Получение правильных десятичных знаков в библиотеке 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.