
แแแแถแแแฝแแแแปแแแแแแแแแแแแถ!
ะ แแแแแแแแแแพแแแทแแทแแแแแพแแแแแขแทแแขแแแธแแแแแแแแแพแ แแทแแแแแพแแถแแแถแแฝแ dApp (แแแแแแทแแธแแทแแแแแแถแ) แแ แแแแปแ .
แแแโแแถแโแแแแโแงแแแแแโแแแโแแแโแ แแโแแแแแทแ โแฅแกแผแโแแแแ .
แแแแถแแแแถแแแธ 3. แแถแแแแแแแแแธ dApp

แแพแแถแแแแแ แถแขแแแธแแพแแกแพแแแแแถแแแ แแแแแขแแแแแถแแฝแแขแถแแธแ? แ แแแแ แแแแธ?
แแธแแฝแ:
Boob แแทแ Cooper แขแถแ แแแแพแแแแถแแแแแแ แแแแแแแ แแถแแแขแถแแแแแแถแ dApp แแแแแแแพแแแแแถแแ แแถแแแแแแแแแแถแแ แแแแแทแแแแแทแแถแ แ แพแแแผแ แแแแแแนแแแทแแขแถแ แ แผแแแแแพแแฝแแแถแแแแทแแแถแแแแแแธแแธแ:
แแพแแแทแแแถแแแแแแแทแ Alice แแแแปแแแแแแแแถแแแถแแฝแแแธแแถแแแแแแแถแแแแแแแแแถแแแถแแแแแแแแแแธ Boob แแทแ/แฌ Cooper แแแ แ แถแแแแถแแแแธ, แแแ แทแแแแแปแแแถแแแแพแแแแธแแแแแแแแแถแแ, แแแแแทแแแแแทแแถแแแถแแแขแแแแธ Alice แแนแแแแแผแแแถแแแแแแทแแแแแทแ
แแแแแฝแแแปแแแธ 2 แแแแ แถแแขแถแแธแ แแถแแแแแแแแแแถแแ แแแแแทแแแแแทแแถแแ แ
แผแโแแแแพโแแแแแแธแโแแแโแแถแโแแโแแแแแผแแ

๏ฟผ
แแพแแแแแปแแแแแถแแถแแแแแถแแแแธ dApp Alice แแทแแ แแแแแแแถแแแแแแถแแ แแพแแแแฝแแแถแแแแ แปแแแฝแแ

แ แผแแแพแแแแแถแแถแแแแแแแแถแแแแแแแถแแแ
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))แแแแแแธแแแแแพแแแถแแ แพแแแพแแแแแพแแ แแแปแ แแธ 2!
แแแแถแแแแถแแแธ 4. แแแแแพแ DAO แแถแแฝแแแนแแแถแแแแแแแแแ
แแถแขแแปแแ แแถแแถ RIDE แแทแแแถแแแแแแแแแแแแแถแแแแแปแแแถแแแแแพแแถแแแถแแฝแแแแแแปแ (แแ แแถแแปแแแแ แแ แแถแแปแแแแ แขแแแแแแแแแกแพแแแทแ แขแแแแแถแแแแแแแแแแ)แ แแแแแแถแแแถแแแแแแแแแแถแแแแแแแทแแแแแทแแถแแแถแแฝแแแถแแฝแแแนแแแถแแแแแแผแแแแแแแแแแ แแแแแแแแแถแแแ แปแ แแพแโแขแถแ โแแ แแถโแแแแแแแแโแแฝแโแแแแแถแแโแแแแพโแแถแโแแถแแฝแโแแแแโแแแแโแแถแโแแแแถแแโแ แปแ โแแทแโแแถแโแแทแแแแธแโแแแแโแแถโแ
แแแแแขแแแแแแถแแแถแแแถแแแแแฝแแแแแปแแแถแแแแแถแแแแแแแขแแแแแขแถแ
แแแแผแแแถแแแแแแแแแแแแแแแแแแแ
แ
แผแแแพแแแแแแผแ แแทแแแแแแแแแขแแแแแแถแงแแถแ แแแแแถแแแแแ แ แพแแแทแแทแแแแแพแแแถแแพแแถแแแแแถแแแแแแแแแแแแแแแแแแทแแแแแทแแถแแแแถแแแผแ
แแแแแ
แ
แแพแแแถแแแแแแแแถแแแพแแถแแแทแแแแแแถ Alice แแทแแขแถแ
แ
แปแแ แแแแแแแถแแพแแแแแทแแแแแทแแถแแแแแแแแแแถแแแแถแแแ แแแแแถแแแแแแแแถแแแแแแแแผแแแถแแแถแแถแแแแ
แแแแปแ @verifier แแแแแถแแแแแแแทแแแแแทแแถแแแแแแแแแแแ
แ แผแแแพแแขแแปแแแแแแถแแฝแแแแแแขแแแแ แ แพแแแแแแถแแแแแแแแแแแถแแแถแ
แแแแแขแแแแแแทแ
แแแแแทแแแแแทแแถแแขแถแ
แแแแพแแ
แแถแแแแแแแแ แแพแแแนแแแธแแแแแแแแพแแถแแแถแแฝแแแแแแขแแแแแ

