- Run
git submodule update --init --recursive
to update/download all libraries. - Run
yarn install
to install any additional dependencies.
- Install solidity extension https://marketplace.visualstudio.com/items?itemName=juanblanco.solidity
- Navigate to a .sol file
- Right-click, select
Solidity: Change global compiler version (Remote)
- Select 0.7.6
- Install solhint extension https://marketplace.visualstudio.com/items?itemName=idrabenia.solidity-solhint
Install Foundry CLI (forge 0.2.0) from official website.
- To install a specific verison, see here.
Run forge test
to run test using installed forge cli or make test
to run tests in docker container.
Log level is controlled by the -v flag. For example, forge test -vv
displays console.log() statements from within contracts. Highest verbosity is -vvvvv. More info: https://book.getfoundry.sh/forge/tests.html#logs-and-traces. Contracts that use console.log() must import lib/forge-std/src/console.sol.
Run make anvil-test
to setup anvil
test node in docker container and run integration tests. There is an example in anvil/
folder
Run yarn lint
to lint all .sol
files in the src
and test
directories.
Run make analyze-{message-transmitter | token-messenger-minter}
to set up Mythril dependency and run Mythril on all source files. If Mythril dependency has been installed, alternatively run myth -v4 analyze $FILE_PATH --solc-json mythril.config.json --solv 0.7.6
to run static analysis on a .sol
file at the given $FILE_PATH
. Please note that this can take several minutes.
We use Github actions to run linter and all the tests. The workflow configuration can be found in .github/workflows/ci.yml
Use Docker to run Foundry commands. Run make build
to build Foundry docker image. Then run docker run --rm foundry "<COMMAND>"
to run any forge, anvil or cast commands. There are some pre defined commands available in Makefile
for testing and deploying contract on anvil
. More info on Docker and Foundry here.
ℹ️ Note
- Some machines (including those with M1 chips) may be unable to build the docker image locally. This is a known issue.
The contracts are deployed using Forge Scripts. The script is located in scripts/deploy.s.sol. Follow the below steps to deploy the contracts:
-
Add the below environment variables to your env file
MESSAGE_TRANSMITTER_DEPLOYER_KEY
TOKEN_MESSENGER_DEPLOYER_KEY
TOKEN_MINTER_DEPLOYER_KEY
TOKEN_CONTROLLER_DEPLOYER_KEY
ATTESTER_ADDRESS
USDC_CONTRACT_ADDRESS
REMOTE_USDC_CONTRACT_ADDRESS
MESSAGE_TRANSMITTER_PAUSER_ADDRESS
TOKEN_MINTER_PAUSER_ADDRESS
MESSAGE_TRANSMITTER_RESCUER_ADDRESS
TOKEN_MESSENGER_RESCUER_ADDRESS
TOKEN_MINTER_RESCUER_ADDRESS
TOKEN_CONTROLLER_ADDRESS
DOMAIN
REMOTE_DOMAIN
BURN_LIMIT_PER_MESSAGE
In addition, to link the remote bridge, one of two steps needs to be followed:
- Add the
REMOTE_TOKEN_MESSENGER_DEPLOYER
address to your env file and run scripts/precomputeRemoteMessengerAddress.py with argument--REMOTE_RPC_URL
for the remote chain, which will automatically add theREMOTE_TOKEN_MESSENGER_ADDRESS
to the .env file - Manually add the
REMOTE_TOKEN_MESSENGER_ADDRESS
to your .env file.
-
Run
make simulate RPC_URL=<RPC_URL> SENDER=<SENDER>
to perform a dry run. Note: Use address from one of the private keys (used for deploying) above assender
. It is used to deploy the shared libraries that contracts use -
Run
make deploy RPC_URL=<RPC_URL> SENDER=<SENDER>
to deploy the contracts
For license information, see LICENSE and additional notices stored in NOTICES.