Claim-based airdrop realm with Merkle proofs.
Why Merkle rather than an on-chain list:
- the beneficiary list can run to tens of thousands of rows; writing it on-chain costs gas and storage deposit in proportion;
- here only 32 bytes go on-chain (the root), plus one record per ACTUAL claim. Whoever never claims costs nothing.
Operating flow:
- deploy this realm;
- fund it by transferring GRC20 tokens to it (its address is returned by RealmAddress());
- the admin publishes root, leaf count and deadline block with SetCampaign;
- each beneficiary calls Claim with their own proof;
- after the deadline the admin recovers the residue with Sweep.
The Merkle leaf is the string "<address>|<amount in base units>", UTF-8 encoded. The tree is Tendermint's "simple tree" (gno's crypto/merkle): leaf = SHA256(0x00||data), node = SHA256(0x01||left||right), split at the largest power of two below n. The generator in tools/merkle produces compatible proofs.