diff --git a/.gitignore b/.gitignore index 3f27cdc00f07..258ff3ac75d7 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,5 @@ profile.cov logs/ tests/spec-tests/ + +precompile/out/ diff --git a/precompile/README.md b/precompile/README.md new file mode 100644 index 000000000000..dfae49e90ded --- /dev/null +++ b/precompile/README.md @@ -0,0 +1,9 @@ +# Writing a Precompile Contract + +1. Create Solidity interface in `contracts/interfaces`, e.g, IExampleContract.sol + +2. Generate bindings with `./gen.sh` + +3. Implement the precompile in Go. The struct should implement the `StatefulPrecompiledContract` interface and methods defined in the Solidity interface. + +See NativeMinter as an example implementation diff --git a/precompile/foundry.toml b/precompile/foundry.toml new file mode 100644 index 000000000000..d2b280d46cdb --- /dev/null +++ b/precompile/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +fuzz_runs = 1024 +evm_version = 'shanghai' +solc_version = '0.8.24' +cache = false +force = false +optimizer = false + +[profile.ci] +fuzz_runs = 8192 diff --git a/precompile/gen.sh b/precompile/gen.sh new file mode 100755 index 000000000000..7ed7366d734d --- /dev/null +++ b/precompile/gen.sh @@ -0,0 +1,13 @@ +forge build --extra-output-files bin --extra-output-files abi --root . + +for dir in ./out/*/ +do + NAME=$(basename $dir) + NAME=${NAME%.sol} + NAME_LOWER=$(echo "${NAME:1}" | tr '[:upper:]' '[:lower:]') + abigen --pkg bindings \ + --abi ./out/$NAME.sol/$NAME.abi.json \ + --bin ./out/$NAME.sol/$NAME.bin \ + --out ./bindings/i_${NAME_LOWER}.abigen.go \ + --type ${NAME:1} +done