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

使用web3py调用swapExactTokensForTokens兑换CAKE2转tBNB报STF错误求助

问题排查与解决

首先说明STF是PancakeSwap V2 Router合约的自定义错误码,对应Swap操作失败的场景,结合你的代码,主要问题有以下几点:

核心错误点

  • 错误传入value参数:swapExactTokensForTokens是ERC20代币之间的兑换函数,不需要在交易中附带BNB(value参数)。只有当使用BNB兑换代币的swapExactETHForTokens系列函数时,才需要通过value传入BNB数量。你当前传入了0.0001 BNB,会导致合约逻辑异常触发失败。
  • 缺少代币授权操作:在调用Swap函数前,必须先调用CAKE2代币合约的approve方法,授权PancakeSwap Router合约可以转移你的CAKE2代币。如果没有授权,合约无法获取你的代币,直接导致Swap失败。
  • 遗漏deadline参数:swapExactTokensForTokens函数需要5个参数,你当前只传了4个,漏掉了最后一个**交易截止时间(timestamp)**参数,参数不匹配会直接触发合约错误。

修正后的代码步骤

1. 先执行CAKE2代币授权

# 初始化CAKE2代币合约实例(需补充CAKE2的ABI)
cake2_contract = web3.eth.contract(address=cake2_address, abi=cake2_abi)

# 构建授权交易:允许Router合约使用你的CAKE2,金额要大于等于Swap的数量
approve_txn = cake2_contract.functions.approve(
    pancake_router_address,
    web3.to_wei(0.00005, 'ether')
).build_transaction({
    'from': wallet_address,
    'gas': 100000,
    'gasPrice': web3.to_wei('1', 'gwei'),
    'nonce': nonce,
})

# 签名并发送授权交易,等待确认
signed_approve_txn = web3.eth.account.sign_transaction(approve_txn, private_key=private_key)
approve_tx_hash = web3.eth.send_raw_transaction(signed_approve_txn.raw_transaction)
web3.eth.wait_for_transaction_receipt(approve_tx_hash)
nonce += 1  # 授权交易完成后,nonce需要递增

2. 修正Swap交易代码

pancakeswap2_txn = pancake_router_contract.functions.swapExactTokensForTokens(
    web3.to_wei(0.00005, 'ether'),  # 要卖出的CAKE2数量
    0,  # 最小接收tBNB数量(建议设置合理值,比如预估数量的95%,避免滑点损失)
    [cake2_address, WBNB_address],  # 兑换路径:CAKE2 -> WBNB(tBNB对应包装后的WBNB)
    wallet_address,
    web3.eth.get_block('latest')['timestamp'] + 300  # 交易截止时间:当前时间+5分钟
).build_transaction({
    'from': wallet_address,
    # 移除多余的value参数
    'gas': 250000,
    'gasPrice': web3.to_wei('1', 'gwei'),
    'nonce': nonce,
})

signed_txn = web3.eth.account.sign_transaction(pancakeswap2_txn, private_key=private_key)
tx_token = web3.eth.send_raw_transaction(signed_txn.raw_transaction)
print("Transaction's hex is: ", web3.to_hex(tx_token))

额外注意事项

  • 建议不要将最小接收数量设为0,这会导致交易可能被MEV机器人利用,造成不必要的损失。可以通过PancakeSwap的API预估兑换数量,然后设置为预估量的90%-95%作为最小接收值。
  • 确认[cake2_address, WBNB_address]的兑换路径在PancakeSwap V2上存在流动性池,如果路径不存在,Swap也会失败。

内容的提问来源于stack exchange,提问作者user9805040

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 09:13:20