Uniswap Universal Router执行WETH转DAI交易触发CALL_EXCEPTION错误
问题排查与解决方案
Calldata错误的可能性分析
- 版本适配问题:确认你使用的AlphaRouter SDK版本,是否与Arbitrum链上部署的Uniswap Universal Router合约版本匹配。不同版本的Router合约(如v1/v2)的Command格式、参数顺序存在差异,版本不匹配会直接导致calldata解析失败。
- 地址与参数校验:检查AlphaRouter返回路径中WETH、DAI的Arbitrum链地址是否正确(WETH:
0x82aF49447D8a07e3bd95BD0d56f35241523fBab1,DAI:0xDA10009cBd5D07dd0CeCc66161FC93D7c9000da1);同时确认交易金额参数是否用对单位(必须是wei而非ether),滑点限制的数值格式是否符合合约要求。 - 权限与状态校验:虽然你已授权Permit2,仍要确认授权的金额是否覆盖本次交易的WETH输入量,且授权未过期。可直接在分叉链上调用Permit2合约的
allowance方法查询状态。
是否需要自行解析Command调用execute?
不需要。AlphaRouter生成的calldata已经是直接调用Universal Router execute方法的完整编码数据,其中封装了所有必要的Command数组和参数。自行解析重构反而容易因为参数顺序、编码格式错误触发异常,除非你需要自定义路由逻辑,否则直接使用AlphaRouter的结果即可。
进一步调试步骤
- 开启Anvil详细日志:启动Anvil时添加
--trace或--verbose参数,获取交易执行的完整栈跟踪信息,定位CALL_EXCEPTION触发的具体合约、指令位置,比如是swap合约调用失败还是Permit2授权环节出问题。 - 拆分Command单独测试:将AlphaRouter返回的Command数组拆分,单独调用
execute执行单个Command(比如先测试PERMIT2_TRANSFER_FROM,再测试V3_SWAP_EXACT_IN),定位哪一步触发错误。 - 用Foundry手动模拟调用:使用
cast call命令直接在Anvil环境中执行交易,获取更详细的错误反馈,示例命令:cast call <UNIVERSAL_ROUTER_ADDRESS> "<execute(bytes)>(bytes)" <GENERATED_CALDATA> --rpc-url http://localhost:8545 --from <YOUR_ADDRESS> - 检查分叉链状态:重新初始化Anvil分叉,或切换到其他Arbitrum节点提供者(如Alchemy)对比测试,排除Infura分叉节点的状态异常问题。
- 调整Gas设置:手动将交易Gas Limit设置为
3000000或更高,避免因Gas不足导致的隐性异常。
内容的提问来源于stack exchange,提问作者Devansh Purohit
相关产品推荐
相关产品推荐

