Python web3调用Pancakeswap swapExactTokensForTokens报错如何解决
问题修复方案
错误根因
报错来自三个核心问题:
- 调用
swapExactTokensForTokens的参数数量、顺序和合约ABI要求不匹配 - 入参类型不符合EVM要求,传入了不被支持的float类型
- 交易参数里错误添加了
value字段(ERC20代币兑换不需要原生币转账)
具体修复步骤
首先明确PancakeSwap Router的swapExactTokensForTokens方法的标准ABI参数顺序:swapExactTokensForTokens(uint256 amountIn, uint256 amountOutMin, address[] path, address to, uint256 deadline)
总共5个入参,你原代码只传了4个,漏了第一个参数「要花费的代币数量」,把最小接收量放到了第一个参数的位置,导致参数匹配失败:
- 第一个入参:你要花费的BUSD数量(wei单位的整数,也就是你调用
getAmountsOut时传的amount参数) - 第二个入参:最小可接收的CAKE数量,需要是int类型(EVM不支持float类型的数值入参)
- 第三个入参:兑换路径数组
[tokenToSpend, tokenToBuy] - 第四个入参:CAKE接收地址
- 第五个入参:交易过期时间戳
然后修复参数类型问题:你计算minReceived时做了乘法运算,得到的是float类型,需要强转为int。
另外移除交易配置里的value字段:你当前是BUSD兑换CAKE,属于ERC20代币之间的兑换,不需要转账BNB原生币,value字段是原生币交易专用,填了会导致交易异常。
额外注意:调用兑换方法前,必须先调用BUSD合约的approve方法,给PancakeSwap Router合约授权足够的BUSD额度,否则交易会因为额度不足失败。
修复后代码示例
# Calculate minimum amount of tokens to receive receive = contract.functions.getAmountsOut(amount, [tokenToSpend, tokenToBuy]).call() # 强转为int,避免float类型报错 minReceived = int(receive[1] * 0.9) receiveReadable = web3.fromWei(minReceived,'ether') print("Minimum tokens to recieve:", str(receiveReadable)) # Trade execution: # 补全第一个参数amount,调整入参顺序 pancakeswap2_txn = contract.functions.swapExactTokensForTokens( amount, # 新增:要花费的BUSD数量(wei单位) minReceived, [tokenToSpend,tokenToBuy], sender_address, (int(time.time()) + 1000000) ).buildTransaction({ 'from': sender_address, # 移除了value字段,代币兑换不需要 'gasPrice': web3.toWei('5','gwei'), 'nonce': nonce, })
内容的提问来源于stack exchange,提问作者BJonas88
相关产品推荐
相关产品推荐

