调用Uniswap合约查询ETH兑DAI价格得到异常值该如何处理?
问题排查结果
1. 调用的代币地址错误
你代码中传入Uniswap Factory合约查询交易对的代币地址0x09cabec1ead1c0ba254b09efb3ee13841712be14是已废弃的单抵押Sai(旧版DAI)合约地址,并非当前主流流通的多抵押DAI地址。主网多抵押DAI的正确合约地址为0x6B175474E89094C44Da98b954EedeAC495271d0F,替换该地址即可获取正确的ETH-DAI交易对汇率。
2. 返回数值未做单位转换
Uniswap合约返回的代币数量为最小单位(wei)值,并非常规的DAI计数单位。你输出的136478377597734366需要除以1e18转换为常规单位:136478377597734366 / 1e18 ≈ 0.136
该数值符合单抵押Sai的历史汇率,也可以反向验证你使用了错误的代币地址。
3. Ropsten测试网异常说明
Ropsten测试网的公开Uniswap流动性池普遍流动性极低,1ETH量级的兑换会触发极高的滑点,出现和主网汇率偏离极大的数值属于正常情况。如果需要在测试网做稳定测试,建议自行部署测试代币和交易对,注入足额测试流动性后再进行逻辑验证。
修正后代码示例
const web3 = new Web3('https://mainnet.infura.io/v3/c1d623fecf4a4ef785085de5cf9eaf18') // Uniswap factory contract const factoryABI = ABI(Not going to copy the line) const FACTORY_ADDR = '0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95' const factoryContract = new web3.eth.Contract(factoryABI,FACTORY_ADDR) //Uniswap dai exchange contract const exchangeAbi = ABI(Not going to copy the line) async function checkEthPrice() { // 替换为多抵押DAI主网地址 const exchangeAddr = await factoryContract.methods.getExchange('0x6B175474E89094C44Da98b954EedeAC495271d0F').call() const exchangeContract = new web3.eth.Contract(exchangeAbi, exchangeAddr) const daiAmountWei = await exchangeContract.methods.getEthToTokenInputPrice(web3.utils.toWei('1', 'Ether')).call() // 转换为常规DAI单位 const daiAmount = web3.utils.fromWei(daiAmountWei, 'ether') console.log('Eth price:', daiAmount, 'DAI') } test = setInterval(async () => { await checkEthPrice(); }, 1000)
内容的提问来源于stack exchange,提问作者Apollo
相关产品推荐
相关产品推荐

