我试图使用Web3js和Uniswap智能合同中的方法计算Uniswap上的交换值。
这是WETH (包装以太)的Uniswap合同地址: WBTC (包装比特币)对0xBb2b8038a1640196FbE3e38816F3e67Cba72D940
使用契约地址和契约ABI为合同构造js对象,如:const pairContract = new web3.eth.Contract(pair.abi, pair.address);。
这样做很好,我能够读取合同方法以及合同上的调用方法(我只使用只读方法--我不需要签署任何事务)。所以我可以像这样调用getReserves方法
const reserves = await pairContract.methods.getReserves().call();下面是响应(在这个_blockTimestampLast上)
{
'0': '296352466321',
'1': '37712426843492788602200',
'2': '1621116220',
_reserve0: '296352466321',
_reserve1: '37712426843492788602200',
_blockTimestampLast: '1621116220'
}_reserve0是WBTC的储量,_reserve1是WETH的储量
现在在这个实现中的
const BigNumber = require('bignumber.js');
const estimateTrade = (
baseTokenReserves,
quoteTokenReserves,
numberOfBaseTokenTradedIn,
feePercent)=> {
// x * y = k
const feeMultiplier = BigNumber(1).minus(feePercent.dividedBy(100));
const k = baseTokenReserves.times(quoteTokenReserves);
const baseTokenNewTotal = baseTokenReserves.plus(numberOfBaseTokenTradedIn.times(feeMultiplier));
const quoteTokenNewTotal = k.dividedBy(baseTokenNewTotal);
const quoteTokenReceived = quoteTokenReserves.minus(quoteTokenNewTotal);
return quoteTokenReceived;
}用这些参数调用我的estimatedTrade方法..。
const baseTokenReserves = BigNumber(_reserve0);
const quoteTokenReserves = BigNumber(_reserve1);
const numberOfBaseTokenTradedIn = BigNumber(1);
const feePercent = BigNumber(0.03);
const tokensReceived = estimateTrade(baseTokensReserves, quoteTokenReserves, numberOfBaseTokenTradedIn , feePercent)
console.log(`tokensReceived = ${tokensReceived.toFixed()}`) //tokensReceived = 127151098781.56376683928985070517这显然离我们很远。当我检查Uniswap,看看我将得到多少WBTC,我看到大致12.677。我已经检查了几个小时,每次我的回答被小数点后10位(10,000,000次)。这个方法对我尝试过的每一对(WETH_SUSHI、WETH_UNI等)都很有效。除了WETH_WBTC。有人能看到问题所在吗?谢谢!
发布于 2021-12-25 22:41:30
在查看USDC和WETH并使用ethers.js时,我遇到了类似的问题。这就是我最初是如何转换我的大数的:
const reserve0 = Number(ethers.utils.formatUnits(reserves[0], 18)); //USDC
const reserve1 = Number(ethers.utils.formatUnits(reserves[1], 18)); //WETH我发现问题是USDC只使用了6位小数,而不是18位,所以我不得不将它改为:
const reserve0 = Number(ethers.utils.formatUnits(reserves[0], 6)); //USDC
const reserve1 = Number(ethers.utils.formatUnits(reserves[1], 18)); //WETH根据WBTC关于以太扫描的合同,WBTC使用8小数,所以我猜这是你的问题。
https://ethereum.stackexchange.com/questions/99027
复制相似问题