From c338bd4e5a3792d36f3c8c22b699eb903bec286f Mon Sep 17 00:00:00 2001 From: Noah Zinsmeister Date: Tue, 19 Nov 2019 18:02:47 -0500 Subject: [PATCH] implement rageQuit --- contracts/UniswapV2.sol | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/contracts/UniswapV2.sol b/contracts/UniswapV2.sol index 862e9c0..e6d2e80 100644 --- a/contracts/UniswapV2.sol +++ b/contracts/UniswapV2.sol @@ -214,6 +214,30 @@ contract UniswapV2 is IUniswapV2, ERC20("Uniswap V2", "UNI-V2", 18, 0), SafeTran ); } + function rageQuit(address output, address recipient) external lock returns (uint128 amountOutput) { + uint256 liquidity = balanceOf[address(this)]; + TokenData memory amounts; + + if (output == token0) { + amounts.token0 = amountOutput = (liquidity.mul(reserves.token0) / totalSupply).downcast128(); + require(safeTransfer(token0, recipient, amounts.token0), "UniswapV2: TRANSFER_0_FAILED"); + } else { + amounts.token1 = amountOutput = (liquidity.mul(reserves.token1) / totalSupply).downcast128(); + require(safeTransfer(token1, recipient, amounts.token1), "UniswapV2: TRANSFER_0_FAILED"); + } + + if (liquidity > 0) _burn(address(this), liquidity); + + TokenData memory balances = TokenData({ + token0: IERC20(token0).balanceOf(address(this)).downcast128(), + token1: IERC20(token1).balanceOf(address(this)).downcast128() + }); + update(balances); + emit LiquidityBurned( + msg.sender, recipient, amounts.token0, amounts.token1, balances.token0, balances.token1, liquidity + ); + } + function swap(address input, address recipient) external lock returns (uint128 amountOutput) { TokenData memory balances; TokenData memory amounts;