Ride4Dapps:TypeError 无法读取 invokeScript 中未定义的 属性 'length'
Ride4Dapps: TypeError Cannot read property 'length' of undefined in invokeScript
我正在尝试执行 wallet.ride 示例,但我遇到了一些问题:
广播(调用脚本({合同地址:地址(env.accounts[1]),调用:{函数:"deposit",参数:[]},付款:[{金额:300000000,asset:null }]}))
TypeError: 无法读取未定义的 属性 'length'
如何解决?
# In this example multiple accounts can deposit their funds and safely take them back, no one can interfere with this.
# An inner state is maintained as mapping `address=>waves`.
# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
# broadcast(transfer({recipient:address(env.accounts[1]), amount: 1000000000}))
# broadcast(transfer({recipient:address(env.accounts[2]), amount: 1000000000}))
# From account #1:
# deploy()
# From account #2:
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 300000000, asset:null }]}))
# # observe state and balance of account(1)
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 200000000, asset:null }]}))
# # observe state and balance of account(1)
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 600000000}]}, payment: []}))
# # observe error, nothing changed
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 400000000}]}, payment: []}))
# # observe state and balance of account(1)
{-# 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 currentAmount = match getInteger(this, currentKey) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount + pmt.amount
WriteSet([DataEntry(currentKey, newAmount)])
}
}
@Callable(i)
func withdraw(amount: Int) = {
let currentKey = toBase58String(i.caller.bytes)
let currentAmount = match getInteger(this, currentKey) {
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(currentKey, newAmount)]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Verifier(tx)
func verify() = {
true
}
已解决!
看看: fee = 100000000 和 dappAddress 而不是 contractAddress
# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
# broadcast(transfer({recipient:address(env.accounts[1]), amount: 100000000, fee: 100000000}))
# broadcast(transfer({recipient:address(env.accounts[2]), amount: 100000000, fee: 100000000}))
# From account #1:
# deploy()
# From account #2:
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 300000000, asset:null }]}))
# # observe state and balance of account(1)
我正在尝试执行 wallet.ride 示例,但我遇到了一些问题:
广播(调用脚本({合同地址:地址(env.accounts[1]),调用:{函数:"deposit",参数:[]},付款:[{金额:300000000,asset:null }]}))
TypeError: 无法读取未定义的 属性 'length'
如何解决?
# In this example multiple accounts can deposit their funds and safely take them back, no one can interfere with this.
# An inner state is maintained as mapping `address=>waves`.
# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
# broadcast(transfer({recipient:address(env.accounts[1]), amount: 1000000000}))
# broadcast(transfer({recipient:address(env.accounts[2]), amount: 1000000000}))
# From account #1:
# deploy()
# From account #2:
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 300000000, asset:null }]}))
# # observe state and balance of account(1)
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 200000000, asset:null }]}))
# # observe state and balance of account(1)
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 600000000}]}, payment: []}))
# # observe error, nothing changed
# broadcast(invokeScript({contractAddress: address(env.accounts[1]), call:{function:"withdraw",args:[{type:"integer", value: 400000000}]}, payment: []}))
# # observe state and balance of account(1)
{-# 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 currentAmount = match getInteger(this, currentKey) {
case a:Int => a
case _ => 0
}
let newAmount = currentAmount + pmt.amount
WriteSet([DataEntry(currentKey, newAmount)])
}
}
@Callable(i)
func withdraw(amount: Int) = {
let currentKey = toBase58String(i.caller.bytes)
let currentAmount = match getInteger(this, currentKey) {
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(currentKey, newAmount)]),
TransferSet([ScriptTransfer(i.caller, amount, unit)])
)
}
@Verifier(tx)
func verify() = {
true
}
已解决! 看看: fee = 100000000 和 dappAddress 而不是 contractAddress
# You can try this contract by following commands in the IDE (ide.wavesplatform.com)
# Run commands as listed below
# From account #0:
# broadcast(transfer({recipient:address(env.accounts[1]), amount: 100000000, fee: 100000000}))
# broadcast(transfer({recipient:address(env.accounts[2]), amount: 100000000, fee: 100000000}))
# From account #1:
# deploy()
# From account #2:
# broadcast(invokeScript({dappAddress: address(env.accounts[1]), call:{function:"deposit",args:[]}, payment: [{amount: 300000000, asset:null }]}))
# # observe state and balance of account(1)