Как передать параметры из представления Django в функцию контракта, используя web3.py - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть контракт, в котором есть функция выплат с тремя входами:

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() is:

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 [])'] Ошибка вызова функции из-за отсутствия соответствующих типов аргументов.

1 Ответ

0 голосов
/ 19 сентября 2018

Ошибка говорит о том, что неверный тип передается в метод контракта.Без определения bounty_for_answering() трудно быть по-настоящему конкретным, но здесь повторяется сообщение об ошибке с выделенными соответствующими частями:

Не удалось определить предполагаемую функцию с выплатой имени, позиционным аргументом (с).) типа (<class 'list'>, <class 'list'>, <class 'set'>) и ключевой аргумент (аргументы) типа {}.Найдено 1 функция (ей) с именем выплаты: ['payout (uint256 [], address [], uint256[])'] Ошибка вызова функции из-за отсутствия соответствующих типов аргументов.

Питон set неупорядочен, но функция контракта ожидает упорядоченный список в качестве третьего аргумента.Очень вероятно, что порядок имеет значение в функции контракта, поэтому вам, вероятно, нужно проделать определенную работу, чтобы упорядочить значения, прежде чем передавать их в вызов метода контракта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...