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

v0 source realm

Package merkledrop is an idiomatic gno.land port of the classic Solidity MerkleDistributor airdrop (Uniswap's contrac...

Readme View source

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.

Overview

Package merkledrop is an idiomatic gno.land port of the classic Solidity MerkleDistributor airdrop (Uniswap's contract, OpenZeppelin's MerkleProof).

A fixed merkleRoot commits to a set of (address, amount) allocations. A recipient proves membership by supplying the sibling hashes on the path from their leaf up to the root. Each address may claim exactly once.

Leaf and node hashing use crypto/sha256 (available in the gno stdlib), the same primitive Solidity distributors use via keccak — here sha256 keeps the off-chain tree builder trivially reproducible. Internal nodes hash the two children in sorted order (the OpenZeppelin "commutative" scheme), so proofs carry no left/right flags.

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

Balances are pure accounting (uint64); no real coin moves — there is no msg.value on gno, so this models the allocation ledger only.

Functions 5

func AmountClaimed

Action
1func AmountClaimed(claimer address) uint64
source

AmountClaimed returns how much the address has already claimed (0 if none).

func Claim

crossing Action
1func Claim(cur realm, amount uint64, proof string)
source

Claim proves the caller is entitled to `amount` via `proof` (comma-separated hex sibling hashes) and marks the allocation claimed. Panics on a bad proof or a double claim. Mirrors MerkleDistributor.claim (msg.sender is the caller).

func HasClaimed

Action
1func HasClaimed(claimer address) bool
source

HasClaimed reports whether the address already claimed.

func Render

1func Render(path string) string
source

Render shows the committed root, aggregate stats, and the list of claimers.

func Verify

Action
1func Verify(claimer address, amount uint64, proof string) bool
source

Verify reports whether (claimer, amount, proof) resolves to merkleRoot. Pure and read-only — safe to call from tests and Render.

Imports 8

  • bytes stdlib
  • chain stdlib
  • chain/runtime/unsafe stdlib
  • crypto/sha256 stdlib
  • encoding/hex stdlib
  • gno.land/p/nt/avl/v0 package
  • strconv stdlib
  • strings stdlib

Source Files 3