Uniswap
Uniswap V2、getAmountsOut 和 toWei/fromWei
我有一個簡單的程式碼可以從 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 儲存庫為此提供了一些不錯的實用功能。