Uniswap
getAmountsOut UniswapV2 USDC/USDT 對不返回 1
這是我在 Python 中的簡單程式碼:
web3 = Web3(Web3.HTTPProvider(infura_url)) abi = [{"name": "getAmountsOut", "type": "function", "inputs": [{"name": "amountIn", "type": "uint256"}, {"name": "path", "type": "address[]"}], "outputs": [{"name": "amounts", "type": "uint256[]"}], }, ] router = '0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D' exchange_contract = web3.eth.contract(address=router, abi=abi) # dexRouter # Prices DAI = "0x6B175474E89094C44Da98b954EedeAC495271d0F" WETH = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2" USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7" USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48" decimals = 6 # Token 0 decimals result = (exchange_contract.functions.getAmountsOut(Web3.toWei(1, 'ether'), [USDC, USDT]).call())[1]; humanPrice = result/(10**decimals) rev = 1/humanPrice print(result) print(humanPrice) print(rev)
回報總是圍繞著這個:
5772384686621 5772384.686621 1.732386274112603e-07
可能是我不完全理解 getAmountsOut 是如何工作的,但為什麼我不能得到 0.99-1 ?
你很困惑,因為 USDC 和 USDT 的小數位數與 ETH 的小數位數不同。前兩位有 6 位小數,後一位有 18 位。該
toWei
功能是針對 ETH 的。將您的呼叫程式碼更改為:
one_usdc = int(1e6) result = exchange_contract.functions.getAmountsOut(one_usdc, [USDC, USDT]).call()
這應該給你一個接近 1000000 (1e6) 的數字。
如果您輸入
Web3.toWei(1, 'ether')
金額,則表示您正在嘗試將 1 000 000 000 000 (1e12) USDC 兌換成 USDT。顯然匯率很糟糕,因為池中只有有限數量的 USDT。