рдирдорд╕реНрдХрд╛рд░!
╨Т
рдЕрдм рдЕрд▓рд┐рдХрддрд┐ рдбрд┐рд╕реЗрдореНрдмрд▓ рдЧрд░рд┐рдПрдХреЛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реМрдВ
рдЪрд░рдг 3. dApp рдЦрд╛рддрд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд░реНрджреИ
рдПрд▓рд┐рд╕рдХреЛ рд╕рд╛рдердорд╛ рдХреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рддреБрд░реБрдиреНрддреИ рдмрд╛рд╣рд┐рд░ рдЖрдЙрдБрдЫрдиреН? dApp рдЦрд╛рддрд╛?
рдкрд╣рд┐рд▓реЛ:
Boob рд░ Cooper рд▓реЗ рд╕рдВрдпреЛрдЧрд╡рд╢ рдирд┐рдпрдорд┐рдд рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ dApp рдареЗрдЧрд╛рдирд╛рдорд╛ рд░рдХрдо рдкрдард╛рдЙрди рд╕рдХреНрдЫ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН рд▓реЗрдирджреЗрди рд░ рдпрд╕реИрд▓реЗ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдлрд┐рд░реНрддрд╛ рдкрд╣реБрдБрдЪ рдЧрд░реНрди рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреИрдиредрджреЛрд╕реНрд░реЛ:
рд╣рд╛рдореА рдПрд▓рд┐рд╕рд▓рд╛рдИ Boob рд░/рд╡рд╛ рдХреВрдкрд░рдХреЛ рд╕реНрд╡реАрдХреГрддрд┐ рдмрд┐рдирд╛ рд░рдХрдо рдЭрд┐рдХреНрдирдмрд╛рдЯ рдХреБрдиреИ рдкрдирд┐ рд╣рд┐рд╕рд╛рдмрд▓реЗ рдкреНрд░рддрд┐рдмрдиреНрдз рд▓рдЧрд╛рдЙрдБрджреИрдиреМрдВред рдХрд┐рдирдХрд┐, рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЧрд░реНрди рдзреНрдпрд╛рди рджрд┐рдиреБрд╣реЛрд╕реН, рдПрд▓рд┐рд╕рдмрд╛рдЯ рд╕рдмреИ рд▓реЗрдирджреЗрдирд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░рд┐рдиреЗрдЫред
рдПрд▓рд┐рд╕рд▓рд╛рдИ рдкреНрд░рддрд┐рдмрдиреНрдз рд▓рдЧрд╛рдПрд░ 2 рдлрд┐рдХреНрд╕ рдЧрд░реМрдВ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рдЧрд░реНрдиреБрд╣реЛрд╕реН рд▓реЗрдирджреЗрдиред рд╕рд╣реА рд▓рд┐рдкрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ:
я┐╝
рд╣рд╛рдореА dApp рдПрд▓рд┐рд╕ рд░ рдЙрдирдХреЛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рдмрд╛рдЯ рд╕рд┐рдХреНрдХрд╛ рдлрд┐рд░реНрддрд╛ рд▓рд┐рди рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджреИрдЫреМрдВред рд╣рд╛рдореАрд▓реЗ рддреНрд░реБрдЯрд┐ рдкрд╛рдЙрдБрдЫреМрдВ:
рдирд┐рдХрд╛рд╕реА рдорд╛рд░реНрдлрдд рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))
рд╕реНрдХреНрд░рд┐рдкреНрдЯрд▓реЗ рдХрд╛рдо рдЧрд░реНрдЫ рд░ рд╣рд╛рдореАрд▓реЗ рджреЛрд╕реНрд░реЛ рдмрд┐рдиреНрджреБ рдкрддреНрддрд╛ рд▓рдЧрд╛рдпреМрдВ!
рдЪрд░рдг 4. рдорддрджрд╛рдирдХреЛ рд╕рд╛рде DAO рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН
рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, RIDE рднрд╛рд╖рд╛рд▓реЗ рдЕрдЭреИ рдкрдирд┐ рд╕рдЩреНрдЧреНрд░рд╣рд╣рд░реВ (рд╢рдмреНрджрдХреЛрд╢ рд╢рдмреНрджрдХреЛрд╢рд╣рд░реВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рд╣рд░реВ, рдШрдЯрд╛рдЙрдиреЗрд╣рд░реВ, рдЖрджрд┐) рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдЧрд░реНрджреИрдиред рдпрджреНрдпрдкрд┐, рдлреНрд▓реНрдпрд╛рдЯ рд╕рдВрдЧреНрд░рд╣рдХреЛ рд╕рд╛рде рдХреБрдиреИ рдкрдирд┐ рдЕрдкрд░реЗрд╕рдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдЮреНрдЬреА-рдорд╛рди рд╣рд╛рдореА рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗ рдкреНрд░рдгрд╛рд▓реА рдбрд┐рдЬрд╛рдЗрди рдЧрд░реНрди рд╕рдХреНрдЫреМрдВ, рддрджрдиреБрд╕рд╛рд░ рдХреБрдЮреНрдЬреАрд╣рд░реВ рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рдирдХреЛ рд╕рд╛рдеред
рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВ рдорд┐рд▓рд╛рдЙрди рдзреЗрд░реИ рд╕рдЬрд┐рд▓реЛ рдЫ; рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рджреНрд╡рд╛рд░рд╛ рдЫреБрдЯреНрдпрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫред
рдПрдЙрдЯрд╛ рд╕реНрдЯреНрд░рд┐рдЩрд▓рд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЙрджрд╛рд╣рд░рдгрдХреЛ рд░реВрдкрдорд╛ рд╕рдЩреНрдХрд▓рди рд░ рдкрд╛рд░реНрд╕ рдЧрд░реМрдВ рд░ рдпрд╕рд▓реЗ рд▓реЗрдирджреЗрдирдХреЛ рдирддрд┐рдЬрд╛рд▓рд╛рдИ рдХрд╕рд░реА рдЕрд╕рд░ рдЧрд░реНрдЫ рдЬрд╛рдБрдЪ рдЧрд░реМрдВред
рдпрд╕ рдкреНрд░рдХрд╛рд░рдХреЛ рд▓реЗрдирджреЗрдирдХреЛ рд▓рд╛рдЧрд┐ @verifier рдорд╛ рдпреЛ рдХреНрд╖рдорддрд╛ рдЕрд╡рд░реБрджреНрдз рднрдПрдХреЛрд▓реЗ рдПрд▓рд┐рд╕рд▓реЗ рд╕реНрдерд╛рдирд╛рдиреНрддрд░рдг рд▓реЗрдирджреЗрдирдорд╛ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдЧрд░реНрди рд╕рдХреЗрди рднрдиреНрдиреЗ рддрдереНрдпрдорд╛ рд╣рд╛рдореАрд▓реЗ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдпреМрдВред
рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдЕрднреНрдпрд╛рд╕ рдЧрд░реМрдВ рд░ рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓рд╛рдИ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реНред
RIDE рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВ
рд▓реЗрдирджреЗрди рдлреЗрд░рд┐ рд╕рдореНрднрд╡ рдЫ, рд╣рд╛рдореАрд▓рд╛рдИ рдерд╛рд╣рд╛ рдЫ рдХрд╕рд░реА рд╕реНрдЯреНрд░рд┐рдЩрд╣рд░реВрд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрдиреЗред
я┐╝
рдХреБрд▓рдорд╛, рд╣рд╛рдореАрд╕рдБрдЧ рдЬрдЯрд┐рд▓ рддрд░реНрдХ рд▓реЗрдЦреНрди рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рдЫ DAO dApp.
рдбрд╛рдЯрд╛ рд▓реЗрдирджреЗрди
рдбрд╛рдЯрд╛ рд▓реЗрдирджреЗрди:
"рдХреБрдЮреНрдЬреАрдХреЛ рд▓рд╛рдЧрд┐ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ 100 рдХреНрдпрд╛рд░реЗрдХреНрдЯрд░рд╣рд░реВ рдЫрдиреН, рд░ рдПрдЙрдЯрд╛ рдХреБрдЮреНрдЬреАрдорд╛ рдЦрд╛рд▓реА рдард╛рдЙрдБрд╣рд░реВ рд░ рдЕрдиреНрдп рдЫрд╛рдкреНрди рдирд╕рдХреНрдиреЗ рдкреНрд░рддреАрдХрд╣рд░реВ рд╕рд╣рд┐рдд рд╕реНрд╡реЗрдЪреНрдЫрд╛рдЪрд╛рд░реА рдпреБрдирд┐рдХреЛрдб рдХреЛрдб рдмрд┐рдиреНрджреБрд╣рд░реВ рд╕рдорд╛рд╡реЗрд╢ рд╣реБрди рд╕рдХреНрдЫред рд╕реНрдЯреНрд░рд┐рдЩ рдорд╛рдирд╣рд░реВрдХреЛ рд╕реАрдорд╛ 32,768 рдмрд╛рдЗрдЯ рд╣реБрдиреНрдЫ рд░ рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрдирдорд╛ рд╕рдореНрднрд╛рд╡рд┐рдд рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рд╣рд░реВрдХреЛ рдЕрдзрд┐рдХрддрдо рд╕рдВрдЦреНрдпрд╛ 100 рд╣реЛред рд╕рдордЧреНрд░рдорд╛, рдбреЗрдЯрд╛ рд▓реЗрдирджреЗрдирдХреЛ рдЕрдзрд┐рдХрддрдо рдЖрдХрд╛рд░ рд▓рдЧрднрдЧ 140kb рд╣реЛ тАФ рд╕рдиреНрджрд░реНрднрдХреЛ рд▓рд╛рдЧрд┐, рд▓рдЧрднрдЧ рдареНрдпрд╛рдХреНрдХреИ рд╢реЗрдХреНрд╕рдкрд┐рдпрд░рдХреЛ рдирд╛рдЯрдХ 'рд░реЛрдорд┐рдпреЛ рд░ рдЬреБрд▓рд┐рдпрдЯ' рдХреЛ рд▓рдореНрдмрд╛рдЗред 'ред
рд╣рд╛рдореА рдирд┐рдореНрди рд╕рд░реНрддрд╣рд░реВрд╕рдБрдЧ DAO рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдЫреМрдВ:
рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЛ рд▓рд╛рдЧреА рдХрд▓ рдЧрд░реЗрд░ рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреА рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН() рдХрдореНрддрд┐рдорд╛ реи рд╕рд╣рднрд╛рдЧреАрд╣рд░реВрдХреЛ рд╕рдорд░реНрдерди - DAO рд▓рдЧрд╛рдиреАрдХрд░реНрддрд╛рд╣рд░реВ - рдЖрд╡рд╢реНрдпрдХ рдЫред рдирд┐рдХрд╛рд▓реНрдиреБрд╣реЛрд╕реН рдпреЛ рд╕рдореНрднрд╡ рд╣реБрдиреЗрдЫ рдареНрдпрд╛рдХреНрдХреИ рдЬрддрд┐ рдХреБрд▓ рдорд╛ рд╕рдВрдХреЗрдд рдЧрд░рд┐рдПрдХреЛ рдЫ рдорддрджрд╛рди DAO рдорд╛рд▓рд┐рдХрд╣рд░реВред
3 рдкреНрд░рдХрд╛рд░рдХрд╛ рдХреБрдЮреНрдЬреАрд╣рд░реВ рдмрдирд╛рдЙрдиреБрд╣реЛрд╕реН рд░ 2 рдирдпрд╛рдБ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдмреНрдпрд╛рд▓реЗрдиреНрд╕рдХреЛ рд╕рд╛рде рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрд░реНрдХ рдердкреНрдиреБрд╣реЛрд╕реН рд░ рдлрдиреНрдбрд╣рд░реВ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН:
xxтАжxx_ia = рд▓рдЧрд╛рдиреАрдХрд░реНрддрд╛, рдЙрдкрд▓рдмреНрдз рдмреНрдпрд╛рд▓реЗрдиреНрд╕ (рднреЛрдЯ, рдЬрдореНрдорд╛, рдирд┐рдХрд╛рд╕реА)
xxтАжxx_sv = рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрд╣рд░реВ, рднреЛрдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ (рднреЛрдЯ, рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН)
xxтАжxx_sf = рд╕реНрдЯрд╛рд░реНрдЯрдЕрдкрд╣рд░реВ, рднреЛрдЯрд╣рд░реВрдХреЛ рд╕рдВрдЦреНрдпрд╛ (рднреЛрдЯ, рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН)
xxтАжxx = рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдареЗрдЧрд╛рдирд╛ (рейрел рд╡рд░реНрдг)
рдХреГрдкрдпрд╛ рдиреЛрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рднреЛрдЯрдорд╛ рд╣рд╛рдореАрд▓реЗ рдПрдХреИ рдкрдЯрдХ рдзреЗрд░реИ рдХреНрд╖реЗрддреНрд░рд╣рд░реВ рдЕрджреНрдпрд╛рд╡рдзрд┐рдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ:
WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),
WriteSet рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдПрдХреИ рдкрдЯрдХрдорд╛ рдзреЗрд░реИ рд░реЗрдХрд░реНрдбрд╣рд░реВ рдмрдирд╛рдЙрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ invokeScript рд▓реЗрдирджреЗрдиред
DAO dApp рдХреЛ рдореБрдЦреНрдп-рдорд╛рди рднрдгреНрдбрд╛рд░рдгрдорд╛ рдпреЛ рдЬрд╕реНрддреЛ рджреЗрдЦрд┐рдиреНрдЫ, рдмрдм рд░ рдХреВрдкрд░рд▓реЗ рдкреБрди: рднрд░рд┐рд╕рдХреЗ рдкрдЫрд┐ ia- рдирд┐рдХреНрд╖реЗрдк:
рд╣рд╛рдореНрд░реЛ рдЬрдореНрдорд╛ рдкреНрд░рдХрд╛рд░реНрдп рдереЛрд░реИ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫ:
рдЕрдм DAO рдХрд╛ рдЧрддрд┐рд╡рд┐рдзрд┐рд╣рд░реВрдорд╛ рд╕рдмреИрднрдиреНрджрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рдХреНрд╖рдг рдЖрдЙрдБрдЫ - рднреЛрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА рд╡рд┐рддреНрдд рдкреЛрд╖рдг рдЧрд░реНрди рдХреЛ рд▓рд╛рдЧреАред
рдмрдмрд▓реЗ рдиреЗрд▓реАрдХреЛ 500000 рддрд░рдВрдЧрдХрд╛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓рд╛рдИ рднреЛрдЯ рджрд┐рдП:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
рдбрд╛рдЯрд╛ рд╕реНрдЯреЛрд░рдорд╛ рд╣рд╛рдореА рдиреЗрд▓реАрдХреЛ рдареЗрдЧрд╛рдирд╛рдХрд╛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рд╕рдмреИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рд╣рд░реВ рджреЗрдЦреНрдЫреМрдВ:
рдХреБрдкрд░рд▓реЗ рдкрдирд┐ рдиреЗрд▓реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдкрдХреНрд╖рдорд╛ рдорддрджрд╛рди рдЧрд░реЗред
рдкреНрд░рдХрд╛рд░реНрдп рдХреЛрдбрдорд╛ рдПрдХ рдирдЬрд░ рд░рд╛рдЦреМрдВ рдХреЛрд╖ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдиреЗрд▓реАрд▓реЗ DAO рдмрд╛рдЯ рд░рдХрдо рдЭрд┐рдХреНрди рд╕рдХреНрд╖рдо рд╣реБрди рдХрдореНрддрд┐рдорд╛ реи рднреЛрдЯ рдЬрдореНрдорд╛ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫред
рдиреЗрд▓реАрд▓реЗ рдЖрдлреВрд▓рд╛рдИ рджрд┐рдПрдХреЛ рд░рдХрдордХреЛ рдЖрдзрд╛ рд░рдХрдо рдлрд┐рд░реНрддрд╛ рд▓рд┐рдиреЗ рднрдПрдХреЛ рдЫ ред
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
рдЙрдиреА рд╕рдлрд▓ рд╣реБрдиреНрдЫрдиреН, рддреНрдпреЛ рд╣реЛ, DAO рдХрд╛рдо рдЧрд░реНрджрдЫ!
рд╣рд╛рдореАрд▓реЗ рднрд╛рд╖рд╛рдорд╛ DAO рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рд╣реЗрд░реНрдпреМрдВ RIDE4DAPPS.
рдирд┐рдореНрди рднрд╛рдЧрд╣рд░реВрдорд╛ рд╣рд╛рдореА рдХреЛрдб рд░рд┐рдлреНрдпрд╛рдХреНрдЯрд░рд┐рдЩ рд░ рдХреЗрд╕ рдкрд░реАрдХреНрд╖рдгрд▓рд╛рдИ рдирдЬрд┐рдХрдмрд╛рдЯ рд╣реЗрд░реНрдиреЗрдЫреМрдВред
рдХреЛрдбрдХреЛ рдкреВрд░реНрдг рд╕рдВрд╕реНрдХрд░рдг рдорд╛
# In this example multiple accounts can deposit their funds to DAO and safely take them back, no one can interfere with this.
# DAO participants can also vote for particular addresses and let them withdraw invested funds then quorum has reached.
# An inner state is maintained as mapping `address=>waves`.
# https://medium.com/waves-lab/waves-announces-funding-for-ride-for-dapps-developers-f724095fdbe1
# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
# deploy()
# From account #1: deposit funds
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
# From account #2: deposit funds
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 100000000, asset:null }]}))
# From account #1: vote for startup
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
# From account #2: vote for startup
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
# From account #3: get invested funds
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
{-# STDLIB_VERSION 3 #-}
{-# CONTENT_TYPE DAPP #-}
{-# SCRIPT_TYPE ACCOUNT #-}
@Callable(i)
func deposit() = {
let pmt = extract(i.payment)
if (isDefined(pmt.assetId)) then throw("can hodl waves only at the moment")
else {
let currentKey = toBase58String(i.caller.bytes)
let xxxInvestorBalance = currentKey + "_" + "ib"
let currentAmount = match getInteger(this, xxxInvestorBalance) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount + pmt.amount
WriteSet([DataEntry(xxxInvestorBalance, newAmount)])
}
}
@Callable(i)
func withdraw(amount: Int) = {
let currentKey = toBase58String(i.caller.bytes)
let xxxInvestorBalance = currentKey + "_" + "ib"
let currentAmount = match getInteger(this, xxxInvestorBalance) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount - amount
if (amount < 0)
then throw("Can't withdraw negative amount")
else if (newAmount < 0)
then throw("Not enough balance")
else ScriptResult(
WriteSet([DataEntry(xxxInvestorBalance, newAmount)]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Callable(i)
func getFunds(amount: Int) = {
let quorum = 2
let currentKey = toBase58String(i.caller.bytes)
let xxxStartupFund = currentKey + "_" + "sf"
let xxxStartupVotes = currentKey + "_" + "sv"
let currentAmount = match getInteger(this, xxxStartupFund) {
case a:Int => a
case _ => 0
}
let totalVotes = match getInteger(this, xxxStartupVotes) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount - amount
if (amount < 0)
then throw("Can't withdraw negative amount")
else if (newAmount < 0)
then throw("Not enough balance")
else if (totalVotes < quorum)
then throw("Not enough votes. At least 2 votes required!")
else ScriptResult(
WriteSet([
DataEntry(xxxStartupFund, newAmount)
]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Callable(i)
func vote(amount: Int, address: String) = {
let currentKey = toBase58String(i.caller.bytes)
let xxxInvestorBalance = currentKey + "_" + "ib"
let xxxStartupFund = address + "_" + "sf"
let xxxStartupVotes = address + "_" + "sv"
let currentAmount = match getInteger(this, xxxInvestorBalance) {
case a:Int => a
case _ => 0
}
let currentVotes = match getInteger(this, xxxStartupVotes) {
case a:Int => a
case _ => 0
}
let currentFund = match getInteger(this, xxxStartupFund) {
case a:Int => a
case _ => 0
}
if (amount <= 0)
then throw("Can't withdraw negative amount")
else if (amount > currentAmount)
then throw("Not enough balance")
else ScriptResult(
WriteSet([
DataEntry(xxxInvestorBalance, currentAmount - amount),
DataEntry(xxxStartupVotes, currentVotes + 1),
DataEntry(xxxStartupFund, currentFund + amount)
]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Verifier(tx)
func verify() = {
match tx {
case t: TransferTransaction =>false
case _ => true
}
}
рд╕реНрд░реЛрдд: www.habr.com