# 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, the ds-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.