From 912caa48040ba2d88aa32f5fda56f05fdb539e76 Mon Sep 17 00:00:00 2001 From: Jean-Grimal Date: Thu, 2 Nov 2023 17:10:06 +0100 Subject: [PATCH] feat: gas opti --- src/MetaMorpho.sol | 24 ++++++++++++++---------- test/forge/MarketTest.sol | 5 +++-- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/MetaMorpho.sol b/src/MetaMorpho.sol index 0987b492..b8c5c8eb 100644 --- a/src/MetaMorpho.sol +++ b/src/MetaMorpho.sol @@ -155,8 +155,11 @@ contract MetaMorpho is ERC4626, ERC20Permit, Ownable2Step, Multicall, IMetaMorph /// - the timelock has expired since the pending value has been submitted. modifier withinTimelockWindow(uint256 submittedAt) { if (submittedAt == 0) revert ErrorsLib.NoPendingValue(); - if (block.timestamp < submittedAt + timelock) revert ErrorsLib.TimelockNotElapsed(); - if (block.timestamp > submittedAt + timelock + ConstantsLib.TIMELOCK_EXPIRATION) { + + uint256 currentTimelock = timelock; + + if (block.timestamp < submittedAt + currentTimelock) revert ErrorsLib.TimelockNotElapsed(); + if (block.timestamp > submittedAt + currentTimelock + ConstantsLib.TIMELOCK_EXPIRATION) { revert ErrorsLib.TimelockExpirationExceeded(); } @@ -262,11 +265,10 @@ contract MetaMorpho is ERC4626, ERC20Permit, Ownable2Step, Multicall, IMetaMorph /// @dev Warning: Submitting a cap will overwrite the current pending cap. function submitCap(MarketParams memory marketParams, uint256 newSupplyCap) external onlyCuratorRole { Id id = marketParams.id(); - if (marketParams.loanToken != asset()) revert ErrorsLib.InconsistentAsset(id); - if (MORPHO.lastUpdate(id) == 0) revert ErrorsLib.MarketNotCreated(); - uint256 supplyCap = config[id].cap; + if (marketParams.loanToken != asset()) revert ErrorsLib.InconsistentAsset(id); if (newSupplyCap == supplyCap) revert ErrorsLib.AlreadySet(); + if (MORPHO.lastUpdate(id) == 0) revert ErrorsLib.MarketNotCreated(); if (newSupplyCap < supplyCap) { _setCap(id, newSupplyCap.toUint192()); @@ -667,14 +669,16 @@ contract MetaMorpho is ERC4626, ERC20Permit, Ownable2Step, Multicall, IMetaMorph MarketConfig storage marketConfig = config[id]; if (supplyCap > 0 && marketConfig.withdrawRank == 0) { - supplyQueue.push(id); - withdrawQueue.push(id); - - if (supplyQueue.length > ConstantsLib.MAX_QUEUE_SIZE || withdrawQueue.length > ConstantsLib.MAX_QUEUE_SIZE) - { + if ( + supplyQueue.length + 1 > ConstantsLib.MAX_QUEUE_SIZE + || withdrawQueue.length + 1 > ConstantsLib.MAX_QUEUE_SIZE + ) { revert ErrorsLib.MaxQueueSizeExceeded(); } + supplyQueue.push(id); + withdrawQueue.push(id); + // Safe "unchecked" cast because withdrawQueue.length <= MAX_QUEUE_SIZE. marketConfig.withdrawRank = uint64(withdrawQueue.length); } diff --git a/test/forge/MarketTest.sol b/test/forge/MarketTest.sol index c2aa0e85..323c372b 100644 --- a/test/forge/MarketTest.sol +++ b/test/forge/MarketTest.sol @@ -27,14 +27,15 @@ contract MarketTest is IntegrationTest { vault.submitCap(marketParams, 0); } - function testSubmitCapMarketNotCreated(MarketParams memory marketParams) public { + function testSubmitCapMarketNotCreated(MarketParams memory marketParams, uint256 cap) public { marketParams.loanToken = address(loanToken); vm.assume(morpho.lastUpdate(marketParams.id()) == 0); + vm.assume(cap != 0); vm.prank(CURATOR); vm.expectRevert(ErrorsLib.MarketNotCreated.selector); - vault.submitCap(marketParams, 0); + vault.submitCap(marketParams, cap); } function testSubmitCapAlreadySet() public {