使用Web3.py调用合约时列表参数转元组致调用失败
问题分析与解决
核心问题
你遇到的参数类型不匹配,根本原因不是列表被转为元组,而是传入的第二个参数内部元素类型不符合合约函数的要求:
- 合约函数
swapExactNATIVEForTokens的第二个参数要求是(uint256[], uint8[], address[]),也就是三个数组类型组成的元组/结构体; - 但你传入的是
(10, 1, list),其中10和1是单个整数,不是数组,这才是类型不匹配的关键。
Web3.py会自动将传入的序列(列表、元组)映射为合约对应的数组/结构体类型,但这里的问题是你给的元素类型不对,而非外层的元组格式问题。
修复代码
把第二个参数里的单个整数改成数组形式,确保每个元素都符合合约要求的数组类型:
swap_txn = btc_bridge_contract.functions.swapExactNATIVEForTokens( amountOfMinBtc, ([10], [1], list), address, deadline ).build_transaction({ 'from': address, 'value': amount_avax, 'gas': 300000, 'gasPrice': gas_price, 'nonce': nonce, })
额外说明
如果合约里的第二个参数是结构体类型,Web3.py接受元组或列表作为外层容器,只要内部元素的类型和数量匹配合约定义即可。你之前的list本身是正确的address数组,问题出在前面两个单个整数没有包装成数组。
内容的提问来源于stack exchange,提问作者Soska512
相关产品推荐
相关产品推荐

