Deploy a smart contract with Foundry
In this example, we will learn how to deploy a smart contract to Celo testnet, mainnet, or a local network using Foundry.
Introduction to Foundry
Foundry is a smart contract development toolchain.
Foundry manages your dependencies, compiles your project, runs tests, deploys, and lets you interact with the chain from the command-line and via Solidity scripts.
Prerequisites
You will need the Rust compiler and Cargo, the Rust package manager. The easiest way to install both is with rustup.rs.
Using Foundryup
Foundryup is the Foundry toolchain installer. You can find more about it here.
Open your terminal and run the following command:
curl -L https://foundry.paradigm.xyz | bash
This will install Foundryup, then simply follow the instructions on-screen, which will make the foundryup command available in your CLI.
Running foundryup
by itself will install the latest (nightly) precompiled binaries: forge
, cast
, anvil
, and chisel
.
Create a new project using Forge
To start a new project with Foundry, use:
forge init hello_foundry
If you initializing project in an already initialized git repo use:
forge init project_name --no-git
Adding a dependency
To add a dependency, use:
forge install openzeppelin/openzeppelin-contracts
Remapping dependencies
Forge can remap dependencies to make them easier to import. Forge will automatically try to deduce some remappings for you
$ forge remappings
ds-test/=lib/solmate/lib/ds-test/src/
forge-std/=lib/forge-std/src/
solmate/=lib/solmate/src/
weird-erc20/=lib/weird-erc20/src/
These remappings mean:
- To import from
forge-std
we would write: importforge-std/Contract.sol
; - To import from
ds-test
we would write: importds-test/Contract.sol
; - To import from
solmate
we would write: importsolmate/Contract.sol
; - To import from
weird-erc20
we would write: importweird-erc20/Contract.sol
;
You can customize these remappings by creating a remappings.txt
file in the root of your project.
Removing dependencies
You can remove dependencies using
forge remove openzeppelin/openzeppelin-contracts
Adding Celo specific config to foundry.toml
Add the following configuration to foundry.toml
file in the root level of your project.
[rpc_endpoints]
celo-alfajores = "https://alfajores-forno.celo-testnet.org"
celo = "https://forno.celo.org"
Deploying contract
Forge can deploy smart contracts to a given network using:
The below example deploys Counter
contract at location src/Counter.sol
in the project to the Celo Alfajores Testnet.
forge create --rpc-url celo-alfajores --private-key <your_private_key> src/Counter.sol:Counter
Notice the contract name after :
, this is because a single solidity file can have multiple contracts.
It is recommended to use --verify
flag so that the contract gets verified right after deployment, this requires etherscan configuration in the foundry.toml
file.
On successful deployment, you should a following output!