Node.js结合ethers的Ropsten测试网Uniswap交易Reverted报错排查
Ropsten测试网Uniswap交易回滚的核心触发原因
- 链上合约地址完全错配
代码中引用的wethErc20Address、uniErc20Address均为以太坊主网的正式合约地址,并非Ropsten测试网链上的对应部署地址。在Ropsten网络上调用主网合约地址,相当于向不存在对应Uniswap交易对的空地址发起调用,合约执行时根本找不到匹配的交易逻辑,直接触发回滚。同时也要同步核对传入的uniswapRouterAddress是否为Ropsten测试网部署的Uniswap V2 Router地址,不能直接复用主网Router地址。 - 调用了错误的兑换方法,未满足方法前置执行要求
当前调用的swapExactTokensForTokens方法,仅适用于「预先完成代币授权、账户已持有目标花费币种(此处为WETH)」的场景,不支持直接用原生ETH完成兑换:- 真要直接用原生ETH兑换ERC20代币,应该使用Router合约提供的
swapExactETHForTokens方法,该方法会自动将交易附带的原生ETH包装为WETH完成兑换流程; - 如果坚持使用当前的
swapExactTokensForTokens走WETH路径,需要提前完成两步前置操作:一是通过WETH合约的存款方法,将对应数量的测试ETH转换为WETH存入自己地址;二是给Uniswap Router合约授权对应金额的WETH使用额度,缺任意一步都会触发回滚。
- 真要直接用原生ETH兑换ERC20代币,应该使用Router合约提供的
- 交易参数与链上实际状态不匹配
- 代码中写死传入的兑换金额为0.1ETH对应的wei值,没有核对Ropsten地址的实际可用余额:要么测试网地址本身没有足额的测试ETH,要么授权给Router的WETH额度不足以覆盖传入的兑换金额,执行时余额不足直接回滚。
- 没有确认Ropsten网络上是否存在配置的
WETH-UNI流动性交易池,如果池子里没有足够的流动性支撑兑换,即便其他参数正确,也会因为无法完成兑换输出触发回滚。 - 钱包初始化逻辑存在隐患:
new ethers.Wallet(Buffer.from(privateKey, "hex"))的写法很容易出错——如果你的私钥字符串本身带0x前缀,这种Buffer转码的写法会把前缀也纳入hex解析范围,最终生成的钱包实例根本不是你平时用的那个测试网地址,和填入的收款walletAddress对不上,交易签名的授权校验自然不通过,直接触发回滚。 - 额外说明:
amountOutMin设为0本身不会直接触发回滚,但如果交易路径上没有任何流动性,零输出的兑换也会触发Router的内置校验回滚。
内容的提问来源于stack exchange,提问作者Pespi coke
相关产品推荐
相关产品推荐

