Skip to content

api3dao/merkle-funder

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

merkle-funder

This repo contains contracts, scripts and a serverless function that can be used to send funds to addresses based on values from a configuration file

  • contracts - Smart contracts written in Solidity to manage funds sent to pre-defined addresses using a Merkle tree
  • deploy - Deployment scripts for the hardhat-deploy plugin. Currently there is a single script that deploys the MerkleFunder contract
  • deployments - Parent directory for the hardhat-deploy script output. When MerkleFunder.sol is deployed to a new chain using this script, a new directory with the chain name will be added
  • scripts - Utility scripts to interact with the MerkleFunder contract
  • src - Shared source code and the handler implementation for the serverless function

Prerequisites

  • Node.js >= 18.x
  • Yarn

Installation

yarn install --frozen-lockfile

Building

yarn build

Adding a new chain

Deploy contracts

  1. Run the following script to generate the example.env file:

    yarn env-example:write
  2. Copy example.env to .env

  3. In .env, delete the lines that are related to chains that you will not use. Refer to @api3/chains for more information about the chains.

  4. In .env, populate the MNEMONIC value. This will be used by hardhat-deploy to deploy contracts and by the app you deploy to send transactions to execute fundings.

  5. In .env, populate the FUNDER_RPC_URL_ values. These will be used by the app you deploy.

  6. In .env, populate the ETHERSCAN_API_KEY_ values. These will be used by hardhat-etherscan to verify the contracts you deploy.

  7. Copy config.example.json to config.json and add a new entry using the chain ID as key for the object

  8. Deploy MerkleFunder by running:

    NETWORK=<chainAlias> yarn deploy:merkle-funder

    chainAlias must match one from @api3/chains

  9. Deploy all MerkleFunderDepository contracts by running:

    NETWORK=<chainAlias> yarn deploy:merkle-funder-depositories

Send funds to recipients

After following all steps in previous section, and funding your MerkleFunderDepository contracts, run the following command:

yarn fund <chainName>

This command will trigger funds to be sent to recipients defined in config.json

Deploy serverless function

Another way to trigger funds to be sent from a MerkleFunderDepository to a recipient address is to run the scheduled lambda function on a 1 minute interval

  1. Configure your AWS credentials

  2. Deploy the function by running:

    yarn sls:deploy --stage <stageName>

    Make sure that your environment variables are defined in your .env file.

Remove serverless function

If you want to remove the function from AWS then run the following command:

yarn sls:remove --stage <stageName>

Local development

  • Start a local ethereum node by running yarn hh:node

  • The scripts can be then run using localhost as chainName For example:

    yarn deploy:merkle-funder localhost
    yarn deploy:merkle-funder-depositories localhost
    yarn fund:merkle-funder-depositories localhost
    yarn fund localhost
  • There are 2 ways to test the lambda function locally:

    1. yarn sls:local (uses serverless-offline plugin and this is the closest to actually deploying the function to AWS)
    2. yarn sls:invoke:fundHandler

    In case you want to use different environment variables when testing this function locally then the easiest is to create a .env.dev file which will have precedence over .env when executing either of the two commands. Another alternative is to create a .env.local (or .env.development, etc) and set the stage to local. For example: yarn sls:local --stage local