我能够在uniswap上增加流动性和消除流动性,但我在计算令牌对的最小值时遇到了困难。
为了消除流动性,我试图通过以下操作获取每个令牌的金额:
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的数量。因此,我试着像这样计算最小值,我不明白这些滑动公差是如何计算出来的。
const minAmtA = desiredAmtA.mul(BigNumber.from(9)).div(BigNumber.from(10));
const minAmtB = desiredAmtB.mul(BigNumber.from(9)).div(BigNumber.from(10));当我放0的时候它会起作用,但很明显我不想100%的滑落
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,
}
);发布于 2022-05-20 13:40:12
这是错误的,有两个原因:
你的流动资金券代表了你在池中的份额。因此,计算特定流动性的集合代币数量的公式是:
amountADesired = (liquidity* reserveA)/totalSupply
这就是在池智能契约的烧伤功能背后发生的事情。Uniswap对烧伤法
这是一个去除流动性的代码示例,如果您已经走到了这一步,那么其余的操作就很容易了。如果您需要进一步的帮助,请留言。
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
);https://ethereum.stackexchange.com/questions/92704
复制相似问题