The nine bundled examples are real public transactions retrieved through
Chaingraph's own read-only Core/Electrum proxy and stored as snapshots in
src/App/Examples/templateData/. Labels, notes, icons, bookmarks and tags are
original educational annotations. Tags describe observed amounts, script forms
and exact spending links; none of them is an ownership or participant claim.
| Example | Network | Chain reference | Transactions | Initial nodes |
|---|---|---|---|---|
| Whirlpool: five equal outputs | mainnet | seed, successor | 15 | 37 |
| An on-chain message | mainnet | OP_RETURN | 2 | 5 |
| Follow the largest output | mainnet | 15-input split, funding hop | 16 | 36 |
| One input, 143 outputs | mainnet | fan-out | 2 | 146 |
| A large WabiSabi CoinJoin | mainnet | 327 in / 279 out | 1 | 607 |
| Explore a public demo wallet | mainnet | change-branch funding | 10 | 21 |
| Follow an exact spent output | testnet4 | creator, spender | 3 | 8 |
| Explore 53 outputs | testnet4 | fan-out | 2 | 56 |
| From mixed scripts to a spend | testnet4 | mixed scripts, successor | 4 | 10 |
Initial nodes counts the loaded evidence. Every example opens on the complete input and output set of its root transactions, because each one is curated around comparing that whole width. Where the count is higher than the opening canvas, the difference is context: a parent transaction kept for its values but not placed on the canvas itself.
The Whirlpool, WabiSabi, 143-output and OP_RETURN transaction IDs come from the public test fixtures of the MIT-licensed Am I Exposed project. Only the identifiers were used; snapshot JSON was fetched independently, and the protocol names are the publisher's. Chaingraph does not verify protocol provenance, participant identities or the success of any privacy technique. Testnet4 candidates were found through mempool.space testnet4 pages and then fetched from the configured Electrum server. The large split was a public transaction ID supplied during testing.
The wallet example uses the intentionally published BIP84 account-0 test zpub
(the BIP84 test vector,
CC0, also used as Am I Exposed's homepage example). Its seed is public, so
never send funds to these addresses, and a match to them establishes
nothing about ownership. The snapshot derives receive and change indexes 0 to 9,
records 214 known transaction IDs across 11 used addresses, includes 10 complete
transaction records (two funding/spending stories with their immediate parents)
and keeps the other 204 IDs as pending. The wallet is saved with
scanComplete: false, scanLimit: 10 and scanGap: 20; continuing discovery
queries the user's backend. A change-branch match is a derivation fact, not
proof that an output is economically change.
A snapshot holds network, retrievedAt, roots and transactions. Labels,
notes, icons, bookmarks, tags and the opening view are built in code in
src/App/Examples/workspaceTemplates.ts, not stored in the JSON, so editing prose
never means refetching chain data.
An input's funding output can be recorded two ways:
- attach it to the spending input as
vin[].prevout, the same representation Chaingraph's own verbosity-2 fetch produces (seedocs/spender-index.md); - load the whole parent transaction and scope its display through
inputContext, which lists the outputs an example draws.
Prefer the attached prevout unless the example actually puts the parent on the
canvas. A loaded parent also loads every output the example never draws, and
every one of its own inputs becomes a placeholder node with unknown value and
unknown address. createTemplateWorkspace builds inputContext only for
parents the snapshot loads in full, and a test caps each snapshot at 400 KB.
Every snapshot record passed fetchRawInspection: the txid was recomputed from
serialized bytes and compared with the saved data along with exact input
outpoints, output amounts and script bytes. Raw bytes are not shipped, so raw
inspection of an example still needs the backend. The WabiSabi snapshot records
the CoinJoin alone and attaches each consumed output to the input that spends it,
so all 327 input amounts and scripts are present without the parent
transactions. The parents were never drawn on the canvas, and exploring the
CoinJoin outward is the point of that example, so fetching a parent is left to
the user's backend.
node --use-system-ca --import tsx scripts/verify-examples.ts re-checks the
examples against a running backend (CHAINGRAPH_PROXY_URL, default
http://127.0.0.1:4000): configured networks, transaction identity and I/O
counts, Core versus Electrum serialized bytes, referenced funding outputs and,
for testnet4, bounded address histories and known spends. It loads no
environment file and prints no endpoints. Histories grow and test networks can
reset, so verification describes a moment, not a guarantee. A pruned node may
not serve historical transactions.
Snapshot confirmation counts are historical. The end of a bundled path is not a final destination, and a missing spender never proves an output is unspent.