๏ฟผ
แแแปแแแ แแพแแแถแแขแแแธแแแแแแแแถแแแแแ
แถแแแถแ
แแแพแแแแธแแแแแแแแแแแทแแแแถแแแแปแแแแแถแ DAO dApp.
แแแแแทแแแแแทแแถแแแทแแแแแแ
แแแแแทแแแแแทแแถแแแทแแแแแแแ
โแแแ แแขแแทแแแแถแแแแแถแแแแแแบ 100 แแฝแขแแแแ แ แพแแแแแฝแแขแถแ
แแถแแ
แแแปแ
แแผแแแผแแธแแผแแแถแแขแแแพแ
แทแแแ แแฝแแแถแแแแแแแแถ แแทแแแทแแทแแแแแแแแถแแแแแทแแขแถแ
แแแแแปแแแแแถแแแแแแแแแแ แแแแแแแแแแขแแแแแแถแแแแแแแแแ 32,768 แแ แ แพแแ
แแแฝแแขแแทแแแแถแแแแถแแปแแแแขแถแ
แแแแพแแถแแแ
แแแแปแแแแแแทแแแแแทแแถแแแทแแแแแแแแบ 100 แ แแแปแแแ แแแ แแขแแทแแแแถแแแแแแแทแแแแแทแแถแแแทแแแแแแแแบแแแแ แแ 140kb โ แแแแแถแแแแถแฏแแแถแแแแ แแแแพแแแแแแแแแแแแแถแแแแแแแแ Shakespeare 'Romeo and Juliet 'แ
แแพแแแแแแพแ DAO แแแแแถแแแแแแแแแแแผแ
แแถแแแแแแแ
แแพแแแแธแฑแแแแถแแ
แถแแแแแแพแแขแถแแธแแแแแแแแฝแแแถแแแผแแแทแแทแแแแแถแแ แ
แแผแแแแแแ getFunds() แแถแแแถแแแแแแธแขแแแแ
แผแแแฝแแแแถแแ แแ
แแถแแ 2 แแถแแ - แขแแแแแทแแทแแแ DAO - แแแแผแแแถแแแถแแแถแแ แแแแแแถแแ แแถแแนแแขแถแ
แแแแพแแ
แแถแแแแถแแแทแแแแแถแแแแผแ
แ
แแแฝแแแแปแแแแแแถแแแแแ แถแแแ
แแพ แแถแแแแแแแแแ แแแ
แถแแ DAO แ
แแแแแแแแพแแแผแแแ 3 แแแแแแ แ แพแแแแแแแแแแแแแทแแแแถแแแแแถแแแแแแพแแถแแแถแแฝแแแแแปแแแแแแแปแแแปแแแถแแแแแธแ แแแฝแ 2 vote แแทแ getFundsแ
xxโฆxx_แขแถแ = แแทแแทแแแแทแ แแแแปแแแแแแแแถแ (แแแแแแแแ แแถแแแแแแถแแ แแแแแแถแแ)
xxโฆxx_sv = แแถแแ แถแแแแแแพแ, แ แแแฝแแแแแถแแแแแแแแแ (แแแแแแแแ แแแฝแแแถแแแผแแแทแแท)
xxโฆxx_sf = แแถแแ แถแแแแแแพแ, แ แแแฝแแแแแถแแแแแแแแแ (แแแแแแแแ แแแฝแแแถแแแผแแแทแแท)
xxโฆxx = แขแถแแแแแแถแแแถแแถแแแ (แฃแฅ แแฝแขแแแแ)
แแผแแ แแแถแแแถแแ แแแแปแ Vote แแพแแแแแผแแแแแพแแ แแ แปแแแแแแแแถแแแถแแแถแ แแแพแแแแแปแแแแแแแแฝแแ
WriteSet([DataEntry(key1, value1), DataEntry(key2, value2)]),WriteSet แขแแปแแแแถแแฑแแแแพแแแแแแพแแแแแแแแแแถแแถแ แแแพแแแแแปแแแแแแแแฝแแแแแปแแแฝแ invokeScript แแแแแทแแแแแทแแถแแ
แแแโแแถโแขแแแธโแแแโแแถโแแพแโแแ
โแแผแ
โแแถโแแ
โแแแแปแโแแถแโแแแแปแโแแแแแโแแแแแนแโแแ DAO dApp แแแแแถแแโแแธ Bob แแทแ Cooper แแถแโแแแแแโแแแแแแ ia-แแแแถแแแแแแแพแ

