Ethereum contracts deployedTransactions may use real assets. Primary-market minting and instant redemption are KYC-gated; deployment does not mean every product or entry path is open. Review the legal and risk disclosures.

Protocol fee stack, composition re-check

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. Forest Road Vault is live on Ethereum mainnet; its Solana curator vault remains on devnet and BSC has its own deployment status. An open finding applies only to the product, version and deployment state named by this review. Each review's scope bounds what its clean result is worth. Nothing here is a securities-law representation; token characterization is a matter for counsel.

Scope
The remediation of the Round 12 findings, the exit hurdle law, the legacy high-water-mark seed, and the backstop rotation ordering, across the vault and the default manager.
Method
Eight lenses over the remediation delta, deliberately weighted toward attacking the exit fix rather than confirming it, because that fix was recommended by the previous round's auditor and therefore had an advocate. Two adversarial refuters per candidate, then synthesis and a completeness critic.

Findings and remediation history

  • R13-01MediumAccepted

    Entry and exit hurdle laws are not composable: a value-neutral round trip permanently destroys the deferred performance fee

    Forest Road accepted the holder-protective pooled-HWM policy without an exit equalization charge. The hurdle is additive on entry and pro-rata on exit, so an exit/redeposit round trip can erase deferred protocol fees; it cannot lower a surviving holder's per-share hurdle or over-charge holders. ADR-0031 and the threat model record the revenue trade-off explicitly. A production dual-NAV integration regression now reproduces the complete queue exit, claim, and re-deposit composition, asserts that assets and supply return to their starting values, and pins the safe under-collection direction.

  • R13-02MediumRemediated

    The legacy high-water-mark seed anchors on the redemption base, leaving a residual equal to the live senior mark

    The zero-HWM migration seed now anchors to totalAssets(), the realized asset base, rather than either impairment-adjusted view. The regression carries non-zero pending and performance impairments, asserts the exact realized-asset seed, and proves that a later cure mints no fee on pre-upgrade value.

  • R13-03MediumRemediated

    The regression pinning the backstop rotation fix is vacuous and passes against the code it replaced

    The replacement regression now creates a live default whose senior impairment depends on the outgoing backstop, makes that backstop unreadable, proves the valuation view fails, rotates to a valid replacement, and asserts the restored impairment. Incoming replacements must also advertise the complete ICascadeBackstop interface through ERC-165 before their capacity is probed.

  • R13-04MediumRemediated

    A new cross-proxy valuation dependency has no executable upgrade-ordering constraint

    Both upgrade authorization hooks now probe the currently installed downstream dependency: the assessed wrapper refuses an upgrade unless its DefaultManager base exposes the revisioned dual-NAV interface, and sUSDfr refuses an upgrade unless its installed source exposes both impairment selectors. The runbook requires DefaultManager → AssessedImpairmentSource → sUSDfr upgrades in one atomic timelock batch; unit regressions prove the wrong order fails before an implementation change lands. Round 14 confirms the runbook requirement, which was this finding's stated minimum, is delivered, and that both guards fire on a real capability gap. It also records what they are not: they are liveness checks on the installed dependency, not ordering constraints, so they cannot by themselves force a correct sequence. The atomic batch remains the operative control.

  • R13-05LowAccepted

    The assurance artifacts re-derive the production expression and check one operation at a time, so no test can detect a composition defect

    The per-operation invariant remains useful but is no longer presented as composition-complete. A separate production-wired integration test now composes queue exit, claim, and re-deposit of the same economic position, independently checks restored assets/supply and monotone holder protection, and explicitly pins the accepted protocol-revenue under-collection. Recorded as accepted rather than remediated because the structural limitation is not the kind of thing a regression can close: an artifact that restates the production expression cannot falsify the law it encodes, whatever cases are added around it. Round 14 confirms it is now honestly described rather than fixed, which is the correct disposition.

  • R13-06LowRemediated

    The depositor deferral disclosure arms on one wei of rounding dust, so it renders in the healthy steady state

    The staking warning now requires the global HWM to exceed fee NAV by more than one rate wei. Render regressions assert that a one-wei floor/ceiling gap is silent and a two-wei deferred band is disclosed. The false positive this finding named is genuinely gone. Round 14 finds the tolerance boundary is also the maximal-deferral point, so the corrected predicate is silent exactly where the exposure is largest, carried forward as R14-03, and made the steady state rather than a transient boundary by per-repayment crystallization.

  • R13-07LowRemediated

    The vault implementation is within 1.5% of the contract size limit and the build pipeline has no size gate

    CI now parses forge build --sizes --json and fails if any of the 19 production contracts is missing or exceeds EIP-170. The current sUSDfr runtime is 24,488 bytes, leaving only 88 bytes; the gate makes that maintenance constraint explicit rather than relying on a compiler warning.

