SEAL v1
1,500 unique seals on Bitcoin L1, built on CRC-20. No sidechain, no bridge, no token contract: a seal is a small Bitcoin output, and a public set of rules says which one.
CRC-20 only knows amounts. SEAL v1 keeps the same construction and adds ids 1 to 1,500. Anyone can replay the rules below on a Bitcoin node and get the exact same owners as this site.
Where a seal lives
A Taproot output with an unspendable internal key and two leaves. The owner signs every move; the marketplace co-signs trades but can never move a seal alone.
# cosign: every trade <SEAL_CONST> OP_DROP <owner> OP_CHECKSIGVERIFY <marketplace> OP_CHECKSIG # escape: the owner alone, after 4,320 blocks without moving <SEAL_CONST> OP_DROP <4320> OP_CHECKSEQUENCEVERIFY OP_DROP <owner> OP_CHECKSIG
SEAL_CONST = taggedHash("crc-20", "SEAL") = 4d05e30c…e46d7cf2. If the marketplace ever disappears, the escape leaf gives every seal back to its owner after about 30 days.
Mint
A mint spends an output of the mint authority and carries this marker. The n outputs right after it each receive a seal.
OP_RETURN {"p":"crc-20","op":"mint","tick":"SEAL","n":3}
- n is 1 to 100. An output that is missing, an OP_RETURN or under 330 sats gets no seal and uses no draw.
- When the supply runs out, the remaining outputs get nothing.
The draw
Which seal a mint gets is decided by the block that confirms it. Nobody, the team included, can know or choose it before that block exists: no sniping, no re-rolling.
index = SHA256("<block hash>:<txid>:<k>") mod (free ids)
seal = free ids, ascending, at that index
Verify a draw
Transfer and burn
OP_RETURN {"p":"crc-20","op":"transfer","tick":"SEAL"}
- The k-th seal spent (by input order, then id) moves to the output at marker + 1 + k. A sweep of 50 seals still uses a 44-byte marker.
- An explicit list works too: with "ids":[42], seal 42 moves to the first output after the marker.
- A seal spent without a marker moves to the first non-OP_RETURN output, so a wallet that does not know SEAL never destroys one by accident.
- A seal sent to an OP_RETURN, a missing output or an output under 330 sats is burned for good.
The indexer
- DiscoverReads the mint authority's history (Esplora or Bitcoin Core) to find every mint.
- FollowFollows each live seal with outspends until nothing new is spent.
- ReplayApplies each transaction once, strictly in chain order: height, then position in the block.
- GuardCounts only confirmed blocks (2 on mainnet), checks the last block hash on every pass and rebuilds aside after a reorg.
During a rebuild the previous state keeps being served, and the marketplace refuses new trades until the index is healthy again.
Fees and rewards
Marketplace fees are split this way. Holders are paid in BTC, in proportion to the seals they hold.
On-chain art
The generator itself is inscribed as the collection's parent, with the collection deploy in the same transaction. Every seal can be drawn from Bitcoin alone.
OP_RETURN {"p":"crc-21","op":"deploy","type":"ord"}
/content/<parent id>#42 # draws seal 42
Public API
GET /api/indexIndexer status: height, minted, holders, last passGET /api/index/liveStatus, the 1,500 ids as a map, the latest eventsGET /api/index/item?id=42One seal: owner, output, full historyGET /api/covenant?pk=…Both leaves and control blocks for a wallet key
