> For the complete documentation index, see [llms.txt](https://docs.trilobyte.finance/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.trilobyte.finance/protocol-mechanics/vault-lifecycle/active.md).

# 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):

| Order | Bucket                        | Amount due this period                                               |
| ----- | ----------------------------- | -------------------------------------------------------------------- |
| 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](/protocol-mechanics/payments-and-emi.md) 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](/protocol-mechanics/covenants-exposure-and-compliance.md).

## 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_s` and `outstanding_j` reach zero
* **Renegotiation** — When the manager proposes new terms
* **Defaulted** — When the grace period expires after a missed payment

## Relevant Functions

| Function                                    | Caller   | Description                                                         |
| ------------------------------------------- | -------- | ------------------------------------------------------------------- |
| `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.*
