diff --git a/src/LiquidityPool.sol b/src/LiquidityPool.sol index 96fda35d..f4597931 100644 --- a/src/LiquidityPool.sol +++ b/src/LiquidityPool.sol @@ -186,13 +186,14 @@ contract LiquidityPool is Auth, IERC7540 { } /// @notice Similar to requestDeposit, but with a permit option - function requestDepositWithPermit(uint256 assets, address owner, uint256 deadline, uint8 v, bytes32 r, bytes32 s) - public - { - _withPermit(asset, owner, address(this), assets, deadline, v, r, s); - require(manager.requestDeposit(address(this), assets, owner, owner), "LiquidityPool/request-deposit-failed"); - SafeTransferLib.safeTransferFrom(asset, owner, address(escrow), assets); - emit DepositRequest(owner, owner, assets); + function requestDepositWithPermit(uint256 assets, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { + try IERC20Permit(asset).permit(msg.sender, address(this), assets, deadline, v, r, s) {} catch {} + require( + manager.requestDeposit(address(this), assets, msg.sender, msg.sender), + "LiquidityPool/request-deposit-failed" + ); + SafeTransferLib.safeTransferFrom(asset, msg.sender, address(escrow), assets); + emit DepositRequest(msg.sender, msg.sender, assets); } /// @notice View the total amount the operator has requested to deposit but isn't able to deposit or mint yet @@ -324,25 +325,6 @@ contract LiquidityPool is Auth, IERC7540 { } // --- Helpers --- - function _withPermit( - address token, - address owner, - address spender, - uint256 value, - uint256 deadline, - uint8 v, - bytes32 r, - bytes32 s - ) internal { - try IERC20Permit(token).permit(owner, spender, value, deadline, v, r, s) { - return; - } catch { - if (IERC20(token).allowance(owner, spender) == value) { - return; - } - } - revert("LiquidityPool/permit-failure"); - } /// @dev In case of unsuccessful tx, parse the revert message function _successCheck(bool success) internal pure { diff --git a/test/LiquidityPool.t.sol b/test/LiquidityPool.t.sol index dc070003..e820dd17 100644 --- a/test/LiquidityPool.t.sol +++ b/test/LiquidityPool.t.sol @@ -1045,11 +1045,17 @@ contract LiquidityPoolTest is TestSetup { ) ); - vm.prank(random_); // random fr permit + vm.startPrank(random_); // random fr permit erc20.permit(investor, lPool_, amount, block.timestamp, v, r, s); + // frontrunnign not possible + centrifugeChain.updateMember(lPool.poolId(), lPool.trancheId(), random_, type(uint64).max); + vm.expectRevert(bytes("SafeTransferLib/safe-transfer-from-failed")); + lPool.requestDepositWithPermit((amount), block.timestamp, v, r, s); + vm.stopPrank(); // investor still able to requestDepositWithPermit - lPool.requestDepositWithPermit(amount, investor, block.timestamp, v, r, s); + vm.prank(vm.addr(0xABCD)); + lPool.requestDepositWithPermit(amount, block.timestamp, v, r, s); // ensure funds are locked in escrow assertEq(erc20.balanceOf(address(escrow)), amount); @@ -1068,6 +1074,7 @@ contract LiquidityPoolTest is TestSetup { LiquidityPool lPool = LiquidityPool(lPool_); erc20.mint(investor, amount); centrifugeChain.updateMember(lPool.poolId(), lPool.trancheId(), investor, type(uint64).max); + centrifugeChain.updateMember(lPool.poolId(), lPool.trancheId(), address(this), type(uint64).max); // Sign permit for depositing investment currency (uint8 v, bytes32 r, bytes32 s) = vm.sign( @@ -1085,14 +1092,12 @@ contract LiquidityPoolTest is TestSetup { ) ); - // frontrunnign with lower amount should not be possible - vm.startPrank(randomUser); - ERC20(address(lPool.asset())).permit(investor, lPool_, amount, block.timestamp, v, r, s); - vm.expectRevert(bytes("LiquidityPool/permit-failure")); - lPool.requestDepositWithPermit((amount - 1), investor, block.timestamp, v, r, s); - vm.stopPrank(); + // premit functions can only be executed by the owner + vm.expectRevert(bytes("SafeTransferLib/safe-transfer-from-failed")); + lPool.requestDepositWithPermit(amount, block.timestamp, v, r, s); + vm.prank(vm.addr(0xABCD)); + lPool.requestDepositWithPermit(amount, block.timestamp, v, r, s); - lPool.requestDepositWithPermit(amount, investor, block.timestamp, v, r, s); // To avoid stack too deep errors delete v; delete r;