1 · The campaign
Name the storm, pick the PRL-20 token tick, and set the claim window. Composing the header freezes its canonical bytes and SHA-256 campaign id.
Lifecycle
Status: draft
Sealing happens in the Seal tab after the Merkle root is computed. Recipients and the campaign header lock the moment the root is computed.
2 · Recipients
Paste address,amount lines — amounts in PRL, up to 8 decimals.
Header rows, blank lines and # comments are skipped. First-seen address wins;
later repeats are reported as duplicates.
3 · Merkle tree
Leaf i is SHA-256 over the canonical bytes
drop-v1:<index>:<address>:<amountGrains>
(index = position after dedupe, 0-based). Parents hash the
sorted pair — SHA-256(min‖max) — and an odd level
duplicates its last leaf.
4 · Seal
Sealing freezes the campaign: the seal document binds the campaign id, the token tick, the Merkle root, the leaf count and the pledged total under one SHA-256 seal id. Campaign status becomes sealed.
Verify a sealed campaign
Paste a seal document plus the recipient CSV it was sealed against — the desk re-derives the campaign id, rebuilds the Merkle tree from scratch, and rules PROVEN / NOT PROVEN.
5 · Claim check
Works for any campaign: paste its seal document and recipient CSV, enter an address, and the desk looks up the allocation, rebuilds the Merkle proof, and recomputes it to the sealed root.
6 · Methodology & honest limits
What this desk does
- Campaign header — canonical JSON, fixed field order
v,name,tick,starts_at,ends_at,contact; campaign id = SHA-256 of those bytes. - Leaf format —
drop-v1:<index>:<address>:<amountGrains>, UTF-8, index 0-based after dedupe. Amounts are exact BigInt grains (1 PRL = 108 grains). - Pair-sorting convention — each parent is
SHA-256(min‖max)over the lexicographically sorted child pair; an odd level duplicates its last leaf. Proofs carry the sibling at each level. - Address validation — BIP-350 bech32m, HRP
prl, witness version 1, 32-byte program, canonical re-encode — same rules as the audited Names desk core. - Seal document — fixed field order
v,campaign_id,tick,merkle_root,leaf_count,total_grains,sealed_at,campaign; seal id = SHA-256 of the canonical bytes. The embedded full header lets anyone re-derivecampaign_idwithout trusting it. - Inscription — the seal is inscribed under marker
prl-drop(neverprl-20). Preparing the envelope is this desk's job; commit/reveal happens in Pearl Etch.
Crypto lineage
- No new cryptography. SHA-256 is the byte-identical
snipSha256Bytesfrom the Paywall desk, a mechanical minimization of the audited Sign-core@noble/hashes/sha256— differentially tested there and pinned to known vectors here. bech32m is copied verbatim from the auditedsign/src/crypto.js(from pearlpurse).