使用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
相关产品推荐
相关产品推荐

