diff --git a/src/adapters/MorphoMarketV1AdapterV2.sol b/src/adapters/MorphoMarketV1AdapterV2.sol index 07c222d35..8d620a864 100644 --- a/src/adapters/MorphoMarketV1AdapterV2.sol +++ b/src/adapters/MorphoMarketV1AdapterV2.sol @@ -82,10 +82,12 @@ contract MorphoMarketV1AdapterV2 is IMorphoMarketV1AdapterV2 { } function timelocked() internal { + bytes4 selector = bytes4(msg.data); require(executableAt[msg.data] != 0, DataNotTimelocked()); require(block.timestamp >= executableAt[msg.data], TimelockNotExpired()); + require(!IVaultV2(parentVault).abdicated(selector), Abdicated()); executableAt[msg.data] = 0; - emit Accept(bytes4(msg.data), msg.data); + emit Accept(selector, msg.data); } function revoke(bytes calldata data) external { diff --git a/src/adapters/interfaces/IMorphoMarketV1AdapterV2.sol b/src/adapters/interfaces/IMorphoMarketV1AdapterV2.sol index ffc54c08d..fc281206f 100644 --- a/src/adapters/interfaces/IMorphoMarketV1AdapterV2.sol +++ b/src/adapters/interfaces/IMorphoMarketV1AdapterV2.sol @@ -19,6 +19,7 @@ interface IMorphoMarketV1AdapterV2 is IAdapter { /* ERRORS */ + error Abdicated(); error AlreadyPending(); error DataNotTimelocked(); error IrmMismatch(); diff --git a/test/MorphoMarketV1AdapterV2Test.sol b/test/MorphoMarketV1AdapterV2Test.sol index d5821170a..a0f4e9aad 100644 --- a/test/MorphoMarketV1AdapterV2Test.sol +++ b/test/MorphoMarketV1AdapterV2Test.sol @@ -526,4 +526,19 @@ contract MorphoMarketV1AdapterV2Test is Test { ); assertEq(adapter.realAssets(), 0, "realAssets"); } + + function testAbdicated() public { + parentVault.setAbdicated(IMorphoMarketV1AdapterV2.morphoMarketV1AdapterV2BurnShares.selector, true); + + vm.prank(curator); + adapter.submit(abi.encodeCall(IMorphoMarketV1AdapterV2.morphoMarketV1AdapterV2BurnShares, (marketId))); + + vm.warp( + block.timestamp + parentVault.timelock(IMorphoMarketV1AdapterV2.morphoMarketV1AdapterV2BurnShares.selector) + ); + + vm.expectRevert(IMorphoMarketV1AdapterV2.Abdicated.selector); + vm.prank(curator); + adapter.morphoMarketV1AdapterV2BurnShares(marketId); + } } diff --git a/test/mocks/VaultV2Mock.sol b/test/mocks/VaultV2Mock.sol index f6bfd1329..0c63af1f3 100644 --- a/test/mocks/VaultV2Mock.sol +++ b/test/mocks/VaultV2Mock.sol @@ -14,6 +14,7 @@ contract VaultV2Mock { mapping(bytes32 => uint256) public allocation; uint256 public _timelock; uint256 public firstTotalAssets; + mapping(bytes4 => bool) public abdicated; constructor(address _asset, address _owner, address _curator, address _allocator, address _sentinel) { asset = _asset; @@ -59,4 +60,8 @@ contract VaultV2Mock { function setFirstTotalAssets(uint256 newFirstTotalAssets) external { firstTotalAssets = newFirstTotalAssets; } + + function setAbdicated(bytes4 selector, bool newAbdicated) external { + abdicated[selector] = newAbdicated; + } }