Moonwell Brief
Methodology
Every figure in the Brief is reconstructed from primary sources, valued at the Moonwell oracle, and reconciliation-gated before publication. This page documents where each number comes from and exactly how it is computed, so any reader can audit it.
01Data sources
Four primary sources feed the Brief. No figure depends on a third-party dashboard.
An Envio HyperIndex deployment indexes Moonwell across Base, Optimism, Moonbeam, and Ethereum into a Neon Postgres database. Per-wallet supply is reconstructed from signed Transfer deltas (SupplyDelta), with mToken→underlying exchange rates from RateSample. This powers supply reconstruction, the retention and cohort triangle, net flows, concentration, and wallet composition.
Direct contract reads at the last block of each period on each chain. Core lending supply = getCash + totalBorrows − totalReserves per mToken; USD via the Moonwell comptroller oracle (getUnderlyingPrice). Bad debt = comptroller.getAccountLiquidity per borrower (real shortfall, collateral-factor-weighted).
A Cloudflare-Worker-maintained Neon ledger of daily financials, governance proposals and votes, OEV wrapper events, and liquidation events, refreshed on a schedule and read at report time.
Base-chain-scoped supplied USD (net TVL + borrowed) for the other Base lending venues in the league table. Used only for peers; Moonwell's own row is its oracle-priced on-chain figure (the basis difference is noted on the chart).
02Conventions
Every USD figure is valued at the Moonwell comptroller oracle price at the month-end block, not a market or DefiLlama price. This keeps the report consistent with what the protocol itself sees for collateral and liquidation decisions.
Period-over-period measures value both endpoints at a single month-end oracle price map, so the result isolates capital actually moving (deposits, withdrawals, accrued interest) from token price drift. A wallet whose token holdings are unchanged shows zero flow even if the token's price moved.
Each cycle is anchored to the last block of the calendar period on each chain; balances, prices, and bad debt are read at that block.
An active wallet (and a cohort member) is one with at least $10 supplied across all chains and markets (combined core + vaults). The floor removes dust and abandoned positions.
Supply is always broken out into Core lending (the Compound-V2-fork mTokens), Vaults (the Moonwell-Morpho ERC-4626 vaults), and Combined (= core supplied + vault TVL). The three are never blended into one unlabeled number.
Cited figures are cross-checked through a reconciliation gate (indexer reconstruction vs on-chain capture, tally vs distinct-voter counts, etc.) before an issue is published. Material divergences are surfaced, not smoothed over.
03Per-metric definitions
Core lending supply is the on-chain getCash + totalBorrows − totalReserves per market, oracle-priced. Vault TVL is the indexer's share balances × assets-per-share, oracle-priced via the underlying. Active suppliers = distinct wallets ≥ $10 supplied, global across chains.
Cohort = wallets ≥ $10 at the prior month-end. Wallet retention = share still ≥ $10 at this month-end. Dollar retention (NRR) = the cohort's USD still supplied now ÷ its USD then, both valued at this month's prices (can exceed 100% on deepening).
For each monthly cohort (wallets ≥ $10 at the cohort month-end), retention is tracked at every later month-end. Each cell values both the cohort's starting and current holdings at the measured month's price map, and shows both wallet retention and dollar retention (NRR). The cohort is held fixed at its own month, so a row is internally consistent; the M0→M1 diagonal reconciles with the single-step retention above.
Per borrower, the comptroller returns (liquidity, shortfall) at the cycle-end block. Bad debt = Σ shortfall — real, collateral-factor-weighted, oracle-priced. Health factor = (borrow + liquidity − shortfall) / borrow. At-risk collateral = collateral-factor-weighted collateral in positions with HF < 1.1. By-market attributes each shortfall to the borrower's debt markets pro-rata.
Gross fees (paid by users) = borrower interest + liquidation bonus (collateral seized − debt repaid) + Morpho-vault performance fees (15%). Revenue (the protocol's cut) = reserve-factor interest + the protocol's OEV liquidation share + the protocol's 50% share of the vault performance fee. Take rate = annualized revenue ÷ fees.
Liquidate events within the cycle's calendar months. Gross profit = collateral seized − debt repaid (the liquidation bonus); a net-of-gas figure needs transaction-receipt data not stored, so the Brief reports gross only. Broken out by chain and by collateral asset.
Each wallet's USD = Σ supplied across all chains and markets (combined), oracle-priced. Top-10 and top-50 shares are those wallets' supply as a share of total active supply.
Net supply flow (USD) per market = (this month-end balance − prior month-end balance), valued at a single this-month-end oracle price map; broken out core / vaults / combined.
Proposals whose on-chain voting start falls in the window. For/Against/Abstain power is read directly off the governance ledger in WELL. Distinct-voter counts are recovered across the per-chain vote collectors via the cross-chain proposal-id mapping; Ethereum-native proposals are matched directly on their hub id (see the MIP-E00 correction).
Sum of OEV-wrapper liquidation events in the window. Capture rate = protocol fee ÷ (protocol fee + liquidator fee), computed over all events in the month (not filtered on later deprecation flags).
Peers are DefiLlama Base-chain-scoped supplied USD (net TVL + borrowed). Moonwell's row is its own oracle-priced Base core lending; the vaults are excluded because they are Morpho Blue deposits already counted under Morpho. The two bases differ, which the chart notes.
The 1-month US Treasury constant-maturity yield (DGS1MO), the standard 4-week T-bill proxy, at the last observation on or before month-end. Used to frame real lending yields.