Commit 43f33f39 authored by Maurelian's avatar Maurelian

ci: Add job to run echidna

ctb: Echidna script runs all fuzz contracts

ctb: Include metadatahash in compilation for echidna
parent b14ac6b0
---
'@eth-optimism/contracts-bedrock': patch
---
Add echidna test commands
...@@ -262,6 +262,50 @@ jobs: ...@@ -262,6 +262,50 @@ jobs:
command: yarn storage-snapshot && git diff --exit-code .storage-layout command: yarn storage-snapshot && git diff --exit-code .storage-layout
working_directory: packages/contracts-bedrock working_directory: packages/contracts-bedrock
contracts-bedrock-echidna:
docker:
- image: ethereumoptimism/ci-builder:latest
resource_class: large
steps:
- checkout
- attach_workspace: {at: "."}
- run:
name: Check if we should run
command: |
shopt -s inherit_errexit
CHANGED=$(check-changed "(contracts-bedrock/contracts)" || echo "TRUE")
if [[ "$CHANGED" = "FALSE" ]]; then
circleci step halt
fi
- run:
name: Compile with metadata hash
command: yarn build:with-metadata
working_directory: packages/contracts-bedrock
- run:
name: Echidna Fuzz Aliasing
command: yarn echidna:aliasing || exit 0
working_directory: packages/contracts-bedrock
- run:
name: Echidna Fuzz Burn
command: yarn echidna:burn || exit 0
working_directory: packages/contracts-bedrock
- run:
name: Echidna Fuzz Encoding
command: yarn echidna:encoding || exit 0
working_directory: packages/contracts-bedrock
- run:
name: Echidna Fuzz Portal
command: yarn enchidna:portal || exit 0
working_directory: packages/contracts-bedrock
- run:
name: Echidna Fuzz Hashing
command: yarn echidna:hashing || exit 0
working_directory: packages/contracts-bedrock
- run:
name: Echidna Fuzz Resource Metering
command: yarn echidna:metering || exit 0
working_directory: packages/contracts-bedrock
op-bindings-build: op-bindings-build:
docker: docker:
- image: ethereumoptimism/ci-builder:latest - image: ethereumoptimism/ci-builder:latest
...@@ -775,6 +819,9 @@ workflows: ...@@ -775,6 +819,9 @@ workflows:
- contracts-bedrock-tests: - contracts-bedrock-tests:
requires: requires:
- yarn-monorepo - yarn-monorepo
- contracts-bedrock-echidna:
requires:
- yarn-monorepo
- op-bindings-build: - op-bindings-build:
requires: requires:
- yarn-monorepo - yarn-monorepo
......
...@@ -77,6 +77,17 @@ yarn build ...@@ -77,6 +77,17 @@ yarn build
yarn test yarn test
``` ```
#### Running Echidna tests
You must have [Echidna](https://github.com/crytic/echidna) installed.
Contracts targetted for Echidna testing are located in `./contracts/echidna`
Each target contract is tested with a separate yarn command, for example:
```shell
yarn echidna:aliasing
```
### Deployment ### Deployment
#### Configuration #### Configuration
......
...@@ -21,3 +21,6 @@ fuzz_runs = 16 ...@@ -21,3 +21,6 @@ fuzz_runs = 16
[profile.ci] [profile.ci]
fuzz_runs = 512 fuzz_runs = 512
[profile.echidna]
bytecode_hash = 'ipfs'
...@@ -10,6 +10,11 @@ import 'hardhat-deploy' ...@@ -10,6 +10,11 @@ import 'hardhat-deploy'
// Hardhat tasks // Hardhat tasks
import './tasks' import './tasks'
let bytecodeHash = 'none'
if (process.env.FOUNDRY_PROFILE === 'echidna') {
bytecodeHash = 'ipfs'
}
const config: HardhatUserConfig = { const config: HardhatUserConfig = {
networks: { networks: {
hardhat: { hardhat: {
...@@ -371,7 +376,7 @@ const config: HardhatUserConfig = { ...@@ -371,7 +376,7 @@ const config: HardhatUserConfig = {
], ],
settings: { settings: {
metadata: { metadata: {
bytecodeHash: 'none', bytecodeHash,
}, },
outputSelection: { outputSelection: {
'*': { '*': {
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
], ],
"scripts": { "scripts": {
"build:forge": "forge build", "build:forge": "forge build",
"build:with-metadata": "hardhat clean && FOUNDRY_PROFILE=echidna hardhat compile",
"build:differential": "tsc scripts/differential-testing.ts --outDir dist --moduleResolution node --esModuleInterop", "build:differential": "tsc scripts/differential-testing.ts --outDir dist --moduleResolution node --esModuleInterop",
"prebuild": "yarn ts-node scripts/verify-foundry-install.ts", "prebuild": "yarn ts-node scripts/verify-foundry-install.ts",
"build": "hardhat compile && yarn autogen:artifacts && yarn build:ts && yarn typechain", "build": "hardhat compile && yarn autogen:artifacts && yarn build:ts && yarn typechain",
...@@ -36,7 +37,13 @@ ...@@ -36,7 +37,13 @@
"lint:contracts:fix": "yarn prettier --write 'contracts/**/*.sol'", "lint:contracts:fix": "yarn prettier --write 'contracts/**/*.sol'",
"lint:fix": "yarn lint:contracts:fix && yarn lint:ts:fix", "lint:fix": "yarn lint:contracts:fix && yarn lint:ts:fix",
"lint": "yarn lint:fix && yarn lint:check", "lint": "yarn lint:fix && yarn lint:check",
"typechain": "typechain --target ethers-v5 --out-dir dist/types --glob 'artifacts/!(build-info)/**/+([a-zA-Z0-9_]).json'" "typechain": "typechain --target ethers-v5 --out-dir dist/types --glob 'artifacts/!(build-info)/**/+([a-zA-Z0-9_]).json'",
"echidna:aliasing": "echidna-test --contract FuzzAddressAliasing --format text --crytic-args --hardhat-ignore-compile .",
"echidna:burn": "echidna-test --contract FuzzBurn --format text --crytic-args --hardhat-ignore-compile .",
"echidna:encoding": "echidna-test --contract FuzzEncoding --format text --crytic-args --hardhat-ignore-compile .",
"echidna:portal": "echidna-test --contract FuzzOptimismPortal --format text --crytic-args --hardhat-ignore-compile .",
"echidna:hashing": "echidna-test --contract FuzzHashing --format text --crytic-args --hardhat-ignore-compile .",
"echidna:metering": "echidna-test --contract FuzzResourceMetering --format text --crytic-args --hardhat-ignore-compile ."
}, },
"dependencies": { "dependencies": {
"@eth-optimism/core-utils": "^0.11.0", "@eth-optimism/core-utils": "^0.11.0",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment