MUSD (Mezo USD) — Long-form Analysis
A Liquity-v2-style, BTC-collateralized CDP stablecoin native to the Mezo chain, with per-trove interest, a protocol-owned stability backstop, and a non-inflationary cross-chain bridge.
1. Executive Summary
MUSD is a BTC-backed collateralized-debt-position (CDP) stablecoin deployed on Mezo mainnet (chainId 31612) and built by Thesis, the team behind tBTC, Keep, and Fold. It is a faithful fork of Liquity v2: users open troves collateralized by native BTC (the Mezo gas token), mint MUSD against them, and the system maintains the peg through redemptions, a StabilityPool backstop, and recovery-mode collateralization thresholds. At assessment time the supply was ≈ 29.4M MUSD. The on-chain core is competently engineered — checks-effects-interactions (CEI) is verified on every native-BTC payout, interest accounting is symmetric, and mint/burn authority is scoped exactly to the canonical Liquity system contracts with no public mint path.
The assessment assigns a security score of 60.0 / 100, grade B, risk level Medium. The deal-breaker gate clears with no failures (15 PASS, 7 N/A, 1 Inconclusive across the 23-item checklist). The grade sits in the B band — not higher — because of three structural governance and operational gaps rather than code defects: an untimelocked 5-of-9 Gnosis Safe with full upgrade and mint-list authority; a single chain-native BTC/USD oracle with no fallback and no value-sanity bounds on the read path; and deployed bytecode that post-dates the only public audit and is unverified on the Mezo explorer.
A trust-model caveat frames all three. The 5/9 Safe is operated by the Mezo/Thesis team — the same entity that already runs the chain’s validators, the BTC/USD oracle precompile, and the native bridge. The admin power therefore does not introduce a counterparty beyond the one a Mezo user already trusts; it concentrates app-layer authority into the same hands as chain-layer authority. The residual concerns are that concentration and the mechanism — a 5/9 key compromise with no timelock leaves no reaction window.
2. Protocol Overview
MUSD’s mission is to provide a BTC-native dollar on Mezo. The collateral asset is native BTC (the chain’s gas token), and the debt asset is MUSD, a non-upgradeable ERC20Permit + Ownable token. The token contract is deliberately minimal: minting and burning are gated to an explicit allow-list, and on-chain the only live minters are BorrowerOperations and InterestRateManager, with burners BorrowerOperations, TroveManager, and StabilityPool — exactly the canonical Liquity wiring. There is no public mint function.
The borrowing flow follows Liquity v2 closely. A user opens a trove through BorrowerOperations, depositing native BTC and minting MUSD up to the minimum collateral ratio (MCR 110%). Interest accrues per-trove through InterestRateManager, which tracks an interestNumerator that the assessment verified is added to and removed from symmetrically across open, adjust, close, and liquidation flows (no underflow). System solvency is defended by TroveManager liquidations and by redemptions, which let any holder swap MUSD for collateral at face value against the least-collateralized troves. A critical-collateral-ratio (CCR 150%) recovery mode tightens behavior under system-wide stress.
The StabilityPool is the first-loss backstop: depositors supply MUSD that is burned to absorb liquidated debt in exchange for discounted collateral. A protocol-owned component, PCV (Protocol Controlled Value), seeds a bootstrap loan (on the order of 100M MUSD of protocol-owned StabilityPool capital) and, in its V2 form, distributes BTC fees and a savings rate. The assessment confirmed PCV/governance fund movements operate on PCV’s own capital — StabilityPool.withdrawFromSP acts on deposits[msg.sender], so governance cannot pull user SP deposits or trove collateral.
Operator roles are concentrated in a single 5-of-9 Gnosis Safe (0x98D8…7C7a, Safe v1.3.0) that owns the token, the PriceFeed, the PCV, GovernableVariables, and every ProxyAdmin. There is no governance token and no on-chain voting. InterestRateManager renounces ownership after setup, and a separate BorrowerOperationsSignatures contract supports EIP-712 meta-transactions (deadline, per-borrower nonce, chainId-bound domain — verified sound).
Pricing comes from a single source: PriceFeed reads the Mezo “Skip” BTC/USD precompile (0x7b7c…0015), a Chainlink-compatible consensus oracle. Verified on-chain at assessment time, the precompile refreshes every block (~3s block time, measured staleness 0s, 18 decimals), so the 60-second staleness window is appropriately sized. Liquity’s Tellor fallback was removed, leaving no secondary source.
The deployment scope is Mezo-only for the native token: 15 core contracts (the token plus 14 transparent proxies), wired to the Skip oracle precompile and a Wormhole NTT bridge. A single Cantina audit (2025-04-15) predates the current PCV V2 code. Full addresses are in §9.
3. Findings
3.1 Untimelocked 5/9 multisig holds full upgrade and mint authority
The defining trust assumption in MUSD is governance concentration. A single 5-of-9 Gnosis Safe (0x98D8…7C7a) owns every ProxyAdmin and the MUSD token. There is no timelock anywhere between the Safe and the contracts it controls.
With those powers, the Safe can, in one transaction: upgrade BorrowerOperations to mint MUSD freely; upgrade ActivePool to drain BTC collateral; or call addToMintList to register an arbitrary address as a minter and issue unlimited MUSD. Each of these is a complete loss vector. Because there is no timelock, there is no public delay, no veto window, and no opportunity for holders to react before execution. Mitigation is purely operational: the 5/9 threshold and the team’s key custody.
The mitigating context is the trust-model collapse described in §1 and §5: the Safe is the Mezo/Thesis team, who already control the chain’s validators, oracle, and bridge. A Mezo user is already trusting that entity at the chain layer. What this finding adds is concentration — app-layer mint/upgrade authority sits with the same party as chain-layer authority, unlike a neutral L1 where the two are separated — and mechanism risk: a 5/9 multisig key compromise is a different and faster failure mode than a consensus failure, and the absence of a timelock removes any reaction window. The team’s identity is credited as a positive (a green flag), not folded into the access-control score, to avoid double-counting.
3.2 Single chain-native oracle with no fallback and no read-path sanity checks
PriceFeed consumes exactly one source — the Mezo Skip BTC/USD precompile — and Liquity’s Tellor backup has been removed. The read path performs a staleness check but no price > 0, negative-value, or deviation/bounds checks, and answeredInRound is always 0 (which is why the standard round-completeness check was intentionally dropped).
The original concern was an oracle-lag liquidation freeze, but on-chain verification softened it: because the precompile updates every block (~3s), the 60s staleness window does not brick the system under normal operation. A revert only occurs if the chain’s oracle module itself stalls — in which case freezing is the safe behavior. The genuine residual is garbage-in: a single bad or zero price from the chain oracle is consumed directly for minting and liquidation with no sanity guard (tracked as C-02). Trust ultimately rests on the Mezo chain’s oracle module / Skip sidecar — a chain-level assumption that is not verifiable from the EVM.
A sharpening detail: a richer Pyth oracle (including an MUSD/USD feed) already exists on Mezo at 0x2880…7B43 and could serve as a fallback, but PriceFeed does not use it. The fix surface is therefore well understood — add a fallback plus deviation/circuit-breaker bounds — and is recommendation territory, not a deal-breaker.
3.3 Deployed code post-dates the only public audit and is unverified on-chain
Cantina audited MUSD on 2025-04-15, but the repository HEAD is a PCV V2 upgrade (May 2026, reinitializer(2)) that adds new BTC fee-distribution, distributor, and savings-rate logic. The deployed bytecode is unverified on Blockscout, so source-to-bytecode equivalence is assumed (review relied on the official GitHub repo), and the V2 delta has no confirmed re-audit.
The impact is epistemic rather than a concrete exploit: “audited” and “deployed” cannot be proven to be the same code, and the newest, most complex logic (fee distribution and savings rate) is precisely the part with the least external review. This drives the largest single score drag — Code Quality & Verification scored 39.0 (Contract Verification = 0) — and a -5 red flag for post-audit modification without confirmed re-audit. The assessment notes that confirming a V2 review and verifying bytecode would remove the red flag and lift the final score to roughly 65.
The softening context: the source is public and open, the team is doxxed and actively developing, and static analysis (Slither) over the project source returned 0 High / 0 Medium / 3 benign Low. So the unverified-bytecode gap is about provenance and re-audit coverage, not evidence of a defect.
3.4 Economic design weakened by a fixed redemption fee
The core CDP collateralization is sound — MCR 110% / CCR 150% with recovery mode, and a large protocol-owned StabilityPool backstop. The economic-design concern (C-03) is that the redemption fee appears to be fixed by governance rather than using Liquity’s dynamic base-rate spike-and-decay. A dynamic base rate makes redemptions progressively more attractive as the peg slips, pulling MUSD back toward $1; a fixed fee weakens that peg-restoration force under a sustained depeg. The practical constraint on exit is also liquidity depth: native-Mezo trading venues for MUSD are thin relative to the ~$29M supply.
3.5 Bridge cannot inflate native supply
The Wormhole NTT Manager on Mezo (0x7efb…e0bD) runs in locking mode — it holds roughly 1.2M MUSD in custody and is not on the mint or burn lists. Cross-chain bridging therefore cannot mint native MUSD; canonicality is enforced by the off-chain NTT lock/mint invariant. Wrapped MUSD on Ethereum and Base is a separate deployment and out of scope here. This is a positive finding: the bridge surface, often a source of inflation risk, does not threaten native supply integrity. Wormhole guardian trust applies only to the wrapped representations on other chains.
4. Deal Breaker Analysis
The framework’s deal-breaker gate is a fixed 23-item checklist; any FAIL halts the assessment with a Fail outcome. MUSD clears the gate with 15 PASS, 0 FAIL, 7 N/A, and 1 Inconclusive.
4.1 Access Control & Governance
| Item | Status | Notes |
|---|---|---|
| EOA Upgrade Control | PASS | All ProxyAdmins owned by the 5/9 Gnosis Safe 0x98D8…7C7a, not an EOA. |
| EOA Fund Control | PASS | No single-EOA fund-withdrawal path; admin powers are multisig-gated. |
| >60% Governance Centralization | N/A | No governance token; control via the multisig. |
| Governance Mechanism Bypass | N/A | No on-chain token voting. |
| Timelock Backdoors | PASS | No bypass functions, but no timelock at all between the Safe and the contracts — scored as a risk, not a hard breaker (see §3.1). |
| No Emergency Controls | N/A | Liquity-style non-custodial CDP has no pause; an upgrade is the only lever. |
4.2 Oracle & Price Integrity
| Item | Status | Notes |
|---|---|---|
| Direct Pool Price Oracle | PASS | Source is the Mezo L1 chain-native BTC/USD precompile, not a DEX spot price. |
| Manual Price Control | PASS | No setPrice; setOracle (onlyOwner) must point to a feed returning decimals()>0 and a nonzero price. Repointing risk noted in §3.2. |
4.3 Smart Contract Architecture
| Item | Status | Notes |
|---|---|---|
| Known Compiler Bugs | PASS | Solidity 0.8.24, no applicable CVE. |
| No Reentrancy Protection | PASS | Strict CEI verified on all native-BTC payout paths; PCV adds nonReentrant. |
| Unlimited Minting | PASS | Mint gated to system contracts; the Safe can add an arbitrary minter (centralization risk, not a breaker). |
| Unsafe Delegatecall / Call | PASS | No delegatecall; only SendCollateral raw .call{value} for native-BTC transfer. |
| Uninitialized Implementation | PASS | _disableInitializers() present in all upgradeable impls (exception: GovernableVariables, D-1 — low impact). |
| Unprotected Initializer | PASS | initializer/reinitializer modifiers present; on-chain initialized=true. |
4.4 Audit & Verification
| Item | Status | Notes |
|---|---|---|
| No Audit + High TVL | PASS | Cantina audit (2025-04-15); TVL ≈ $29M MUSD supply. |
| Unverified Contracts | Inconclusive | Deployed bytecode unverified on Blockscout; reviewed against the official GitHub source. Not a hard breaker (source is public). |
| Critical Unfixed Issues | PASS | No public unfixed Critical/High known; Cantina PDF not deep-read per scope. |
4.5 Economic & Liquidity
| Item | Status | Notes |
|---|---|---|
| Zero Flash Loan Protection | PASS | Oracle-priced CDP; no same-block DEX reads; core ops atomic and CEI-safe. |
| Broken Tokenomics | N/A | Stablecoin; no APY emissions. |
| No Slippage Protection | PASS | Redemptions/adjustments use hints + max-fee parameters; signature path carries deadlines. |
4.6 Cross-Chain & Bridges
| Item | Status | Notes |
|---|---|---|
| Centralized Bridge | N/A | NTT Manager on Mezo runs in locking mode and holds no mint/burn rights on the native token. |
| No Transfer Limits | N/A | Bridge rate limits are an NTT/destination-chain concern; native supply is unaffected. |
| No Token Verification | N/A | Native token; canonicality enforced by the NTT lock/mint invariant. |
5. Trust & Permissions
Authority concentrates almost entirely in one 5-of-9 Gnosis Safe.
| Surface | Controller | Type | Min delay | Worst case |
|---|---|---|---|---|
| All ProxyAdmins — Proxy upgrade | 0x98D8…7C7a | Multisig 5/9 | Instant | Upgrade BorrowerOperations to mint freely or ActivePool to drain BTC collateral |
| MUSD token — Owner (mint list) | 0x98D8…7C7a | Multisig 5/9 | Instant | addToMintList an arbitrary address to mint unlimited MUSD |
PriceFeed — setOracle | 0x98D8…7C7a | Multisig 5/9 | Instant | Repoint the BTC/USD oracle to a malicious feed; mis-price collateral and liquidations |
PCV / GovernableVariables — Owner | 0x98D8…7C7a | Multisig 5/9 | Instant | Adjust PCV/governance params; movements scoped to PCV’s own capital (cannot pull user SP/trove funds) |
Two observations follow. First, the dominant trust risk is the no-timelock upgrade/mint path, not any single contract. Every powerful lever — implementation replacement, mint-list mutation, oracle repointing — resolves to the same multisig with zero delay. The system has strong intra-protocol boundaries (PCV cannot reach user funds, the bridge cannot mint) but no temporal boundary on the admin itself.
Second, the trust posture is best understood as a single “trust the Mezo team + chain” bet rather than an independent extra risk. The same Safe already governs the validators, the oracle precompile, and the bridge; a user transacting on Mezo is already exposed to that party. The improvements that would most resolve the dominant risk are mechanical: a timelock on the ProxyAdmin owner (introducing a reaction window) and caps or delays on mint-list additions. Either change would materially shrink the blast radius of a key compromise without altering the protocol’s economics.
6. Architecture Notes
6.1 Upgrade pattern
The token is non-upgradeable (immutable Ownable ERC20Permit); all other core contracts are transparent upgradeable proxies whose ProxyAdmins are owned by the Safe. The PCV proxy is on its V2 implementation via reinitializer(2). The assessment verified the V2 storage layout is append-only (five new fields appended after the original storage, no collision), which is the correct pattern, though no migration tests or storage-layout tooling were available in the reviewed snapshot.
6.2 Oracle integration
PriceFeed wraps the Skip BTC/USD precompile (0x7b7c…0015), which implements latestRoundData() and decimals() (returning 18); description() and version() revert. Verification on-chain confirmed per-block updates with updatedAt == block.timestamp and zero measured staleness, validating the 60s window. The gap is the absent fallback and the missing read-path value checks (§3.2). The unused Mezo Pyth feed is the obvious fallback candidate.
6.3 Reentrancy and locking
The strongest category (Smart Contract Security scored 80.25, A−). Every native-BTC payout path — closeTrove, withdrawColl, redeemCollateral, StabilityPool withdrawals, gas compensation, and CollSurplus claims — updates state before the external .call{value}, with no double-spend or read-only reentrancy. mintBootstrapLoanFromPCV is single-trigger (guarded by PCV isInitialized). The PCV layer adds explicit nonReentrant guards for its semi-trusted recipients.
6.4 Interest and PCV mechanics
Interest accrues per trove through a scaled interestNumerator that is added and removed symmetrically across all flows — the assessment confirmed no underflow path. The PCV bootstrap loan provides a protocol-owned StabilityPool backstop, and the V2 distributor streams BTC fees and a savings rate. Crucially, all PCV/governance fund operations act only on PCV’s own capital; user StabilityPool deposits (deposits[msg.sender]) and trove collateral are out of reach.
6.5 Aggravating factors beyond the deal breakers
- No timelock anywhere on the admin path — the single most consequential non-breaker (§3.1).
- Non-standard token behavior: MUSD
transfer/transferFromrevert onto == address(this)(D-2), which can break naive integrators. GovernableVariablesis the one implementation missing_disableInitializers()(D-1); low impact behind a proxy.- PCV
withdraw*functions lacknonReentrant, and a maliciousfeeRecipientcould DoSdistributeMUSD(B-2/B-3) — griefing-class, limited. - Off-chain dependency: the oracle’s operator set and the bridge’s lock/mint invariant are chain-level assumptions not verifiable from the EVM.
7. Open Issues
Eight issues are surfaced for the protocol team. Priorities reflect engineering urgency for the maintainers, not a position on the protocol from this site’s perspective.
7.1 P1 — within 1 month
- Untimelocked 5/9 Safe can mint or upgrade to drain (A-1/A-2). High, Access Control. Latent total loss if the multisig is compromised or malicious. Recommendation: add a timelock to the ProxyAdmin owner; cap and/or timelock mint-list additions.
- Deployed code post-dates the Cantina audit; bytecode unverified (RF). High, Code Quality. Audited code is not provably deployed; the PCV V2 delta carries unknown risk. Recommendation: re-audit the V2 delta and verify the deployed bytecode on the explorer.
7.2 P2 — within 3 months
- Single chain-native oracle, no fallback, no sanity bounds (C-01). Medium, Oracle. Per-block updates keep the staleness window safe, but a single bad/zero price is trusted directly and a chain oracle stall freezes the system. Recommendation: add a fallback (e.g. the Mezo Pyth feed) plus deviation/circuit-breaker bounds.
fetchPricelacks aprice>0/ round-completeness check (C-02). Medium, Oracle. A zero or negative answer would mis-price collateral or disable liquidations. Recommendation: add value and round-completeness guards on the read path.- Fixed redemption fee with no dynamic base-rate decay (C-03). Medium, Economic. Weaker peg-restoration force under a sustained depeg. Recommendation: restore the dynamic base-rate mechanism.
- MUSD transfer reverts on
to==address(this)(D-2). Low, Dependencies. Integration/composability breakage. Recommendation: document the deviation and assess integrator impact. GovernableVariablesmissing_disableInitializers()(D-1). Low, Code Quality. The implementation can be initialized (low impact behind a proxy). Recommendation: add a constructor disable for consistency.- PCV
withdraw*lacknonReentrant; maliciousfeeRecipientcan DoSdistributeMUSD(B-2/B-3). Low, Smart Contract. Griefing/limited DoS. Recommendation: add guards and validate thefeeRecipient.
8. Audit History
| Date | Firm | Tier | Note |
|---|---|---|---|
| 2025-04-15 | Cantina | 1 | MUSD smart contracts; not deep-read per scope. Pre-dates the PCV V2 upgrade. |
A single engagement with a top-tier firm (Cantina) is meaningful but does not reach the “3+ audits” bar, and — critically — it predates the deployed PCV V2 code. Cantina’s contest-and-review model surfaces a broad class of issues, but a 2025 scope cannot speak to 2026 logic. The provenance gap in §3.3 (unverified bytecode plus an unaudited V2 delta) is the practical consequence. The report PDF is linked from the dashboard’s Audit History section.
9. Contract Inventory
Deployed bytecode is unverified on the Mezo Blockscout explorer for all core contracts; review relied on the official mezo-org/musd GitHub source.
| Contract | Address | Type | Compiler |
|---|---|---|---|
| MUSD (token) | 0xdD468A1DDc392dcdbEf6db6e34E89AA338F9F186 | Immutable (Ownable ERC20Permit) | 0.8.24 |
| BorrowerOperations | 0x44b1bac67dDA612a41a58AAf779143B181dEe031 | TransparentUpgradeableProxy | 0.8.24 |
| TroveManager | 0x94AfB503dBca74aC3E4929BACEeDfCe19B93c193 | TransparentUpgradeableProxy | 0.8.24 |
| StabilityPool | 0x73245Eff485aB3AAc1158B3c4d8f4b23797B0e32 | TransparentUpgradeableProxy | 0.8.24 |
| ActivePool | 0x3012C2fE1240e3754E5C200A0946bb0E07474876 | TransparentUpgradeableProxy | 0.8.24 |
| DefaultPool | 0xE4B5913C0c82dB2eFC553b95c0173efb90a07c8B | TransparentUpgradeableProxy | 0.8.24 |
| InterestRateManager | 0x4a453700d157717Fe02fB62E7700ED7845048285 | TransparentUpgradeableProxy | 0.8.24 |
| PCV | 0x391EcC7ffEFc48cff41D0F2Bb36e38b82180B993 | TransparentUpgradeableProxy (V2) | 0.8.24 |
| PriceFeed | 0xc5aC5A8892230E0A3e1c473881A2de7353fFcA88 | TransparentUpgradeableProxy | 0.8.24 |
| GovernableVariables | 0x560AC4Ea44Fb7EB2D4d3c00608CB1CAb2613d389 | TransparentUpgradeableProxy | 0.8.24 |
| CollSurplusPool | 0xBF51807ACb3394B8550f0554FB9098856Ef5F491 | TransparentUpgradeableProxy | 0.8.24 |
| SortedTroves | 0x8C5DB4C62BF29c1C4564390d10c20a47E0b2749f | TransparentUpgradeableProxy | 0.8.24 |
| GasPool | 0x3EB418BdBE95b4b9cf465ecfBD8424685ACD1Bc1 | TransparentUpgradeableProxy | 0.8.24 |
| HintHelpers | 0xD267b3bE2514375A075fd03C3D9CBa6b95317DC3 | TransparentUpgradeableProxy | 0.8.24 |
| BorrowerOperationsSignatures | 0xB57ab578BF20b3e318f3EFAA587C51DBccE5df7a | TransparentUpgradeableProxy | 0.8.24 |
| Oracle — Skip precompile (BTC/USD) | 0x7b7c000000000000000000000000000000000015 | Consensus precompile (18 dec, per-block) | n/a |
| NTT Manager (Mezo) | 0x7efb386675d75280D39Aae42964A6776DE0ee0bD | Wormhole NTT (locking mode) | n/a |
| Wormhole Transceiver (Mezo) | 0x56E27f1A8425515FFD4BD76A254Ac1a5c0B66D71 | NTT transceiver | n/a |
The Safe owner is 0x98D8899c3030741925BE630C710A98B57F397C7a (5/9, v1.3.0). A Mezo Pyth feed (including an MUSD/USD price) exists at 0x2880aB155794e7179c9eE2e38200202908C17B43 but is not wired into PriceFeed.
10. References
- Documentation — https://mezo.org/docs/users/musd/
- Source — https://github.com/mezo-org/musd
- Audit report (PDF) — Cantina 2025-04-15, linked from the dashboard’s Audit History section
- Explorer — https://explorer.mezo.org
- Structured, filterable view — see the protocol dashboard
Long-form companion to the dashboard. Descriptive technical analysis only — not financial advice.