Active
The Active phase is the core operating state of the vault. The loan has been disbursed to the borrower, and periodic repayments are expected, flowing through a strict six-bucket waterfall.
What Happens
The Borrower makes periodic repayments via
receive_payment(payer, amount)Each payment is allocated through the waterfall, in order: reserve fee → senior interest → senior principal → junior interest → junior principal → residual (borrower cash pool)
Investors can claim their pro-rata share of their own tranche's accumulated interest and principal at any time
The Borrower can withdraw from the cash pool, but only while current on payments
The Pool Manager monitors repayment health, applies late fees, and stays current on any reporting covenant
Payment Processing — the waterfall
receive_payment accepts any amount greater than zero — there is no gross-up or fixed split. Per period, buckets fill in this order (with any carried arrears from a prior underpaid period added ahead of the new period's dues, in the same order):
1
Reserve fee → treasury
interest × reserve_fee_bps / 10000
2
Senior interest
Senior's share of interest, net of the reserve and the junior spread
3
Senior principal
Scheduled senior amortisation
4
Junior interest
Remaining interest after buckets 1–2
5
Junior principal
Scheduled junior amortisation
6
Residual → borrower cash pool
Whatever remains
A bucket that isn't fully paid records the deficit as arrears, which must be cleared — in the same order — before the next period's own dues are accepted. The schedule (payments_made, next_due) only advances once buckets 1–5 are fully cleared for a period; a short payment never advances the schedule. See Payments & the Waterfall for the full worked example.
The amount actually received is verified against the vault's own token-balance delta, not just the caller-supplied amount — a fee-on-transfer or otherwise short-delivering token is rejected with TransferShortfall.
Yield Claims
Investors call claim_yield(investor, tranche) to claim their share of that tranche's accumulated interest and principal pools, pro rata to their deposit within the tranche. Claims are available during both the Active and FullyRepaid phases.
Cash Withdrawals — the covenant
The borrower can call withdraw_cash(amount) to withdraw available funds from the cash pool — but only while missed_payments == 0. If the borrower has missed a payment, withdraw_cash is blocked with BorrowerNotCurrent until they catch up. See Covenants, Exposure and Compliance.
Reporting Covenant
If the vault has a reporting_interval set, the manager calls mark_report_received() on the agreed cadence. If a report becomes overdue, anyone can call check_reporting(), which flags reporting_overdue and counts as one missed period toward the NAV write-down until the next report lands.
Transition Out
From Active, the vault can transition to:
FullyRepaid — Automatically when both
outstanding_sandoutstanding_jreach zeroRenegotiation — When the manager proposes new terms
Defaulted — When the grace period expires after a missed payment
Relevant Functions
receive_payment(payer, amount)
Anyone
Submit a repayment; allocated through the six-bucket waterfall
claim_yield(investor, tranche)
Investor
Claim pro-rata share of that tranche's interest + principal pools
withdraw_cash(amount)
Borrower
Withdraw from the cash pool (blocked while behind on payments)
apply_late_fee(caller)
Manager
Apply late fee penalty, split pro rata across tranches
mark_report_received(caller)
Manager
Clear the reporting-overdue flag
check_reporting()
Anyone
Flag the reporting covenant overdue after the deadline
propose_renegotiation(caller, rate, term)
Manager
Propose new terms
check_default()
Anyone
Trigger default if grace period expired
get_senior_nav() / get_junior_nav()
Anyone
View NAV after write-down (view only)
get_covenant_status()
Anyone
View missed payments, reporting-overdue flag, borrower-current flag
As of September 2026.
Last updated