⌈seal⌉ docs
1,500 pixel seals living directly on Bitcoin L1. How to mint, hold and trade them, and the public rules the chain follows.
How to mint
- Connect a walletUniSat, Xverse or OKX. You sign a message to prove the address is yours: it costs nothing and moves nothing.
- Choose a quantityThe limit per wallet is shown under the quantity.
- Sign the transactionYour wallet shows the exact price and network fee before you confirm.
- Wait for the blockYour seals are drawn from the block that confirms the mint, and appear in your bag after 2 confirmations.
Nobody, the team included, can know or choose which seals a mint gets before its block exists: no sniping of rare seals, no re-rolling.
Wallets
Your seals belong to your Taproot (bc1p…) or Native SegWit (bc1q…) address. The wallet may pay from another of its addresses: the seals always go to the address you connected with.
Seals are not shown in wallets or in other marketplaces: SEAL v1 is our own standard. This site, your bag and our marketplace are where they live.
Your bag
The bag lists the seals of the connected address with their traits and rank, your listings, the offers you received, your rewards and your history. From there you list a seal, accept an offer or send a seal to another address.
Marketplace
- Buy one seal, or sweep several at once from the floor.
- List a seal at your price, change it or delist at any time.
- Offer a price on any minted seal. Offers last 7 days and the owner can accept one.
Every trade is one Bitcoin transaction: the seal and the payment move together, or nothing moves.
Fees and rewards
Each marketplace sale pays a 5% fee, split three ways. Holders are paid in BTC, in proportion to the seals they hold.
SEAL v1
No sidechain, no bridge, no token contract: a seal is a small Bitcoin output, and a public set of rules says which one. Anyone can replay these rules on a Bitcoin node and get the exact same owners as this site.
CRC-20 only knows amounts. SEAL v1 keeps the same construction and adds ids 1 to 1,500.
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 marker
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.
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. Watch the indexer run live →
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
Parent inscription: 57c2297b7ae51b7732ca64dc6efc6d0712c620a9bc85aeef61fe97b5c7ea17cbi0
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 keySafety
- Use a fresh wallet for mints and trades.
- Read what your wallet shows before you sign. We never ask for your seed phrase or private key.
- The only official links are on this site and on @SealsCRC.
FAQ
Why can't I see my seals in my wallet?
Wallets only display standards they know. Your seals are safe on your address: open your bag here to see them.
How long until my seals appear?
Two confirmations after the block that includes your mint, usually 10 to 30 minutes.
Can I choose which seal I mint?
No. The block that confirms your mint decides, so nobody can pick the rare ones.
What if the site goes away?
The seals stay on Bitcoin. After 4,320 blocks without moving, you can move them alone through the escape leaf.

