Skip to content

Commit de3175a

Browse files
authored
Merge pull request #543 from moonwell-fi/mip-x37
Mip x37
2 parents e8e1025 + b188057 commit de3175a

File tree

10 files changed

+359
-84
lines changed

10 files changed

+359
-84
lines changed

CLAUDE.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1-
- Always set the id in @proposals/mips/mips.json to 0 when creating new proposals
1+
- Always set the id in @proposals/mips/mips.json to 0 when creating new
2+
proposals

chains/10.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -719,7 +719,7 @@
719719
"isContract": true,
720720
"name": "CHAINLINK_wrsETH_ETH_EXCHANGE_RATE"
721721
},
722-
{
722+
{
723723
"addr": "0x5fddda4866db63685018faa1bfc9bfce7072014c",
724724
"isContract": true,
725725
"name": "CHAINLINK_wrsETH_COMPOSITE_ORACLE"

chains/8453.json

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,5 +1238,10 @@
12381238
"addr": "0xccC994a46c0d81c934fd6c82d89f626aee336ade",
12391239
"isContract": true,
12401240
"name": "CHAINLINK_wrsETH_COMPOSITE_ORACLE"
1241+
},
1242+
{
1243+
"addr": "0xadcC226082E878371a3fc33c1f914dad7FB6a28D",
1244+
"isContract": false,
1245+
"name": "BAD_DEBT_REPAYER_EOA"
12411246
}
12421247
]

proposals/mips/mip-b52/b52.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
## MIP-B52: Bad Debt Remediation
2+
3+
### **Summary**
4+
5+
This proposal implements Anthias Labs' recommended actions to remediate the
6+
outstanding bad debt within select markets on Moonwell's Base implementation
7+
resulting from events which took place on October 10th, 2025 and November
8+
4th, 2025. This proposal also formalizes an allocation strategy for distributing
9+
excess reserves between cbXRP and VIRTUAL, based on both proportional debt share
10+
and contributor feedback on interest-rate dynamics.
11+
12+
### **Background**
13+
14+
Anthias has conducted a reserve and risk assessment on Moonwell Base following
15+
the two major incidents that produced bad debt in multiple markets. Their
16+
analysis included a review on current protocol reserve balances, updated minimum
17+
reserve targets, outstanding bad debt, and the proper distribution of excess
18+
reserves available for repayment among the highest interest markets.
19+
20+
Moonwell holds approximately 1.89M USD in reserves, distributed across assets
21+
like WETH, USDC, cbBTC, AERO, etc. Significant idle reserves exist in certain
22+
markets, particularly USDC and cbBTC. These reserves can partially or fully
23+
cover existing bad debt without external funding.
24+
25+
Anthias has identified 5.25M USD in required reserves to fully remediate all bad
26+
debt, with the largest deficits concentrated in cbXRP (2.57M USD), VIRTUAL
27+
(1.96M USD), AERO (248K USD), and other markets like MORPHO, EURC, and cbETH. No
28+
single market's bad debt can be resolved using only its own reserves,
29+
necessitating a coordinated proposal.
30+
31+
### **Proposal**
32+
33+
This proposal enacts the following changes on Moonwell Base only:
34+
35+
1. Limit Reserve Auctions During Bad-Debt Remediation
36+
37+
- Reserve auctions on Base (and OP Mainnet, where applicable) will be limited
38+
and minimized while bad debt is being repaid.
39+
- Auctions will not be fully halted; contributors may still conduct small or
40+
periodic auctions when necessary or when the opportunity arises.
41+
- The intention is to conserve reserves during the remediation period while
42+
maintaining flexibility for contributors.
43+
44+
2. Redirect 100% of Reserve Accruals Toward Bad-Debt Repayment
45+
46+
- All future reserve income (interest margin, liquidation fees, protocol
47+
revenue) will go directly to paying down outstanding bad debt.
48+
49+
3. Utilize Excess Reserves in USDC and cbBTC
50+
51+
- Anthias identifies significant excess reserves in these markets.
52+
- This proposal reduces 490,000 USDC and 3 cbBTC from their respective
53+
markets to be used for bad debt repayment.
54+
- These funds will be used to cover bad debt, prioritizing:
55+
1. cbXRP
56+
2. VIRTUAL
57+
3. AERO, MORPHO, EURC, cbETH (in order of deficit)
58+
59+
4. Adopt Minimum Reserve Targets
60+
61+
- Reserve auctions remain limited until each asset’s reserves reach or exceed
62+
Anthias’ recommended minimum level.
63+
64+
5. Adopt an Allocation Strategy for cbXRP and VIRTUAL
65+
66+
- These two assets are of high interest and with a significant portion of
67+
shortfall being centered between these two assets. As such, there may be a
68+
preference to pay off VIRTUAL first due its historically high interest
69+
rate.
70+
71+
6. Transparently Communicate Progress
72+
- The Foundation or designated contributors will report ongoing metrics
73+
including:
74+
- Remaining bad debt
75+
- Reserves used
76+
- Reserve accrual rate
77+
- Progress toward minimum reserve targets
78+
79+
### **Rationale**
80+
81+
Bad debt weakens protocol solvency, user confidence, and long-term
82+
sustainability. The Anthias analysis demonstrates both:
83+
84+
1. The scale of the problem — multiple markets are underwater, with an aggregate
85+
shortfall of ~$5.25 M.
86+
2. A clear, conservative path to remediation — using existing reserves, limiting
87+
auctions, and redirecting future accrual allows Moonwell to address the issue
88+
without external capital or token dilution.
89+
90+
Limiting reserve auctions ensures the protocol does not drain capital too
91+
quickly while still allowing contributors flexibility to conduct small or
92+
periodic auctions when needed. Redirecting reserve accrual speeds up repayment
93+
using organic protocol revenue. Drawing from excess reserves in USDC and cbBTC
94+
markets allows immediate remediation of the largest deficits without sacrificing
95+
safety.
96+
97+
In short: this plan protects the protocol, its users, and its long-term
98+
viability.
99+
100+
### **Voting Options**
101+
102+
- **Yes** — Adopt the Anthias bad-debt remediation plan: limit auctions,
103+
redirect reserves, and use excess USDC/cbBTC to repay bad debt.
104+
- **No** — Reject the plan; continue current reserve operations.
105+
- **Abstain** — No preference.

