Uniswap V2 getAmountIn计算COMP兑WETH价格与UI不符求助
Uniswap V2 getAmountIn计算结果与UI不符的解决办法
以下是核心问题排查点和修正方案:
参数顺序匹配错误
Uniswap V2的getAmountIn函数参数定义为:function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn),各参数对应关系为:amountOut:你要兑换得到的目标代币数量(此处为310 COMP)reserveIn:用于兑换的代币(WETH)在池子里的储备量reserveOut:目标代币(COMP)在池子里的储备量
你的代码直接传入reserve1和reserve0,但未确认这两个储备对应的代币是否与参数要求匹配。如果reserve0是COMP储备、reserve1是WETH储备,就会把reserveIn和reserveOut传反,直接导致计算结果偏大。
未处理代币小数位数
Uniswap合约所有计算基于代币最小单位(比如COMP是18位小数,1枚COMP = 10^18 wei)。直接传字符串"310"相当于告诉合约要兑换310 wei的COMP,而非310枚。这是常见错误点,必须修正。储备数据非实时
你获取的reserve0/reserve1可能是旧数据,Uniswap UI会实时拉取最新池子储备,数据滞后也会造成计算结果偏差。
修正后的代码示例
// 1. 处理COMP小数位数,转换为合约认可的最小单位 const targetCompAmount = ethers.utils.parseUnits("310", 18); // COMP为18位小数 // 2. 确认储备对应代币:假设reserve0是WETH储备,reserve1是COMP储备 const wethReserve = ethers.BigNumber.from(response.toJSON().reserve0); const compReserve = ethers.BigNumber.from(response.toJSON().reserve1); // 3. 正确调用getAmountIn const requiredWeth = await routerV2.getAmountIn(targetCompAmount, wethReserve, compReserve); // 4. 转换回可读的WETH数量(WETH同样为18位小数) console.log(ethers.utils.formatUnits(requiredWeth, 18)); // 结果应接近UI显示的10.4
如果修正后仍有偏差,建议通过Uniswap V2 Pair合约的token0()和token1()方法查询池子代币顺序,确保reserveIn和reserveOut对应正确的代币储备。
内容的提问来源于stack exchange,提问作者Shadq
相关产品推荐
相关产品推荐

