智能合约函数调用上的 ValidationError 无明显原因web3py?

问题描述

我正在尝试调用 Uniswap 的路由器函数 swapExactTokensForETHSupportingFeeOnTransferTokens()。当我在 etherscan 上手动输入值时,它会通过。但是,当我通过 python 代码执行此操作时,它给了我一个验证错误错误如下:

web3.exceptions.ValidationError: Could not identify the intended function with name swapExactTokensForETHSupportingFeeOnTransferTokens,positional argument(s) of type (<class int>,<class int>,<class list>,<class str>,<class float>) and keyword argument(s) of type {}. Found 1 function(s) with the name swapExactTokensForETHSupportingFeeOnTransferTokens: [swapExactTokensForETHSupportingFeeOnTransferTokens(uint256,uint256,address[],address,uint256)] Function invocation Failed due to no matching argument types.

这是我使用的代码

swap = uniswap_router_contract.functions.swapExactTokensForETHSupportingFeeOnTransferTokens(uint amount,list_of_two_token_addresses,my_address_string,unix_time_stamp_deadline).buildTransaction({'nonce': some_nonce})

gas_amount = web3.eth.estimateGas(swap)

print(gas amount)

我应该以某种方式将我的整数转换为 python 中的 unsigned int 吗?我试过了,但没有解决。我使用 web3py 库。有人可以指导我解决问题或调用所述函数的现有代码吗?

谢谢。

编辑:

我将时间戳转换为 int,并使用 web3.tochecksum 方法确保我的地址字符串是校验和。

swap = uniswap_router_contract.functions.swapExactTokensForETHSupportingFeeOnTransferTokens(uint amount,int(unix_time_stamp_deadline)).buildTransaction({'nonce': some_nonce})
gas = web3.eth.estimateGas(swap)
print(gas)

当我运行它时,它给了我这个错误

引发 solidityError(response['error']['message']) web3.exceptions.solidityError:执行恢复:TransferHelper: TRANSFER_FROM_Failed

解决方法

您传递的参数类型与函数的预期参数类型不匹配。

你正在通过:

int,int,list,str,float

但函数期望:

uint256,uint256,address[],address,uint256

我猜是最后一个参数 unix_time_stamp_deadline 导致了不匹配。它是一个浮点数,但该函数需要一个整数。您可以在将其传递给函数时将其转换为 int,如下所示:

int(unix_time_stamp_deadline)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...