
āĻšā§āϝāĻžāϞ⧠āϏāĻŦāĻžāĻ!
Đ āĻ āĻāĻļā§, āĻāĻŽāϰāĻž āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤāĻāĻžāĻŦā§ āĻĒāϰā§āĻā§āώāĻž āĻāϰā§āĻāĻŋ āϝ⧠āĻā§āĻāĻžāĻŦā§ āĻāĻāĻāĻŋ dApp (āĻŦāĻŋāĻā§āύā§āĻĻā§āϰā§āĻā§āϤ āĻ ā§āϝāĻžāĻĒā§āϞāĻŋāĻā§āĻļāύ) āϤā§āϰāĻŋ āĻāϰāĻž āϝāĻžāϝāĻŧ āĻāĻŦāĻ āĻāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻž āϝāĻžāϝāĻŧ .
āĻāϰ āĻāĻāύ āĻāĻāĻā§ disassembled āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻž āϝāĻžāĻ .
āĻĒāϰā§āϝāĻžāϝāĻŧ 3. dApp āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āĻĒāϰā§āĻā§āώāĻž āĻāϰāĻž

āĻā§ āϏāĻŽāϏā§āϝāĻž āĻ āĻŦāĻŋāϞāĻŽā§āĻŦā§ āĻ ā§āϝāĻžāϞāĻŋāϏā§āϰ āϏāĻžāĻĨā§ āĻāĻŖā§āĻ ā§ āĻā§āĻā§ āĻāϏ⧠āĻĄāĻŋāĻāĻĒāĻŋ āĻ ā§āϝāĻžāĻāĻžāĻāύā§āĻ āύā§āĻ?
āĻĒā§āϰāĻĨāĻŽā§:
Boob āĻāĻŦāĻ Cooper āĻāĻāύāĻžāĻā§āϰāĻŽā§ āĻāĻāĻāĻŋ āϏāĻžāϧāĻžāϰāĻŖ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻāĻāĻŋ dApp āĻ āĻŋāĻāĻžāύāĻžāϝāĻŧ āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāĻ āĻžāϤ⧠āĻĒāĻžāϰ⧠āĻšāϏā§āϤāĻžāύā§āϤāϰ āϞā§āύāĻĻā§āύ āĻāĻŦāĻ āĻāĻāĻāĻžāĻŦā§ āϤāĻžāĻĻā§āϰ āĻĢāĻŋāϰ⧠āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāĻŦā§ āύāĻž.āĻĻā§āĻŦāĻŋāϤā§āϝāĻŧāϤ:
āĻŦā§āĻŦ āĻāĻŦāĻ/āĻ āĻĨāĻŦāĻž āĻā§āĻĒāĻžāϰā§āϰ āϏāĻŽā§āĻŽāϤāĻŋ āĻŦā§āϝāϤā§āϤ āĻāĻŽāϰāĻž āĻ ā§āϝāĻžāϞāĻŋāϏāĻā§ āϤāĻšāĻŦāĻŋāϞ āĻāϤā§āϤā§āϞāύ āĻĨā§āĻā§ āĻā§āύā§āĻāĻžāĻŦā§āĻ āϏā§āĻŽāĻžāĻŦāĻĻā§āϧ āĻāϰāĻŋ āύāĻžāĨ¤ āϝā§āĻšā§āϤā§, āϝāĻžāĻāĻžāĻ āĻāϰāĻžāϰ āĻĻāĻŋāĻā§ āĻŽāύā§āϝā§āĻ āĻĻāĻŋāύ, āĻāϞāĻŋāϏ āĻĨā§āĻā§ āϏāĻŽāϏā§āϤ āϞā§āύāĻĻā§āύ āĻāĻžāϰā§āϝāĻāϰ āĻāϰāĻž āĻšāĻŦā§āĨ¤
āĻāϞāĻŋāϏ āύāĻŋāώāĻŋāĻĻā§āϧ āĻāϰ⧠2 āĻ āĻŋāĻ āĻāϰāĻž āϝāĻžāĻ āĻšāϏā§āϤāĻžāύā§āϤāϰ āϞā§āύāĻĻā§āύ āϏāĻāĻļā§āϧāύ āĻāϰāĻž āϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϏā§āĻĨāĻžāĻĒāύ āĻāϰā§āύ:

