Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
116 commits
Select commit Hold shift + click to select a range
89eccaa
feat: add ev-deployer CLI for genesis contract allocation
randygrok Mar 13, 2026
0c8f54e
test: add bytecode verification tests for ev-deployer contracts
randygrok Mar 13, 2026
2ba2b80
docs: add ev-deployer README with config and usage guide
randygrok Mar 13, 2026
a540858
fix(ci): serialize bytecode verification tests to avoid solc race con…
randygrok Mar 13, 2026
b9e2670
style: apply cargo fmt to ev-deployer
randygrok Mar 13, 2026
18ed817
ci(ev-deployer): split workflow into separate bytecode and unit test …
randygrok Mar 13, 2026
f7d0e71
style: fix fmt and clippy lint errors in ev-deployer
randygrok Mar 16, 2026
46ea9a6
feat(ev-deployer): add MerkleTreeHook contract with immutable bytecod…
randygrok Mar 18, 2026
e5f4eb9
Merge branch 'main' into ev-deployer-part1-core
randygrok Mar 18, 2026
be1b241
Merge remote-tracking branch 'origin/main' into ev-deployer-part1-core
randygrok Mar 19, 2026
7e19222
ci(ev-deployer): add e2e genesis test to CI workflow
randygrok Mar 19, 2026
e9fa70e
Merge remote-tracking branch 'origin/ev-deployer-part1-core' into ev-…
randygrok Mar 19, 2026
946026d
ci(ev-deployer): install soldeer deps before bytecode verification
randygrok Mar 19, 2026
9dd5011
test(ev-deployer): add MerkleTreeHook verification to e2e genesis test
randygrok Mar 19, 2026
217be0c
fix(ev-deployer): escape brackets in doc comments to fix rustdoc
randygrok Mar 19, 2026
67151c3
feat(ev-deployer): add Permit2 contract support
randygrok Mar 19, 2026
56548ec
docs(ev-deployer): add comment explaining canonical Permit2 address
randygrok Mar 19, 2026
fa8a428
merge: resolve e2e test conflicts with ev-deployer-merkle-tree-hook
randygrok Mar 19, 2026
bfa5a23
style(ev-deployer): fix fmt, clippy and rustdoc warnings in permit2
randygrok Mar 19, 2026
4da01ea
feat(ev-deployer): add Mailbox, NoopIsm, and ProtocolFee genesis cont…
randygrok Mar 19, 2026
3faa629
fix(ev-deployer): regenerate Mailbox and ProtocolFee bytecodes from c…
randygrok Mar 19, 2026
eb413d1
merge: resolve conflicts with ev-deployer-merkle-tree-hook (mailbox, …
jgimeno Mar 19, 2026
aeffc0d
fix(ev-deployer): address PR review feedback
jgimeno Mar 19, 2026
a2d194e
merge(ev-deployer): integrate ev-deployer-part1-core duplicate addres…
jgimeno Mar 19, 2026
1ecc93c
feat: integrate ev-deployer into ev-dev for genesis contract deployment
jgimeno Mar 19, 2026
911e217
docs(ev-dev): add genesis contract deployment usage to README
jgimeno Mar 19, 2026
ebd4365
feat(ev-dev): add interactive TUI dashboard with --tui flag
jgimeno Mar 19, 2026
e0c3330
feat(ev-dev): add real-time balance polling to TUI dashboard
randygrok Mar 20, 2026
8a3a4f3
fix(ev-dev): replace redundant match with direct let binding
randygrok Mar 23, 2026
fa99c4f
feat(ev-dev): add block selection and transaction detail overlay to TUI
randygrok Mar 24, 2026
86b92d7
merge: resolve conflicts with ev-deployer-part4-ev-dev-integration
randygrok Mar 24, 2026
b68f7f7
style(ev-dev): fix rustfmt formatting in TUI module
randygrok Mar 24, 2026
5030259
fix(ev-dev): use map_or_else to satisfy clippy or_fun_call lint
randygrok Mar 24, 2026
e8a39f8
refactor(ev-deployer): remove FeeVault contract from part 1
randygrok Mar 24, 2026
089ef22
refactor(ev-deployer): remove AdminProxy contract from part 1
randygrok Mar 24, 2026
6b85563
Revert "refactor(ev-deployer): remove AdminProxy contract from part 1"
randygrok Mar 24, 2026
93b3eaa
fix(ev-deployer): make [contracts] section optional in config
randygrok Mar 24, 2026
70111fd
feat(ev-deployer): add init command to generate starter config
randygrok Mar 24, 2026
fa0e71f
fix(ev-deployer): clean up command ordering and stale fee_vault refer…
randygrok Mar 24, 2026
1acd3c8
docs(ev-deployer): document init command in README
randygrok Mar 24, 2026
cb838e8
merge(ev-deployer): integrate ev-deployer-part1-core keeping all cont…
randygrok Mar 24, 2026
ee68354
fix(ev-deployer): remove extra blank lines from merge to pass rustfmt
randygrok Mar 24, 2026
ef5ac9e
docs(ev-deployer): document all supported contracts in README and ini…
randygrok Mar 24, 2026
65bbf9e
fix(ev-deployer): normalize alloc keys for collision detection
randygrok Mar 24, 2026
08c9eb4
style(ev-deployer): fix fmt and clippy lint in genesis.rs
randygrok Mar 25, 2026
46b75bf
Merge remote-tracking branch 'origin/ev-deployer-part1-core' into ev-…
randygrok Mar 25, 2026
e365cfe
merge: resolve e2e test conflict with ev-deployer-merkle-tree-hook (p…
randygrok Mar 25, 2026
7f9e238
docs(ev-deployer): add Permit2 to init template and README
randygrok Mar 25, 2026
f1ad84c
merge: resolve ContractsConfig visibility/derive conflict with ev-dep…
randygrok Mar 25, 2026
b1e5ae3
fix(ev-deployer): use case-insensitive grep in e2e genesis address ch…
randygrok Mar 25, 2026
6371c11
Merge remote-tracking branch 'origin/ev-deployer-part3-permit2' into …
randygrok Mar 25, 2026
739b3e0
Merge remote-tracking branch 'origin/ev-deployer-part4-ev-dev-integra…
randygrok Mar 25, 2026
5d2be71
refactor(ev-deployer): remove Hyperlane contracts, keep only AdminPro…
randygrok Mar 27, 2026
c32b633
merge: integrate main into ev-deployer-part3-permit2
randygrok Mar 27, 2026
502a131
merge: integrate ev-deployer-part3-permit2 Hyperlane contract removal
randygrok Mar 27, 2026
04beb6b
refactor(contracts): remove Hyperlane dependency from FeeVault
randygrok Mar 27, 2026
c6e679b
style(contracts): fix forge fmt formatting
randygrok Mar 27, 2026
cae3723
docs: clarify FeeVault is optional, document when to use it vs plain …
randygrok Mar 27, 2026
2af627e
merge: integrate ev-deployer-part3-permit2 FeeVault refactor and docs
randygrok Mar 27, 2026
21a7989
Merge remote-tracking branch 'origin/ev-deployer-part4-ev-dev-integra…
randygrok Mar 27, 2026
4653ccc
fix(ev-deployer): validate permit2 zero-address and duplicate deploy …
randygrok Mar 30, 2026
221aa28
style(ev-deployer): remove unnecessary #[allow(dead_code)] from confi…
randygrok Mar 30, 2026
877c66b
chore(ev-deployer): add permit2 config tests and update contracts skill
randygrok Mar 30, 2026
588a46a
style(ev-deployer): fix rustfmt formatting in config.rs
randygrok Mar 30, 2026
8e8bf8c
docs(ev-deployer): use full canonical Permit2 address in config refer…
randygrok Mar 30, 2026
6070a3b
refactor(ev-deployer): make address optional in contract configs
randygrok Mar 30, 2026
3c74168
feat(ev-deployer): add initcode constants for live deployment
randygrok Mar 30, 2026
1f7e2cc
feat(ev-deployer): add CREATE2 address computation module
randygrok Mar 30, 2026
826c10d
feat(ev-deployer): add deploy state file with immutability checks
randygrok Mar 30, 2026
f9054b7
feat(ev-deployer): add ChainDeployer trait and LiveDeployer
randygrok Mar 30, 2026
2b90e82
feat(ev-deployer): add deploy pipeline with mock-tested flow
randygrok Mar 30, 2026
0c67446
feat(ev-deployer): wire up deploy subcommand in CLI
randygrok Mar 30, 2026
308ac0e
docs(ev-deployer): update init template for deploy mode
randygrok Mar 30, 2026
cbdaaa2
style(ev-deployer): fix rustfmt formatting
randygrok Mar 30, 2026
58dd78a
chore: update Cargo.lock for ev-deployer deploy dependencies
randygrok Mar 30, 2026
868bd3a
fix(ev-deployer): address clippy lints and nightly rustfmt imports
randygrok Mar 30, 2026
77c098b
fix(ev-deployer): remove AdminProxy from deploy pipeline
randygrok Mar 30, 2026
922af60
fix(ev-deployer): use atomic writes for deploy state file
randygrok Mar 30, 2026
c15313a
merge: integrate ev-deployer-part3a deploy pipeline and CREATE2 support
randygrok Mar 31, 2026
5f950fb
Merge remote-tracking branch 'origin/ev-deployer-part4-ev-dev-integra…
randygrok Mar 31, 2026
bb35228
feat(ev-deployer): add CLI flags to init command
randygrok Mar 31, 2026
48a4d39
feat(ev-deployer): add template builder with parameterized tests
randygrok Mar 31, 2026
9771899
feat(ev-deployer): wire parameterized init into CLI
randygrok Mar 31, 2026
9c2fcb6
docs(ev-deployer): rewrite README as comprehensive user guide
randygrok Mar 31, 2026
27be728
merge: integrate ev-deployer-part3a parameterized init and README
randygrok Mar 31, 2026
d2bd5a6
Merge remote-tracking branch 'origin/ev-deployer-part4-ev-dev-integra…
randygrok Mar 31, 2026
71afcec
fix(ev-deployer): address clippy lints and rustfmt in init module
randygrok Mar 31, 2026
e01e053
merge: integrate ev-deployer-part3a clippy and rustfmt fixes
randygrok Mar 31, 2026
3be382b
fix(ev-deployer): resolve clippy warnings for Eq, Debug, and missing …
randygrok Mar 31, 2026
36829a9
fix(ev-deployer): resolve remaining clippy and rustfmt warnings
randygrok Mar 31, 2026
f353150
style(ev-deployer): fix clippy warnings and missing docs
randygrok Mar 31, 2026
7449b21
merge: integrate ev-deployer-part4 clippy and rustfmt fixes
randygrok Mar 31, 2026
a0d9906
feat(ev-dev): include deterministic deployer in devnet genesis
randygrok Mar 31, 2026
2b9485c
feat(ev-deployer): add deterministic deployer as genesis contract
randygrok Mar 31, 2026
74da873
merge: integrate origin/ev-deployer-part3a deterministic deployer sup…
randygrok Mar 31, 2026
4e00b8a
fix(ev-deployer): restrict immutables visibility to pub(crate)
randygrok Mar 31, 2026
28e24c9
Merge branch 'ev-deployer-part4-ev-dev-integration' of github.com-ran…
randygrok Mar 31, 2026
304f60a
feat(ev-deployer): use canonical Uniswap salt for Permit2 CREATE2 deploy
randygrok Apr 1, 2026
01815ea
refactor(ev-deployer): split init into genesis and deploy subcommands
randygrok Apr 2, 2026
9ed902f
fix(ev-deployer): remove deterministic deployer from deploy init temp…
randygrok Apr 2, 2026
160fd22
docs: update ev-deployer and ev-dev READMEs for init subcommands
randygrok Apr 2, 2026
d2624bf
refactor(ev-dev): rename --deploy-config to --genesis-config
randygrok Apr 2, 2026
0c324a2
style(ev-deployer): apply rustfmt to deterministic deployer
randygrok Apr 2, 2026
802d748
Merge remote-tracking branch 'origin/ev-deployer-part3a' into ev-depl…
randygrok Apr 2, 2026
37945c5
Merge remote-tracking branch 'origin/ev-deployer-part4-ev-dev-integra…
randygrok Apr 7, 2026
1adf1b4
style(ev-deployer): apply rustfmt to init.rs
randygrok Apr 7, 2026
adf04f4
Merge branch 'main' into ev-deployer-part3-permit2
randygrok Apr 8, 2026
b3f746d
Merge remote-tracking branch 'origin/main' into ev-deployer-part3-per…
randygrok Apr 13, 2026
17bd295
docs: clarify callFee is zero-fee safe in FeeVault doc
randygrok Apr 13, 2026
a3beb2b
Merge branch 'ev-deployer-part3-permit2' into chipped-walker
randygrok Apr 14, 2026
35cee5f
fix(ev-deployer): make deterministic_deployer::build a const fn
randygrok Apr 14, 2026
0e0db76
Merge remote-tracking branch 'origin/ev-deployer-part3a' into ev-depl…
randygrok Apr 14, 2026
22e2d5d
Merge remote-tracking branch 'origin/ev-deployer-part4-ev-dev-integra…
randygrok Apr 14, 2026
772ebe2
bump reth 2.2 (#236)
tac0turtle May 12, 2026
39b292a
chore(deps): bump tokio from 1.51.1 to 1.52.3 (#226)
dependabot[bot] May 12, 2026
429fdfa
merge: integrate ev-dev part5 TUI with main
randygrok May 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,442 changes: 1,053 additions & 389 deletions Cargo.lock

Large diffs are not rendered by default.

136 changes: 68 additions & 68 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,94 +23,94 @@ repository = "https://github.com/evstack/ev-reth"
authors = ["Evolve Stack Contributors"]

[workspace.dependencies]
# Reth dependencies - Using v2.1.0 stable
reth-chainspec = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-cli-util = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-tracing-otlp = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-node-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-node-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-errors = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-trie-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-trie-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
# Reth dependencies - Using v2.2.0 stable
reth-chainspec = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-cli-util = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-tracing-otlp = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-node-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-node-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-errors = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-trie-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-trie-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-rpc-eth-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-primitives-traits = { version = "0.3.0", default-features = false }
reth-provider = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-storage-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-tracing = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-network = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-network-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-chain-state = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-db-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-ethereum = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-ethereum-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-engine-local = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-engine-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-ethereum-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", features = ["serde", "reth-codec"] }
reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-evm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.1.0" }
reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.1.0" }
reth-execution-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-node-core = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-node-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-payload-builder-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-payload-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-ethereum-forks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-revm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.1.0" }
reth-rpc-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-rpc-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-rpc-engine-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-rpc = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0" }
reth-provider = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-storage-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-tracing = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-transaction-pool = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }
reth-network = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-network-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-chain-state = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-db-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-ethereum = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-ethereum-cli = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-basic-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-engine-local = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-engine-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-ethereum-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-ethereum-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", features = ["serde", "reth-codec"] }
reth-e2e-test-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }
reth-evm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.2.0" }
reth-evm-ethereum = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.2.0" }
reth-execution-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-node-core = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-node-types = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-payload-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-payload-builder-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-payload-primitives = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-ethereum-forks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-revm = { git = "https://github.com/paradigmxyz/reth.git", default-features = false, tag = "v2.2.0" }
reth-rpc-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-rpc-builder = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-rpc-engine-api = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-rpc = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0" }
reth-codecs = { version = "0.3.1", default-features = false }

ev-revm = { path = "crates/ev-revm" }
ev-primitives = { path = "crates/ev-primitives" }


# Consensus dependencies
reth-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-consensus-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-ethereum-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }
reth-consensus-common = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }
reth-ethereum-consensus = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }

