@@ -54,7 +54,7 @@ contract ZuniswapV2RouterTest is DSTest {
5454 );
5555
5656 address pairAddress = factory.pairs (address (tokenA), address (tokenB));
57- assertEq (pairAddress, 0xCB304901c533168e091bA95A5297E39e882FDF26 );
57+ assertEq (pairAddress, 0x1200107eD3bbF12Ef4Ac648b9a36F8be48f3b0D7 );
5858 }
5959
6060 function testAddLiquidityNoPair () public {
@@ -215,4 +215,143 @@ contract ZuniswapV2RouterTest is DSTest {
215215 assertEq (amountB, 0.9 ether);
216216 assertEq (liquidity, 1272792206135785543 );
217217 }
218+
219+ function testRemoveLiquidity () public {
220+ tokenA.approve (address (router), 1 ether);
221+ tokenB.approve (address (router), 1 ether);
222+
223+ router.addLiquidity (
224+ address (tokenA),
225+ address (tokenB),
226+ 1 ether,
227+ 1 ether,
228+ 1 ether,
229+ 1 ether,
230+ address (this )
231+ );
232+
233+ address pairAddress = factory.pairs (address (tokenA), address (tokenB));
234+ ZuniswapV2Pair pair = ZuniswapV2Pair (pairAddress);
235+ uint256 liquidity = pair.balanceOf (address (this ));
236+
237+ pair.approve (address (router), liquidity);
238+
239+ router.removeLiquidity (
240+ address (tokenA),
241+ address (tokenB),
242+ liquidity,
243+ 1 ether - 1000 ,
244+ 1 ether - 1000 ,
245+ address (this )
246+ );
247+
248+ (uint256 reserve0 , uint256 reserve1 ,) = pair.getReserves ();
249+ assertEq (reserve0, 1000 );
250+ assertEq (reserve1, 1000 );
251+ assertEq (pair.balanceOf (address (this )), 0 );
252+ assertEq (pair.totalSupply (), 1000 );
253+ assertEq (tokenA.balanceOf (address (this )), 20 ether - 1000 );
254+ assertEq (tokenB.balanceOf (address (this )), 20 ether - 1000 );
255+ }
256+
257+ function testRemoveLiquidityPartially () public {
258+ tokenA.approve (address (router), 1 ether);
259+ tokenB.approve (address (router), 1 ether);
260+
261+ router.addLiquidity (
262+ address (tokenA),
263+ address (tokenB),
264+ 1 ether,
265+ 1 ether,
266+ 1 ether,
267+ 1 ether,
268+ address (this )
269+ );
270+
271+ address pairAddress = factory.pairs (address (tokenA), address (tokenB));
272+ ZuniswapV2Pair pair = ZuniswapV2Pair (pairAddress);
273+ uint256 liquidity = pair.balanceOf (address (this ));
274+
275+ liquidity = (liquidity * 3 ) / 10 ;
276+ pair.approve (address (router), liquidity);
277+
278+ router.removeLiquidity (
279+ address (tokenA),
280+ address (tokenB),
281+ liquidity,
282+ 0.3 ether - 300 ,
283+ 0.3 ether - 300 ,
284+ address (this )
285+ );
286+
287+ (uint256 reserve0 , uint256 reserve1 ,) = pair.getReserves ();
288+ assertEq (reserve0, 0.7 ether + 300 );
289+ assertEq (reserve1, 0.7 ether + 300 );
290+ assertEq (pair.balanceOf (address (this )), 0.7 ether - 700 );
291+ assertEq (pair.totalSupply (), 0.7 ether + 300 );
292+ assertEq (tokenA.balanceOf (address (this )), 20 ether - 0.7 ether - 300 );
293+ assertEq (tokenB.balanceOf (address (this )), 20 ether - 0.7 ether - 300 );
294+ }
295+
296+ function testRemoveLiquidityInsufficientAAmount () public {
297+ tokenA.approve (address (router), 1 ether);
298+ tokenB.approve (address (router), 1 ether);
299+
300+ router.addLiquidity (
301+ address (tokenA),
302+ address (tokenB),
303+ 1 ether,
304+ 1 ether,
305+ 1 ether,
306+ 1 ether,
307+ address (this )
308+ );
309+
310+ address pairAddress = factory.pairs (address (tokenA), address (tokenB));
311+ ZuniswapV2Pair pair = ZuniswapV2Pair (pairAddress);
312+ uint256 liquidity = pair.balanceOf (address (this ));
313+
314+ pair.approve (address (router), liquidity);
315+
316+ vm.expectRevert (encodeError ("InsufficientAAmount() " ));
317+ router.removeLiquidity (
318+ address (tokenA),
319+ address (tokenB),
320+ liquidity,
321+ 1 ether,
322+ 1 ether - 1000 ,
323+ address (this )
324+ );
325+ }
326+
327+ function testRemoveLiquidityInsufficientBAmount () public {
328+ tokenA.approve (address (router), 1 ether);
329+ tokenB.approve (address (router), 1 ether);
330+
331+ router.addLiquidity (
332+ address (tokenA),
333+ address (tokenB),
334+ 1 ether,
335+ 1 ether,
336+ 1 ether,
337+ 1 ether,
338+ address (this )
339+ );
340+
341+ address pairAddress = factory.pairs (address (tokenA), address (tokenB));
342+ ZuniswapV2Pair pair = ZuniswapV2Pair (pairAddress);
343+ uint256 liquidity = pair.balanceOf (address (this ));
344+
345+ pair.approve (address (router), liquidity);
346+
347+ vm.expectRevert (encodeError ("InsufficientBAmount() " ));
348+ router.removeLiquidity (
349+ address (tokenA),
350+ address (tokenB),
351+ liquidity,
352+ 1 ether - 1000 ,
353+ 1 ether,
354+ address (this )
355+ );
356+ }
218357}
0 commit comments