The practitioner is a program, and it is allowed to refuse.
The FAssets Core Vault is a Flare-governed multisig on XRPL, operated by human signers in daily windows. It is the most audit-relevant surface in the stack, and there is no record of whether its documented controls hold. CV-1 tests them every period — from entirely public data, needing no client, no credentials and nobody's permission.
Fig. 1 — CV-1 at 2026-08-05 on Flare mainnet (chain 14). Vault rfkXSaCZKTg1EZzec2rLDyrWHxRVJdtVXj,
custodian rMLNvZR9dascY5jtCfCv3whAp8HdUSZAQ. Evidence digest
0xf8313802 · XRPL ledgers 106059358–106086751.
Three outcomes, not twoCLEAN means the control was tested and held. EXCEPTION means it was tested and did not. DISCLAIMER means there was not enough evidence to conclude — and it is never rolled up as a pass. A procedure that can only produce good news is marketing, so refusing to conclude is a first-class result.
Three corrections we made to ourselves. The cross-chain reconciliation has been
wrong three times, and the wrongness was instructive each time.
(i) It asserted availableFunds + escrowedFunds ≤ totalAvailable across two
contracts and reported a 400 UBA exception against Flare — figures never defined to relate;
the 400 UBA is a fee the asset manager nets off, now disclosed as C5 rather than judged.
(ii) It asserted escrowedFunds = totalAvailable − immediatelyAvailable, which held
exactly and could never fail, because both sides derive from one storage slot (§ 3.3).
(iii) It asserted availableFunds + escrowedFunds ≤ Balance and produced a
497,844,875,522 drop shortfall — caught before publication: XRPL escrow
removes XRP from the account balance and holds it in Escrow objects, so adding Flare's escrowed
figure to a balance that already excludes it double-counts every escrow.
C3 now reconciles the two things that genuinely must agree — Flare's escrowedFunds
against the sum of the vault's Escrow objects on XRPL, which on live data match to the drop — and C4
compares Flare's spendable claim against the liquid balance after the ledger's own reserve. A false
accusation is far more damaging to an assurance register than a missed finding.
Every correction this project has ever made is published in full, including the ones that reached the public before being withdrawn. [ Read the errata → ]
What was tested, and what it asserts
| Control | Opinion | Assertion | Tested |
|---|---|---|---|
| C1Outflow destination allowlist | [ ✓ ] CLEAN | Every payment sent by the Core Vault lands on an allowlisted address or the custodian. | 1 |
| C2Control preconditions | [ ✓ ] CLEAN | The allowlist is populated, deduplicated, and the custodian and vault addresses are set. | 6 |
| C3Escrow backing | [ ✓ ] CLEAN | Every UBA Flare records as escrowed is matched by XRP sitting in an Escrow object on the XRP Ledger. · 14 escrow objects totalling 140000000000000 drops match Flare's escrowedFunds exactly |
14 |
| C4Liquid backing | [ ✓ ] CLEAN | What Flare can spend today does not exceed the vault's spendable XRP after the ledger's reserve. · 7527741127031 drops spendable covers Flare's 7527356716731 UBA with 384410300 to spare (reserve 4000000 over 15 owned objects) |
1 |
| C5Available-funds wedge | [ ✓ ] CLEAN | The difference between the raw and advertised available balances is disclosed. · raw availableFunds exceeds advertised immediatelyAvailable by 400 UBA (expected: the asset manager nets a fee) |
1 |
Fig. 2 — Every input is public: the allowlist, custodian and balances from Flare, the payments from XRPL. No client had to agree to be audited, which is what lets continuous assurance start at all.
The allowlist under test
| Address | Role |
|---|---|
rfkXSaCZKTg1EZzec2rLDyrWHxRVJdtVXj | core vault (payer) |
rMLNvZR9dascY5jtCfCv3whAp8HdUSZAQ | custodian — permitted by construction |
rs6q5K4RrVbrymieYjx9TFzTW24Rv9BekL | allowlisted destination |
rGWGTbxqmpLJ3TYGjoCFDqY9mPQ4T1GTGb | allowlisted destination |
raDZBXEKsBtgcRsWjq6bg2DVRkCXknJ4Kq | allowlisted destination |
rEUvL6uJ1NYqa81tGxjH6BnLCQRzqT1aR7 | allowlisted destination |
rU3KcE1fqgn7Qm8dA3DSnefNoUnsYF31Wr | allowlisted destination |
rGK7w4oK5x4ncCZyjYEH4QpCZSkKSMrUV2 | allowlisted destination |
Fig. 3 — The custodian is permitted by construction and is deliberately not in the destination allowlist; C2 tests that both are actually set, so C1 cannot pass for the wrong reason.
A backing check that accuses honest agents is worse than none.
CV-1 reconciles the Core Vault. Nobody reconciles the agents — and the agents are where a redemption is actually paid from. AB-1 asks the same question one level down, for every FXRP agent: does the XRP Ledger hold what Flare says it holds?
The false accusation we measuredRead both chains once, and an honest
agent looks insolvent. An agent pays a redemption on the XRP Ledger first; Flare's
underlyingBalanceUBA only falls once that payment is confirmed back on Flare. Inside
that window the agent appears short by exactly the payment in flight.
t1 flare 408,410.89 | xrpl 394,344.37 | diff −14,066.52 <- false shortfall
t2 flare 393,423.10 | xrpl 394,344.37 | diff +921.27 <- truth, 45s later
Flare fell by 14,987.784 XRP between those readings — matching, to the drop, the payment this agent had already made at XRP Ledger 106,099,993. That equality is what makes it settlement lag rather than a coincidence, and it is why a shortfall here is never published from a single observation.
| Agent underlying address | Opinion | Minted (XRP) | Ledger − Flare | Bracket |
|---|---|---|---|---|
rs6q5K4RrVbrymieYjx9TFzTW24Rv9BekL |
[ ✓ ] CLEAN | 348,371.42 | 131.29 | +++ |
rGWGTbxqmpLJ3TYGjoCFDqY9mPQ4T1GTGb |
[ ✓ ] CLEAN | 133,310 | 79,614.83 | +++ |
rGK7w4oK5x4ncCZyjYEH4QpCZSkKSMrUV2 |
[ ✓ ] CLEAN | 301,542.91 | 1,102.12 | +++ |
rEUvL6uJ1NYqa81tGxjH6BnLCQRzqT1aR7 |
[ ✓ ] CLEAN | 389,912.05 | 1,751.96 | +++ |
raDZBXEKsBtgcRsWjq6bg2DVRkCXknJ4Kq |
[ ✓ ] CLEAN | 307,066.61 | 111.18 | +++ |
rU3KcE1fqgn7Qm8dA3DSnefNoUnsYF31Wr |
[ ✓ ] CLEAN | 362,376.8 | 921.27 | +++ |
Fig. 4 — A single − is a candidate, not a finding. An exception is published only if every reading in the bracket is short; anything that resolves is a DISCLAIMER naming the skew, because that is what we actually know.
The control has gone red, on purpose
Coston2 is forked locally, one storage slot in
CoreVaultManager is overwritten, and the identical procedure runs again. The XRP Ledger
is left completely untouched and real — that asymmetry is the point, because a cross-chain fault only
surfaces when the two sources are genuinely independent.
| Control | Before | After |
|---|---|---|
| C1Outflow destination allowlistnot in the fault's scope | [ ✓ ] CLEAN | [ ✓ ] CLEAN |
| C2Control preconditionsnot in the fault's scope | [ ✓ ] CLEAN | [ ✓ ] CLEAN |
| C3Escrow backingfired on the injected fault | [ ✓ ] CLEAN | [ ✗ ] EXCEPTION |
| C4Liquid backingnot in the fault's scope | [ ✓ ] CLEAN | [ ✓ ] CLEAN |
| C5Available-funds wedgenot in the fault's scope | [ ✓ ] CLEAN | [ ✓ ] CLEAN |
Flare records 999999999999 UBA escrowed but the XRP Ledger holds only 480000000000 drops across 48 escrow objects at rDhpmiPq4BVBDWMVdSrmkgt8thKyRzGV1p — 519999999999 unbacked
Why this section existsAn earlier version of C3 asserted
escrowedFunds = totalAvailable − immediatelyAvailable. It held exactly, every period. It
also could not fail: coreVaultAvailableAmount() derives both of its
outputs from that same escrowedFunds, so this very fault injection moved both sides of
the identity together and the control stayed green. It had been printing CLEAN for reasons having
nothing to do with the vault's health.
Four controls do not move under this fault. That matters as much as the one that does — a check that fires on everything is no more informative than one that fires on nothing.
Reproduce it: pnpm --filter @therecord/procedure redrun. The script
exits non-zero if C3 stays CLEAN, so a control that stops being able to fail breaks the build.
The same procedure has also been run backwards, across 119 historical heights on both chains — where it reports exceptions this register was not running to see. [ The backfilled series → ]