īŋŧ
āĻāĻŽāϰāĻž dApp āĻ
ā§āϝāĻžāϞāĻŋāϏ āĻāĻŦāĻ āϤāĻžāϰ āϏā§āĻŦāĻžāĻā§āώāϰ āϏāĻš āĻāϝāĻŧā§āύ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻāĻŋāĨ¤ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āϤā§āϰā§āĻāĻŋ āĻĒā§āϝāĻŧā§āĻāĻŋ:

āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ āĻāϰāĻžāϰ āĻā§āώā§āĻāĻž āĻāϰāĻž:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))
āϏā§āĻā§āϰāĻŋāĻĒā§āĻāĻāĻŋ āĻāĻžāĻ āĻāϰ⧠āĻāĻŦāĻ āĻāĻŽāϰāĻž ⧍āϝāĻŧ āĻĒāϝāĻŧā§āύā§āĻ āĻŦā§āϰ āĻāϰā§āĻāĻŋ!
āĻĒāϰā§āϝāĻžāϝāĻŧ 4. āĻā§āĻ āĻĻāĻŋāϝāĻŧā§ āĻāĻāĻāĻŋ DAO āϤā§āϰāĻŋ āĻāϰā§āύ
āĻĻā§āϰā§āĻāĻžāĻā§āϝāĻŦāĻļāϤ, RIDE āĻāĻžāώāĻž āĻāĻāύāĻ āϏāĻāĻā§āϰāĻšā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻā§āώāĻŽāϤāĻž āĻĒā§āϰāĻĻāĻžāύ āĻāϰ⧠āύāĻž (āĻ āĻāĻŋāϧāĻžāύ, āĻ āĻāĻŋāϧāĻžāύ, āĻĒā§āύāϰāĻžāĻŦā§āϤā§āϤāĻŋāĻāĻžāϰā§, āĻšā§āϰāĻžāϏāĻāĻžāϰā§, āĻāϤā§āϝāĻžāĻĻāĻŋ)āĨ¤ āϝāĻžāĻāĻšā§āĻ, āĻĢā§āϞā§āϝāĻžāĻ āϏāĻāĻā§āϰāĻšā§āϰ āĻāĻĒāϰ āĻā§āύ āĻ āĻĒāĻžāϰā§āĻļāύ āĻāύā§āϝ āĻĒā§āϰāĻā§āϤ āĻŽā§āϞā§āϝ āĻāĻŽāϰāĻž āϝāĻĨāĻžāĻā§āϰāĻŽā§ āĻā§ āĻāĻŦāĻ āϤāĻžāĻĻā§āϰ āĻĄāĻŋāĻā§āϰāĻŋāĻĒāĻļāύ āϏāĻš āϏā§āĻā§āϰāĻŋāĻāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āϏāĻŋāϏā§āĻā§āĻŽ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤
āϏā§āĻā§āϰāĻŋāĻāĻā§āϞāĻŋ āϏāĻāϝā§āĻā§āϤ āĻāϰāĻž āĻā§āĻŦ āϏāĻšāĻ, āϏā§āĻā§āϰāĻŋāĻāĻā§āϞāĻŋāĻā§ āϏā§āĻā§ āĻĻā§āĻŦāĻžāϰāĻž āĻĒā§āĻĨāĻ āĻāϰāĻž āϝā§āϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻāϏā§āύ āĻā§āϏā§āĻ āĻā§āϏ āĻšāĻŋāϏāĻžāĻŦā§ āϏā§āĻā§āϰāĻŋāĻāĻāĻŋāĻā§ āϏāĻāĻā§āϰāĻš āĻāĻŦāĻ āĻĒāĻžāϰā§āϏ āĻāϰāĻŋ āĻāĻŦāĻ āĻāĻāĻŋ āĻā§āĻāĻžāĻŦā§ āϞā§āύāĻĻā§āύā§āϰ āĻĢāϞāĻžāĻĢāϞāĻā§ āĻĒā§āϰāĻāĻžāĻŦāĻŋāϤ āĻāϰāĻŦā§ āϤāĻž āĻĒāϰā§āĻā§āώāĻž āĻāϰ⧠āĻĻā§āĻāĻŋāĨ¤
āĻāĻŽāϰāĻž āĻāĻ āĻŦāĻŋāώāϝāĻŧāĻāĻŋāϤ⧠āĻŽā§āĻŽāĻžāĻāϏāĻž āĻāϰā§āĻāĻŋ āϝ⧠āĻ
ā§āϝāĻžāϞāĻŋāϏ āĻā§āϰāĻžāύā§āϏāĻĢāĻžāϰ āϞā§āύāĻĻā§āύ⧠āϏā§āĻŦāĻžāĻā§āώāϰ āĻāϰāϤ⧠āĻĒāĻžāϰā§āύāĻŋ, āϝā§āĻšā§āϤ⧠āĻāĻ āϧāϰāύā§āϰ āϞā§āύāĻĻā§āύā§āϰ āĻāύā§āϝ @verifier-āĻ āĻāĻ āϏāĻŽā§āĻāĻžāĻŦāύāĻžāĻāĻŋ āĻŦā§āϞāĻ āĻāϰāĻž āĻšāϝāĻŧā§āĻāĻŋāϞ⧎
āĻāϰ āϏā§āĻā§āϰāĻŋāĻ āϏāĻā§āĻā§ āĻ āύā§āĻļā§āϞāύ āĻāϰāĻž āϝāĻžāĻ āĻāĻŦāĻ āϤāĻžāϰāĻĒāϰ āĻāĻāĻŋ āϏāĻŽāĻžāϧāĻžāύ.
āϰāĻžāĻāĻĄ āϏā§āĻā§āϰāĻŋāĻāϏ
āϞā§āύāĻĻā§āύ āĻāĻŦāĻžāϰ āϏāĻŽā§āĻāĻŦ, āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ āĻāĻŋāĻāĻžāĻŦā§ āϏā§āĻā§āϰāĻŋāĻ āĻĻāĻŋāϝāĻŧā§ āĻāĻžāĻ āĻāϰāϤ⧠āĻšāϝāĻŧāĨ¤

