Получение правильных десятичных знаков в библиотеке ethers.io с помощью getAmountsOut() ABI

Я использую интерфейс getAmountsOut(), чтобы получить текущую цену PancakeSwap для случайного токена BSC.

Цифры, которые я получаю, совпадают с цитатой 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)?

Вопрос 2: Почему у меня разница в цене? Что-то с проскальзыванием? Котировки этой монеты постоянно немного выше. Это не вопрос времени, это согласованно.

Или я вообще цитату неправильно рассчитываю ??

Заранее спасибо!

1 ответ

As far as I know, WBNB has 18 decimals, similar to WETH. Change all of your code with ethers.utils.parseUnits("1.00", 9) to

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

or

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

and you will be fine.

Другие вопросы по тегам