แแแฃแแแ แฏแแก แงแแแแแก!
ะ
แแฎแแ แชแแขแ แแแแกแแแฏแแ แแแจแแแแ
แแขแแแ 3. dApp แแแแแ แแจแแก แขแแกแขแแ แแแ
แ แ แแ แแแแแแแแ แจแแแแฅแแแแ แแแจแแแแ แแแแกแแกแแแ? แแแ แแแแแ แแจแ?
แแแ แแแ แ แแแจแ:
Boob-แแ แแ Cooper-แแ แจแแแซแแแแ แจแแแแฎแแแแแ แแแแแแแแแ แแแแฎแแแ dApp-แแก แแแกแแแแ แแแ แ แแแฃแแแ แฃแแ แแแแแงแแแแแแ แแแแแ แแชแฎแแ แขแ แแแแแฅแชแแแแ แแ, แจแแกแแแแแแกแแ, แแแ แจแแซแแแแ แแแแแ แฌแแแแแแก.แแแแ แ:
แฉแแแ แแ แแแแแ แแ แแ แแแฆแฃแแแแ แแแแกแแก แแแแฎแแแแก แแแแแขแแแแก แแฃแแแก แแ/แแ แแฃแแแ แแก แแแแฎแแแแแก แแแ แแจแ. แแแแแแแแ, แงแฃแ แแแฆแแแ แแแแฅแชแแแ แแแแแแแฌแแแแแก, แแแแกแแแแ แงแแแแ แขแ แแแแแฅแชแแ แจแแกแ แฃแแแแแ.
แแแแแแแกแฌแแ แแ แแ-2 แแแแกแแก แแแ แซแแแแแ แแแแแ แแชแฎแแ แแแ แแแแแแแ. แแแแแ แแแแแแแแแกแแ แจแแกแฌแแ แแแฃแแ แกแแ แแแขแ:
๏ฟผ
แฉแแแ แแชแแแแแแ แแแแแแแขแแแแ แแแแแขแแแ dApp Alice-แแแ แแ แแแกแ แฎแแแแแฌแแ แแแแ. แฉแแแ แแแฆแแแ แจแแชแแแแแก:
แจแแแแชแแแแ แแแงแแแแ แแแงแแแแแก แแแแ:
broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 1000000}]}, payment: []}))
แกแชแแแแ แ แแฃแจแแแแก แแ แฉแแแ แแแแแ แแแแแ แแ-2 แฌแแ แขแแแ!
แแขแแแ 4. แจแแฅแแแแแ DAO แฎแแแก แแแชแแแแ
แกแแแฌแฃแฎแแ แแ, RIDE แแแ แฏแแ แแแแแ แแ แแซแแแแ แแแแแฅแชแแแแแแ แแฃแจแแแแแก แจแแกแแซแแแแแแแแก (แแแฅแกแแแแแแแแก แแแฅแกแแแแแแแ, แแขแแ แแขแแ แแแ, แ แแแฃแฅแขแแ แแแ แแ แ.แจ.). แแฃแแชแ, แแแแแกแแแแ แ แแแแ แแชแแแแแกแแแแก แแ แขแงแแแ แแแแแฅแชแแแแแ แกแแแแแแซแ แแแแจแแแแแแแ แฉแแแ แจแแแแแซแแแ แจแแแฅแแแแ แกแแกแขแแแ แกแขแ แแฅแแแแแแแ แแฃแจแแแแแกแแแแก, แจแแกแแแแแแกแแ แแแกแแฆแแแแแแ แแ แแแแ แแแจแแคแแ แแ.
แกแขแ แแฅแแแแแแก แจแแแ แแแแ แซแแแแแ แแแแแแแ; แกแขแ แแฅแแแแแ แจแแแซแแแแ แแแแแแงแแก แแแแแฅแกแแแแ.
แแแแแ แจแแแแแ แแแแ แแ แแแแแแแแแแแแ แกแขแ แแฅแแแ, แ แแแแ แช แกแแขแแกแขแ แแแแแแแแ แแ แจแแแแแแฌแแแ, แ แแแแ แแแแฅแแแแแแก แแก แแแ แแแแแแก แจแแแแแแ.
แฉแแแ แแแแแแแฎแแแแ แแ แคแแฅแขแแ, แ แแ แแแแกแแ แแแ แแแแฌแแ แ แฎแแแ แแแแแชแแแแก แขแ แแแแแฅแชแแแก, แ แแแแแ แแก แจแแกแแซแแแแแแแ แแแแแแแแแ แแงแ @verifier-แจแ แแ แขแแแแก แขแ แแแแแฅแชแแแกแแแแก.
แแแแแ แแแแแ แฏแแจแแ แกแขแ แแฅแแแแแแ แแ แจแแแแแ แแแแแแแแ แแ แแก.
RIDE แกแแแแแ
แขแ แแแแแฅแชแแ แแกแแ แจแแกแแซแแแแแแแ, แฉแแแ แแแชแแ แ แแแแ แแแแฃแจแแแ แกแขแ แแฅแแแแแแแ.
๏ฟผ
แกแแแ แแ แฏแแแจแ แงแแแแแคแแ แ แแแแฅแแก แ แแฃแแ แแแแแแแก แแแกแแฌแแ แแ DAO dApp.
แแแแแชแแแแ แขแ แแแแแฅแชแแแแ
แแแแแชแแแแ แขแ แแแแแฅแชแแแแ:
โแแแกแแฆแแแแก แแแฅแกแแแแแฃแ แ แแแแ แแ แแก 100 แกแแแแแแ แแ แแแกแแฆแแแ แจแแแซแแแแ แจแแแชแแแแแก แแแแแแแแฃแ แฃแแแแแแแก แแแแแก แฌแแ แขแแแแแก, แแแ แจแแ แแก แกแแแ แชแแแแก โโแแ แกแฎแแ แแแฃแแแญแแแ แกแแแแแแแแแก. แกแขแ แแฅแแแแแแก แแแแจแแแแแแแแแก แแฅแแ 32,768 แแแแขแแก แแแแแขแ แแ แแแแแชแแแแ แขแ แแแแแฅแชแแแจแ แจแแกแแซแแ แฉแแแแฌแแ แแแแก แแแฅแกแแแแแฃแ แ แ แแแแแแแแแ 100. แกแแแ แแ แฏแแแจแ, แแแแแชแแแแ แขแ แแแแแฅแชแแแก แแแฅแกแแแแแฃแ แ แแแแแ แแแแฎแแแแแแ 140 แแ - แชแแแแแกแแแแก, แแแแฅแแแก แแฃแกแขแแ แจแแฅแกแแแ แแก แแแแกแแก "แ แแแแ แแ แฏแฃแแแแขแ" แกแแแ แซแ. ''.
แฉแแแ แแฅแแแแ DAO-แก แจแแแแแแ แแแ แแแแแแ:
แแแแกแแแแแก, แ แแ แกแขแแ แขแแแแ แแแแฆแแก แแแคแแแแแกแแแ แแแ แแแแแ getFunds () แกแแญแแ แแ แแแแแแฃแ 2 แแแแแฌแแแแก - DAO แแแแแกแขแแ แแแแก แแฎแแ แแแญแแ แ. แแแงแแแแ แจแแกแแซแแแแแแ แแฅแแแแ แแฃแกแขแแ แแแแแแ, แ แแแแแแแช แแแแแแแแฃแแแ แฎแแแก แแแชแแแ DAO-แก แแคแแแแแแแแ.
แแแแแ แแแแแแแแแ 3 แขแแแแก แแแกแแฆแแแ แแ แแแแแแแขแแ แแแแแแ แแแจแแแแแแ แแฃแจแแแแแกแแแแก 2 แแฎแแ แคแฃแแฅแชแแแจแ แฎแแแก แแแชแแแ แแ แแแแฆแแFunds:
xxโฆxx_แแ = แแแแแกแขแแ แแแ, แฎแแแแแกแแฌแแแแแ แแแแแแกแ (แฎแแแก แแแชแแแ, แแแแแแแขแ, แแแขแแแ)
xxโฆxx_แกแ = แกแขแแ แขแแแแแ, แฎแแแแแก แ แแแแแแแแ (แฎแแแก แแแชแแแ, แแแแฆแแ แกแแฎแกแ แแแ)
xxโฆxx_แกแค = แกแขแแ แขแแแแแ, แฎแแแแแก แ แแแแแแแแ (แฎแแแก แแแชแแแ, แแแแฆแแ แกแแฎแกแ แแแ)
xxโฆxx = แกแแฏแแ แ แแแกแแแแ แแ (35 แกแแแแแแ)
แแแฎแแแ, แแแแแแแแแกแฌแแแแ, แ แแ Vote-แจแ แแแญแแ แแแแแแ แแ แแแ แแฃแแแ แ แแแแแแแแ แแแแแก แแแแแฎแแแแ:
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: []}))
แแแแแชแแแแ แแแฆแแแแแจแ แฉแแแ แแฎแแแแแ แงแแแแ แกแแญแแ แ แฉแแแแฌแแ แก แแแแแก แแแกแแแแ แแแกแแแแก:
แแฃแแแ แแ แแกแแแ แฎแแ แแแกแชแ แแแแแก แแ แแแฅแขแก.
แแแแแ แจแแแฎแแแแ แคแฃแแฅแชแแแก แแแแก แแแแฆแแ แคแแแแแแ. แแแแแ แฃแแแ แจแแแแ แแแแก แแแแแแฃแ 2 แฎแแ, แ แแ แจแแซแแแก แแแแฎแแแแก แแแแฆแแแ 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