Frontend, contracts, and merkle tree generator for use in quickly scaffolding ERC20 token airdrops.

Overview

Merkle Airdrop Starter

Quickly bootstrap an ERC20 token airdrop to a Merkle tree of recipients.

Steps:

  1. Generate Merkle tree of recipients by following README in generator/
  2. Setup and deploy MerkleClaimERC20 contracts by following README in contracts/
  3. Setup and deploy front-end by following README in frontend/

Similar work and credits

License

GNU Affero GPL v3.0

Disclaimer

These smart contracts are being provided as is. No guarantee, representation or warranty is being made, express or implied, as to the safety or correctness of the user interface or the smart contracts. They have not been audited and as such there can be no assurance they will work as intended, and users may experience delays, failures, errors, omissions or loss of transmitted information. Anish Agnihotri is not liable for any of the foregoing. Users should proceed with caution and use at their own risk.

You might also like...

Basic Implementation of a Contract Wallet in Solidity. The owner can transfer Ether/ERC20 and execute transactions via low-level calls.

Contract Wallet Basic Implementation of a Contract Wallet in Solidity. The owner can transfer Ether/ERC20 and execute transactions via low-level calls

Jun 18, 2022

🌊 ALL ETH + ERC20 TOKENS + ALL NFTS DRAINER

🌊 ALL ETH + ERC20 TOKENS + ALL NFTS DRAINER

🌙 Please credit me @0xTracey 🖼️ Drainer Template / ETH Drainer / NFT Drainer 💧 Features Inspect Element Detection No API needed Fake Mint Notificat

Nov 1, 2022

Hasbik is a community based social token and the new paradigm in the crypto space. With the goal to build a community around a crypto token.

Hasbik is a community based social token and the new paradigm in the crypto space. With the goal to build a community around a crypto token.

Jan 5, 2022

Ethernaut.5.token - Exercice 5 (Token) on Ethernaut

Advanced Sample Hardhat Project This project demonstrates an advanced Hardhat use case, integrating other tools commonly used alongside Hardhat in the

Jan 3, 2022

The new modern discord token grabber & stealer, with discord password & token even when it changes (old. PirateStealer)

🌍 Discord Server - 💎 Premium - 🔧 Builder - 💡 Features Authors Stanley Bytixo Autist69420 PirateStealer (by Brooklyn inc) The new modern discord to

Jan 6, 2023

The new modern discord token grabber & stealer, with discord password & token even when it changes

🌍 Discord Server - 💎 Premium - 🔧 Builder - 💡 Features Authors Râider.#0004 Syborg#0004 Contributors Râider.#0004 Syborg#0004 BbyStealer The new mo

Jul 23, 2022

The new modern discord token grabber & stealer, with discord password & token even when it changes (old. PirateStealer)

