我试着用Uniswapv2Router和trying和Ganache,但是还没能识别出我做错了什么。我使用addLiquidty方法如下:await uniswapV2Router02.addLiquidity(token0.address, token1.address, 500, 250, 250 , 125, accounts[0], 1618158769);,它抛出错误Error: Returned error: VM Exception while processing transaction: revert ds-math-sub-underflow -- Reason given: ds-math-sub-underflow.
但是,如果我注释掉.minto(to),代码将一直正确执行。
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) {
(amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin);
address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB);
TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA);
TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB);
IUniswapV2Pair(pair);//.mint(to);
}即使我有一个简单的薄荷实现来测试正在发生的事情,也会发生这种情况。
function mint(address to) external lock returns (uint liquidity) {
liquidity = 3;
}发布于 2021-04-10 20:10:02
问题在于,在使用UniswapV2Factory时,只应按照docs https://uniswap.org/docs/v2/smart-contract-integration/quick-start/中的说明部署来自@uniswap的构建目录中预编译的UniswapV2Factory契约。所以,即使我在我的UniswapV2Pair合同上注释掉了一些东西,它也没有效果,因为UniswapV2Factory也使用预编译的UniswapV2Pair契约。另一方面,ds-math-sub-underflow错误是因为在UniswapV2Pair契约上,function mint(address to)检索了每个令牌的余额,而且由于没有足够的时间,liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);导致了一个underflow。
发布于 2021-07-25 16:26:09
如果与池相关的Uniswap令牌未被批准用于发送事务的钱包,则也会发生这种情况。
解决方案:使用spender调用新对合同的审批方法为0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
发布于 2022-08-02 06:22:49
下流通常只发生在数学运算中,在这种情况下,下流误差看起来来自您作为amountA和amountB传入的参数。在使用pancakeSwap时也会出现同样的问题,要输入的最小金额为1000。这样做解决了我的地下流量问题,希望它能解决你的问题!
https://ethereum.stackexchange.com/questions/97032
复制相似问题