-include .cargo/scratch.local.mk
.PHONY: build test check fmt lint e2e bench coverage coverage-open coverage-summary \
fuzz fuzz-parse-artifact fuzz-config-toml fuzz-sol-type fuzz-codegen-full fuzz-barrel \
fuzz-corpus fuzz-init-corpus scratch-setup scratch-disable test-storage
DOUBLCOV ?= npx --yes @0xdoublesharp/doublcov@0
build:
cargo build --all
test:
cargo test --all
check:
cargo check --all
fmt:
cargo fmt --all
lint:
cargo clippy --all -- -D warnings
e2e: e2e-foundry e2e-hardhat e2e-hardhat3
e2e-foundry: build
cd e2e/foundry-sample && forge build
cd e2e/foundry-sample && ../../target/debug/abi-typegen generate --artifacts ./out --out ./src/generated --target viem
cd e2e/foundry-sample && ../../target/debug/abi-typegen generate --artifacts ./out --out ./src/generated --target ethers
cd e2e/foundry-sample && pnpm exec tsc --noEmit
cd e2e/foundry-sample && ../../target/debug/abi-typegen generate --artifacts ./out --out ./src/generated-zod --target zod
cd e2e/foundry-sample && pnpm exec tsc --noEmit -p tsconfig.zod.json
cd e2e/foundry-sample && ../../target/debug/abi-typegen generate --artifacts ./out --out ./src/generated-solidity --target solidity
cd e2e/foundry-sample && forge build --contracts ./solidity-validation --out ./out-solidity-validation
@echo "e2e-foundry: pass"
e2e-hardhat: build
cd e2e/hardhat-sample && pnpm exec hardhat compile --quiet
cd e2e/hardhat-sample && ../../target/debug/abi-typegen generate --hardhat --artifacts ./artifacts/contracts --out ./abi-typegen-out --target viem
@echo "e2e-hardhat: pass"
e2e-hardhat3: build
cd e2e/hardhat3-sample && pnpm exec hardhat compile
cd e2e/hardhat3-sample && test -f abi-typegen-out/Token.viem.ts
cd e2e/hardhat3-sample && pnpm exec tsc --noEmit
@echo "e2e-hardhat3: pass"
bench:
./e2e/bench.sh 10
_NCPUS := $(shell sysctl -n hw.logicalcpu 2>/dev/null || nproc 2>/dev/null || echo 2)
FUZZ_JOBS := $(shell j=$$(( $(_NCPUS) - 1 )); [ "$$j" -lt 1 ] && echo 1 || echo $$j)
_FUZZ_NTGTS := 5
FUZZ_PAR := $(shell j=$$(( $(_NCPUS) / $(_FUZZ_NTGTS) )); [ "$$j" -lt 1 ] && echo 1 || echo $$j)
fuzz: fuzz-init-corpus
@mkdir -p fuzz/logs
@echo "Fuzzing $(_FUZZ_NTGTS) targets in parallel — $(FUZZ_PAR) worker(s) each ($(_NCPUS) total CPUs)"
@echo "Logs → fuzz/logs/ | Crashes → fuzz/artifacts/"
cargo +nightly fuzz run fuzz_parse_artifact fuzz/corpus/fuzz_parse_artifact fuzz/seeds/fuzz_parse_artifact -- -workers=$(FUZZ_PAR) > fuzz/logs/fuzz_parse_artifact.log 2>&1 &
cargo +nightly fuzz run fuzz_config_toml fuzz/corpus/fuzz_config_toml fuzz/seeds/fuzz_config_toml -- -workers=$(FUZZ_PAR) > fuzz/logs/fuzz_config_toml.log 2>&1 &
cargo +nightly fuzz run fuzz_sol_type_str fuzz/corpus/fuzz_sol_type_str fuzz/seeds/fuzz_sol_type_str -- -workers=$(FUZZ_PAR) > fuzz/logs/fuzz_sol_type_str.log 2>&1 &
cargo +nightly fuzz run fuzz_codegen_full fuzz/corpus/fuzz_codegen_full fuzz/seeds/fuzz_codegen_full -- -workers=$(FUZZ_PAR) > fuzz/logs/fuzz_codegen_full.log 2>&1 &
cargo +nightly fuzz run fuzz_barrel fuzz/corpus/fuzz_barrel fuzz/seeds/fuzz_barrel -- -workers=$(FUZZ_PAR) > fuzz/logs/fuzz_barrel.log 2>&1 &
wait
fuzz-parse-artifact: fuzz-init-corpus
@echo "Fuzzing fuzz_parse_artifact with $(FUZZ_JOBS) worker(s)"
cargo +nightly fuzz run fuzz_parse_artifact fuzz/corpus/fuzz_parse_artifact fuzz/seeds/fuzz_parse_artifact -- -workers=$(FUZZ_JOBS)
fuzz-config-toml: fuzz-init-corpus
@echo "Fuzzing fuzz_config_toml with $(FUZZ_JOBS) worker(s)"
cargo +nightly fuzz run fuzz_config_toml fuzz/corpus/fuzz_config_toml fuzz/seeds/fuzz_config_toml -- -workers=$(FUZZ_JOBS)
fuzz-sol-type: fuzz-init-corpus
@echo "Fuzzing fuzz_sol_type_str with $(FUZZ_JOBS) worker(s)"
cargo +nightly fuzz run fuzz_sol_type_str fuzz/corpus/fuzz_sol_type_str fuzz/seeds/fuzz_sol_type_str -- -workers=$(FUZZ_JOBS)
fuzz-codegen-full: fuzz-init-corpus
@echo "Fuzzing fuzz_codegen_full with $(FUZZ_JOBS) worker(s)"
cargo +nightly fuzz run fuzz_codegen_full fuzz/corpus/fuzz_codegen_full fuzz/seeds/fuzz_codegen_full -- -workers=$(FUZZ_JOBS)
fuzz-barrel: fuzz-init-corpus
@echo "Fuzzing fuzz_barrel with $(FUZZ_JOBS) worker(s)"
cargo +nightly fuzz run fuzz_barrel fuzz/corpus/fuzz_barrel fuzz/seeds/fuzz_barrel -- -workers=$(FUZZ_JOBS)
fuzz-init-corpus:
mkdir -p fuzz/corpus/fuzz_parse_artifact fuzz/corpus/fuzz_config_toml fuzz/corpus/fuzz_sol_type_str \
fuzz/corpus/fuzz_codegen_full fuzz/corpus/fuzz_barrel
coverage:
$(DOUBLCOV) cargo-llvm-cov --mode standalone --no-open -- --workspace
coverage-open:
$(DOUBLCOV) cargo-llvm-cov --mode standalone --open -- --workspace
coverage-summary:
cargo llvm-cov --workspace --summary-only
fuzz-corpus:
cp tests/fixtures/erc20.json fuzz/seeds/fuzz_parse_artifact/erc20.json
cp tests/fixtures/vault.json fuzz/seeds/fuzz_parse_artifact/vault.json
cp tests/fixtures/minimal.json fuzz/seeds/fuzz_parse_artifact/minimal.json
cp tests/fixtures/erc20.json fuzz/seeds/fuzz_codegen_full/erc20.json
cp tests/fixtures/vault.json fuzz/seeds/fuzz_codegen_full/vault.json
cp tests/fixtures/minimal.json fuzz/seeds/fuzz_codegen_full/minimal.json
scratch-setup:
python3 .cargo/setup-scratch.py
scratch-disable:
python3 .cargo/setup-scratch.py --disable
test-storage:
PYTHONDONTWRITEBYTECODE=1 python3 -m unittest discover -s tests -p test_scratch.py