# Test dependencies
reth-testing-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-tasks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.1.0", default-features = false }
reth-testing-utils = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }
reth-db = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }
reth-tasks = { git = "https://github.com/paradigmxyz/reth.git", tag = "v2.2.0", default-features = false }

revm = { version = "38.0.0", default-features = false }

# Alloy dependencies (aligned to reth v2.1.0)
alloy = { version = "2.0.0", features = [
# Alloy dependencies (aligned to reth v2.2.0)
alloy = { version = "2.0.4", features = [
"contract",
"providers",
"provider-http",
"signers",
"reqwest-rustls-tls",
], default-features = false }
alloy-evm = { version = "0.33.0", default-features = false }
alloy-eips = { version = "2.0.0", default-features = false }
alloy-network = { version = "2.0.0", default-features = false }
alloy-provider = { version = "2.0.0", default-features = false }
alloy-rpc-client = { version = "2.0.0", default-features = false }
alloy-rpc-types = { version = "2.0.0", default-features = false }
alloy-json-rpc = { version = "2.0.0", default-features = false }
alloy-rpc-types-eth = { version = "2.0.0", default-features = false }
alloy-rpc-types-engine = { version = "2.0.0", default-features = false }
alloy-signer = { version = "2.0.0", default-features = false }
alloy-signer-local = { version = "2.0.0", features = ["mnemonic"] }
alloy-serde = { version = "2.0.0", default-features = false }
alloy-evm = { version = "0.34.0", default-features = false }
alloy-eips = { version = "2.0.4", default-features = false }
alloy-network = { version = "2.0.4", default-features = false }
alloy-provider = { version = "2.0.4", default-features = false }
alloy-rpc-client = { version = "2.0.4", default-features = false }
alloy-rpc-types = { version = "2.0.4", default-features = false }
alloy-json-rpc = { version = "2.0.4", default-features = false }
alloy-rpc-types-eth = { version = "2.0.4", default-features = false }
alloy-rpc-types-engine = { version = "2.0.4", default-features = false }
alloy-signer = { version = "2.0.4", default-features = false }
alloy-signer-local = { version = "2.0.4", features = ["mnemonic"] }
alloy-serde = { version = "2.0.4", default-features = false }
alloy-primitives = { version = "1.5.6", default-features = false }
alloy-consensus = { version = "2.0.0", default-features = false }
alloy-consensus-any = { version = "2.0.0", default-features = false }
alloy-consensus = { version = "2.0.4", default-features = false }
alloy-consensus-any = { version = "2.0.4", default-features = false }
alloy-rlp = { version = "0.3.13", default-features = false }
alloy-genesis = { version = "2.0.0", default-features = false }
alloy-rpc-types-txpool = { version = "2.0.0", default-features = false }
alloy-genesis = { version = "2.0.4", default-features = false }
alloy-rpc-types-txpool = { version = "2.0.4", default-features = false }
alloy-sol-types = { version = "1.5.6", default-features = false }

# Utility dependencies
Expand All @@ -124,7 +124,7 @@ nybbles = "0.4.8"
# Core dependencies
eyre = "0.6"
tracing = "0.1"
tokio = { version = "1.51", features = ["full"] }
tokio = { version = "1.52", features = ["full"] }
serde = { version = "=1.0.228", default-features = false, features = [
"derive",
] }
Expand Down
59 changes: 42 additions & 17 deletions bin/ev-deployer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,12 @@ Both modes read the same TOML config. The `address` field in each contract secti
## Quick Start

```bash
# 1. Generate a config pre-populated for your chain
ev-deployer init --chain-id 42170 --permit2 --output deploy.toml
# Genesis: embed contracts into the chain's genesis state
ev-deployer init genesis --chain-id 42170 --permit2 --deterministic-deployer --output genesis.toml
ev-deployer genesis --config genesis.toml --merge-into genesis.json --output genesis-out.json

# 2a. Genesis mode: embed into genesis state
ev-deployer genesis --config deploy.toml --merge-into genesis.json --output genesis-out.json

# 2b. Deploy mode: deploy to a live chain
# Deploy: deploy contracts to a running chain via CREATE2
ev-deployer init deploy --chain-id 42170 --permit2 --output deploy.toml
ev-deployer deploy \
--config deploy.toml \
--rpc-url http://localhost:8545 \
Expand All @@ -40,31 +39,55 @@ The binary is output to `target/release/ev-deployer`.

## Commands

### `init`
### `init genesis`

Generate a starter config file.
Generate a starter config for **genesis mode** (contracts embedded at chain start). Includes `address` fields for each contract.

```bash
# Bare template (all contracts commented out)
ev-deployer init
ev-deployer init genesis

# Pre-populated with chain ID, Permit2, and deterministic deployer
ev-deployer init --chain-id 42170 --permit2 --deterministic-deployer
# Pre-populated with Permit2 and deterministic deployer
ev-deployer init genesis --chain-id 42170 --permit2 --deterministic-deployer

# Full config with all contracts
ev-deployer init \
ev-deployer init genesis \
--chain-id 42170 \
--permit2 \
--deterministic-deployer \
--admin-proxy-owner 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \
--output deploy.toml
--output genesis.toml
```

| Flag | Description |
|------|-------------|
| `--output <PATH>` | Write to file instead of stdout |
| `--chain-id <ID>` | Set the chain ID (defaults to 0) |
| `--permit2` | Enable Permit2 with its canonical address |
| `--deterministic-deployer` | Enable the deterministic deployer (Nick's factory) with its canonical address |
| `--deterministic-deployer` | Enable the deterministic deployer (Nick's factory) |
| `--admin-proxy-owner <ADDR>` | Enable AdminProxy with the given owner |

### `init deploy`

Generate a starter config for **deploy mode** (contracts deployed via CREATE2 to a running chain). No `address` fields — addresses are computed deterministically. The deterministic deployer is not included in the config since it cannot be deployed via CREATE2 (it must already exist on-chain).

```bash
# Config with Permit2
ev-deployer init deploy --chain-id 42170 --permit2

# Full config
ev-deployer init deploy \
--chain-id 42170 \
--permit2 \
--admin-proxy-owner 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \
--output deploy.toml
```

| Flag | Description |
|------|-------------|
| `--output <PATH>` | Write to file instead of stdout |
| `--chain-id <ID>` | Set the chain ID (defaults to 0) |
| `--permit2` | Enable Permit2 |
| `--admin-proxy-owner <ADDR>` | Enable AdminProxy with the given owner |

### `genesis`
Expand Down Expand Up @@ -114,15 +137,17 @@ ev-deployer deploy \
The deploy pipeline:

1. Connects to the RPC and verifies the chain ID matches the config.
2. Checks that the deterministic deployer (`0x4e59b44847b379578588920ca78fbf26c0b4956c`) exists on-chain.
2. Checks that the [deterministic deployer](https://github.com/Arachnid/deterministic-deployment-proxy) (`0x4e59b44847b379578588920ca78fbf26c0b4956c`) exists on-chain.
3. Deploys each configured contract via CREATE2.
4. Verifies that the on-chain bytecode matches the expected bytecode (including patched immutables).

The `address` field in the config is **ignored** in deploy mode — addresses come from the CREATE2 computation.
Permit2 is deployed using the [canonical Uniswap salt](https://github.com/Uniswap/permit2/blob/main/script/DeployPermit2.s.sol), so it lands at its well-known address `0x000000000022D473030F116dDEE9F6B43aC78BA3` on any chain.

> **Using with ev-dev**: The deterministic deployer can be included in the ev-dev genesis via `ev-deployer init genesis --deterministic-deployer`, so `ev-deployer deploy` works against ev-dev. See the [ev-dev README](../ev-dev/README.md#live-contract-deployment-create2) for examples.

#### State file and resumability

The `--state` file tracks deployment progress. On first run it generates a random CREATE2 salt and records which contracts have been deployed. If the process is interrupted, re-running with the same state file resumes where it left off.
The `--state` file tracks deployment progress and records which contracts have been deployed. If the process is interrupted, re-running with the same state file resumes where it left off. Contracts with well-known salts (e.g. Permit2) use their canonical salt; others use a random salt generated on first run.

Immutability rules protect against accidental misconfiguration on resume:

Expand Down
8 changes: 8 additions & 0 deletions bin/ev-deployer/src/contracts/permit2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,14 @@ pub(crate) const HASHED_NAME: B256 = B256::new(hex!(
"9ac997416e8ff9d2ff6bebeb7149f65cdae5e32e2b90440b566bb3044041d36a"
));

/// The CREATE2 salt used by Uniswap to deploy Permit2 at its canonical address
/// (`0x000000000022D473030F116dDEE9F6B43aC78BA3`) via Nick's factory.
///
/// Source: <https://github.com/Uniswap/permit2/blob/main/script/DeployPermit2.s.sol>
pub(crate) const PERMIT2_CANONICAL_SALT: B256 = B256::new(hex!(
"0000000000000000000000000000000000000000d3af2663da51c10215000000"
));

/// Build the expected runtime bytecode for a Permit2 deployed at `address` on `chain_id`.
/// Used by the deploy pipeline to verify on-chain bytecode matches.
pub(crate) fn expected_runtime_bytecode(chain_id: u64, address: Address) -> Vec<u8> {
Expand Down
10 changes: 10 additions & 0 deletions bin/ev-deployer/src/deploy/create2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,16 @@ mod tests {
assert_ne!(addr1, addr2);
}

#[test]
fn permit2_canonical_salt_produces_canonical_address() {
use crate::contracts::permit2::{PERMIT2_CANONICAL_SALT, PERMIT2_INITCODE};
let addr = compute_address(PERMIT2_CANONICAL_SALT, PERMIT2_INITCODE);
let expected: Address = "0x000000000022D473030F116dDEE9F6B43aC78BA3"
.parse()
.unwrap();
assert_eq!(addr, expected);
}

#[test]
fn factory_calldata_format() {
let salt = B256::with_last_byte(0x42);
Expand Down
2 changes: 2 additions & 0 deletions bin/ev-deployer/src/deploy/mod.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
//! On-chain deployment pipeline: CREATE2 addressing, state tracking, and orchestration.

pub mod create2;
pub mod deployer;
pub mod pipeline;
Expand Down
Loading
Loading