แแปแแแถแแแถแแแแแแถแแแแแแแแพแแแถแแแแแถแแแแแแผแแแแแแทแ
แแแแแฝแ
แ

แฅแกแผแแแแแแแแแแแแแแแแแแถแแแแแแปแแแ แแแแปแแแแแแแแถแแแแแ DAO - แแแแแแแแ แแแแแถแแแแแแแแแแแแแแแผแแแแแแแ แทแแแแแแแแแถแแ
Bob แแแแแแแแแฑแแแแแแแแแแแ 500000 แแแแ Neliแ
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"vote",args:[{type:"integer", value: 500000}, {type:"string", value: "3MrXEKJr9nDLNyVZ1d12Mq4jjeUYwxNjMsH"}]}, payment: []}))
แแ
แแแแปแแแแแถแแแแทแแแแแแ แแพแแแพแแแถแแปแ
แถแแแถแ
แแแถแแแขแแแแแแแถแแแขแถแแแแแแถแแแแแ Neliแ

Cooper แแแแถแแแแแแแแแแฑแแแแแแแแ Neli แแแแแแ

แแแแแพแแแผแแแปแแแถแ แแแฝแแแถแแแผแแแทแแท. Neli แแแแผแแแแแแแแผแแแแกแแแแแถแแแทแ
2 แแพแแแแธแขแถแ
แแแแผแแแทแแทแแธ DAO แ

Neli แแนแแแแแถแแแแแแแถแแแแ แแแฝแแแนแแแแแถแแแแแแแแแแแแฑแแแแถแแ
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"getFunds",args:[{type:"integer", value: 500000}]}, payment: []}))
แแถแแแแแแแ แแแแแบ DAO แแแแพแแถแ!
แแพแแแถแแแทแแทแแแแแพแแแแแพแแแถแแแแแถแแแแแแพแ DAO แแถแแถแแถ แแทแ 4DAPPS.
แแ
แแแแปแแแแแแแแถแแแแแแ แแพแแแนแแแทแแทแแแแแพแแฑแแแแถแแแแแแทแแแแแแพแแถแแแแแแแแแผแ แแทแแแถแแแแแพแแแแแแแแแธแ
แแแแแแแแแแแแแแผแแแ แแแแปแ
# 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
