Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/defi-wonderland/solidity-foundry-boilerplate
⚒️ Start your next Solidity project with Foundry in seconds
https://github.com/defi-wonderland/solidity-foundry-boilerplate
boilerplate dapp-starter forge foundry solidity template
Last synced: 4 days ago
JSON representation
⚒️ Start your next Solidity project with Foundry in seconds
- Host: GitHub
- URL: https://github.com/defi-wonderland/solidity-foundry-boilerplate
- Owner: defi-wonderland
- License: mit
- Created: 2022-07-16T18:57:13.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-05T12:39:32.000Z (9 months ago)
- Last Synced: 2024-04-05T17:36:49.157Z (9 months ago)
- Topics: boilerplate, dapp-starter, forge, foundry, solidity, template
- Language: Solidity
- Homepage:
- Size: 223 KB
- Stars: 146
- Watchers: 6
- Forks: 17
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- Blockchain-Development-Resources - Solidity foundry boilerplate
README
Start your next Solidity project with Foundry in secondsA highly scalable foundation focused on DX and best practices
## Features
- Sample contracts
- Basic Greeter contract with an external interface.
- Foundry setup
- Foundry configuration with multiple custom profiles and remappings.
- Deployment scripts
- Sample scripts to deploy contracts on both mainnet and testnet.
- Sample Integration, Unit, Property-based fuzzed and symbolic tests
- Example tests showcasing mocking, assertions and configuration for mainnet forking. As well it includes everything needed in order to check code coverage.
- Unit tests are built based on the Branched-Tree Technique, using Bulloak.
- Formal verification and property-based fuzzing are achieved with Halmos and Medusa (resp.).
- Formal verification and property-based fuzzing are achieved with Halmos and Medusa (resp.).
- Linter
- Simple and fast solidity linting thanks to forge fmt.
- Find missing natspec automatically.
- Github workflows CI
- Run all tests and see the coverage as you push your changes.
- Export your Solidity interfaces and contracts as packages, and publish them to NPM.
## Setup
1. Install Foundry by following the instructions from [their repository](https://github.com/foundry-rs/foundry#installation).
2. Copy the `.env.example` file to `.env` and fill in the variables.
3. Install the dependencies by running: `yarn install`. In case there is an error with the commands, run `foundryup` and try them again.
## Build
The default way to build the code is suboptimal but fast, you can run it via:
```bash
yarn build
```
In order to build a more optimized code ([via IR](https://docs.soliditylang.org/en/v0.8.15/ir-breaking-changes.html#solidity-ir-based-codegen-changes)), run:
```bash
yarn build:optimized
```
## Running tests
Unit tests should be isolated from any externalities, while Integration usually run in a fork of the blockchain. In this boilerplate you will find example of both.
In order to run both unit and integration tests, run:
```bash
yarn test
```
In order to just run unit tests, run:
```bash
yarn test:unit
```
In order to run unit tests and run way more fuzzing than usual (5x), run:
```bash
yarn test:unit:deep
```
In order to just run integration tests, run:
```bash
yarn test:integration
```
In order to start the Medusa fuzzing campaign (requires [Medusa](https://github.com/crytic/medusa/blob/master/docs/src/getting_started/installation.md) installed), run:
```bash
yarn test:fuzz
```
In order to just run the symbolic execution tests (requires [Halmos](https://github.com/a16z/halmos/blob/main/README.md#installation) installed), run:
```bash
yarn test:symbolic
```
In order to check your current code coverage, run:
```bash
yarn coverage
```
## Deploy & verify
### Setup
Configure the `.env` variables and source them:
```bash
source .env
```
Import your private keys into Foundry's encrypted keystore:
```bash
cast wallet import $MAINNET_DEPLOYER_NAME --interactive
```
```bash
cast wallet import $SEPOLIA_DEPLOYER_NAME --interactive
```
### Sepolia
```bash
yarn deploy:sepolia
```
### Mainnet
```bash
yarn deploy:mainnet
```
The deployments are stored in ./broadcast
See the [Foundry Book for available options](https://book.getfoundry.sh/reference/forge/forge-create.html).
## Export And Publish
Export TypeScript interfaces from Solidity contracts and interfaces providing compatibility with TypeChain. Publish the exported packages to NPM.
To enable this feature, make sure you've set the `NPM_TOKEN` on your org's secrets. Then set the job's conditional to `true`:
```yaml
jobs:
export:
name: Generate Interfaces And Contracts
# Remove the following line if you wish to export your Solidity contracts and interfaces and publish them to NPM
if: true
...
```
Also, remember to update the `package_name` param to your package name:
```yaml
- name: Export Solidity - ${{ matrix.export_type }}
uses: defi-wonderland/solidity-exporter-action@1dbf5371c260add4a354e7a8d3467e5d3b9580b8
with:
# Update package_name with your package name
package_name: "my-cool-project"
...
- name: Publish to NPM - ${{ matrix.export_type }}
# Update `my-cool-project` with your package name
run: cd export/my-cool-project-${{ matrix.export_type }} && npm publish --access public
...
```
You can take a look at our [solidity-exporter-action](https://github.com/defi-wonderland/solidity-exporter-action) repository for more information and usage examples.
## Licensing
The primary license for the boilerplate is MIT, see [`LICENSE`](https://github.com/defi-wonderland/solidity-foundry-boilerplate/blob/main/LICENSE)