generated from defi-wonderland/solidity-foundry-boilerplate
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
0 parents
commit 5a884ce
Showing
21 changed files
with
3,422 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
MAINNET_RPC= | ||
MAINNET_DEPLOYER_PK= | ||
|
||
GOERLI_RPC= | ||
GOERLI_DEPLOYER_PK= | ||
|
||
ETHERSCAN_API_KEY= |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
*.sol linguist-language=Solidity |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
name: CI | ||
|
||
on: [push] | ||
|
||
concurrency: | ||
group: ${{github.workflow}}-${{github.ref}} | ||
cancel-in-progress: true | ||
|
||
jobs: | ||
unit-tests: | ||
name: Run Unit Tests | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v3 | ||
|
||
- name: Install Foundry | ||
uses: foundry-rs/foundry-toolchain@v1 | ||
with: | ||
version: nightly | ||
|
||
- name: Use Node.js | ||
uses: actions/setup-node@v3 | ||
with: | ||
node-version: 18.x | ||
cache: 'yarn' | ||
|
||
- name: Install dependencies | ||
run: yarn --frozen-lockfile --network-concurrency 1 | ||
|
||
- name: Precompile using 0.8.14 and via-ir=false | ||
run: yarn build | ||
|
||
- name: Run tests | ||
shell: bash | ||
run: yarn test:unit | ||
|
||
integration-tests: | ||
name: Run Integration Tests | ||
runs-on: ubuntu-latest | ||
steps: | ||
- uses: actions/checkout@v3 | ||
|
||
- name: Install Foundry | ||
uses: foundry-rs/foundry-toolchain@v1 | ||
with: | ||
version: nightly | ||
|
||
- name: Use Node.js | ||
uses: actions/setup-node@v3 | ||
with: | ||
node-version: 18.x | ||
cache: 'yarn' | ||
|
||
- name: Install dependencies | ||
run: yarn --frozen-lockfile --network-concurrency 1 | ||
|
||
- name: Precompile using 0.8.14 and via-ir=false | ||
run: yarn build | ||
|
||
- name: Create env file | ||
run: | | ||
touch .env | ||
echo MAINNET_RPC="${{ secrets.MAINNET_RPC }}" >> .env | ||
echo GOERLI_RPC="${{ secrets.GOERLI_RPC }}" >> .env | ||
cat .env | ||
- name: Run tests | ||
run: yarn test:integration | ||
|
||
lint: | ||
name: Lint Commit Messages | ||
runs-on: ubuntu-latest | ||
|
||
steps: | ||
- uses: actions/checkout@v3 | ||
with: | ||
fetch-depth: 0 | ||
|
||
- uses: wagoid/commitlint-github-action@v5 | ||
|
||
- name: Install Foundry | ||
uses: foundry-rs/foundry-toolchain@v1 | ||
with: | ||
version: nightly | ||
|
||
- name: Use Node.js | ||
uses: actions/setup-node@v3 | ||
with: | ||
node-version: 18.x | ||
cache: 'yarn' | ||
|
||
- name: Install dependencies | ||
run: yarn --frozen-lockfile --network-concurrency 1 | ||
|
||
- run: yarn lint:check |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
name: Export Interfaces And Contracts | ||
|
||
on: [push] | ||
|
||
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: false | ||
runs-on: ubuntu-latest | ||
strategy: | ||
matrix: | ||
export_type: ["interfaces", "contracts"] | ||
|
||
steps: | ||
- uses: actions/checkout@v3 | ||
|
||
- name: Install Foundry | ||
uses: foundry-rs/foundry-toolchain@v1 | ||
with: | ||
version: nightly | ||
|
||
- name: Use Node.js | ||
uses: actions/setup-node@v3 | ||
with: | ||
node-version: 16 | ||
registry-url: "https://registry.npmjs.org" | ||
|
||
- name: Install dependencies | ||
run: yarn --frozen-lockfile | ||
|
||
- name: Build project and generate out directory | ||
run: yarn build | ||
|
||
- name: Update version | ||
run: yarn version --new-version "0.0.0-${GITHUB_SHA::8}" --no-git-tag-version | ||
|
||
- name: Export Solidity - ${{ matrix.export_type }} | ||
uses: defi-wonderland/[email protected] | ||
with: | ||
# Update package_name with your package name | ||
package_name: "my-cool-project" | ||
out: "out" | ||
interfaces: "solidity/interfaces" | ||
contracts: "solidity/contracts" | ||
export_type: "${{ matrix.export_type }}" | ||
|
||
- 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 | ||
env: | ||
NPM_TOKEN: ${{ secrets.NPM_TOKEN }} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
# General | ||
yarn-error.log | ||
node_modules | ||
.DS_STORE | ||
|
||
# Foundry files | ||
cache | ||
out-via-ir | ||
|
||
# Config files | ||
.env | ||
|
||
# Avoid ignoring gitkeep | ||
!/**/.gitkeep | ||
|
||
# Keep the latest deployment only | ||
broadcast/*/*/* | ||
|
||
# Out dir | ||
out |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
_ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
#!/bin/sh | ||
. "$(dirname "$0")/_/husky.sh" | ||
|
||
npx --no-install commitlint --edit $1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
#!/bin/sh | ||
. "$(dirname "$0")/_/husky.sh" | ||
|
||
# 1. Build the contracts | ||
# 2. Stage build output | ||
# 2. Lint and stage style improvements | ||
yarn build && npx lint-staged |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
{ | ||
"extends": "solhint:recommended", | ||
"plugins": ["defi-wonderland"], | ||
"rules": { | ||
"compiler-version": ["off"], | ||
"constructor-syntax": "warn", | ||
"quotes": ["error", "single"], | ||
"func-visibility": ["warn", { "ignoreConstructors": true }], | ||
"not-rely-on-time": "off", | ||
"func-name-mixedcase": "off", | ||
"var-name-mixedcase": "off", | ||
"const-name-snakecase": "off", | ||
"no-inline-assembly": "off", | ||
"no-empty-blocks": "off", | ||
"private-vars-leading-underscore": ["warn", { "strict": false }], | ||
"defi-wonderland/non-state-vars-leading-underscore": ["warn"], | ||
"defi-wonderland/contract-data-order": ["warn"], | ||
"defi-wonderland/enum-name-camelcase": ["warn"], | ||
"defi-wonderland/immutable-name-snakecase": ["warn"], | ||
"defi-wonderland/import-statement-format": ["warn"], | ||
"defi-wonderland/interface-member-order": ["warn"], | ||
"defi-wonderland/interface-starts-with-i": ["warn"], | ||
"defi-wonderland/named-return-values": ["warn"], | ||
"defi-wonderland/struct-name-camelcase": ["warn"], | ||
"defi-wonderland/wonder-var-name-mixedcase": ["warn"], | ||
"avoid-low-level-calls": "off", | ||
"no-console": "off" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
<img src="https://raw.githubusercontent.com/defi-wonderland/brand/v1.0.0/external/solidity-foundry-boilerplate-banner.png" alt="wonderland banner" align="center" /> | ||
<br /> | ||
|
||
<div align="center"><strong>Start your next Solidity project with Foundry in seconds</strong></div> | ||
<div align="center">A highly scalable foundation focused on DX and best practices</div> | ||
|
||
<br /> | ||
|
||
## Features | ||
|
||
<dl> | ||
<dt>Sample contracts</dt> | ||
<dd>Basic Greeter contract with an external interface.</dd> | ||
|
||
<dt>Foundry setup</dt> | ||
<dd>Foundry configuration with multiple custom profiles and remappings.</dd> | ||
|
||
<dt>Deployment scripts</dt> | ||
<dd>Sample scripts to deploy contracts on both mainnet and testnet.</dd> | ||
|
||
<dt>Sample Integraion & Unit tests</dt> | ||
<dd>Example tests showcasing mocking, assertions and configuration for mainnet forking. As well it includes everything needed in order to check code coverage.</dd> | ||
|
||
<dt>Linter</dt> | ||
<dd>Simple and fast solidity linting thanks to forge fmt</a>.</dd> | ||
|
||
<dt>Github workflows CI</dt> | ||
<dd>Run all tests and see the coverage as you push your changes.</dd> | ||
<dd>Export your Solidity interfaces and contracts as packages, and publish them to NPM.</dd> | ||
</dl> | ||
|
||
## 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 check your current code coverage, run: | ||
|
||
```bash | ||
yarn coverage | ||
``` | ||
|
||
<br> | ||
|
||
## Deploy & verify | ||
|
||
### Setup | ||
|
||
Configure the `.env` variables. | ||
|
||
### Goerli | ||
|
||
```bash | ||
yarn deploy:goerli | ||
``` | ||
|
||
### 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 | ||
solidity-exporter.yml | ||
|
||
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 | ||
solidity-exporter.yml | ||
|
||
- 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 more information and usage examples. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
module.exports = { extends: ['@commitlint/config-conventional'] }; |
Oops, something went wrong.