
เชนเซเชฒเซ เชฆเชฐเซเช!
ะ เช เชญเชพเชเชฎเชพเช เชเชชเชฃเซ dApp (เชตเชฟเชเซเชจเซเชฆเซเชฐเชฟเชค เชเชชเซเชฒเชฟเชเซเชถเชจ) เชเซเชตเซ เชฐเซเชคเซ เชฌเชจเชพเชตเชตเซ เช เชจเซ เชคเซเชจเซ เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฐเซเชฏ เชเชฐเชตเซเช เชคเซ เชตเชฟเชเชคเชตเชพเชฐ เชเซเชฏเซเช. .
เชเชพเชฒเซ เชนเชตเซ เชกเชฟเชธเชเชธเซเชฎเซเชฌเชฒ เชเชฐเซเชฒเชพเชจเซเช เชฅเซเชกเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเซเช. .
เชชเชเชฒเซเช 3: dApp เชเชเชพเชเชจเซเชเชจเซเช เชชเชฐเซเชเซเชทเชฃ เชเชฐเชตเซเช

เชเชฒเชฟเชธ เชธเชพเชฅเซ เชคเชฎเชจเซ เชเช เชธเชฎเชธเซเชฏเชพเช เชคเชฐเชค เช เชฆเซเชเชพเชฏ เชเซ? dApp เชเชพเชคเซเช?
เชชเซเชฐเชฅเชฎ:
เชฌเซเชฌ เช เชจเซ เชเซเชชเชฐ เชจเชฟเชฏเชฎเชฟเชค เชเชชเชฏเซเช เชเชฐเซเชจเซ dApp เชธเชฐเชจเชพเชฎเชพเช เชชเชฐ เชเชเชธเซเชฎเชฟเช เชฐเซเชคเซ เชญเชเชกเซเชณ เชฎเซเชเชฒเซ เชถเชเซ เชเซ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชตเซเชฏเชตเชนเชพเชฐเซ เช เชจเซ เชคเซเชฅเซ เชคเซเชฎเชจเซ เชชเชพเชเชพ เชเชเซเชธเซเชธ เชเชฐเซ เชถเชเชถเซ เชจเชนเซเช.เชฌเซเชเซเช:
เช เชฎเซ เชเชฒเชฟเชธเชจเซ เชฌเซเชฌ เช เชจเซ/เช เชฅเชตเชพ เชเซเชชเชฐเชจเซ เชฎเชเชเซเชฐเซ เชตเชฟเชจเชพ เชญเชเชกเซเชณ เชเชชเชพเชกเชตเชพ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เชฎเซเชเชคเชพ เชจเชฅเซ. เชเซเชฎ เชคเชฎเซ เชเซเช เชถเชเซ เชเซ, เชเชฒเชฟเชธเชจเชพ เชฌเชงเชพ เชตเซเชฏเชตเชนเชพเชฐเซ เชเชเซเชเชฟเชเซเชฏเซเช เชเชฐเชตเชพเชฎเชพเช เชเชตเชถเซ, เชเซเชฎ เชเซ เชตเซเชฐเชฟเชซเชฟเชเซเชถเชจ เชฌเชเชจ เชฆเซเชตเชพเชฐเชพ เชธเซเชเชตเชตเชพเชฎเชพเช เชเชตเซเชฏเซเช เชเซ.
เชเชพเชฒเซ เชเชฒเชฟเชธ เชชเชฐ เชชเซเชฐเชคเชฟเชฌเชเชง เชฎเซเชเซเชจเซ เชฌเซเชเชพเชจเซ เช เซเช เชเชฐเซเช เชเซเชฐเชพเชจเซเชธเชซเชฐ เชตเซเชฏเชตเชนเชพเชฐเซ. เชธเซเชงเชพเชฐเซเชฒเซ เชธเซเชเซเชฐเชฟเชชเซเช เชเชฎเชพเชตเชตเซ:

