Uniswap

Uniswap V2、getAmountsOut 和 toWei/fromWei

  • August 14, 2022

我有一個簡單的程式碼可以從 Uniswap V2 獲取價格

const getTokenExchangeRate = async (tokenA, tokenB) => {
 return (
   await dexRouter.methods.getAmountsOut(toWei("1"), [tokenA, tokenB]).call()
 )[1];
};

// usage

const price = await getTokenExchangeRate(LINK, DAI)
priceNormal = web3.utils.fromWei(price)

console.log(priceNormal)

如果兩個硬幣的小數相同,它可以正常工作,但如果小數不同,我會得到一個很大的數字。例如

const price = await getTokenExchangeRate(LINK, USDC)
priceNormal = web3.utils.fromWei(price)

console.log(priceNormal)
PS C:\Users\Viktor\Desktop\Uniswap3JS> node test.js
0.000000000009015961

我應該添加什麼來獲得所有可能對的人類可讀數字?謝謝。

好吧,我找到了答案,雖然我不喜歡它。現在我不明白為什麼 getAmountsOut (WETH, USDC) 給出了一個真實的價格,而 getAmountsOut (USDC, WETH) 給出了一些奇怪的數字。但那是另一回事了。

const getTokenExchangeRate = async (tokenA, tokenB) => {
 return (
   await dexRouter.methods.getAmountsOut(toWei("1"), [tokenA, tokenB]).call()
 )[1];
};
const price = await getTokenExchangeRate(USDC, WETH9)

// DECIMALS
const abi2 = [
 {
   "constant": true,
   "inputs": [],
   "name": "decimals",
   "outputs": [
     {
       "name": "",
       "type": "uint8"
     }
   ],
   "payable": false,
   "type": "function"
 },
];


const check = new web3.eth.Contract(
 abi2,
 WETH9 //TokenB
);

const result = await check.methods.decimals().call()
let humanPrice = price/(10**result)

我建議將所有數字轉換為公分母(即 18 位小數精度)並使用這些小數位執​​行分析。

Aave V2 儲存庫為此提供了一些不錯的實用功能

引用自:https://ethereum.stackexchange.com/questions/133589