ethers.js调用getAmountsOut获取PancakeSwap价格小数位异常问题咨询
问题解答
问题1:小数位偏差9位的原因
你调用getAmountsOut返回的第二个值是WBNB的最小单位数量,WBNB的链上精度为18位,而你在调用ethers.utils.formatUnits做格式化时,错误传入了代币FEG的精度9作为参数,相当于最终结果少除以了10^9,刚好出现9位的量级偏差。
修正输出代码即可:
console.log(`${ethers.utils.formatUnits(wbnbsPerToken[1], 18)} WBNB per FEG`);
问题2:持续价格差的原因
和滑点无关,是你的代码逻辑本身存在错误,同时叠加代币机制影响:
- 第一处核心错误:你初始化路由合约时传错了合约地址。
getAmountsOut是PancakeSwap V2 Router合约的方法,不是Factory合约的方法,你传入Factory地址调用该方法得到的返回值本身就是错误的。你需要将初始化合约的第一个参数替换为BSC主网PancakeSwap V2 Router的官方地址0x10ED43C718714eb63d5aA57B78B54704E256024E。 - 第二处影响因素:FEG属于带交易税的反射类代币,每笔交易都会被代币合约扣除一定比例的税费(包含销毁、持币分红等)。
getAmountsOut仅计算AMM交易池本身的兑换比例,不会计算代币层面的扣税,而PancakeSwap前端显示的报价是已经扣除交易税后用户实际可到账的数值,因此会比你直接调用接口得到的数值更低。
内容的提问来源于stack exchange,提问作者blitter
相关产品推荐
相关产品推荐

