下面是我用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呢?
发布于 2022-08-18 16:07:02
您很困惑,因为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')作为金额,则意味着您试图将1000 000 000 000 (1e12) USDC转换为USDT。显然,汇率是可怕的,因为池中只有有限的USDT。
https://ethereum.stackexchange.com/questions/133876
复制相似问题