UNDERSTAND · IN BUILD
Flashy Ledger
Ledger-as-a-Service: an append-only, multi-asset ledger any network can settle on, with one write path, one invariant, and a daily Merkle root anchored to any chain that accepts a transaction. Flashy Gold is the first asset on it.
Where this sits
The unit · rewards layer
Flashy Gold is the rewards layer across every Flashy property, canonical at flashy.gold. What it is, that site defines. Where it settles is this page.
Today · Ledger-as-a-Service IN BUILD
Flashy Ledger holds the entries and commits to them — one root a day, anchored to any chain. The first asset on Flashy Ledger, and the reason it was built.
Direction NORTH STAR
A Layer 2 on The Open Network, where the entries stop being anchored and start being native. Nothing here runs on it yet.
Why a ledger before a chain
The step before every transaction is native to a chain. A 32-byte root has no chain affinity, so one commitment reaches every chain at once, and the roots stay valid when the transactions eventually move on-chain.
The order is not an apology for the chain being late. An issuer who anchors first gets the property that actually matters — a record they cannot be talked out of — without betting the economy on one chain’s fees, throughput or survival, and without the migration being a rewrite when it comes. A ledger that cannot reconcile does not become trustworthy by being published on-chain; it becomes permanently wrong in public.
The engine is a published package, @flashylabs/ledger, so the rules can be read rather than described. The Merkle specification is on /snapshots/ in enough detail to reimplement in a language we did not choose.
The write path
Funded source
quest · streak · auction · adjustment
Guarded writer IN BUILD
An idempotency key is required. A replayed event produces no second entry.
Entry + balance
One transaction, with the before and after recorded on the entry itself.
What is not true yet
Landed. Every movement goes through postEntry; the legacy-writer list in eslint.ledger-legacy.mjs is empty and the rule keeps it that way. SEAM-4 Phase 1 gates service-to-service calls through one guard. That gap is why Σ(entries) cannot be expected to equal Σ(balances). The portable lint rule that closes it exists in flashy-contracts and is not yet installed in the consuming repository.
ClaimYour.Gold · eslint.ledger-legacy.mjs · SEAM-1, SEAM-4 · read 2026-08-25
Entry types
| Type | Meaning | Source of truth |
|---|---|---|
| issuance | Flashy Gold created against a funded source. Never discretionary. | prisma/schema.prisma · GoldLedger.entryType |
| redemption | Gold retired against a real obligation the group has taken on. | prisma/schema.prisma · RedemptionOrder |
| transfer | Two entries, never one balance edit. Both land or neither. | @flashylabs/ledger · postTransfer() |
| adjustment | A correction. Entries are append-only, so a fix is a new entry. | @flashylabs/ledger · reverse() |
Entries are append-only. A correction is a new adjustment entry, never an edit — which is what makes the incident register possible and what makes a deleted mistake detectable.
The extraction
The ledger runs inside the ClaimYour.Gold monolith today. The rules that govern it live in @flashylabs/ledger — a pure, storage-agnostic package with integer minor units and a hash chain per identity. Moving the monolith's writes onto that package is the extraction, and it is what the roadmap tracks. The package will be this site's read path; today every published figure is a labelled fixture, and the live read lands with Phase 1.