我有一个具有支付功能的合同,其中包含三个输入:
function payout(uint256[] ids, address[] recipients, uint256[] amounts) public authorized {
require(ids.length == recipients.length && ids.length == amounts.length);
for (uint i = 0; i < recipients.length; i++) {
Payout(ids[i], recipients[i].send(amounts[i]));
}
}
,并且在views.py
中定义了一个调用该函数的函数:
q=Question.objects.filter()
ids = []
adds = []
for cur in q:
for a in cur.answer.all():
ids = a.user.id
adds = a.user.user_wallet_address
bounty_for_answering(ids, adds, cur.ether)
return redirect('/')
和bounty_for_answering()
是:
def bounty_for_answering(ids, usersWalletAddress, bountyAmount):
amount_in_wei = w3.toWei(bountyAmount, 'ether')
nonce=w3.eth.getTransactionCount(usersWalletAddress)
txn_dict = contract_instance.functions.payout(ids, usersWalletAddress, bountyAmount).buildTransaction({
'gas': 30000,
'gasPrice': w3.toWei('40', 'gwei'),
'nonce': nonce,
'chainId': 3
})
signed_txn = w3.eth.account.signTransaction(txn_dict, wallet_private_key)
txn_hash = w3.eth.sendRawTransaction(signed_txn.rawTransaction)
txn_receipt = w3.eth.getTransactionReceipt(txn_hash)
count = 0
while tx_receipt is None and (count < 30):
time.sleep(10)
tx_receipt = w3.eth.getTransactionReceipt(txn_hash)
print(tx_receipt)
if tx_receipt is None:
return {'status': 'failed', 'error': 'timeout'}
其中user_wallet_address
是MetaMask钱包地址。
问题是我不知道如何将输入参数传递给bounty_for_answering
并收到此错误:
无法识别名称为
payout
,类型为(<class 'list'>, <class 'list'>, <class 'set'>)
的位置参数和类型为{}
的关键字参数的预期函数。 找到1个名称为payout
的函数:['payout(uint256 [],address [],uint256 [])'] 由于没有匹配的参数类型,导致函数调用失败。
答案 0 :(得分:0)
该错误告诉您正在将错误的类型传递给合同方法。如果没有bounty_for_answering()
的定义,很难确切说明,但是这里重复了错误消息,并突出了相关部分:
无法使用名称支付,
(<class 'list'>, <class 'list'>
类型,<class 'set'>
)的位置参数和{}类型的关键字参数来识别预期的函数。找到1个名称为payout的函数:['payout(uint256 [],address [],uint256[]
)']由于没有匹配的参数类型,函数调用失败。>
python set
是无序的,但是contract函数期望将有序列表作为第三个参数。订单在合同功能中发挥作用的机会非常好,因此在将值传递到合同方法调用之前,您可能需要做一些工作以对值进行排序。