1

我正在使用 getAmountsOut() 接口来获取随机 BSC 代币的当前 PancakeSwap 价格。

我得到的数字确实与 Pancakeswap 的报价相匹配(大致),但我似乎无法以具有正确小数的人类可读格式显示它。

import ethers from "ethers";

// ...open factory, account etc....

const TOKEN_WBNB_ADDR = "0xbb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c"; // WBNB
const TOKEN_FEG_ADDR = "0xacfc95585d80ab62f67a14c566c1b7a49fe91167"; // Token
const router = new ethers.Contract(
    factory,    // PancakeSwap V2 factory
    ['function getAmountsOut(uint amountIn, address[] memory path) public view returns (uint[] memory amounts)'],
    account,
);

// how many WBNBs would we get for 1 FEG?
const wbnbsPerToken = await router.getAmountsOut(
    ethers.utils.parseUnits("1.00", 9), // token has 9 decimals
    [TOKEN_FEG_ADDR, TOKEN_WBNB_ADDR]);

console.log(`${ethers.utils.formatUnits(wbnbsPerToken[1], 9)} WBNB per FEG`);

// My script's output:   0.018870301 WBNB per FEG
// PancakeSwap's output: 0.0000000000190529 WBNB per FEG

问题 1:忽略微小的价格差异,为什么我的小数点差这么差(9 位)?

问题二:为什么会有差价有滑点的东西?Pancakeswap 对该硬币的报价始终较高。这不是时间问题,而是一致的。

还是我完全错误地计算了报价?

提前致谢!

4

1 回答 1

0

据我所知,WBNB 有 18 位小数,类似于 WETH。使用 ethers.utils.parseUnits("1.00", 9) 将所有代码更改为

ethers.utils.parseUnits("1.00", 18);

或者

ethers.utils.parseUnits('1.00', 'ethers');

你会没事的。

于 2021-10-22T13:32:03.000 回答