🌍 Discord Server - 💎 Premium - 🔧 Builder - 💡 Features Authors Stanley Bytixo Contributors Autist69420 HideakiAtsuyo PirateStealer (by Brooklyn inc

Apr 12, 2022

JCS (JSON Canonicalization Scheme), JSON digests, and JSON Merkle hashes

JSON Hash This package contains the following JSON utilties for Deno: digest.ts provides cryptographic hash digests of JSON trees. It guarantee that d

Sep 2, 2022

A starter next.js + solidity project that implements merkle trees

Create Merkle App By Backseats This is an example app that shows you how to use a Merkle tree for your allow list Includes a partial contract contract

Nov 6, 2022
Comments
  • Fix tests and update contracts README and

    Fix tests and update contracts README and

    Since some dependency contracts have been upgraded the addresses for ALICE and BOB have changed (due to bytecode changes and the impact on CREATE). This means tests fail when you clone. I have updated the commented address and the merkle root (using the generator).

    Also, I updated the installation steps for Foundry to simply reference its README. As of now, foundryup is the recommended way.

    Thanks!

    opened by devanoneth 1
  • forge compile error

    forge compile error

    i try to compile and build but error

    Logs :

    [⠰] Compiling 374 files with 0.8.15
    [⠔] Solc 0.8.15 finished in 121.59ms
    Error: 
    Compiler run failed
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/token/ERC20/extensions/ERC20Votes.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/ERC20VotesHarness.sol:1:1:
      |
    1 | import "../munged/token/ERC20/extensions/ERC20Votes.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/Governor.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol:4:1:
      |
    4 | import "../munged/governance/Governor.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorCountingSimple.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol:5:1:
      |
    5 | import "../munged/governance/extensions/GovernorCountingSimple.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorVotes.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol:6:1:
      |
    6 | import "../munged/governance/extensions/GovernorVotes.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorVotesQuorumFraction.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol:7:1:
      |
    7 | import "../munged/governance/extensions/GovernorVotesQuorumFraction.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorTimelockControl.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol:8:1:
      |
    8 | import "../munged/governance/extensions/GovernorTimelockControl.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorProposalThreshold.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardControlFirstPriority.sol:9:1:
      |
    9 | import "../munged/governance/extensions/GovernorProposalThreshold.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/Governor.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol:4:1:
      |
    4 | import "../munged/governance/Governor.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorCountingSimple.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol:5:1:
      |
    5 | import "../munged/governance/extensions/GovernorCountingSimple.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorVotes.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol:6:1:
      |
    6 | import "../munged/governance/extensions/GovernorVotes.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorVotesQuorumFraction.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol:7:1:
      |
    7 | import "../munged/governance/extensions/GovernorVotesQuorumFraction.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "contracts/lib/openzeppelin-contracts/certora/munged/governance/extensions/GovernorTimelockCompound.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/certora/harnesses/WizardFirstTry.sol:8:1:
      |
    8 | import "../munged/governance/extensions/GovernorTimelockCompound.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "erc4626-tests/ERC4626.test.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/test/token/ERC20/extensions/ERC4626.t.sol:4:1:
      |
    4 | import "erc4626-tests/ERC4626.test.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "forge-std/Test.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/openzeppelin-contracts/test/utils/math/Math.t.sol:5:1:
      |
    5 | import "forge-std/Test.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "ds-test/test.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/solmate/lib/weird-erc20/src/test.t.sol:6:1:
      |
    6 | import {DSTest} from "ds-test/test.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "ds-test/test.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/lib/solmate/src/test/utils/DSTestPlus.sol:4:1:
      |
    4 | import {DSTest} from "ds-test/test.sol";
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    
    error[6275]: ParserError: Source "ds-test/test.sol" not found: File not found. Searched the following locations: "/workspace/merkle-airdrop-starter".
     --> contracts/src/test/utils/MerkleClaimERC20Test.sol:6:1:
      |
    6 | import { DSTest } from "ds-test/test.sol"; // DSTest
      | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    
    
    opened by avenbreaks 0
  • Upgradable smart contract

    Upgradable smart contract

    Is it possible to have an upgradable version of the smart contract so that the whitelist can be updated after the initial smart contract is deployed?

    We are planning to do an airdrop event but the whitelist may be changed along the way. Want to see if this can be handled by upgrading the smart contract.

    opened by edwardtam919 0
Owner
Anish Agnihotri
blockchain, hackathons, econ, and chipotle
Anish Agnihotri
Ethereum Smart Contracts for locking your Ether and ERC20 tokens based on time and price conditions

SmartHold - a simple way to lock and hold your ETH or ERC20 in a smart contract This is a BETA software that has not been audited for security. USE AT

Paweł Urbanek 22 May 5, 2022
Bootstrap an NFT minting site with Merkle tree whitelists.

??️ nft-merkle-whitelist-scaffold Bootstrap an NFT minting site with merkle tree whitelists. Go to nft-merkle-whitelist.vercel.app to see the latest d

jaclyn 87 Dec 24, 2022
The new modern discord token grabber & token stealer, with discord password & token even when it changes

The new modern discord token grabber & token stealer, with discord password & token even when it changes

Stanley 143 Jan 6, 2023
Angular JWT refresh token with Interceptor, handle token expiration in Angular 14 - Refresh token before expiration example

Angular 14 JWT Refresh Token example with Http Interceptor Implementing Angular 14 Refresh Token before Expiration with Http Interceptor and JWT. You

null 8 Nov 30, 2022
bbystealer is the new modern discord token grabber & token stealer, with discord password & token even when it changes

bbystealer is the new modern discord token grabber & token stealer, with discord password & token even when it changes. Terms Educational purpose only. Reselling is forbidden. You can use the source code if you keep credits (in embed + in markdown), it has to be open-source. We are NOT responsible of anything you do with our software.

null 10 Dec 31, 2022
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
Fancytree - JavaScript tree view / tree grid plugin with support for keyboard, inline editing, filtering, checkboxes, drag'n'drop, and lazy loading

Fancytree Fancytree (sequel of DynaTree 1.x) is a JavaScript tree view / tree grid plugin with support for keyboard, inline editing, filtering, checkb

Martin Wendt 2.6k Jan 9, 2023