๏ฟผ
เช
เชฎเซ เชเชฒเชฟเชธเชจเชพ dApp เช
เชจเซ เชคเซเชจเชพ เชนเชธเซเชคเชพเชเซเชทเชฐเชฎเชพเชเชฅเซ เชธเชฟเชเซเชเชพ เชชเชพเชเชพ เชเซเชเชเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซ เชฐเชนเซเชฏเชพ เชเซเช. เช
เชฎเชจเซ เชเช เชญเซเชฒ เชฎเชณเซ เชฐเชนเซ เชเซ:

เชเชพเชฒเซ เชเชชเชพเชก เชฆเซเชตเชพเชฐเชพ เชเชชเชพเชก เชเชฐเชตเชพเชจเซ เชชเซเชฐเชฏเชพเชธ เชเชฐเซเช:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))เชธเซเชเซเชฐเชฟเชชเซเช เชเชพเชฎ เชเชฐเซ เชเซ เช เชจเซ เช เชฎเซ เชชเซเชเชจเซเช 2 เชเชเซเชฒเซ เชจเชพเชเซเชฏเซ เชเซ!
เชชเชเชฒเซเช 4: เชฎเชคเชฆเชพเชจ เชธเชพเชฅเซ DAO เชฌเชจเชพเชตเซ
เชเชฎเชจเชธเซเชฌเซ, RIDE เชญเชพเชทเชพ เชนเชเซ เชธเซเชงเซ เชธเชเชเซเชฐเชนเซ (เชถเชฌเซเชฆเชเซเชถเซเชจเชพ เชถเชฌเซเชฆเชเซเชถเซ, เชชเซเชจเชฐเชพเชตเชฐเซเชคเชเซ, เชฐเซเชกเซเชฏเซเชธเชฐเซเชธ, เชตเชเซเชฐเซ) เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชเซเชทเชฎเชคเชพเช เชชเซเชฐเชฆเชพเชจ เชเชฐเชคเซ เชจเชฅเซ. เชเซ เชเซ, เชซเซเชฒเซเช เชธเชเชเซเชฐเชนเซ เชธเชพเชฅเซเชจเชพ เชเซเชเชชเชฃ เชเชพเชฎเชเซเชฐเซ เชฎเชพเชเซ เชเซ-เชฎเซเชฒเซเชฏ เชเชชเชฃเซ เชคเชพเชฐ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ, เชคเซ เชฎเซเชเชฌ เชเซเช เช เชจเซ เชคเซเชฎเชจเชพ เชกเชฟเชเซเชฐเชฟเชชเซเชถเชจ เชฎเชพเชเซ เชเช เชธเชฟเชธเซเชเชฎ เชกเชฟเชเชพเชเชจ เชเชฐเซ เชถเชเซเช เชเซเช.
เชธเซเชเซเชฐเชฟเชเชเซเชธเชจเซ เชเซเชกเชตเชพเชจเซเช เชเซเชฌ เช เชธเชฐเชณ เชเซ, เชธเซเชเซเชฐเชฟเชเชเซเชธเชจเซ เชเชจเซเชกเซเชเซเชธ เชฆเซเชตเชพเชฐเชพ เชตเชฟเชญเชพเชเชฟเชค เชเชฐเซ เชถเชเชพเชฏ เชเซ.
เชเช เชชเชฐเซเชเซเชทเชฃ เชเชฆเชพเชนเชฐเชฃ เชคเชฐเซเชเซ, เชเชพเชฒเซ เชเช เชธเซเชเซเชฐเชฟเชเชเชจเซ เชเชธเซเชฎเซเชฌเชฒ เช
เชจเซ เชชเชพเชฐเซเชธ เชเชฐเซเช เช
เชจเซ เชคเชชเชพเชธเซเช เชเซ เช เชตเซเชฏเชตเชนเชพเชฐเชจเชพ เชชเชฐเชฟเชฃเชพเชฎเชจเซ เชเซเชตเซ เชฐเซเชคเซ เช
เชธเชฐ เชเชฐเซ เชเซ.
เช
เชฎเชจเซ เช เชนเชเซเชเชคเชจเซ เชธเชพเชฎเชจเซ เชเชฐเชตเซ เชชเชกเซเชฏเซ เชเซ เชเชฒเชฟเชธ เชเซเชฐเชพเชจเซเชธเชซเชฐ เชเซเชฐเชพเชจเซเชเซเชเซเชถเชจ เชชเชฐ เชธเชนเซ เชเชฐเซ เชถเชเซ เชจเชนเซเช, เชเชพเชฐเชฃ เชเซ เช เชชเซเชฐเชเชพเชฐเชจเชพ เชเซเชฐเชพเชจเซเชเซเชเซเชถเชจ เชฎเชพเชเซ @verifier เชฎเชพเช เช เชเซเชทเชฎเชคเชพ เช
เชตเชฐเซเชงเชฟเชค เชนเชคเซ.
เชเชพเชฒเซ เชถเชฌเซเชฆเชฎเชพเชณเชพเช เชธเชพเชฅเซ เชชเซเชฐเซเชเซเชเชฟเชธ เชเชฐเซเช เช เชจเซ เชชเชเซ เช เชเชเซเชฒเซเช.
เชฐเชพเชเชก เชธเซเชเซเชฐเชฟเชเชเซเชธ
เชตเซเชฏเชตเชนเชพเชฐ เชซเชฐเซเชฅเซ เชถเชเซเชฏ เชเซ, เชเชชเชฃเซ เชเชพเชฃเซเช เชเซเช เชเซ เชถเชฌเซเชฆเชฎเชพเชณเชพเช เชธเชพเชฅเซ เชเซเชตเซ เชฐเซเชคเซ เชเชพเชฎ เชเชฐเชตเซเช.

