首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当使用恒定的产品做市商公式时,Uniswap WETH_WBTC的价格会下降数量级。

当使用恒定的产品做市商公式时,Uniswap WETH_WBTC的价格会下降数量级。
EN

Ethereum用户
提问于 2021-05-15 22:37:04
回答 1查看 447关注 0票数 1

我试图使用Web3js和Uniswap智能合同中的方法计算Uniswap上的交换值。

这是WETH (包装以太)的Uniswap合同地址: WBTC (包装比特币)对0xBb2b8038a1640196FbE3e38816F3e67Cba72D940

使用契约地址和契约ABI为合同构造js对象,如:const pairContract = new web3.eth.Contract(pair.abi, pair.address);

这样做很好,我能够读取合同方法以及合同上的调用方法(我只使用只读方法--我不需要签署任何事务)。所以我可以像这样调用getReserves方法

代码语言:javascript
复制
const reserves = await pairContract.methods.getReserves().call();

下面是响应(在这个_blockTimestampLast上)

代码语言:javascript
复制
{
  '0': '296352466321',
  '1': '37712426843492788602200',
  '2': '1621116220',
  _reserve0: '296352466321',
  _reserve1: '37712426843492788602200',
  _blockTimestampLast: '1621116220'
}

_reserve0是WBTC的储量,_reserve1是WETH的储量

现在在这个实现中的

就是出了问题的地方.

代码语言:javascript
复制
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方法..。

代码语言:javascript
复制
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。有人能看到问题所在吗?谢谢!

EN

回答 1

Ethereum用户

回答已采纳

发布于 2021-12-25 22:41:30

在查看USDC和WETH并使用ethers.js时,我遇到了类似的问题。这就是我最初是如何转换我的大数的:

代码语言:javascript
复制
const reserve0 = Number(ethers.utils.formatUnits(reserves[0], 18)); //USDC
const reserve1 = Number(ethers.utils.formatUnits(reserves[1], 18)); //WETH

我发现问题是USDC只使用了6位小数,而不是18位,所以我不得不将它改为:

代码语言:javascript
复制
const reserve0 = Number(ethers.utils.formatUnits(reserves[0], 6)); //USDC
const reserve1 = Number(ethers.utils.formatUnits(reserves[1], 18)); //WETH

根据WBTC关于以太扫描的合同,WBTC使用8小数,所以我猜这是你的问题。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/99027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档