You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python web3调用Pancakeswap swapExactTokensForTokens报错如何解决

问题修复方案

错误根因

报错来自三个核心问题:

  1. 调用swapExactTokensForTokens的参数数量、顺序和合约ABI要求不匹配
  2. 入参类型不符合EVM要求,传入了不被支持的float类型
  3. 交易参数里错误添加了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 05:33:02