Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

README.md

2.79 Kb · 70 lines

merkledrop

⚠️ Experimental — generated with no human supervision by the daily MCP pipeline (Solidity→Gno port). Not audited. See r/moul/x/daily.


A gno.land port of the classic Solidity MerkleDistributor airdrop (Uniswap / OpenZeppelin MerkleProof). A fixed merkleRoot commits to a set of (address, amount) allocations; a recipient claims by supplying the sibling hashes on the path from their leaf to the root. Each address may claim exactly once (tracked in an avl.Tree, so Render can list claimers deterministically).

Hashing uses crypto/sha256 from the gno stdlib (confirmed importable on gno 0.9 / sapphire), so the tree is trivially reproducible off-chain. Internal nodes hash their two children in sorted order (OpenZeppelin's commutative scheme), meaning proofs need no left/right flags:

leaf = sha256(addr.String() + "|" + amount)
node = sha256(min(a,b) || max(a,b))

Amounts are pure uint64 accounting — gno has no msg.value, so this models the allocation ledger only, not a real coin transfer.

Allocation set (committed by the root)

Address Amount
g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 100
g1sss9uxef4l6lwc0mxq8n5v0e4vqpml7c39cxq2 250
g1manfred47kzduec920z88wfr64ylksmdcedar8 500
g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj 750

Root: 0d00b73577019dc92924f0ae001d3e1839d51fb358adda2ad1510c39eb82b13f

Example calls

Claim from g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 (its proof is the sibling leaf then the right subtree root):

Claim(100, "dd57b89301cc6f1aa5593eb0881cefefcf2ef85ce7629dab61ad0528c301bce9,7c1352bec23bc53d2b573373623cff31174a738de9a257906866c9b598d01253")

Read-only checks:

Verify("g1manfred47kzduec920z88wfr64ylksmdcedar8", 500, "<proof>")  // -> true
HasClaimed("g1manfred47kzduec920z88wfr64ylksmdcedar8")              // -> false until claimed

A wrong amount, wrong caller, or bad proof panics invalid proof; a second claim from the same address panics already claimed.


Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.

Dependency graph:

gno.land/r/moul/x/daily/merkledrop/v0 dependency graph

🧪 Highly experimental — potentially vibe-coded. Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: DISCLAIMER.