๏ฟผ
เชคเซ, เชเชเชฟเชฒ เชคเชฐเซเช เชฒเชเชตเชพ เชฎเชพเชเซ เชเชชเชฃเซ เชชเชพเชธเซ เชฌเชงเซเช เช เชเซ. DAO dApp.
เชกเซเชเชพ เชตเซเชฏเชตเชนเชพเชฐเซ
เชกเซเชเชพ เชตเซเชฏเชตเชนเชพเชฐเซ:
"เชเซ เชฎเชพเชเซ เชฎเชนเชคเซเชคเชฎ เชเชฆ 100 เช
เชเซเชทเชฐเซ เชเซ, เช
เชจเซ เชเซเชฎเชพเช เชเชเซเชฏเชพเช เช
เชจเซ เช
เชจเซเชฏ เชฌเชฟเชจ-เชชเซเชฐเชฟเชจเซเชเซเชฌเชฒ เชชเซเชฐเชคเซเชเซ เชธเชนเชฟเชค เชฎเชจเชธเซเชตเซ เชฏเซเชจเชฟเชเซเชก เชเซเชก เชชเซเชเชจเซเช เชนเซเช เชถเชเซ เชเซ. เชธเซเชเซเชฐเชฟเชเช เชฎเซเชฒเซเชฏเซเชจเซ เชฎเชฐเซเชฏเชพเชฆเชพ 32,768 เชฌเชพเชเชเซเชธเชจเซ เชเซ เช
เชจเซ เชกเซเชเชพ เชเซเชฐเชพเชจเซเชเซเชเซเชถเชจเชฎเชพเช เชถเชเซเชฏ เชเชจเซเชเซเชฐเซเชเชจเซ เชฎเชนเชคเซเชคเชฎ เชธเชเชเซเชฏเชพ 100 เชเซ. เชเชเชเชฆเชฐเซ, เชกเซเชเชพ เชเซเชฐเชพเชจเซเชเซเชเซเชถเชจเชจเซเช เชฎเชนเชคเซเชคเชฎ เชเชฆ เชฒเชเชญเช 140kb เชเซ - เชธเชเชฆเชฐเซเชญ เชฎเชพเชเซ, เชฒเชเชญเช เชถเซเชเซเชธเชชเชฟเชฏเชฐเชจเชพ เชจเชพเชเช 'เชฐเซเชฎเชฟเชฏเซ เช
เชจเซ เชเซเชฒเชฟเชฏเช' เชจเซ เชฒเชเชฌเชพเช เชเซเชเชฒเซเช เช."
เช
เชฎเซ เชจเซเชเซเชจเซ เชถเชฐเชคเซ เชธเชพเชฅเซ DAO เชฌเชจเชพเชตเซเช เชเซเช:
เชธเซเชเชพเชฐเซเชเช
เชชเชจเซ เชซเซเชจ เชเชฐเซเชจเซ เชญเชเชกเซเชณ เชฎเซเชณเชตเชตเชพ เชฎเชพเชเซ เชเซเชเชซเชเชกเซเชธ() เชเชเชพเชฎเชพเช เชเชเชพ 2 เชธเชนเชญเชพเชเซเช - DAO เชฐเซเชเชพเชฃเชเชพเชฐเซ - เชจเซ เชเซเชเซ เชเชฐเซเชฐเซ เชเซ. เชชเชพเชเซ เชเซเชเชเซ เชชเชฐ เชฆเชฐเซเชถเชพเชตเซเชฒ เชเซเชฒ เชฐเชเชฎ เชเซเชเชฒเซ เช เชฐเชเชฎ เชฎเชณเซ เชถเชเชถเซ เชฎเชคเชฆเชพเชจ DAO เชฎเชพเชฒเชฟเชเซ.
เชเชพเชฒเซ 3 เชชเซเชฐเชเชพเชฐเชจเซ เชเซ เชฌเชจเชพเชตเซเช เช เชจเซ 2 เชจเชตเชพ เชซเชเชเซเชถเชจ, เชตเซเช เช เชจเซ เชเซเชเชซเชเชกเซเชธเชฎเชพเช เชฌเซเชฒเซเชจเซเชธ เชธเชพเชฅเซ เชเชพเชฎ เชเชฐเชตเชพ เชฎเชพเชเซ เชฒเซเชเชฟเช เชเชฎเซเชฐเซเช:
xxโฆxx_เชเชเช = เชฐเซเชเชพเชฃเชเชพเชฐเซ, เชเชชเชฒเชฌเซเชง เชฌเซเชฒเซเชจเซเชธ (เชฎเชค, เชเชฎเชพ, เชเชชเชพเชก)
xxโฆxx_เชธเชฐเซเชต = เชธเซเชเชพเชฐเซเชเช เชชเซเชธ, เชฎเชคเซเชจเซ เชธเชเชเซเชฏเชพ (เชฎเชค เชเชชเซ, เชญเชเชกเซเชณ เชฎเซเชณเชตเซ)
xxโฆxx_เชเชธเชเชซ = เชธเซเชเชพเชฐเซเชเช เชชเซเชธ, เชฎเชคเซเชจเซ เชธเชเชเซเชฏเชพ (เชฎเชค เชเชชเซ, เชญเชเชกเซเชณ เชฎเซเชณเชตเซ)
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 เชเชพเชฎ เชเชฐเซ เชเซ!
เช
เชฎเซ เชญเชพเชทเชพเชฎเชพเช DAO เชฌเชจเชพเชตเชตเชพเชจเซ เชชเซเชฐเชเซเชฐเชฟเชฏเชพเชจเซ เชเชตเชฐเซ เชฒเซเชงเซ เชเซ เชฐเชพเชเชก4เชกเซเชเชชเซเชเชธ.
เชจเซเชเซเชจเชพ เชญเชพเชเซเชฎเชพเช, เชเชชเชฃเซ เชเซเชก เชฐเชฟเชซเซเชเซเชเชฐเชฟเชเช เช
เชจเซ เชเซเชธ เชเซเชธเซเชเชฟเชเช เชชเชฐ เชจเชเซเชเชฅเซ เชจเชเชฐ เชจเชพเชเซเชถเซเช.
เชเซเชกเชจเซเช เชธเชเชชเซเชฐเซเชฃ เชธเชเชธเซเชเชฐเชฃ
# 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
