diff --git a/part3/contracts/crytic/EchidnaTest.sol b/part3/contracts/crytic/EchidnaTest.sol index 929fec7..43a654e 100644 --- a/part3/contracts/crytic/EchidnaTest.sol +++ b/part3/contracts/crytic/EchidnaTest.sol @@ -4,18 +4,22 @@ import "./Setup.sol"; contract EchidnaTest is Setup { event logUints(uint unit1, uint unit2); - function testProvideLiquidity(uint amount1, uint amount2) public { - //Preconditions: - amount1 = _between(amount1, 1000, uint(-1)); - amount2 = _between(amount2, 1000, uint(-1)); - if(!completed) { - _init(amount1, amount2); + + function mintLiquidity(uint amount1, uint amount2) public returns (bool,uint,uint) { + //precondition + if(!notInitialLiquidityMint) { + amount1 = _between(amount1, 1000, uint(-1)); + amount2 = _between(amount2, 1000, uint(-1)); + notInitialLiquidityMint = true; } + + _init(amount1, amount2); + uint lpTokenBalanceBefore = pair.balanceOf(address(user)); (uint reserve0Before, uint reserve1Before,) = pair.getReserves(); uint kBefore = reserve0Before * reserve1Before; - + (bool success1,) = user.proxy(address(testToken1),abi.encodeWithSelector(testToken1.transfer.selector, address(pair),amount1)); (bool success2,) = user.proxy(address(testToken2),abi.encodeWithSelector(testToken2.transfer.selector, address(pair),amount2)); require(success1 && success2); @@ -23,8 +27,14 @@ contract EchidnaTest is Setup { //Action: (bool success3,) = user.proxy(address(pair),abi.encodeWithSelector(bytes4(keccak256("mint(address)")), address(user))); + return (success3, lpTokenBalanceBefore, kBefore); + } + //Allows to mint liquidity not just on initial scenario and extend coverage + function testProvideLiquidity(uint amount1, uint amount2) public { + //perform preconditions and action on mintLiquidity + (bool success, uint lpTokenBalanceBefore, uint kBefore) = mintLiquidity(amount1, amount2); //Postconditions: - if(success3) { + if(success) { uint lpTokenBalanceAfter = pair.balanceOf(address(user)); (uint reserve0After, uint reserve1After,) = pair.getReserves(); uint kAfter = reserve0After * reserve1After; @@ -34,6 +44,7 @@ contract EchidnaTest is Setup { } } + function testSwap(uint amount1, uint amount2) public { if(!completed) { @@ -48,8 +59,6 @@ contract EchidnaTest is Setup { //Postcondition: assert(!success1); //call should never succeed - - - } + } diff --git a/part3/contracts/crytic/Setup.sol b/part3/contracts/crytic/Setup.sol index 45c4039..4c74cb4 100644 --- a/part3/contracts/crytic/Setup.sol +++ b/part3/contracts/crytic/Setup.sol @@ -16,7 +16,7 @@ contract Setup { UniswapV2ERC20 testToken1; UniswapV2ERC20 testToken2; Users user; - bool completed; + bool notInitialLiquidityMint; constructor() public { testToken1 = new UniswapV2ERC20(); @@ -32,12 +32,9 @@ contract Setup { function _init(uint amount1, uint amount2) internal { testToken1.mint(address(user), amount1); testToken2.mint(address(user), amount2); - completed = true; } function _between(uint val, uint low, uint high) internal pure returns(uint) { return low + (val % (high-low +1)); } - - } \ No newline at end of file