TESTNET BUILD — no mainnet deployment, no real value. Nothing on this site is an offer or a live financial product.

← Audit register

Round 15 · 30 July 2026

Protocol fee stack, full-delta review

Internal review. This is an internal engineering review of source, not an independent external audit, and it does not by itself authorize a production launch. It reviews the source at the baseline below, which is not necessarily identical to the code deployed on any network. No mainnet deployment has been authorized or attempted. Nothing here is a securities-law representation; token characterization is a matter for counsel.

Scope
The entire ADR-0031 workstream reviewed at once rather than incrementally — 14 changed production contracts, +1,130/−99 lines of Solidity, from the commit before the work began to the current tree.
Method
Twelve lenses partitioning the whole delta so nothing fell between them, instructed to assume nothing any prior round concluded. Two adversarial refuters per candidate, an explicit unverified bucket so a failed refuter could not be scored as a refutation, then synthesis and a completeness critic. Eighteen candidates, thirteen survivors; five of the twelve lenses returned nothing.

Findings and remediation history

Why this round is different

The six preceding rounds each reviewed a slice of the protocol-fee work as it landed. That is the right way to review changes as they are made, and it found real defects every time. It is also structurally unable to find one particular thing: a defect that is invisible in each slice and present only in their composition.

This round took the whole change at once — every changed production contract, from the commit before the work began to the current tree — and was instructed to assume nothing that any prior round concluded. Twelve reviewers partitioned the delta so nothing fell between them. Five of the twelve found nothing, which is worth stating because it is evidence about the code rather than about the reviewers.

The fee stack composes correctly

The properties that a slice-by-slice review cannot check were re-derived from scratch, and the load-bearing ones hold.

The most important is an ordering between the two impairment views, because the vault reverts when it is violated and that revert sits on the loss-realization path the design documents as never suppressible. It holds by construction rather than by luck: the gross figure is a plain per-class sum, and the conservative figure is that same sum after two reductions that can only ever subtract, each floored at zero. For the governance-assessment wrapper all four gate combinations were enumerated individually, including proving the fourth unreachable. So the worst liveness outcome in the design — a protocol that cannot recognize a loss — is not reachable through the valuation wiring.

Two other things were checked rather than assumed. The fee-share arithmetic cannot divide by zero: doing so would require roughly eighty years without a single checkpoint, against a checkpoint that anyone may call and that every value-moving path already performs. And all eight sites that take the cross-module fee lock open and close it inside one function body, with no early return and no swallowed error, so the lock cannot survive a transaction.

The cross-slice defect

It is not in the fee stack. It is in a control the fee work never touched.

Vault entry is closed when share pricing becomes degenerate. That guard has two clauses: a point test for a fully written-down vault, and a band for the neighbourhood around it. The rationale written above it argues at length that the point alone is insufficient — the hazard is the whole neighbourhood, not the single value at its limit.

The launch decision to recognize yield instantly rather than streaming it sets the vesting window to zero. With no window, the quantity the band clause measures is identically zero, so the band can never fire. At launch the guard is the point test its own author rejected.

Neither decision is wrong alone. The vesting window is a documented economic parameter with its own reasoning. The guard is byte-for-byte what it was before this work began. Their composition converts a deliberate security control into one that a single token transfer of one unit steps past.

The state that matters is reached by ordinary operation rather than by contrivance. When a loss exceeds what the senior layer can absorb, the realization function refuses anything larger than the vault's whole balance — so the servicer's only permitted action lands the vault exactly on the point, with all shares still outstanding. Entry is correctly closed there. One unit of the underlying token, transferred by anyone, moves it off the point and re-opens entry at a price that is still degenerate.

Nothing is taken at that instant, and no rate guarantee breaks: the incumbent shares are worth nothing before and nothing after. The harm is the ownership split it establishes. An entrant paying one unit acquires essentially the entire pool, so every later inflow — servicing income on the surviving book, a workout recovery, a governance recapitalization — accrues to them instead of to the written-down holders who have the only real claim on it.

Three executable tests accompany this report: one confirming the guard fires correctly at the exact point, one demonstrating the one-unit bypass, and one measuring the resulting split. They document current behaviour and must be inverted, not deleted, when the guard is widened.

The existing assurance cannot see any of this. The invariant covering the guard builds its reference model by re-implementing the same predicate, so it agrees with whatever the predicate says. And every test of the band runs with streaming explicitly switched on — none at the configuration that actually ships.

The fix does not currently fit

The recommended repair keys the band on the stored high-water mark, which no investment loss lowers, so the guard stays armed whatever the vesting setting. It was implemented and measured rather than merely proposed: it costs 116 bytes, and the vault has 88 before it exceeds the contract size limit. Applied, the implementation becomes undeployable by 28 bytes.

That converts the size margin from a maintenance note into a live constraint on remediation, and it means the choice is now explicit: free space in the vault first, or accept the exposure and mitigate it operationally. Both are decisions for Forest Road rather than for a reviewer, and the size measurement is what makes the choice concrete.

Corrections carried from the previous round

The correction to the accepted denomination residual — that its recorded bound described only one of two families, and missed the one with the larger effect — had been applied to the architecture decision record but nowhere else. The published register, the safety specification and the launch runbook all still carried the superseded version, including a monitoring trigger the record itself now describes as blind. All three are corrected here, and the runbook gains explicit gates for the monitoring obligations the acceptance created.

Assurance and evidence

The evidence artifacts describe a slightly older tree than the code. The identity manifest is complete and fails honestly, but it was regenerated partially, so the contract hashes verify while the summary above them does not. A reviewer following the documented onboarding path meets that failure as their first command.

That understates the work rather than overstating it, and none of it is a code defect. It is still the first thing an external reviewer will encounter, and a stale figure in the file the security page names as the evidence of record invites discounting everything downstream of it — including the parts that are genuinely strong.

Two narrower assurance gaps: the queue-side rate invariant re-anchors its own reference point after every action, so at the launch configuration it compares a value against itself; and the role that gates the cross-module fee lock is absent from the generic privilege scanners, so the durable handover receipt cannot name it.

Status

One High, open, with an executable reproduction and a measured reason it cannot be fixed in place. Two Medium, both concerning propagation rather than behaviour, corrected here. Two Low. The fee stack itself, after seven rounds, composes correctly.

Earlier roundProtocol fee stack, instant-recognition re-check