Owner disposition and follow-up (30 July 2026). This page preserves the external review as delivered. Forest Road accepted the protocol-revenue under-collection in the global-HWM exit/redeposit round trip and declined an exit equalization charge. The remaining findings were remediated: the legacy seed uses realized assets; the backstop regression is non-vacuous and incoming backstops must advertise the complete interface; upgrade authorization probes installed downstream implementations and the runbook requires one ordered atomic batch; a composition regression now exercises the accepted round trip; the UI ignores one-wei rounding dust; and CI has an explicit EIP-170 size gate. These follow-up changes remain a new source delta and do not turn this historical review into an audit of the resulting tree.

The shape of this round

Three consecutive rounds of this fee work each produced a High finding, and each one had the same root cause: a fee hurdle denominated in one asset base, adjusted by a quantity measured in a different one. Every remediation closed the specific defect and moved the class somewhere else, first out of the high-water-mark ratchet, then out of the junior-capacity bracket, then out of the exit path.

This round is the first that does not continue that sequence. There is no High finding, no invariant on the protocol's safety list is broken, and the residual that remains has the opposite sign from all three predecessors: it costs the protocol its own revenue rather than costing holders theirs.

It is also the round that explains why the sequence happened, which turns out to be more useful than any individual finding.

What the exit fix actually achieved

The previous round found that an exit priced on the junior-supported redemption NAV carried the performance hurdle out at the wrong price, so a leaver shed deferred fee exposure onto the holders who stayed. The fix carries the hurdle out at the greater of two quantities: the assets actually paid, or the leaver's pro-rata share of the hurdle.

The pro-rata leg is the load-bearing half, and it works for a reason worth stating precisely. Converting the pro-rata carry back into a per-share rate leaves that rate exactly unchanged, and the maximum is never below the pro-rata term. So the stored per-share high-water mark is monotonically non-decreasing across every exit, in every reachable state.

That is a real guarantee, and it is the one the previous three rounds never had. A surviving holder can no longer be charged more than a textbook per-share high-water-mark fee. The failure direction that produced every earlier High, a hurdle pushed below holders' own cost basis, so a fee lands on something that was never profit, is now structurally impossible rather than merely absent.

The backstop-rotation fix is also clean. Exactly one checkpoint opens on every path and is always followed by the single close, the no-op early exit skips both, and a broken outgoing backstop no longer blocks its own replacement, which is what the previous round asked for.

Why four rounds were needed

The interesting result is not any of the findings. It is that three properties, each one forced by a previous round's remediation, cannot all hold at once.

  • Entry must be basis-additive. A deposit adds exactly the principal delivered to the hurdle. Anything else taxes an entrant on a gain earned before they arrived. Rounds one and two forced this.
  • Exit must remove the departing shares' basis. Under a pooled model that is the leaver's pro-rata share. Anything smaller dumps their deferred liability on the holders who stay. Round three forced this.
  • A value-neutral round trip must not move the hurdle. Anything else lets anyone erase deferred fee for free. This round forced it.

