Uniswap

getAmountsOut UniswapV2 USDC/USDT 對不返回 1

  • August 18, 2022

這是我在 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。

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