首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Uniswap V2 removeLiquidity

Uniswap V2 removeLiquidity
EN

Ethereum用户
提问于 2021-01-24 00:55:48
回答 1查看 741关注 0票数 2

我能够在uniswap上增加流动性和消除流动性,但我在计算令牌对的最小值时遇到了困难。

为了消除流动性,我试图通过以下操作获取每个令牌的金额:

代码语言:javascript
复制
const pathA = [liquidityToken.address, tokenA.address];
  const amountsA = await uniswap.getAmountsOut(liquidityAmount, pathA);
  const desiredAmtA = amountsA[1];

  const pathB = [liquidityToken.address, tokenB.address];
  const amountsB = await uniswap.getAmountsOut(liquidityAmount, pathA);
  const desiredAmtB = amountsB[1];

这是抛出一个错误,但我不知道如何获得我的流动性令牌所代表的令牌/b的数量。因此,我试着像这样计算最小值,我不明白这些滑动公差是如何计算出来的。

代码语言:javascript
复制
const minAmtA = desiredAmtA.mul(BigNumber.from(9)).div(BigNumber.from(10));
const minAmtB = desiredAmtB.mul(BigNumber.from(9)).div(BigNumber.from(10));

当我放0的时候它会起作用,但很明显我不想100%的滑落

代码语言:javascript
复制
    tokenA.address,
    tokenB.address,
    liquidityAmount,
    BigNumber.from(0), // don't know how to calculate this
    BigNumber.from(0), // don't know how to calculate this
    wallet.address,
    deadline,
    {
      gasLimit: process.env.GAS_LIMIT,
      gasPrice: 20e9,
    }
  );
EN

回答 1

Ethereum用户

发布于 2022-05-20 13:40:12

这是错误的,有两个原因:

  1. 你不是在用流动资金代币换现金,你是在移除流动性,这是不一样的。amountADesired & amountBDesired不与流动性池令牌保持成对。
  2. getAmountsOut和getAmountsIn用于计算贸易价格,但增加/消除流动性的情况并非如此。

你的流动资金券代表了你在池中的份额。因此,计算特定流动性的集合代币数量的公式是:

amountADesired = (liquidity* reserveA)/totalSupply

这就是在池智能契约的烧伤功能背后发生的事情。Uniswap对烧伤法

这是一个去除流动性的代码示例,如果您已经走到了这一步,那么其余的操作就很容易了。如果您需要进一步的帮助,请留言。

代码语言:javascript
复制
    const toBN = web3.utils.toBN;
    const owner = '<Your address>'
    const pairContract = new web3.eth.Contract(getPairABI(), pairAddress);
    
    const reserves = await getReserves(tokenAName, tokenBName);// calling pairContract.getResrves()
    const totalSupply = await pairContract.methods.totalSupply().call();
    const ownerBalance = await pairContract.methods.balanceOf(owner).call();

    console.log('LIQUIDITY SHARE', web3.utils.toBN(ownerBalance).div(toBN(totalSupply)).mul(toBN(100)).toNumber());
    const liquidityPerc = 50;
    const liquidity = toBN(ownerBalance).mul(toBN(liquidityPerc)).div(toBN(100));

    const amountA = liquidity.mul(toBN(reserves[0])).div(toBN(totalSupply));
    const amountB = liquidity.mul(toBN(reserves[1])).div(toBN(totalSupply));
    console.log('HOlDING AMOUNTS', amountA.toString(), amountB.toString());
    //5% slippage
    var amountAMin = toBN(amountA).div(toBN(100)).mul(toBN(95));
    var amountBMin = toBN(amountB).div(toBN(100)).mul(toBN(95));
    console.log('MIN AMOUNTS', amountAMin.toString(), amountBMin.toString());
    
    var routerAbi = getRouterABI();
    var contract = new web3.eth.Contract(routerAbi, getRouterAddress(dex));

    var data = contract.methods.removeLiquidity(
        getTokenAddress(tokenAName),
        getTokenAddress(tokenBName),
        web3.utils.toHex(liquidity),
        web3.utils.toHex(amountAMin),
        web3.utils.toHex(amountBMin),
        targetAccount.address,
        web3.utils.toHex(Math.round(Date.now()/1000)+60*200), // in seconds
    );
票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

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

复制
相关文章

相似问题

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