the record · procedure
Procedure · CV-1

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.

Opinion
CLEAN
5 controls · Flare mainnet
Outflows tested
1
of 200 XRPL txs
Under test
140M XRP
140,000,000 XRP escrowed · 7,527,356.72 available · real value on mainnet
Allowlist
6
permitted destinations

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 → ]

§ 3.1 — Controls

What was tested, and what it asserts

CV-1 control results with the assertion tested, opinion, exceptions and sample size.
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
[ ✓ ] tested and held
[ ✗ ] tested and breached
[ ? ] insufficient evidence — not a pass

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.

§ 3.2 — Permitted destinations

The allowlist under test

Addresses the Core Vault is permitted to pay, read from Flare at test time.
Address Role
rfkXSaCZKTg1EZzec2rLDyrWHxRVJdtVXjcore vault (payer)
rMLNvZR9dascY5jtCfCv3whAp8HdUSZAQcustodian — permitted by construction
rs6q5K4RrVbrymieYjx9TFzTW24Rv9BekLallowlisted destination
rGWGTbxqmpLJ3TYGjoCFDqY9mPQ4T1GTGballowlisted destination
raDZBXEKsBtgcRsWjq6bg2DVRkCXknJ4Kqallowlisted destination
rEUvL6uJ1NYqa81tGxjH6BnLCQRzqT1aR7allowlisted destination
rU3KcE1fqgn7Qm8dA3DSnefNoUnsYF31Wrallowlisted destination
rGK7w4oK5x4ncCZyjYEH4QpCZSkKSMrUV2allowlisted 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.

§ 3.4 — AB-1 · the agents, not the vault

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?

Agents reconciled
6
every FXRP agent on Flare mainnet
Fleet opinion
CLEAN
settle bracket of 3 readings, 45s apart
Backed by agents
1.23%
the other 98.77% of FXRP is the Core Vault
Minted by agents
1,842,579.78
XRP, against their own underlying addresses

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.

Every FXRP agent, its minted supply, and what the XRP Ledger actually holds against it.
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 +++
+ ledger holds at least what Flare records
candidate shortfall at that reading
? address unreadable — never counted as backed

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.

§ 3.3 — Falsification

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.

Injected fault
1 slot
escrowedFunds 500,000,000,000 → 999,999,999,999
Opinion under fault
EXCEPTION
was CLEAN — same code, same XRPL evidence
Evidence digest
0xd096bc0e
→ 0x886e4dee
Controls moved
1 of 5
the other four correctly did not
Every control before and after the injected fault. Only the control whose scope contains the fault moves.
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
The exception it wrote, verbatim

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 → ]