With a single scalar hurdle these are jointly unsatisfiable. Entry contributes the full principal; exit removes only the pro-rata share; and whenever the entrant came in above the pooled average basis the difference is stripped permanently. Round three chose the first and third properties and sacrificed the second. Round four chose the first and second and sacrificed the third.

Neither is wrong so much as incomplete, and the choice between them has never been framed as a choice. That is the substantive recommendation of this round: the trade-off is a financial-mechanic decision, not an implementation detail, and it belongs with Forest Road and the economic review rather than with whoever writes the next patch.

The residual

The surviving instance is a round trip that restores the vault exactly. An incumbent redeems a fraction of their position through the queue and re-deposits the proceeds; assets, share supply and all three valuation bases return to their starting values, but the hurdle is permanently higher, so the deferred performance fee the protocol had accrued is destroyed.

It needs no fresh capital, and the damage scales with the fraction round-tripped rather than with capital committed: redeeming and re-depositing most of a position destroys most of the deferred fee. Chunking the exit across settlements does not reduce it. The only frictions are time, the redemption cooldown and the per-epoch liquidity throttle, and there is no minimum holding period between deposit and queue admission.

The direction matters for how urgently this needs answering. No holder is over-charged and no exchange-rate guarantee is broken; the protocol simply loses fees it had earned. That makes it a revenue and fairness question rather than a custody one, which is why it is recorded as Medium and referred upward rather than patched in place.

A second, smaller base mismatch survives in the upgrade path: seeding a legacy proxy's hurdle anchors on the redemption base, which removes the junior-covered portion of the old mismatch but leaves the senior-marked portion. The anchor that is neutral in both terminal states, a cure and a realized loss, is the realized asset base. It is a one-token change, and both existing regressions for that branch happen to run with the residual pinned to zero, which is why it was not visible.

Assurance

Two things this round did not find, which is itself informative. The queue campaign can now construct the divergent-NAV state the previous round said it structurally could not, and the management-and-performance sequencing now has a test that runs both fees against genuinely different bases with independently computed expectations. Both were previous-round findings and both are properly closed.

What the assurance tier still cannot do is falsify the flow law itself. The invariant added for it re-derives the production expression with the same rounding, and checks one operation at a time against state captured immediately before that operation, so a defect that only appears in the composition of two operations is invisible to it by construction. That is exactly the defect this round found, and no test in the repository composes an entry with an exit of the same shares.

The regression added for the backstop change is vacuous in a more ordinary way: its fixture never reaches a state in which the outgoing backstop is read at all, so it passes identically against the code the fix replaced.

Separately, the whole fork tier, every one of its tests, did not execute in this review environment for want of an archive endpoint, including the suite that was modified by this very change. The rest of the suite is deterministic and green across repeated runs.

Operational constraints

Two items are not defects but will shape what can be done next.

The vault implementation now sits about 1.5% below the contract size limit. The fee work has consumed roughly two thirds of the headroom that existed a few checkpoints ago, and the build pipeline has no explicit size gate, the only thing between a routine change and an undeployable implementation is a compiler warning being promoted to an error.

And this change introduced a new cross-contract dependency: the vault now calls a second valuation method that did not exist before, through two layers of upgradeable proxies. The candidate is validated when a source is installed, but not when an implementation behind an already-installed address is upgraded. Upgrading the vault ahead of the sources would freeze every value path in the vault, including queue settlement. That ordering needs to be an executable constraint or, at minimum, a stated atomicity requirement in the launch runbook.

Status at delivery

Seven findings, none High: two Medium on the remaining base mismatches, two Medium on assurance and upgrade ordering, three Low. All were open when delivered. The owner disposition above records the subsequent accepted policy and remediations without retroactively expanding this review's scope.

Earlier roundProtocol fee stack, dual-NAV re-check→