Skip to content

Commit b3661da

Browse files
authored
Merge branch 'main' into feat/bridge-validation
2 parents 82433cd + 7f6278e commit b3661da

File tree

5 files changed

+117
-7
lines changed

5 files changed

+117
-7
lines changed

proposals/mips/mip-b51/MIP-B51.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
# MIP-B51: Change Moonwell USDC Ecosystem Vault Timelock
2+
3+
**Author(s):** Moonwell DAO **Submission Date:** October 27th, 2025
4+
5+
## Summary
6+
7+
This proposal updates the Moonwell USDC Ecosystem Vault Timelock to a 72-hour
8+
delay, aligning it with the latest risk management and operational standards
9+
requested by Anthias and confirmed by the team. The The Moonwell Ecosystem USDC
10+
vault allows for borrowable liquidity for three new isolated markets on Base,
11+
WELL/USDC, stkWELL/USDC, and MAMO/USDC. Vault depositors are rewarded with fees
12+
creating a beneficial relationship. The stkWELL/USDC market in particular will
13+
allow for new utility by giving liquid access for safety module users. Finally,
14+
this launch culminates the creation of a credit facility to support Moonwell and
15+
its operational expansion.
16+
17+
## Motivation
18+
19+
The current timelock setting does not provide an optimal delay for governance
20+
and operational safety. Per Morpho documentation and confirmed by the
21+
MetaMorphoV1_1 contract implementation, only the vault owner can modify the
22+
timelock parameter.
23+
24+
This proposal ensures the vault’s delay aligns with community standards and
25+
allows sufficient buffer time for review before execution.
26+
27+
## Implementation
28+
29+
If this proposal passes, the following onchain actions will be executed:
30+
31+
Action:
32+
33+
- Call setTimelock(72 hours) on the Vault contract.
34+
35+
## Voting Options
36+
37+
- **For:** Change the timelock
38+
- **Against:** Do not change the timelock
39+
- **Abstain**
40+
41+
## Conclusion
42+
43+
Updating the timelock to 72 hours for the Moonwell USDC Ecosystem Vault enhances
44+
operational security while maintaining flexibility for governance and curators.
45+
This adjustment aligns the vault with Moonwell’s broader risk management
46+
standards and ensures that all future vault actions are subject to a
47+
standardized 72-hour review window, improving transparency and stakeholder
48+
confidence.

proposals/mips/mip-b51/mip-b51.sol

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
//SPDX-License-Identifier: GPL-3.0-or-later
2+
pragma solidity 0.8.19;
3+
4+
import "@forge-std/Test.sol";
5+
6+
import {Configs} from "@proposals/Configs.sol";
7+
import {BASE_FORK_ID} from "@utils/ChainIds.sol";
8+
import {HybridProposal} from "@proposals/proposalTypes/HybridProposal.sol";
9+
import {IMetaMorphoBase} from "@protocol/morpho/IMetaMorpho.sol";
10+
import {ParameterValidation} from "@proposals/utils/ParameterValidation.sol";
11+
import {AllChainAddresses as Addresses} from "@proposals/Addresses.sol";
12+
13+
/// DO_VALIDATE=true DO_PRINT=true DO_BUILD=true DO_RUN=true forge script
14+
/// proposals/mips/mip-b51/mip-b51.sol:mipb51
15+
contract mipb51 is HybridProposal, Configs, ParameterValidation {
16+
string public constant override name = "MIP-B51";
17+
18+
uint256 public constant NEW_TIMELOCK = 3 days;
19+
20+
constructor() {
21+
bytes memory proposalDescription = abi.encodePacked(
22+
vm.readFile("./proposals/mips/mip-b51/MIP-B51.md")
23+
);
24+
25+
_setProposalDescription(proposalDescription);
26+
}
27+
28+
function primaryForkId() public pure override returns (uint256) {
29+
return BASE_FORK_ID;
30+
}
31+
32+
function deploy(Addresses addresses, address) public override {}
33+
34+
function build(Addresses addresses) public override {
35+
_pushAction(
36+
addresses.getAddress("meUSDC_METAMORPHO_VAULT"),
37+
abi.encodeWithSignature("submitTimelock(uint256)", NEW_TIMELOCK),
38+
"Set the timelock for the meUSDC Metamorpho Vault to 3 days"
39+
);
40+
}
41+
42+
function teardown(Addresses addresses, address) public pure override {}
43+
44+
/// @notice assert that the new timelock is set correctly
45+
function validate(Addresses addresses, address) public view override {
46+
assertEq(
47+
IMetaMorphoBase(addresses.getAddress("meUSDC_METAMORPHO_VAULT"))
48+
.timelock(),
49+
NEW_TIMELOCK,
50+
"meUSDC Metamorpho Vault timelock incorrect"
51+
);
52+
}
53+
}

proposals/mips/mips.json

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
11
[
2+
{
3+
"envpath": "",
4+
"governor": "MultichainGovernor",
5+
"id": 126,
6+
"path": "mip-b51.sol/mipb51.json",
7+
"proposalType": "HybridProposal"
8+
},
29
{
310
"envpath": "",
411
"governor": "MultichainGovernor",

test/integration/PostProposalCheck.sol

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,9 @@ contract PostProposalCheck is LiveProposalCheck {
5252
// execute proposals that are succeeded but not executed yet
5353
executeSucceededProposals(addresses, governor);
5454

55+
// reset the block timestamp in case executeSucceededProposals moved it forward
56+
vm.warp(proposalStartTime);
57+
5558
// execute proposals that are in the vote or vote collection period
5659
executeLiveProposals(addresses, governor);
5760

test/utils/LiveProposalCheck.sol

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -231,24 +231,27 @@ contract LiveProposalCheck is Test, ProposalChecker, Networks {
231231

232232
checkMoonbeamActions(targets);
233233

234+
uint256 votingStartTime;
234235
uint256 endTimestamp;
235236
uint256 crossChainVoteCollectionEndTimestamp;
236237
{
237238
// Simulate proposals execution
238239
(
239240
,
240241
,
241-
,
242+
votingStartTime,
242243
endTimestamp,
243244
crossChainVoteCollectionEndTimestamp,
244245
,
245246
,
246247
,
247248

248249
) = governor.proposalInformation(proposalId);
249-
250250
// Only vote if not in voting period
251-
if (block.timestamp < endTimestamp) {
251+
if (
252+
block.timestamp > votingStartTime &&
253+
block.timestamp < endTimestamp
254+
) {
252255
governor.castVote(proposalId, 0);
253256
console.log(
254257
"casting vote on block.timestamp: ",
@@ -465,7 +468,6 @@ contract LiveProposalCheck is Test, ProposalChecker, Networks {
465468

466469
temporalGovernor.queueProposal(vaa);
467470

468-
console.log("block timestamp after queueing: ", block.timestamp);
469471
vm.warp(block.timestamp + temporalGovernor.proposalDelay());
470472

471473
try temporalGovernor.executeProposal(vaa) {} catch (bytes memory e) {
@@ -498,9 +500,6 @@ contract LiveProposalCheck is Test, ProposalChecker, Networks {
498500

499501
vm.selectFork(activeFork);
500502

501-
console.log("temporalGovernor");
502-
console.log(address(temporalGovernor));
503-
504503
temporalGovernor.executeProposal(vaa);
505504

506505
proposal.afterSimulationHook(addresses);

0 commit comments

Comments
 (0)