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 treedeploy
- Deployment scripts for the hardhat-deploy plugin. Currently there is a single script that deploys the MerkleFunder contractdeployments
- 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 addedscripts
- Utility scripts to interact with the MerkleFunder contractsrc
- Shared source code and the handler implementation for the serverless function
- Node.js >= 18.x
- Yarn
yarn install --frozen-lockfile
yarn build
-
Run the following script to generate the example.env file:
yarn env-example:write
-
Copy example.env to
.env
-
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. -
In
.env
, populate theMNEMONIC
value. This will be used by hardhat-deploy to deploy contracts and by the app you deploy to send transactions to execute fundings. -
In
.env
, populate theFUNDER_RPC_URL_
values. These will be used by the app you deploy. -
In
.env
, populate theETHERSCAN_API_KEY_
values. These will be used by hardhat-etherscan to verify the contracts you deploy. -
Copy config.example.json to
config.json
and add a new entry using the chain ID as key for the object -
Deploy
MerkleFunder
by running:NETWORK=<chainAlias> yarn deploy:merkle-funder
chainAlias
must match one from @api3/chains -
Deploy all
MerkleFunderDepository
contracts by running:NETWORK=<chainAlias> yarn deploy:merkle-funder-depositories
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
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
-
Configure your AWS credentials
-
Deploy the function by running:
yarn sls:deploy --stage <stageName>
Make sure that your environment variables are defined in your
.env
file.
If you want to remove the function from AWS then run the following command:
yarn sls:remove --stage <stageName>
-
Start a local ethereum node by running
yarn hh:node
-
The scripts can be then run using
localhost
aschainName
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:
yarn sls:local
(uses serverless-offline plugin and this is the closest to actually deploying the function to AWS)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 tolocal
. For example:yarn sls:local --stage local