proposals/mips/mip-b52/mip-b52.sol

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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 {MErc20} from "@protocol/MErc20.sol";
7+
import {IERC20} from "@openzeppelin-contracts/contracts/token/ERC20/IERC20.sol";
8+
9+
import {HybridProposal, ActionType} from "@proposals/proposalTypes/HybridProposal.sol";
10+
import {AllChainAddresses as Addresses} from "@proposals/Addresses.sol";
11+
import {BASE_FORK_ID} from "@utils/ChainIds.sol";
12+
import {ProposalActions} from "@proposals/utils/ProposalActions.sol";
13+
14+
/// @title MIP-B52: Bad Debt Remediation
15+
/// @notice Proposal to reduce reserves from two Base markets and transfer to EOA for repaying bad debt:
16+
/// 1. Reduce 490,000 USDC from MOONWELL_USDC market
17+
/// 2. Reduce 3 cbBTC from MOONWELL_cbBTC market
18+
/// 3. Transfer all tokens to BAD_DEBT_REPAYER_EOA for swapping to VIRTUALS and cbXRP
19+
contract mipb52 is HybridProposal {
20+
using ProposalActions for *;
21+
22+
string public constant override name = "MIP-B52";
23+
24+
// Reserve amounts to reduce
25+
uint256 public constant USDC_AMOUNT = 490_000e6; // 490,000 USDC
26+
uint256 public constant cbBTC_AMOUNT = 3e8; // 3 cbBTC
27+
28+
constructor() {
29+
bytes memory proposalDescription = abi.encodePacked(
30+
vm.readFile("./proposals/mips/mip-b52/b52.md")
31+
);
32+
_setProposalDescription(proposalDescription);
33+
}
34+
35+
function primaryForkId() public pure override returns (uint256) {
36+
return BASE_FORK_ID;
37+
}
38+
39+
function deploy(Addresses, address) public override {}
40+
41+
function build(Addresses addresses) public override {
42+
vm.selectFork(BASE_FORK_ID);
43+
44+
address eoa = addresses.getAddress("BAD_DEBT_REPAYER_EOA");
45+
46+
// === USDC Reserve Reduction ===
47+
address moonwellUsdc = addresses.getAddress("MOONWELL_USDC");
48+
address usdc = MErc20(moonwellUsdc).underlying();
49+
50+
_pushAction(
51+
moonwellUsdc,
52+
abi.encodeWithSignature("_reduceReserves(uint256)", USDC_AMOUNT),
53+
"Reduce 490,000 USDC reserves from MOONWELL_USDC",
54+
ActionType.Base
55+
);
56+
57+
_pushAction(
58+
usdc,
59+
abi.encodeWithSignature(
60+
"transfer(address,uint256)",
61+
eoa,
62+
USDC_AMOUNT
63+
),
64+
"Transfer 490,000 USDC to BAD_DEBT_REPAYER_EOA",
65+
ActionType.Base
66+
);
67+
68+
// === cbBTC Reserve Reduction ===
69+
address moonwellCbBtc = addresses.getAddress("MOONWELL_cbBTC");
70+
address cbBtc = MErc20(moonwellCbBtc).underlying();
71+
72+
_pushAction(
73+
moonwellCbBtc,
74+
abi.encodeWithSignature("_reduceReserves(uint256)", cbBTC_AMOUNT),
75+
"Reduce 3 cbBTC reserves from MOONWELL_cbBTC",
76+
ActionType.Base
77+
);
78+
79+
_pushAction(
80+
cbBtc,
81+
abi.encodeWithSignature(
82+
"transfer(address,uint256)",
83+
eoa,
84+
cbBTC_AMOUNT
85+
),
86+
"Transfer 3 cbBTC to BAD_DEBT_REPAYER_EOA",
87+
ActionType.Base
88+
);
89+
}
90+
91+
function validate(Addresses addresses, address) public override {
92+
vm.selectFork(BASE_FORK_ID);
93+
94+
address eoa = addresses.getAddress("BAD_DEBT_REPAYER_EOA");
95+
96+
// Validate USDC transfer
97+
address usdc = MErc20(addresses.getAddress("MOONWELL_USDC"))
98+
.underlying();
99+
uint256 usdcBalance = IERC20(usdc).balanceOf(eoa);
100+
assertGe(
101+
usdcBalance,
102+
USDC_AMOUNT,
103+
"BAD_DEBT_REPAYER_EOA should have received USDC"
104+
);
105+
106+
// Validate cbBTC transfer
107+
address cbBtc = MErc20(addresses.getAddress("MOONWELL_cbBTC"))
108+
.underlying();
109+
uint256 cbBtcBalance = IERC20(cbBtc).balanceOf(eoa);
110+
assertGe(
111+
cbBtcBalance,
112+
cbBTC_AMOUNT,
113+
"BAD_DEBT_REPAYER_EOA should have received cbBTC"
114+
);
115+
}
116+
}

