Creating a Foundry project
forge
is the Foundry command line tool for managing projects, compiling contracts, and running tests.
Let's run forge init
to create a new project from a template. (I've created this one with some predefined example contracts that will show us some of the features of forge
and Solidity. To create a new project without a template, you can simply use forge init
):
$ forge init tic-tac-token --template ecmendenhall/foundry-example
This will create a new tic-tac-token
directory. Let's look inside:
$ cd tic-tac-token
$ tree .
.
├── foundry.toml
├── lib
│ └── ds-test
└── src
├── Greeter.sol
└── test
└── Greeter.t.sol
6 directories, 8 files
From the top, we have:
foundry.toml
, a project configuration file.- A
lib/
directory. This is used for project dependencies. Inside, we have one library, theds-test
unit testing framework. - A
src/
directory. This is used for Solidity contracts, including tests. This includes:Greeter.sol
, an example "Hello World" contract.- A
test/
directory for unit test contracts. It's conventional to give these a.t.sol
extension to distinguish them from production code.
The foundry.toml
config file
Out of the box, our configuration file looks like this:
[default]
src = 'src'
out = 'out'
libs = ['lib']
verbosity = 2
Config options are namespaced by profiles. Here, we have a single default profile named default
, with a few options configured to tell Foundry where to look for source code and libraries, where to write compiled output, and a default verbosity level. (Note how it mirrors the directory structure of the project).
We can create additional profiles that inherit from the default and override some settings. For example, a verbose
profile that prints more output by default:
[default]
src = 'src'
out = 'out'
libs = ['lib']
verbosity = 2
[verbose]
verbosity = 4
Defining profiles is a powerful way to configure Foundry for different tasks, contexts, and environments. There are many more configuration options available, but these defaults will do for now.