You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 02:54:03