proposals/mips/mip-x35/x35.md

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
A proposal to adjust the following risk parameters:
1010

11-
| Parameters | Current Value | Recommended Value |
12-
| --- | --- | --- |
13-
| MAMO Borrow Cap | 12M | 3M |
14-
| tBTC Collateral Factor | 85% | 84% |
15-
| LBTC Collateral Factor | 85% | 84% |
11+
| Parameters | Current Value | Recommended Value |
12+
| ---------------------- | ------------- | ----------------- |
13+
| MAMO Borrow Cap | 12M | 3M |
14+
| tBTC Collateral Factor | 85% | 84% |
15+
| LBTC Collateral Factor | 85% | 84% |
1616

1717
<sub> \*Cap changes will be implemented via Cap Guardian </sub>
1818

@@ -21,11 +21,11 @@ A proposal to adjust the following risk parameters:
2121
A proposal to adjust the IR Parameters for USDC:
2222

2323
| **USDC IR Parameters** | Current Value | Recommended Value |
24-
| --- | --- | --- |
25-
| Base | 0 | 0 |
26-
| Kink | 0.9 | 0.9 |
27-
| Multiplier | **0.072** | **0.08** |
28-
| Jump Multiplier | 9 | 9 |
24+
| ---------------------- | ------------- | ----------------- |
25+
| Base | 0 | 0 |
26+
| Kink | 0.9 | 0.9 |
27+
| Multiplier | **0.072** | **0.08** |
28+
| Jump Multiplier | 9 | 9 |
2929

3030
## OP Mainnet
3131

@@ -36,18 +36,18 @@ A proposal to adjust the IR Parameters for USDC:
3636
A proposal to adjust the IR Parameters for USDT0 and DAI:
3737

3838
| **USDT0 IR Parameters** | Current Value | Recommended Value |
39-
| --- | --- | --- |
40-
| Base | 0 | 0 |
41-
| Kink | 0.9 | 0.9 |
42-
| Multiplier | **0.061** | **0.067** |
43-
| Jump Multiplier | 9 | 9 |
39+
| ----------------------- | ------------- | ----------------- |
40+
| Base | 0 | 0 |
41+
| Kink | 0.9 | 0.9 |
42+
| Multiplier | **0.061** | **0.067** |
43+
| Jump Multiplier | 9 | 9 |
4444

4545
| **DAI IR Parameters** | Current Value | Recommended Value |
46-
| --- | --- | --- |
47-
| Base | 0 | 0 |
48-
| Kink | 0.9 | 0.9 |
49-
| Multiplier | **0.061** | **0.067** |
50-
| Jump Multiplier | 9 | 9 |
46+
| --------------------- | ------------- | ----------------- |
47+
| Base | 0 | 0 |
48+
| Kink | 0.9 | 0.9 |
49+
| Multiplier | **0.061** | **0.067** |
50+
| Jump Multiplier | 9 | 9 |
5151

5252
For more information refer to our forum post:
5353
[link](https://forum.moonwell.fi/t/anthias-labs-risk-parameter-recommendations/1759/6).

0 commit comments

Comments
 (0)