īŋŧ
āĻŽā§āĻ, āĻāĻāĻŋāϞ āϝā§āĻā§āϤāĻŋ āϞāĻŋāĻāϤ⧠āĻāĻĒāύāĻžāϰ āϝāĻž āĻĻāϰāĻāĻžāϰ āϤāĻž āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻā§ āϰāϝāĻŧā§āĻā§ DAO dApp.
āĻĄā§āĻāĻž āϞā§āύāĻĻā§āύ
āĻĄā§āĻāĻž āϞā§āύāĻĻā§āύ:
âāĻāĻāĻāĻŋ āĻā§āϰ āϏāϰā§āĻŦā§āĻā§āĻ āĻāĻāĻžāϰ āĻšāϞ 100āĻāĻŋ āĻ
āĻā§āώāϰ, āĻāĻŦāĻ āĻāĻāĻāĻŋ āĻā§ āϏā§āĻĒā§āϏ āĻāĻŦāĻ āĻ
āύā§āϝāĻžāύā§āϝ āĻ
-āĻŽā§āĻĻā§āϰāĻŖāϝā§āĻā§āϝ āĻāĻŋāĻšā§āύ āϏāĻš āύāĻŋāϰā§āĻŦāĻŋāĻāĻžāϰ⧠āĻāĻāύāĻŋāĻā§āĻĄ āĻā§āĻĄ āĻĒāϝāĻŧā§āύā§āĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϏā§āĻā§āϰāĻŋāĻ āĻŽāĻžāύāĻā§āϞāĻŋāϰ āϏā§āĻŽāĻž 32,768 āĻŦāĻžāĻāĻ āĻāĻŦāĻ āĻĄā§āĻāĻž āϞā§āύāĻĻā§āύ⧠āϏāĻŽā§āĻāĻžāĻŦā§āϝ āĻāύā§āĻā§āϰāĻŋāϰ āϏāϰā§āĻŦāĻžāϧāĻŋāĻ āϏāĻāĻā§āϝāĻž 100⧎ āϏāĻžāĻŽāĻā§āϰāĻŋāĻāĻāĻžāĻŦā§, āĻāĻāĻāĻŋ āĻĄā§āĻāĻž āϞā§āύāĻĻā§āύā§āϰ āϏāϰā§āĻŦāĻžāϧāĻŋāĻ āĻāĻāĻžāϰ āĻĒā§āϰāĻžāϝāĻŧ 140kb - āϰā§āĻĢāĻžāϰā§āύā§āϏā§āϰ āĻāύā§āϝ, āĻĒā§āϰāĻžāϝāĻŧ āĻ āĻŋāĻ āĻļā§āĻā§āϏāĻĒāĻŋāϝāĻŧāϰā§āϰ āύāĻžāĻāĻ 'āϰā§āĻŽāĻŋāĻ āĻ
ā§āϝāĻžāύā§āĻĄ āĻā§āϞāĻŋāϝāĻŧā§āĻ'-āĻāϰ āĻĻā§āϰā§āĻā§āϝāĨ¤ 'āĨ¤
āĻāĻŽāϰāĻž āύāĻŋāĻŽā§āύāϞāĻŋāĻāĻŋāϤ āĻļāϰā§āϤāĻā§āϞāĻŋāϰ āϏāĻžāĻĨā§ āĻāĻāĻāĻŋ DAO āϤā§āϰāĻŋ āĻāϰāĻŋ:
āϝāĻžāϤ⧠āĻāĻāĻāĻŋ āϏā§āĻāĻžāϰā§āĻāĻāĻĒ āĻāϞ āĻāϰ⧠āϤāĻšāĻŦāĻŋāϞ āĻĒā§āϤ⧠āĻĒāĻžāϰ⧠āϤāĻšāĻŦāĻŋāϞ āĻĒāĻžāύ() āĻāĻŽāĻĒāĻā§āώ⧠2 āĻāύ āĻ
āĻāĻļāĻā§āϰāĻšāĻŖāĻāĻžāϰā§āϰ āϏāĻŽāϰā§āĻĨāύ āĻĒā§āϰāϝāĻŧā§āĻāύ - DAO āĻŦāĻŋāύāĻŋāϝāĻŧā§āĻāĻāĻžāϰā§āĻĻā§āϰāĨ¤ āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ āĻāĻāĻž āĻ āĻŋāĻ āϤāϤāĻāĻž āϏāĻŽā§āĻāĻŦ āĻšāĻŦā§ āϝāϤāĻāĻž āϝā§āĻāĻĢāϞā§āϰ āĻāĻĒāϰ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāĻž āĻšāϝāĻŧā§āĻā§ āĻā§āĻ āĻĄāĻŋāĻāĻ āĻŽāĻžāϞāĻŋāĻāϰāĻžāĨ¤
āĻāϏā§āύ 3 āϧāϰāύā§āϰ āĻā§ āϤā§āϰāĻŋ āĻāϰāĻŋ āĻāĻŦāĻ 2āĻāĻŋ āύāϤā§āύ āĻĢāĻžāĻāĻļāύ āĻā§āĻā§ āĻŦā§āϝāĻžāϞā§āύā§āϏā§āϰ āϏāĻžāĻĨā§ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āϝā§āĻā§āϤāĻŋ āϝā§āĻ āĻāϰāĻŋ āĻāĻŦāĻ āĻĢāĻžāύā§āĻĄ āϞāĻžāĻ āĻāϰāĻŋ:
xxâĻxx_āĻāĻŽāĻŋ āĻāĻāĻāĻŋ = āĻŦāĻŋāύāĻŋāϝāĻŧā§āĻāĻāĻžāϰā§, āĻāĻĒāϞāĻŦā§āϧ āĻŦā§āϝāĻžāϞā§āύā§āϏ (āĻā§āĻ, āĻāĻŽāĻž, āĻĒā§āϰāϤā§āϝāĻžāĻšāĻžāϰ)
xxâĻxx_sv = āϏā§āĻāĻžāϰā§āĻāĻāĻĒ, āĻā§āĻā§āϰ āϏāĻāĻā§āϝāĻž (āĻā§āĻ, āĻĢāĻžāύā§āĻĄ āĻĒāĻžāύ)
xxâĻxx_sf = āϏā§āĻāĻžāϰā§āĻāĻāĻĒ, āĻā§āĻā§āϰ āϏāĻāĻā§āϝāĻž (āĻā§āĻ, āĻĢāĻžāύā§āĻĄ āĻĒāĻžāύ)
xxâĻxx = āϏāϰā§āĻŦāĻāύā§āύ āĻ āĻŋāĻāĻžāύāĻž (ā§Šā§Ģ āĻ āĻā§āώāϰ)
āĻā§āĻā§ āύā§āĻāĻŋāĻļ āĻāĻŽāĻžāĻĻā§āϰ āĻāĻāϏāĻžāĻĨā§ āĻŦā§āĻļ āĻāϝāĻŧā§āĻāĻāĻŋ āĻā§āώā§āϤā§āϰ āĻāĻĒāĻĄā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§:
WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),
WriteSet āĻāĻŽāĻžāĻĻā§āϰāĻā§ āĻāĻ āϏāĻžāĻĨā§ āĻāĻāĻžāϧāĻŋāĻ āϰā§āĻāϰā§āĻĄ āĻāϰāϤ⧠āĻĻā§āϝāĻŧ āĻāύāĻā§āĻāϏā§āĻā§āϰāĻŋāĻĒā§āĻ āϞā§āύāĻĻā§āύ
āĻŦāĻŦ āĻāĻŦāĻ āĻā§āĻĒāĻžāϰ āĻĒā§āύāϰāĻžāϝāĻŧ āĻĒā§āϰāĻŖ āĻāϰāĻžāϰ āĻĒāϰ⧠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 āĻĨā§āĻā§ āϤāĻšāĻŦāĻŋāϞ āĻāϤā§āϤā§āϞāύ āĻāϰāϤ⧠āϏāĻā§āώāĻŽ āĻšāϤ⧠āύā§āϞāĻŋāĻā§ āĻāĻŽāĻĒāĻā§āώ⧠2āĻāĻŋ āĻā§āĻ āϏāĻāĻā§āϰāĻš āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤

āύā§āϞāĻŋ āϤāĻžāϰ āĻāĻĒāϰ āĻ āϰā§āĻĒāĻŋāϤ āĻ āϰā§āĻĨā§āϰ āĻ āϰā§āϧā§āĻ āϤā§āϞ⧠āύāĻŋāϤ⧠āĻāϞā§āĻā§:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))

āϏ⧠āϏāĻĢāϞ āĻšāϝāĻŧ, āĻ āϰā§āĻĨāĻžā§ āĻĄāĻŋāĻāĻ āĻāĻžāĻ āĻāϰā§!
āĻāĻŽāϰāĻž āĻāĻžāώāĻžāϝāĻŧ āĻāĻāĻāĻŋ 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
