Merkle Tree Generator

Addresses in, a root and a proof for every entry out — OpenZeppelin-compatible, ready to verify on-chain.

Plain address for an allowlist, or address,amount (raw base units) for an airdrop claim tree — mix and match isn’t allowed, it’s one or the other for the whole list.

One root, cheap per-user verification

A Merkle tree lets a contract commit to an entire list — an allowlist, an airdrop claim table — with a single 32-byte root stored on-chain, while each user proves their own membership with a small proof at claim time instead of the contract storing the whole list upfront.

How it works

Built with OpenZeppelin’s own @openzeppelin/merkle-tree library — the same one their docs recommend pairing with MerkleProof.sol — so the root and proofs generated here are guaranteed to verify correctly against that contract, using the standard double-hashed leaf encoding shown in the verification snippet.

Frequently asked questions

Storing every allowlisted address on-chain (e.g. in a mapping you populate one by one) costs gas per address at setup. A Merkle root is one storage slot regardless of list size — each user proves their own membership at claim time instead of the contract storing everyone upfront.

That's OpenZeppelin's StandardMerkleTree convention specifically to prevent a second-preimage attack where a 64-byte leaf could be crafted to look like a valid internal tree node. This tool generates trees exactly this way, so the verify() snippet shown matches what it built.

Then your proofs won't verify against a tree built here — the leaf encoding has to match exactly on both sides. Check the "Verify it on-chain" snippet's leafEncoding comment against how your contract actually builds its leaf.

Entirely in your browser, via OpenZeppelin's own @openzeppelin/merkle-tree library — nothing about your list is sent anywhere.