Arbitrum主网Balancer batchSwap交易失败排查求助
问题分析与修复方案
核心问题1:Limits参数配置错误
Balancer batchSwap 的 limits 数组遵循严格规则:
- 输入资产(此处为ETH,对应assets数组第0位):用负数表示允许转出的最大数量(即最多消耗的ETH金额)
- 输出资产(此处为VST,对应assets数组第2位):用正数表示要求接收的最小数量(若需滑点保护,需计算后填入;无需求可设0)
- 中间过渡资产(USDC,第1位):设为0即可
你当前的 [value_of_eth, 0, 0] 完全不符合规则,应修正为:
[-value_of_eth, 0, 0]
核心问题2:原生ETH输入的步骤参数错误
当使用原生ETH作为输入时,batchSwap 第一个步骤的 amount 参数必须设为0——因为ETH的金额是通过交易的 value 字段传入的,而非步骤内的 amount 参数。你当前将该值设为 value_of_eth,会导致合约逻辑冲突,触发RPC节点的错误反馈。
修正后的第一个步骤:
("0x64541216bafffeec8ea535bb71fbc927831d0595000100000000000000000002", 0, 1, 0, eth_abi.encode_abi(['uint256'], [0])),
其他需调整的参数
- GasPrice设置过低:Arbitrum主网当前基础Gas Fee远高于0.1Gwei(100000000),建议使用网络推荐值或至少设为500000000(0.5Gwei):
"gasPrice": w3.eth.gas_price, - 明确指定ChainId:取消注释
"chainId": 42161,避免网络不匹配引发隐性错误。
修正后的完整代码片段
estimate_txn = BALANCER_VAULT_CONTRACT.functions.batchSwap( 0, [ # 修正ETH输入步骤的amount为0 ("0x64541216bafffeec8ea535bb71fbc927831d0595000100000000000000000002", 0, 1, 0, eth_abi.encode_abi(['uint256'], [0])), ("0x5a5884fc31948d59df2aeccca143de900d49e1a300000000000000000000006f", 1, 2, 0, eth_abi.encode_abi(['uint256'], [0])), ], [ w3.toChecksumAddress("0x0000000000000000000000000000000000000000"), w3.toChecksumAddress("0xFF970A61A04b1cA14834A43f5dE4533eBDDB5CC8"), w3.toChecksumAddress("0x64343594Ab9b56e99087BfA6F2335Db24c2d1F17"), ], (w3.toChecksumAddress(your_wallet), False, w3.toChecksumAddress(your_wallet), False), # 修正limits参数,ETH输入用负数 [-value_of_eth, 0, 0], int(time.time() + 100 * 60) ).buildTransaction({ "nonce": nonce, "from": your_wallet, "value": value_of_eth, # 使用网络推荐gasPrice "gasPrice": w3.eth.gas_price, "gas": 2000000, # 明确指定Arbitrum chainId "chainId": 42161 })
内容的提问来源于stack exchange,提问作者Egettl
相关产品推荐
相关产品推荐

