From ae7efa4ed150d577cb48b9ee0c232c1b3b761b8a Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Thu, 27 Mar 2025 17:14:58 -0300 Subject: [PATCH 01/14] chore: forge init --- .env | 16 + .github/workflows/test.yml | 45 + 81ea7c18-34d1-4549-a99e-96ac2e0e9b5f | 1 + Cargo.lock | 4443 +++++++++++++++++++++++++- Cargo.toml | 3 + README.md | 66 + cli/Cargo.toml | 12 + cli/src/foundry.toml | 27 + cli/src/main.rs | 78 + core/Cargo.toml | 15 + core/src/artifacts.rs | 32 + core/src/client.rs | 17 + core/src/deployer.rs | 19 + core/src/lib.rs | 3 + foundry.toml | 6 + script/Counter.s.sol | 19 + src/Counter.sol | 14 + test/Counter.t.sol | 24 + 18 files changed, 4741 insertions(+), 99 deletions(-) create mode 100644 .env create mode 100644 .github/workflows/test.yml create mode 100644 81ea7c18-34d1-4549-a99e-96ac2e0e9b5f create mode 100644 README.md create mode 100644 cli/Cargo.toml create mode 100644 cli/src/foundry.toml create mode 100644 cli/src/main.rs create mode 100644 core/Cargo.toml create mode 100644 core/src/artifacts.rs create mode 100644 core/src/client.rs create mode 100644 core/src/deployer.rs create mode 100644 core/src/lib.rs create mode 100644 foundry.toml create mode 100644 script/Counter.s.sol create mode 100644 src/Counter.sol create mode 100644 test/Counter.t.sol diff --git a/.env b/.env new file mode 100644 index 0000000..5e91022 --- /dev/null +++ b/.env @@ -0,0 +1,16 @@ +WORMHOLE_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B +WORMHOLE_RELAYER=0x27428DD2d3DD32A4D7f7C497eAaa23130d894911 +SPECIAL_RELAYER=0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74 + + +DEPLOYER_PRIVATE_KEY=0x45baca98dd90be766316072f6df81fab0671bbab99ddbc464837bdd9671dcd55 + +ARBITRUM_ETHERSCAN_KEY=KMQKM34KEYE4TQFJH2U5GAB4952T34G74F +OPTIMISM_ETHERSCAN_KEY=E6UDMDISEPNTX3IYW82J395RJANKE1EGPD +SEPOLIA_ETHERSCAN_KEY=WADYDTJJBQMYF2SJGT61G59MRXQS5XHEKC +BASESEPOLIA_ETHERSCAN_KEY=QR8X95UI4U2JEMQPN7GUK3X98U89YM4W22 + +API_KEY_ALCHEMY="xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" + +NTT_FACTORY=0x4b9F47D6CbaE0620dc49632A52E49608b46D4886 +VERSION="0.1.22" \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..762a296 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/81ea7c18-34d1-4549-a99e-96ac2e0e9b5f b/81ea7c18-34d1-4549-a99e-96ac2e0e9b5f new file mode 100644 index 0000000..03c9fbd --- /dev/null +++ b/81ea7c18-34d1-4549-a99e-96ac2e0e9b5f @@ -0,0 +1 @@ +{"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"4e1291065db7d8aad96e494ac881ec59"},"ciphertext":"e996d06eca6846b03dac971a7356367203e45d3047299f32ef33d822b4f85b31","kdf":"scrypt","kdfparams":{"dklen":32,"n":8192,"p":1,"r":8,"salt":"bfd136ed7aacf2a46620d40ada3aa561bb236451426f98470982254738308610"},"mac":"c594af112697c08d2dee4a7ae80db6741402f47de8358a0f316ce2105dc8c922"},"id":"81ea7c18-34d1-4549-a99e-96ac2e0e9b5f","version":3} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 3dd1acc..282a382 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,107 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "Inflector" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" +dependencies = [ + "lazy_static", + "regex", +] + +[[package]] +name = "addr2line" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy 0.7.35", +] + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "alloy-primitives" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0628ec0ba5b98b3370bb6be17b12f23bfce8ee4ad83823325a20546d9b03b78" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 0.99.19", + "hex-literal", + "itoa", + "ruint", + "tiny-keccak", +] + +[[package]] +name = "alloy-rlp" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" +dependencies = [ + "alloy-rlp-derive", + "bytes", +] + +[[package]] +name = "alloy-rlp-derive" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a40e1ef334153322fd878d07e86af7a529bcb86b2439525920a88eba87bcf943" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "anstream" version = "0.6.18" @@ -38,7 +139,7 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys", + "windows-sys 0.59.0", ] [[package]] @@ -49,196 +150,4340 @@ checksum = "ca3534e77181a9cc07539ad51f2141fe32f6c3ffd4df76db8ad92346b003ae4e" dependencies = [ "anstyle", "once_cell", - "windows-sys", + "windows-sys 0.59.0", ] [[package]] -name = "clap" -version = "4.5.33" +name = "anyhow" +version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2c80cae4c3350dd8f1272c73e83baff9a6ba550b8bfbe651b3c45b78cd1751e" +checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" + +[[package]] +name = "arrayvec" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" + +[[package]] +name = "ascii-canvas" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6" dependencies = [ - "clap_builder", - "clap_derive", + "term", ] [[package]] -name = "clap_builder" -version = "4.5.33" +name = "async-trait" +version = "0.1.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0123e386f691c90aa228219b5b1ee72d465e8e231c79e9c82324f016a62a741c" +checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", + "proc-macro2", + "quote", + "syn 2.0.100", ] [[package]] -name = "clap_derive" -version = "4.5.32" +name = "async_io_stream" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" +dependencies = [ + "futures", + "pharos", + "rustc_version", +] + +[[package]] +name = "atomic" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d818003e740b63afc82337e3160717f4f63078720a810b7b903e70a5d1d2994" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "auto_impl" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12882f59de5360c748c4cbf569a042d5fb0eb515f7bea9c1f470b47f6ffbd73" dependencies = [ - "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.100", ] [[package]] -name = "clap_lex" -version = "0.7.4" +name = "autocfg" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] -name = "colorchoice" -version = "1.0.3" +name = "backtrace" +version = "0.3.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "8d82cb332cdfaed17ae235a638438ac4d4839913cc2af585c3c6746e8f8bee1a" +dependencies = [ + "addr2line", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", + "windows-targets 0.52.6", +] [[package]] -name = "heck" -version = "0.5.0" +name = "base16ct" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" [[package]] -name = "is_terminal_polyfill" -version = "1.70.1" +name = "base64" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] -name = "oft_wizard" -version = "0.1.0" +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64ct" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "clap", + "bit-vec", ] [[package]] -name = "once_cell" -version = "1.21.1" +name = "bit-vec" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" [[package]] -name = "proc-macro2" -version = "1.0.94" +name = "bitflags" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "unicode-ident", + "funty", + "radium", + "tap", + "wyz", ] [[package]] -name = "quote" -version = "1.0.40" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "proc-macro2", + "generic-array", ] [[package]] -name = "strsim" -version = "0.11.1" +name = "bs58" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +dependencies = [ + "sha2", + "tinyvec", +] [[package]] -name = "syn" -version = "2.0.100" +name = "bstr" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +checksum = "531a9155a481e2ee699d4f98f43c0ca4ff8ee1bfd55c31e9e98fb29d2b176fe0" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "memchr", + "serde", ] [[package]] -name = "unicode-ident" -version = "1.0.18" +name = "build_const" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "b4ae4235e6dac0694637c763029ecea1a2ec9e4e06ec2729bd21ba4d9c863eb7" [[package]] -name = "utf8parse" -version = "0.2.2" +name = "bumpalo" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" [[package]] -name = "windows-sys" -version = "0.59.0" +name = "byte-slice-cast" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" + +[[package]] +name = "bytemuck" +version = "1.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" dependencies = [ - "windows-targets", + "serde", ] [[package]] -name = "windows-targets" -version = "0.52.6" +name = "bzip2" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_gnullvm", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "bzip2-sys", + "libc", ] [[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" +name = "bzip2-sys" +version = "0.1.13+1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" +dependencies = [ + "cc", + "pkg-config", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" +name = "camino" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "8b96ec4966b5813e2c0507c1f86115c8c5abaadc3980879c3424042a02fd1ad3" +dependencies = [ + "serde", +] [[package]] -name = "windows_i686_gnu" -version = "0.52.6" +name = "cargo-platform" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] [[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" +name = "cargo_metadata" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", +] [[package]] -name = "windows_i686_msvc" -version = "0.52.6" +name = "cc" +version = "1.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "1fcb57c740ae1daf453ae85f16e37396f672b039e00d9d866e07ddb24e328e3a" +dependencies = [ + "jobserver", + "libc", + "shlex", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "chrono" +version = "0.4.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c" +dependencies = [ + "num-traits", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "cipher" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "clap" +version = "4.5.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2c80cae4c3350dd8f1272c73e83baff9a6ba550b8bfbe651b3c45b78cd1751e" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0123e386f691c90aa228219b5b1ee72d465e8e231c79e9c82324f016a62a741c" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09176aae279615badda0765c0c0b3f6ed53f4709118af73cf4655d85d1530cd7" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "clap_lex" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" + +[[package]] +name = "cli" +version = "0.1.0" +dependencies = [ + "anyhow", + "clap", + "core", + "ethers", + "foundry-config", + "tokio", +] + +[[package]] +name = "coins-bip32" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" +dependencies = [ + "bs58", + "coins-core", + "digest", + "hmac", + "k256", + "serde", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-bip39" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db8fba409ce3dc04f7d804074039eb68b960b0829161f8e06c95fea3f122528" +dependencies = [ + "bitvec", + "coins-bip32", + "hmac", + "once_cell", + "pbkdf2 0.12.2", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", +] + +[[package]] +name = "coins-core" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5286a0843c21f8367f7be734f89df9b822e0321d8bcce8d6e735aadff7d74979" +dependencies = [ + "base64 0.21.7", + "bech32", + "bs58", + "digest", + "generic-array", + "hex", + "ripemd", + "serde", + "serde_derive", + "sha2", + "sha3", + "thiserror 1.0.69", +] + +[[package]] +name = "colorchoice" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" + +[[package]] +name = "const-hex" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +dependencies = [ + "cfg-if", + "cpufeatures", + "hex", + "proptest", + "serde", +] + +[[package]] +name = "const-oid" +version = "0.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" + +[[package]] +name = "const_format" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core" +version = "0.1.0" +dependencies = [ + "anyhow", + "dotenvy", + "ethers", + "serde", + "serde_json", + "tempfile", + "tokio", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" + +[[package]] +name = "crunchy" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43da5946c66ffcc7745f48db692ffbb10a83bfe0afd96235c5c2a4fb23994929" + +[[package]] +name = "crypto-bigint" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "subtle", + "zeroize", +] + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "ctr" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" +dependencies = [ + "cipher", +] + +[[package]] +name = "data-encoding" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575f75dfd25738df5b91b8e43e14d44bda14637a58fae779fd2b064f8bf3e010" + +[[package]] +name = "der" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" +dependencies = [ + "const-oid", + "zeroize", +] + +[[package]] +name = "deranged" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28cfac68e08048ae1883171632c2aef3ebc555621ae56fbccce1cbf22dd7f058" +dependencies = [ + "powerfmt", +] + +[[package]] +name = "derive_more" +version = "0.99.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3da29a38df43d6f156149c9b43ded5e018ddff2a855cf2cfd62e8cd7d079c69f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.100", +] + +[[package]] +name = "derive_more" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a9b99b9cbbe49445b21764dc0625032a89b145a2642e67603e1c936f5458d05" +dependencies = [ + "derive_more-impl", +] + +[[package]] +name = "derive_more-impl" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "const-oid", + "crypto-common", + "subtle", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "displaydoc" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "ecdsa" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +dependencies = [ + "der", + "digest", + "elliptic-curve", + "rfc6979", + "signature", + "spki", +] + +[[package]] +name = "either" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" + +[[package]] +name = "elliptic-curve" +version = "0.13.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +dependencies = [ + "base16ct", + "crypto-bigint", + "digest", + "ff", + "generic-array", + "group", + "pkcs8", + "rand_core 0.6.4", + "sec1", + "subtle", + "zeroize", +] + +[[package]] +name = "ena" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d248bdd43ce613d87415282f69b9bb99d947d290b10962dd6c56233312c2ad5" +dependencies = [ + "log", +] + +[[package]] +name = "encoding_rs" +version = "0.8.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "enr" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a3d8dc56e02f954cac8eb489772c552c473346fc34f67412bb6244fd647f7e4" +dependencies = [ + "base64 0.21.7", + "bytes", + "hex", + "k256", + "log", + "rand 0.8.5", + "rlp", + "serde", + "sha3", + "zeroize", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "errno" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + +[[package]] +name = "eth-keystore" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" +dependencies = [ + "aes", + "ctr", + "digest", + "hex", + "hmac", + "pbkdf2 0.11.0", + "rand 0.8.5", + "scrypt", + "serde", + "serde_json", + "sha2", + "sha3", + "thiserror 1.0.69", + "uuid", +] + +[[package]] +name = "ethabi" +version = "18.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" +dependencies = [ + "ethereum-types", + "hex", + "once_cell", + "regex", + "serde", + "serde_json", + "sha3", + "thiserror 1.0.69", + "uint", +] + +[[package]] +name = "ethbloom" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" +dependencies = [ + "crunchy", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "tiny-keccak", +] + +[[package]] +name = "ethereum-types" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" +dependencies = [ + "ethbloom", + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "primitive-types", + "scale-info", + "uint", +] + +[[package]] +name = "ethers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "816841ea989f0c69e459af1cf23a6b0033b19a55424a1ea3a30099becdb8dec0" +dependencies = [ + "ethers-addressbook", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-middleware", + "ethers-providers", + "ethers-signers", + "ethers-solc", +] + +[[package]] +name = "ethers-addressbook" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5495afd16b4faa556c3bba1f21b98b4983e53c1755022377051a975c3b021759" +dependencies = [ + "ethers-core", + "once_cell", + "serde", + "serde_json", +] + +[[package]] +name = "ethers-contract" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fceafa3578c836eeb874af87abacfb041f92b4da0a78a5edd042564b8ecdaaa" +dependencies = [ + "const-hex", + "ethers-contract-abigen", + "ethers-contract-derive", + "ethers-core", + "ethers-providers", + "futures-util", + "once_cell", + "pin-project", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "ethers-contract-abigen" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04ba01fbc2331a38c429eb95d4a570166781f14290ef9fdb144278a90b5a739b" +dependencies = [ + "Inflector", + "const-hex", + "dunce", + "ethers-core", + "ethers-etherscan", + "eyre", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "reqwest", + "serde", + "serde_json", + "syn 2.0.100", + "toml 0.8.20", + "walkdir", +] + +[[package]] +name = "ethers-contract-derive" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87689dcabc0051cde10caaade298f9e9093d65f6125c14575db3fd8c669a168f" +dependencies = [ + "Inflector", + "const-hex", + "ethers-contract-abigen", + "ethers-core", + "proc-macro2", + "quote", + "serde_json", + "syn 2.0.100", +] + +[[package]] +name = "ethers-core" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" +dependencies = [ + "arrayvec", + "bytes", + "cargo_metadata", + "chrono", + "const-hex", + "elliptic-curve", + "ethabi", + "generic-array", + "k256", + "num_enum", + "once_cell", + "open-fastrlp", + "rand 0.8.5", + "rlp", + "serde", + "serde_json", + "strum", + "syn 2.0.100", + "tempfile", + "thiserror 1.0.69", + "tiny-keccak", + "unicode-xid", +] + +[[package]] +name = "ethers-etherscan" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" +dependencies = [ + "chrono", + "ethers-core", + "reqwest", + "semver", + "serde", + "serde_json", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-middleware" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48f9fdf09aec667c099909d91908d5eaf9be1bd0e2500ba4172c1d28bfaa43de" +dependencies = [ + "async-trait", + "auto_impl", + "ethers-contract", + "ethers-core", + "ethers-etherscan", + "ethers-providers", + "ethers-signers", + "futures-channel", + "futures-locks", + "futures-util", + "instant", + "reqwest", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tracing", + "tracing-futures", + "url", +] + +[[package]] +name = "ethers-providers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6434c9a33891f1effc9c75472e12666db2fa5a0fec4b29af6221680a6fe83ab2" +dependencies = [ + "async-trait", + "auto_impl", + "base64 0.21.7", + "bytes", + "const-hex", + "enr", + "ethers-core", + "futures-core", + "futures-timer", + "futures-util", + "hashers", + "http", + "instant", + "jsonwebtoken", + "once_cell", + "pin-project", + "reqwest", + "serde", + "serde_json", + "thiserror 1.0.69", + "tokio", + "tokio-tungstenite", + "tracing", + "tracing-futures", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "ws_stream_wasm", +] + +[[package]] +name = "ethers-signers" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "228875491c782ad851773b652dd8ecac62cda8571d3bc32a5853644dd26766c2" +dependencies = [ + "async-trait", + "coins-bip32", + "coins-bip39", + "const-hex", + "elliptic-curve", + "eth-keystore", + "ethers-core", + "rand 0.8.5", + "sha2", + "thiserror 1.0.69", + "tracing", +] + +[[package]] +name = "ethers-solc" +version = "2.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" +dependencies = [ + "cfg-if", + "const-hex", + "dirs", + "dunce", + "ethers-core", + "futures-util", + "glob", + "home", + "md-5", + "num_cpus", + "once_cell", + "path-slash", + "rayon", + "regex", + "semver", + "serde", + "serde_json", + "sha2", + "solang-parser", + "svm-rs", + "svm-rs-builds", + "thiserror 1.0.69", + "tiny-keccak", + "tokio", + "tracing", + "walkdir", + "yansi 0.5.1", +] + +[[package]] +name = "eyre" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +dependencies = [ + "indenter", + "once_cell", +] + +[[package]] +name = "fastrand" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" + +[[package]] +name = "ff" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +dependencies = [ + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "figment" +version = "0.10.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" +dependencies = [ + "atomic", + "pear", + "serde", + "toml 0.8.20", + "uncased", + "version_check", +] + +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11faaf5a5236997af9848be0bef4db95824b1d534ebc64d0f0c6cf3e67bd38dc" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "foundry-config" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a64a9bdad47eb4d950523b8ff14e675db8f2226a2aef79063d9344449b3abd5" +dependencies = [ + "Inflector", + "dirs-next", + "ethers-core", + "ethers-etherscan", + "ethers-solc", + "eyre", + "figment", + "globset", + "number_prefix", + "once_cell", + "open-fastrlp", + "path-slash", + "regex", + "reqwest", + "revm-primitives", + "semver", + "serde", + "serde_json", + "serde_regex", + "thiserror 1.0.69", + "toml 0.7.8", + "toml_edit 0.19.15", + "tracing", + "walkdir", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" + +[[package]] +name = "futures-executor" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" + +[[package]] +name = "futures-locks" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ec6fe3675af967e67c5536c0b9d44e34e6c52f86bedc4ea49c5317b8e94d06" +dependencies = [ + "futures-channel", + "futures-task", +] + +[[package]] +name = "futures-macro" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "futures-sink" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" + +[[package]] +name = "futures-task" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" + +[[package]] +name = "futures-timer" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" +dependencies = [ + "gloo-timers", + "send_wrapper 0.4.0", +] + +[[package]] +name = "futures-util" +version = "0.3.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", + "zeroize", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" +dependencies = [ + "cfg-if", + "libc", + "r-efi", + "wasi 0.14.2+wasi-0.2.4", +] + +[[package]] +name = "gimli" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" + +[[package]] +name = "glob" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" + +[[package]] +name = "globset" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54a1028dfc5f5df5da8a56a73e6c153c9a9708ec57232470703592a3f18e49f5" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-timers" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" + +[[package]] +name = "hashers" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bca93b15ea5a746f220e56587f71e73c6165eab783df9e26590069953e3c30" +dependencies = [ + "fxhash", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hex-literal" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest", +] + +[[package]] +name = "home" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41dfc780fdec9373c01bae43289ea34c972e40ee3c9f6b3c8801a35f35586ce7" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.24.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" +dependencies = [ + "futures-util", + "http", + "hyper", + "rustls", + "tokio", + "tokio-rustls", +] + +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7515e6d781098bf9f7205ab3fc7e9709d34554ae0b21ddbcb5febfa4bc7df11d" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "idna" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-rlp" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28220f89297a075ddc7245cd538076ee98b01f2a9c23a53a4f1105d5a322808" +dependencies = [ + "rlp", +] + +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "indenter" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" + +[[package]] +name = "indexmap" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3954d50fe15b02142bf25d3b8bdadb634ec3948f103d04ffe3031bc8fe9d7058" +dependencies = [ + "equivalent", + "hashbrown 0.15.2", +] + +[[package]] +name = "inlinable_string" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8fae54786f62fb2918dcfae3d568594e50eb9b5c25bf04371af6fe7516452fb" + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "ipnet" +version = "2.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" + +[[package]] +name = "jobserver" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48d1dbcbbeb6a7fec7e059840aa538bd62aaccf972c7346c4d9d2059312853d0" +dependencies = [ + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + +[[package]] +name = "jsonwebtoken" +version = "8.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6971da4d9c3aa03c3d8f3ff0f4155b534aad021292003895a469716b2a230378" +dependencies = [ + "base64 0.21.7", + "pem", + "ring 0.16.20", + "serde", + "serde_json", + "simple_asn1", +] + +[[package]] +name = "k256" +version = "0.13.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" +dependencies = [ + "cfg-if", + "ecdsa", + "elliptic-curve", + "once_cell", + "sha2", + "signature", +] + +[[package]] +name = "keccak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" +dependencies = [ + "cpufeatures", +] + +[[package]] +name = "lalrpop" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" +dependencies = [ + "ascii-canvas", + "bit-set", + "ena", + "itertools", + "lalrpop-util", + "petgraph", + "regex", + "regex-syntax", + "string_cache", + "term", + "tiny-keccak", + "unicode-xid", + "walkdir", +] + +[[package]] +name = "lalrpop-util" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "libc" +version = "0.2.171" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" + +[[package]] +name = "libm" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.9.0", + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe7db12097d22ec582439daf8618b8fdd1a7bef6270e9af3b1ebcd30893cf413" + +[[package]] +name = "litemap" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23fb14cb19457329c82206317a5663005a4d404783dc74f4252769b0d5f42856" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e3e04debbb59698c15bacbb6d93584a8c0ca9cc3213cb423d31f760d8843ce5" +dependencies = [ + "adler2", +] + +[[package]] +name = "mio" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.52.0", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "number_prefix" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b246a0e5f20af87141b25c173cd1b609bd7779a4617d6ec582abaf90870f3" + +[[package]] +name = "object" +version = "0.36.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +dependencies = [ + "memchr", +] + +[[package]] +name = "oft_wizard" +version = "0.1.0" +dependencies = [ + "clap", +] + +[[package]] +name = "once_cell" +version = "1.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" + +[[package]] +name = "open-fastrlp" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786393f80485445794f6043fd3138854dd109cc6c4bd1a6383db304c9ce9b9ce" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", + "ethereum-types", + "open-fastrlp-derive", +] + +[[package]] +name = "open-fastrlp-derive" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "003b2be5c6c53c1cfeb0a238b8a1c3915cd410feb684457a36c10038f764bb1c" +dependencies = [ + "bytes", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "parity-scale-codec" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9fde3d0718baf5bc92f577d652001da0f8d54cd03a7974e118d04fc888dc23d" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "const_format", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "rustversion", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581c837bb6b9541ce7faa9377c20616e4fb7650f6b0f68bc93c827ee504fb7b3" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "path-slash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e91099d4268b0e11973f036e885d652fb0b21fedcf69738c627f94db6a44f42" + +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest", + "hmac", +] + +[[package]] +name = "pear" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdeeaa00ce488657faba8ebf44ab9361f9365a97bd39ffb8a60663f57ff4b467" +dependencies = [ + "inlinable_string", + "pear_codegen", + "yansi 1.0.1", +] + +[[package]] +name = "pear_codegen" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bab5b985dc082b345f812b7df84e1bef27e7207b39e448439ba8bd69c93f147" +dependencies = [ + "proc-macro2", + "proc-macro2-diagnostics", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "pem" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8835c273a76a90455d7344889b0964598e3316e2a79ede8e36f16bdcf2228b8" +dependencies = [ + "base64 0.13.1", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap", +] + +[[package]] +name = "pharos" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" +dependencies = [ + "futures", + "rustc_version", +] + +[[package]] +name = "phf" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" +dependencies = [ + "phf_macros", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c80231409c20246a13fddb31776fb942c38553c51e871f8cbd687a4cfb5843d" +dependencies = [ + "phf_shared", + "rand 0.8.5", +] + +[[package]] +name = "phf_macros" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f84ac04429c13a7ff43785d75ad27569f2951ce0ffd30a3321230db2fc727216" +dependencies = [ + "phf_generator", + "phf_shared", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "phf_shared" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +dependencies = [ + "der", + "spki", +] + +[[package]] +name = "pkg-config" +version = "0.3.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy 0.8.24", +] + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5316f57387668042f561aae71480de936257848f9c43ce528e311d89a07cadeb" +dependencies = [ + "proc-macro2", + "syn 2.0.100", +] + +[[package]] +name = "primitive-types" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +dependencies = [ + "fixed-hash", + "impl-codec", + "impl-rlp", + "impl-serde", + "scale-info", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edce586971a4dfaa28950c6f18ed55e0406c1ab88bbce2c6f6293a7aaba73d35" +dependencies = [ + "toml_edit 0.22.24", +] + +[[package]] +name = "proc-macro2" +version = "1.0.94" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proc-macro2-diagnostics" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "version_check", + "yansi 1.0.1", +] + +[[package]] +name = "proptest" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" +dependencies = [ + "bitflags 2.9.0", + "lazy_static", + "num-traits", + "rand 0.8.5", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "unarray", +] + +[[package]] +name = "quote" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" +dependencies = [ + "rand_core 0.9.3", + "zerocopy 0.8.24", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_core" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "regex" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" + +[[package]] +name = "reqwest" +version = "0.11.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" +dependencies = [ + "base64 0.21.7", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-rustls", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "rustls", + "rustls-pemfile", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots", + "winreg", +] + +[[package]] +name = "revm-primitives" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51187b852d9e458816a2e19c81f1dd6c924077e1a8fccd16e4f044f865f299d7" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "auto_impl", + "bitflags 2.9.0", + "bitvec", + "enumn", + "hashbrown 0.14.5", + "hex", +] + +[[package]] +name = "rfc6979" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" +dependencies = [ + "hmac", + "subtle", +] + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted 0.7.1", + "web-sys", + "winapi", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.15", + "libc", + "untrusted 0.9.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest", +] + +[[package]] +name = "rlp" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" +dependencies = [ + "bytes", + "rlp-derive", + "rustc-hex", +] + +[[package]] +name = "rlp-derive" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33d7b2abe0c340d8797fe2907d3f20d3b5ea5908683618bfe80df7f621f672a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ruint" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" +dependencies = [ + "alloy-rlp", + "proptest", + "rand 0.8.5", + "rand 0.9.0", + "ruint-macro", + "serde", + "valuable", + "zeroize", +] + +[[package]] +name = "ruint-macro" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e56a18552996ac8d29ecc3b190b4fdbb2d91ca4ec396de7bbffaf43f3d637e96" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "rustversion" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" + +[[package]] +name = "ryu" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" + +[[package]] +name = "salsa20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97a22f5af31f73a954c10289c93e8a50cc23d971e80ee446f1f6f7137a088213" +dependencies = [ + "cipher", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scale-info" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +dependencies = [ + "cfg-if", + "derive_more 1.0.0", + "parity-scale-codec", + "scale-info-derive", +] + +[[package]] +name = "scale-info-derive" +version = "2.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "scrypt" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f9e24d2b632954ded8ab2ef9fea0a0c769ea56ea98bddbafbad22caeeadf45d" +dependencies = [ + "hmac", + "pbkdf2 0.11.0", + "salsa20", + "sha2", +] + +[[package]] +name = "sct" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" +dependencies = [ + "ring 0.17.14", + "untrusted 0.9.0", +] + +[[package]] +name = "sec1" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" +dependencies = [ + "base16ct", + "der", + "generic-array", + "pkcs8", + "subtle", + "zeroize", +] + +[[package]] +name = "semver" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +dependencies = [ + "serde", +] + +[[package]] +name = "send_wrapper" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f638d531eccd6e23b980caf34876660d38e265409d8e99b397ab71eb3612fad0" + +[[package]] +name = "send_wrapper" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" + +[[package]] +name = "serde" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.219" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "serde_json" +version = "1.0.140" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20068b6e96dc6c9bd23e01df8827e6c7e1f2fddd43c21810382803c136b99373" +dependencies = [ + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8136f1a4ea815d7eac4101cfd0b16dc0cb5e1fe1b8609dfd728058656b7badf" +dependencies = [ + "regex", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sha3" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" +dependencies = [ + "digest", + "keccak", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "signature" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" +dependencies = [ + "digest", + "rand_core 0.6.4", +] + +[[package]] +name = "simple_asn1" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" +dependencies = [ + "num-bigint", + "num-traits", + "thiserror 2.0.12", + "time", +] + +[[package]] +name = "siphasher" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcf8323ef1faaee30a44a340193b1ac6814fd9b7b4e88e9d4519a3e4abe1cfd" + +[[package]] +name = "socket2" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "solang-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" +dependencies = [ + "itertools", + "lalrpop", + "lalrpop-util", + "phf", + "thiserror 1.0.69", + "unicode-xid", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spki" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "string_cache" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "938d512196766101d333398efde81bc1f37b00cb42c2f8350e5df639f040bbbe" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared", + "precomputed-hash", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.100", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "svm-rs" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" +dependencies = [ + "dirs", + "fs2", + "hex", + "once_cell", + "reqwest", + "semver", + "serde", + "serde_json", + "sha2", + "thiserror 1.0.69", + "url", + "zip", +] + +[[package]] +name = "svm-rs-builds" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa64b5e8eecd3a8af7cfc311e29db31a268a62d5953233d3e8243ec77a71c4e3" +dependencies = [ + "build_const", + "hex", + "semver", + "serde_json", + "svm-rs", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "system-configuration" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7437ac7763b9b123ccf33c338a5cc1bac6f69b45a136c19bdd8a65e3916435bf" +dependencies = [ + "fastrand", + "getrandom 0.3.2", + "once_cell", + "rustix", + "windows-sys 0.59.0", +] + +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi", +] + +[[package]] +name = "thiserror" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +dependencies = [ + "thiserror-impl 2.0.12", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "time" +version = "0.3.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +dependencies = [ + "deranged", + "itoa", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" + +[[package]] +name = "time-macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.44.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.52.0", +] + +[[package]] +name = "tokio-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" +dependencies = [ + "futures-util", + "log", + "rustls", + "tokio", + "tokio-rustls", + "tungstenite", + "webpki-roots", +] + +[[package]] +name = "tokio-util" +version = "0.7.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.24", +] + +[[package]] +name = "toml_datetime" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.7.4", +] + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "tracing-core" +version = "0.1.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +dependencies = [ + "once_cell", +] + +[[package]] +name = "tracing-futures" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +dependencies = [ + "pin-project", + "tracing", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "tungstenite" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e3dac10fd62eaf6617d3a904ae222845979aec67c615d1c842b4002c7666fb9" +dependencies = [ + "byteorder", + "bytes", + "data-encoding", + "http", + "httparse", + "log", + "rand 0.8.5", + "rustls", + "sha1", + "thiserror 1.0.69", + "url", + "utf-8", +] + +[[package]] +name = "typenum" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "uncased" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" +dependencies = [ + "version_check", +] + +[[package]] +name = "unicode-ident" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" + +[[package]] +name = "unicode-xid" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc5cf98d8186244414c848017f0e2676b3fcb46807f6668a97dfe67359a3c4b7" +dependencies = [ + "getrandom 0.2.15", + "serde", +] + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasi" +version = "0.14.2+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.50" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +dependencies = [ + "cfg-if", + "js-sys", + "once_cell", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "web-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webpki-roots" +version = "0.25.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys 0.59.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e97b544156e9bebe1a0ffbc03484fc1ffe3100cbce3ffb17eac35f7cdd7ab36" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.50.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags 2.9.0", +] + +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + +[[package]] +name = "ws_stream_wasm" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7999f5f4217fe3818726b66257a4475f71e74ffd190776ad053fa159e50737f5" +dependencies = [ + "async_io_stream", + "futures", + "js-sys", + "log", + "pharos", + "rustc_version", + "send_wrapper 0.6.0", + "thiserror 1.0.69", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "yansi" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" + +[[package]] +name = "yansi" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" + +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive 0.7.35", +] + +[[package]] +name = "zerocopy" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879" +dependencies = [ + "zerocopy-derive 0.8.24", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zerofrom" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2 0.11.0", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.15+zstd.1.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/Cargo.toml b/Cargo.toml index 8ac7b3c..3ecabd7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,3 +5,6 @@ edition = "2021" [dependencies] clap = { version = "4.4", features = ["derive"] } + +[workspace] +members = ["core", "cli"] diff --git a/README.md b/README.md new file mode 100644 index 0000000..9265b45 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/cli/Cargo.toml b/cli/Cargo.toml new file mode 100644 index 0000000..53440b1 --- /dev/null +++ b/cli/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "cli" +version = "0.1.0" +edition = "2021" + +[dependencies] +clap = { version = "4", features = ["derive"] } +tokio = { version = "1", features = ["full"] } +core = { path = "../core" } +ethers = "2" +anyhow = "1" +foundry-config = "0.2" diff --git a/cli/src/foundry.toml b/cli/src/foundry.toml new file mode 100644 index 0000000..3d59f9c --- /dev/null +++ b/cli/src/foundry.toml @@ -0,0 +1,27 @@ +[profile.default] +auto_detect_solc = true +bytecodeHash = "none" +cbor_metadata = false +gas_reports = ["*"] +out = "out" +solc = "0.8.22" +src = "src" +viaIR = true + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options +[rpc_endpoints] +arbitrum = "https://arb-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +arbitrum_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +avalanche = "https://avax-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +base_sepolia = "https://base-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +optimism = "https://1rpc.io/op" +optimism_sepolia = "https://opt-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +sepolia = "https://eth-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" + +[etherscan] +arbitrum = {key = "${ARBITRUM_ETHERSCAN_KEY}"} +arbitrum_sepolia = {key = "${ARBITRUM_ETHERSCAN_KEY}"} +base_sepolia = {key = "${BASESEPOLIA_ETHERSCAN_KEY}"} +optimism = {key = "${OPTIMISM_ETHERSCAN_KEY}"} +optimism_sepolia = {key = "${OPTIMISM_ETHERSCAN_KEY}"} +sepolia = {key = "${SEPOLIA_ETHERSCAN_KEY}", chain = "sepolia"} diff --git a/cli/src/main.rs b/cli/src/main.rs new file mode 100644 index 0000000..da8d3d2 --- /dev/null +++ b/cli/src/main.rs @@ -0,0 +1,78 @@ +use clap::{Parser, Subcommand}; +use core::{client, deployer}; +use ethers::providers::{Http, Provider}; +// use ethers::types::Address; +use foundry_config::Config; +use std::process::Command; + +#[derive(Parser)] +#[command(name = "deploy-cli")] +#[command(about = "Deploy contracts and manage deployer", long_about = None)] +struct Cli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand)] +enum Commands { + Wallet { + #[command(subcommand)] + action: WalletAction, + }, + Deploy { + contract: String, + }, +} + +#[derive(Subcommand)] +enum WalletAction { + New, + Balance, +} + +#[tokio::main] +async fn main() -> anyhow::Result<()> { + let cli = Cli::parse(); + + let config = Config::load_with_root("./"); + println!("{:?}", config); + let rpc_url: String = match config.get_rpc_url_with_alias("optimism_sepolia") { + Some(Ok(rpc)) => rpc.into_owned(), + _ => panic!("rpc"), + }; + + let provider = match Provider::::try_from(rpc_url) { + Ok(provider) => provider, + _ => panic!("provider"), + }; + + match cli.command { + Commands::Wallet { action } => match action { + WalletAction::New => { + let output = Command::new("cast") + .arg("wallet") + .arg("new") + .arg("../wallets") + .output()?; + println!("{}", String::from_utf8_lossy(&output.stdout)); + } + WalletAction::Balance => { + let wallet = client::wallet_from_env().await?; + // let addr: Address = wallet.address(); + // let balance = provider.get_balance(addr, None).await?; + // println!( + // "Deployer: {}\nBalance: {} ETH", + // addr, + // ethers::utils::format_ether(balance) + // ); + } + }, + Commands::Deploy { contract } => { + let wallet = client::wallet_from_env().await?; + let addr = deployer::deploy_contract(&contract, provider, wallet).await?; + println!("Deployed `{}` at {}\n", contract, addr); + } + } + + Ok(()) +} diff --git a/core/Cargo.toml b/core/Cargo.toml new file mode 100644 index 0000000..9ac19e0 --- /dev/null +++ b/core/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "core" +version = "0.1.0" +edition = "2021" + +[dependencies] +ethers = { version = "2", features = ["abigen"] } +serde = { version = "1", features = ["derive"] } +serde_json = "1" +anyhow = "1" +tokio = { version = "1", features = ["full"] } + +[dev-dependencies] +tempfile = "3" +dotenvy = "0.15" diff --git a/core/src/artifacts.rs b/core/src/artifacts.rs new file mode 100644 index 0000000..ff5d340 --- /dev/null +++ b/core/src/artifacts.rs @@ -0,0 +1,32 @@ +use anyhow::{Context, Result}; +use ethers::abi::Abi; +use std::fs; + +fn contract_path(contract_name: &str) -> String { + format!( + "contracts/{}/out/{}.sol/{}.json", + contract_name, contract_name, contract_name + ) +} + +pub fn load_abi(contract_name: &str) -> Result { + let path = contract_path(contract_name); + let json = + fs::read_to_string(&path).with_context(|| format!("failed to read abi from {}", path))?; + let v: serde_json::Value = serde_json::from_str(&json)?; + let abi_str = serde_json::to_string(&v["abi"])?; + let abi = serde_json::from_str(&abi_str)?; + Ok(abi) +} + +pub fn load_bytecode(contract_name: &str) -> Result { + let path = contract_path(contract_name); + let json = fs::read_to_string(&path) + .with_context(|| format!("Failed to read bytecode from {}", path))?; + let v: serde_json::Value = serde_json::from_str(&json)?; + let bytecode = v["bytecode"]["object"] + .as_str() + .context("Missing bytecode object")? + .to_string(); + Ok(bytecode) +} diff --git a/core/src/client.rs b/core/src/client.rs new file mode 100644 index 0000000..2cb9554 --- /dev/null +++ b/core/src/client.rs @@ -0,0 +1,17 @@ +use anyhow::{Context, Result}; +use ethers::signers::{LocalWallet, Wallet}; +use std::env; +use std::fs; + +pub async fn wallet_from_env() -> Result { + let key = env::var("PRIVATE_KEY").context("PRIVATE_KEY not set")?; + Ok(key.parse::()?) +} + +/// Load a wallet from a keystore file. +/// `cast wallet new .` +pub async fn wallet_from_keystore(path: &str, password: &str) -> Result { + let json = fs::read_to_string(path)?; + let wallet = Wallet::decrypt_keystore(&json, password)?; + Ok(wallet) +} diff --git a/core/src/deployer.rs b/core/src/deployer.rs new file mode 100644 index 0000000..22c25d5 --- /dev/null +++ b/core/src/deployer.rs @@ -0,0 +1,19 @@ +use crate::artifacts; +use anyhow::Result; +use ethers::prelude::*; +use std::sync::Arc; + +pub async fn deploy_contract( + contract_name: &str, + provider: Provider, + wallet: LocalWallet, +) -> Result
{ + let abi = artifacts::load_abi(contract_name)?; + let bytecode = artifacts::load_bytecode(contract_name)?; + let client = Arc::new(SignerMiddleware::new(provider, wallet)); + + let factory = ContractFactory::new(abi, Bytes::from(bytecode.as_bytes().to_vec()), client); + let deployer = factory.deploy(())?.send().await?; + + Ok(deployer.address()) +} diff --git a/core/src/lib.rs b/core/src/lib.rs new file mode 100644 index 0000000..1d15ffc --- /dev/null +++ b/core/src/lib.rs @@ -0,0 +1,3 @@ +pub mod artifacts; +pub mod client; +pub mod deployer; diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 0000000..25b918f --- /dev/null +++ b/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/script/Counter.s.sol b/script/Counter.s.sol new file mode 100644 index 0000000..cdc1fe9 --- /dev/null +++ b/script/Counter.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console} from "forge-std/Script.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterScript is Script { + Counter public counter; + + function setUp() public {} + + function run() public { + vm.startBroadcast(); + + counter = new Counter(); + + vm.stopBroadcast(); + } +} diff --git a/src/Counter.sol b/src/Counter.sol new file mode 100644 index 0000000..aded799 --- /dev/null +++ b/src/Counter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract Counter { + uint256 public number; + + function setNumber(uint256 newNumber) public { + number = newNumber; + } + + function increment() public { + number++; + } +} diff --git a/test/Counter.t.sol b/test/Counter.t.sol new file mode 100644 index 0000000..54b724f --- /dev/null +++ b/test/Counter.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + counter.setNumber(0); + } + + function test_Increment() public { + counter.increment(); + assertEq(counter.number(), 1); + } + + function testFuzz_SetNumber(uint256 x) public { + counter.setNumber(x); + assertEq(counter.number(), x); + } +} From bdefcddd3bc99e2767565be2ab8c89729f28bcf0 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Thu, 27 Mar 2025 17:15:04 -0300 Subject: [PATCH 02/14] forge install: forge-std v1.9.6 --- .gitmodules | 3 +++ lib/forge-std | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 lib/forge-std diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..888d42d --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 0000000..3b20d60 --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 From 59d07c2c85820f49729445e527557fc70d13ee6b Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Thu, 27 Mar 2025 19:41:25 -0300 Subject: [PATCH 03/14] Clean up repository structure and configuration Previously scattered configuration files and boilerplate code have been consolidated or removed. Added proper gitignore entries and streamlined the project structure. --- .env | 16 ----- .github/workflows/test.yml | 45 -------------- .gitignore | 2 + .gitmodules | 3 - 81ea7c18-34d1-4549-a99e-96ac2e0e9b5f | 1 - Cargo.lock | 12 +--- Cargo.toml | 8 --- README.md | 66 --------------------- cli/Cargo.toml | 1 + cli/src/foundry.toml | 27 --------- cli/src/main.rs | 87 ++++++++++++++++++---------- core/Cargo.toml | 4 -- core/src/client.rs | 15 ++--- foundry.toml | 9 ++- script/Counter.s.sol | 19 ------ src/Counter.sol | 14 ----- src/main.rs | 3 - test/Counter.t.sol | 24 -------- 18 files changed, 76 insertions(+), 280 deletions(-) delete mode 100644 .env delete mode 100644 .github/workflows/test.yml delete mode 100644 .gitmodules delete mode 100644 81ea7c18-34d1-4549-a99e-96ac2e0e9b5f delete mode 100644 README.md delete mode 100644 cli/src/foundry.toml delete mode 100644 script/Counter.s.sol delete mode 100644 src/Counter.sol delete mode 100644 src/main.rs delete mode 100644 test/Counter.t.sol diff --git a/.env b/.env deleted file mode 100644 index 5e91022..0000000 --- a/.env +++ /dev/null @@ -1,16 +0,0 @@ -WORMHOLE_CORE_BRIDGE=0x98f3c9e6E3fAce36bAAd05FE09d375Ef1464288B -WORMHOLE_RELAYER=0x27428DD2d3DD32A4D7f7C497eAaa23130d894911 -SPECIAL_RELAYER=0x63BE47835c7D66c4aA5B2C688Dc6ed9771c94C74 - - -DEPLOYER_PRIVATE_KEY=0x45baca98dd90be766316072f6df81fab0671bbab99ddbc464837bdd9671dcd55 - -ARBITRUM_ETHERSCAN_KEY=KMQKM34KEYE4TQFJH2U5GAB4952T34G74F -OPTIMISM_ETHERSCAN_KEY=E6UDMDISEPNTX3IYW82J395RJANKE1EGPD -SEPOLIA_ETHERSCAN_KEY=WADYDTJJBQMYF2SJGT61G59MRXQS5XHEKC -BASESEPOLIA_ETHERSCAN_KEY=QR8X95UI4U2JEMQPN7GUK3X98U89YM4W22 - -API_KEY_ALCHEMY="xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" - -NTT_FACTORY=0x4b9F47D6CbaE0620dc49632A52E49608b46D4886 -VERSION="0.1.22" \ No newline at end of file diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index 762a296..0000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: CI - -on: - push: - pull_request: - workflow_dispatch: - -env: - FOUNDRY_PROFILE: ci - -jobs: - check: - strategy: - fail-fast: true - - name: Foundry project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Show Forge version - run: | - forge --version - - - name: Run Forge fmt - run: | - forge fmt --check - id: fmt - - - name: Run Forge build - run: | - forge build --sizes - id: build - - - name: Run Forge tests - run: | - forge test -vvv - id: test diff --git a/.gitignore b/.gitignore index ea8c4bf..e7dd9f1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ /target +wallets/ +.env diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 888d42d..0000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "lib/forge-std"] - path = lib/forge-std - url = https://github.com/foundry-rs/forge-std diff --git a/81ea7c18-34d1-4549-a99e-96ac2e0e9b5f b/81ea7c18-34d1-4549-a99e-96ac2e0e9b5f deleted file mode 100644 index 03c9fbd..0000000 --- a/81ea7c18-34d1-4549-a99e-96ac2e0e9b5f +++ /dev/null @@ -1 +0,0 @@ -{"crypto":{"cipher":"aes-128-ctr","cipherparams":{"iv":"4e1291065db7d8aad96e494ac881ec59"},"ciphertext":"e996d06eca6846b03dac971a7356367203e45d3047299f32ef33d822b4f85b31","kdf":"scrypt","kdfparams":{"dklen":32,"n":8192,"p":1,"r":8,"salt":"bfd136ed7aacf2a46620d40ada3aa561bb236451426f98470982254738308610"},"mac":"c594af112697c08d2dee4a7ae80db6741402f47de8358a0f316ce2105dc8c922"},"id":"81ea7c18-34d1-4549-a99e-96ac2e0e9b5f","version":3} \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock index 282a382..786748f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -509,6 +509,7 @@ dependencies = [ "anyhow", "clap", "core", + "dotenvy", "ethers", "foundry-config", "tokio", @@ -628,11 +629,9 @@ name = "core" version = "0.1.0" dependencies = [ "anyhow", - "dotenvy", "ethers", "serde", "serde_json", - "tempfile", "tokio", ] @@ -2294,13 +2293,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "oft_wizard" -version = "0.1.0" -dependencies = [ - "clap", -] - [[package]] name = "once_cell" version = "1.21.1" diff --git a/Cargo.toml b/Cargo.toml index 3ecabd7..15f4e01 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,2 @@ -[package] -name = "oft_wizard" -version = "0.1.0" -edition = "2021" - -[dependencies] -clap = { version = "4.4", features = ["derive"] } - [workspace] members = ["core", "cli"] diff --git a/README.md b/README.md deleted file mode 100644 index 9265b45..0000000 --- a/README.md +++ /dev/null @@ -1,66 +0,0 @@ -## Foundry - -**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** - -Foundry consists of: - -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. - -## Documentation - -https://book.getfoundry.sh/ - -## Usage - -### Build - -```shell -$ forge build -``` - -### Test - -```shell -$ forge test -``` - -### Format - -```shell -$ forge fmt -``` - -### Gas Snapshots - -```shell -$ forge snapshot -``` - -### Anvil - -```shell -$ anvil -``` - -### Deploy - -```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key -``` - -### Cast - -```shell -$ cast -``` - -### Help - -```shell -$ forge --help -$ anvil --help -$ cast --help -``` diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 53440b1..5baf6ce 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -10,3 +10,4 @@ core = { path = "../core" } ethers = "2" anyhow = "1" foundry-config = "0.2" +dotenvy = "0.15" diff --git a/cli/src/foundry.toml b/cli/src/foundry.toml deleted file mode 100644 index 3d59f9c..0000000 --- a/cli/src/foundry.toml +++ /dev/null @@ -1,27 +0,0 @@ -[profile.default] -auto_detect_solc = true -bytecodeHash = "none" -cbor_metadata = false -gas_reports = ["*"] -out = "out" -solc = "0.8.22" -src = "src" -viaIR = true - -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options -[rpc_endpoints] -arbitrum = "https://arb-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -arbitrum_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -avalanche = "https://avax-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -base_sepolia = "https://base-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -optimism = "https://1rpc.io/op" -optimism_sepolia = "https://opt-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -sepolia = "https://eth-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" - -[etherscan] -arbitrum = {key = "${ARBITRUM_ETHERSCAN_KEY}"} -arbitrum_sepolia = {key = "${ARBITRUM_ETHERSCAN_KEY}"} -base_sepolia = {key = "${BASESEPOLIA_ETHERSCAN_KEY}"} -optimism = {key = "${OPTIMISM_ETHERSCAN_KEY}"} -optimism_sepolia = {key = "${OPTIMISM_ETHERSCAN_KEY}"} -sepolia = {key = "${SEPOLIA_ETHERSCAN_KEY}", chain = "sepolia"} diff --git a/cli/src/main.rs b/cli/src/main.rs index da8d3d2..c623429 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,7 +1,8 @@ use clap::{Parser, Subcommand}; use core::{client, deployer}; -use ethers::providers::{Http, Provider}; -// use ethers::types::Address; +use ethers::providers::{Http, Middleware, Provider}; +use ethers::signers::Signer; +use ethers::types::Address; use foundry_config::Config; use std::process::Command; @@ -9,10 +10,12 @@ use std::process::Command; #[command(name = "deploy-cli")] #[command(about = "Deploy contracts and manage deployer", long_about = None)] struct Cli { + #[arg(long)] + chain: String, + #[command(subcommand)] command: Commands, } - #[derive(Subcommand)] enum Commands { Wallet { @@ -20,6 +23,10 @@ enum Commands { action: WalletAction, }, Deploy { + #[arg(long)] + path: String, + #[arg(long)] + password: String, contract: String, }, } @@ -27,24 +34,34 @@ enum Commands { #[derive(Subcommand)] enum WalletAction { New, - Balance, + Balance { + #[arg(long)] + path: String, + #[arg(long)] + password: String, + }, +} + +fn get_provider(chain_alias: &str) -> anyhow::Result> { + let config = Config::load(); + + let rpc_url: String = config + .get_rpc_url_with_alias(chain_alias) + .ok_or_else(|| anyhow::anyhow!("Error trying to get RPC URL from config"))? + .map_err(|e| anyhow::anyhow!("Error getting RPC URL: {}", e))? + .into_owned(); + + Provider::::try_from(rpc_url) + .map_err(|e| anyhow::anyhow!("Error instantiating provider: {}", e)) } #[tokio::main] async fn main() -> anyhow::Result<()> { - let cli = Cli::parse(); - - let config = Config::load_with_root("./"); - println!("{:?}", config); - let rpc_url: String = match config.get_rpc_url_with_alias("optimism_sepolia") { - Some(Ok(rpc)) => rpc.into_owned(), - _ => panic!("rpc"), - }; + dotenvy::dotenv().ok(); - let provider = match Provider::::try_from(rpc_url) { - Ok(provider) => provider, - _ => panic!("provider"), - }; + let cli = Cli::parse(); + let chain = cli.chain; + let provider = get_provider(chain.as_str()).expect("Provider setup failed"); match cli.command { Commands::Wallet { action } => match action { @@ -52,23 +69,35 @@ async fn main() -> anyhow::Result<()> { let output = Command::new("cast") .arg("wallet") .arg("new") - .arg("../wallets") + .arg("wallets") .output()?; - println!("{}", String::from_utf8_lossy(&output.stdout)); + + println!( + "Error from cast wallet new {:?}", + String::from_utf8_lossy(&output.stderr) + ); + println!( + "Output from cast wallet new {:?}", + String::from_utf8_lossy(&output.stdout) + ); } - WalletAction::Balance => { - let wallet = client::wallet_from_env().await?; - // let addr: Address = wallet.address(); - // let balance = provider.get_balance(addr, None).await?; - // println!( - // "Deployer: {}\nBalance: {} ETH", - // addr, - // ethers::utils::format_ether(balance) - // ); + WalletAction::Balance { path, password } => { + let wallet = client::wallet_from_keystore(path.as_str(), password.as_str()).await?; + let addr: Address = wallet.address(); + let balance = provider.get_balance(addr, None).await?; + println!( + "Deployer: {:?}\nBalance: {} ETH", + addr, + ethers::utils::format_ether(balance) + ); } }, - Commands::Deploy { contract } => { - let wallet = client::wallet_from_env().await?; + Commands::Deploy { + path, + password, + contract, + } => { + let wallet = client::wallet_from_keystore(path.as_str(), password.as_str()).await?; let addr = deployer::deploy_contract(&contract, provider, wallet).await?; println!("Deployed `{}` at {}\n", contract, addr); } diff --git a/core/Cargo.toml b/core/Cargo.toml index 9ac19e0..63bbc76 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -9,7 +9,3 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" anyhow = "1" tokio = { version = "1", features = ["full"] } - -[dev-dependencies] -tempfile = "3" -dotenvy = "0.15" diff --git a/core/src/client.rs b/core/src/client.rs index 2cb9554..5ab25b2 100644 --- a/core/src/client.rs +++ b/core/src/client.rs @@ -1,17 +1,12 @@ -use anyhow::{Context, Result}; +use anyhow::Result; use ethers::signers::{LocalWallet, Wallet}; -use std::env; -use std::fs; - -pub async fn wallet_from_env() -> Result { - let key = env::var("PRIVATE_KEY").context("PRIVATE_KEY not set")?; - Ok(key.parse::()?) -} +use std::path::Path; /// Load a wallet from a keystore file. /// `cast wallet new .` pub async fn wallet_from_keystore(path: &str, password: &str) -> Result { - let json = fs::read_to_string(path)?; - let wallet = Wallet::decrypt_keystore(&json, password)?; + let path = Path::new(path); + let wallet = Wallet::decrypt_keystore(&path, password)?; + println!("Wallet loaded successfully."); Ok(wallet) } diff --git a/foundry.toml b/foundry.toml index 25b918f..6136251 100644 --- a/foundry.toml +++ b/foundry.toml @@ -3,4 +3,11 @@ src = "src" out = "out" libs = ["lib"] -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options +[rpc_endpoints] +arbitrum = "https://arb-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +arbitrum_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +avalanche = "https://avax-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +base_sepolia = "https://base-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +optimism = "https://1rpc.io/op" +optimism_sepolia = "https://opt-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +sepolia = "https://eth-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" diff --git a/script/Counter.s.sol b/script/Counter.s.sol deleted file mode 100644 index cdc1fe9..0000000 --- a/script/Counter.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Script, console} from "forge-std/Script.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterScript is Script { - Counter public counter; - - function setUp() public {} - - function run() public { - vm.startBroadcast(); - - counter = new Counter(); - - vm.stopBroadcast(); - } -} diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded799..0000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index e7a11a9..0000000 --- a/src/main.rs +++ /dev/null @@ -1,3 +0,0 @@ -fn main() { - println!("Hello, world!"); -} diff --git a/test/Counter.t.sol b/test/Counter.t.sol deleted file mode 100644 index 54b724f..0000000 --- a/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function test_Increment() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testFuzz_SetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -} From ab750da4eb77e447c2b4f9a74e14339ac5581cb9 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Thu, 27 Mar 2025 19:44:46 -0300 Subject: [PATCH 04/14] Delete forge-std --- lib/forge-std | 1 - 1 file changed, 1 deletion(-) delete mode 160000 lib/forge-std diff --git a/lib/forge-std b/lib/forge-std deleted file mode 160000 index 3b20d60..0000000 --- a/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 From 8572c68aae0347a0d3b533b69a5bacdc0decbdc8 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Thu, 27 Mar 2025 22:11:34 -0300 Subject: [PATCH 05/14] Add password prompt when not provided via CLI --- Cargo.lock | 22 ++++++++++++++++++++++ cli/Cargo.toml | 1 + cli/src/main.rs | 24 ++++++++++++++++++------ 3 files changed, 41 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 786748f..c5901c6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -512,6 +512,7 @@ dependencies = [ "dotenvy", "ethers", "foundry-config", + "rpassword", "tokio", ] @@ -2932,6 +2933,27 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rpassword" +version = "7.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80472be3c897911d0137b2d2b9055faf6eeac5b14e324073d83bc17b191d7e3f" +dependencies = [ + "libc", + "rtoolbox", + "windows-sys 0.48.0", +] + +[[package]] +name = "rtoolbox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c247d24e63230cdb56463ae328478bd5eac8b8faa8c69461a77e8e323afac90e" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + [[package]] name = "ruint" version = "1.14.0" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 5baf6ce..a93adca 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -11,3 +11,4 @@ ethers = "2" anyhow = "1" foundry-config = "0.2" dotenvy = "0.15" +rpassword = "7" diff --git a/cli/src/main.rs b/cli/src/main.rs index c623429..8b39a22 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,6 +4,7 @@ use ethers::providers::{Http, Middleware, Provider}; use ethers::signers::Signer; use ethers::types::Address; use foundry_config::Config; +use rpassword::prompt_password; use std::process::Command; #[derive(Parser)] @@ -25,8 +26,8 @@ enum Commands { Deploy { #[arg(long)] path: String, - #[arg(long)] - password: String, + #[arg(long, hide = true)] + password: Option, contract: String, }, } @@ -37,11 +38,22 @@ enum WalletAction { Balance { #[arg(long)] path: String, - #[arg(long)] - password: String, + #[arg(long, hide = true)] + password: Option, }, } +async fn get_wallet_from_keystore( + path: &str, + password: Option, +) -> anyhow::Result { + let password = match password { + Some(pass) => pass, + None => prompt_password("Enter password: ")?, + }; + client::wallet_from_keystore(path, &password).await +} + fn get_provider(chain_alias: &str) -> anyhow::Result> { let config = Config::load(); @@ -82,7 +94,7 @@ async fn main() -> anyhow::Result<()> { ); } WalletAction::Balance { path, password } => { - let wallet = client::wallet_from_keystore(path.as_str(), password.as_str()).await?; + let wallet = get_wallet_from_keystore(path.as_str(), password).await?; let addr: Address = wallet.address(); let balance = provider.get_balance(addr, None).await?; println!( @@ -97,7 +109,7 @@ async fn main() -> anyhow::Result<()> { password, contract, } => { - let wallet = client::wallet_from_keystore(path.as_str(), password.as_str()).await?; + let wallet = get_wallet_from_keystore(path.as_str(), password).await?; let addr = deployer::deploy_contract(&contract, provider, wallet).await?; println!("Deployed `{}` at {}\n", contract, addr); } From 77b4006b368c2cc843b7058b85c0b20f1db6b761 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Mon, 31 Mar 2025 12:01:01 -0300 Subject: [PATCH 06/14] wip: compile_contrat --- .gitmodules | 3 + Cargo.lock | 1388 +++++++++++++++-- core/Cargo.toml | 1 + core/src/compiler.rs | 0 core/src/contracts/.github/workflows/test.yml | 45 + core/src/contracts/.gitignore | 14 + core/src/contracts/README.md | 66 + core/src/contracts/foundry.toml | 6 + core/src/contracts/lib/forge-std | 1 + core/src/contracts/script/Counter.s.sol | 19 + core/src/contracts/src/Counter.sol | 14 + core/src/contracts/test/Counter.t.sol | 24 + 12 files changed, 1461 insertions(+), 120 deletions(-) create mode 100644 .gitmodules create mode 100644 core/src/compiler.rs create mode 100644 core/src/contracts/.github/workflows/test.yml create mode 100644 core/src/contracts/.gitignore create mode 100644 core/src/contracts/README.md create mode 100644 core/src/contracts/foundry.toml create mode 160000 core/src/contracts/lib/forge-std create mode 100644 core/src/contracts/script/Counter.s.sol create mode 100644 core/src/contracts/src/Counter.sol create mode 100644 core/src/contracts/test/Counter.t.sol diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..6746890 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "core/src/contracts/lib/forge-std"] + path = core/src/contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/Cargo.lock b/Cargo.lock index c5901c6..f0b2529 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -65,6 +65,18 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +[[package]] +name = "alloy-json-abi" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc05b04ac331a9f07e3a4036ef7926e49a8bf84a99a1ccfc7e2ab55a5fcbb372" +dependencies = [ + "alloy-primitives 0.7.7", + "alloy-sol-type-parser", + "serde", + "serde_json", +] + [[package]] name = "alloy-primitives" version = "0.4.2" @@ -82,6 +94,29 @@ dependencies = [ "tiny-keccak", ] +[[package]] +name = "alloy-primitives" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccb3ead547f4532bc8af961649942f0b9c16ee9226e26caa3f38420651cc0bf4" +dependencies = [ + "alloy-rlp", + "bytes", + "cfg-if", + "const-hex", + "derive_more 0.99.19", + "getrandom 0.2.15", + "hex-literal", + "itoa", + "k256", + "keccak-asm", + "proptest", + "rand 0.8.5", + "ruint", + "serde", + "tiny-keccak", +] + [[package]] name = "alloy-rlp" version = "0.3.11" @@ -89,6 +124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d6c1d995bff8d011f7cd6c81820d51825e6e06d6db73914c1630ecf544d83d6" dependencies = [ "alloy-rlp-derive", + "arrayvec", "bytes", ] @@ -103,6 +139,16 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "alloy-sol-type-parser" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbcba3ca07cf7975f15d871b721fb18031eec8bce51103907f6dcce00b255d98" +dependencies = [ + "serde", + "winnow 0.6.26", +] + [[package]] name = "anstream" version = "0.6.18" @@ -159,6 +205,139 @@ version = "1.0.97" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcfed56ad506cb2c684a14971b8861fdc3baaaae314b9e5f9bb532cbe3ba7a4f" +[[package]] +name = "arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +dependencies = [ + "derive_arbitrary", +] + +[[package]] +name = "ark-ff" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +dependencies = [ + "ark-ff-asm 0.3.0", + "ark-ff-macros 0.3.0", + "ark-serialize 0.3.0", + "ark-std 0.3.0", + "derivative", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.3.3", + "zeroize", +] + +[[package]] +name = "ark-ff" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +dependencies = [ + "ark-ff-asm 0.4.2", + "ark-ff-macros 0.4.2", + "ark-serialize 0.4.2", + "ark-std 0.4.0", + "derivative", + "digest 0.10.7", + "itertools 0.10.5", + "num-bigint", + "num-traits", + "paste", + "rustc_version 0.4.1", + "zeroize", +] + +[[package]] +name = "ark-ff-asm" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-asm" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +dependencies = [ + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +dependencies = [ + "num-bigint", + "num-traits", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-ff-macros" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" +dependencies = [ + "num-bigint", + "num-traits", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "ark-serialize" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +dependencies = [ + "ark-std 0.3.0", + "digest 0.9.0", +] + +[[package]] +name = "ark-serialize" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +dependencies = [ + "ark-std 0.4.0", + "digest 0.10.7", + "num-bigint", +] + +[[package]] +name = "ark-std" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + +[[package]] +name = "ark-std" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +dependencies = [ + "num-traits", + "rand 0.8.5", +] + [[package]] name = "arrayvec" version = "0.7.6" @@ -193,7 +372,7 @@ checksum = "b6d7b9decdf35d8908a7e3ef02f64c5e9b1695e230154c0e8de3969142d9b94c" dependencies = [ "futures", "pharos", - "rustc_version", + "rustc_version 0.4.1", ] [[package]] @@ -255,6 +434,12 @@ version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.7.3" @@ -273,7 +458,16 @@ version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" dependencies = [ - "bit-vec", + "bit-vec 0.6.3", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec 0.8.0", ] [[package]] @@ -282,6 +476,12 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + [[package]] name = "bitflags" version = "1.3.2" @@ -420,7 +620,7 @@ checksum = "2d886547e41f740c616ae73108f6eb70afe6d940c7bc697cb30f13daec073037" dependencies = [ "camino", "cargo-platform", - "semver", + "semver 1.0.26", "serde", "serde_json", "thiserror 1.0.69", @@ -443,6 +643,12 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.40" @@ -524,7 +730,7 @@ checksum = "3b6be4a5df2098cd811f3194f64ddb96c267606bffd9689ac7b0160097b01ad3" dependencies = [ "bs58", "coins-core", - "digest", + "digest 0.10.7", "hmac", "k256", "serde", @@ -557,7 +763,7 @@ dependencies = [ "base64 0.21.7", "bech32", "bs58", - "digest", + "digest 0.10.7", "generic-array", "hex", "ripemd", @@ -631,6 +837,7 @@ version = "0.1.0" dependencies = [ "anyhow", "ethers", + "foundry-compilers", "serde", "serde_json", "tokio", @@ -646,6 +853,16 @@ dependencies = [ "libc", ] +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation-sys" version = "0.8.7" @@ -757,6 +974,28 @@ dependencies = [ "powerfmt", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "derive_arbitrary" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "derive_more" version = "0.99.19" @@ -766,7 +1005,7 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "rustc_version", + "rustc_version 0.4.1", "syn 2.0.100", ] @@ -790,6 +1029,15 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + [[package]] name = "digest" version = "0.10.7" @@ -808,7 +1056,16 @@ version = "5.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" dependencies = [ - "dirs-sys", + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys 0.5.0", ] [[package]] @@ -829,10 +1086,22 @@ checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" dependencies = [ "libc", "option-ext", - "redox_users", + "redox_users 0.4.6", "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users 0.5.0", + "windows-sys 0.59.0", +] + [[package]] name = "dirs-sys-next" version = "0.1.2" @@ -840,7 +1109,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" dependencies = [ "libc", - "redox_users", + "redox_users 0.4.6", "winapi", ] @@ -867,6 +1136,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" + [[package]] name = "ecdsa" version = "0.16.9" @@ -874,7 +1149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" dependencies = [ "der", - "digest", + "digest 0.10.7", "elliptic-curve", "rfc6979", "signature", @@ -895,7 +1170,7 @@ checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" dependencies = [ "base16ct", "crypto-bigint", - "digest", + "digest 0.10.7", "ff", "generic-array", "group", @@ -977,7 +1252,7 @@ checksum = "1fda3bf123be441da5260717e0661c25a2fd9cb2b2c1d20bf2e05580047158ab" dependencies = [ "aes", "ctr", - "digest", + "digest 0.10.7", "hex", "hmac", "pbkdf2 0.11.0", @@ -1102,7 +1377,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "syn 2.0.100", @@ -1164,8 +1439,8 @@ checksum = "e79e5973c26d4baf0ce55520bd732314328cabe53193286671b47144145b9649" dependencies = [ "chrono", "ethers-core", - "reqwest", - "semver", + "reqwest 0.11.27", + "semver 1.0.26", "serde", "serde_json", "thiserror 1.0.69", @@ -1189,7 +1464,7 @@ dependencies = [ "futures-locks", "futures-util", "instant", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror 1.0.69", @@ -1216,12 +1491,12 @@ dependencies = [ "futures-timer", "futures-util", "hashers", - "http", + "http 0.2.12", "instant", "jsonwebtoken", "once_cell", "pin-project", - "reqwest", + "reqwest 0.11.27", "serde", "serde_json", "thiserror 1.0.69", @@ -1263,7 +1538,7 @@ checksum = "66244a771d9163282646dbeffe0e6eca4dda4146b6498644e678ac6089b11edd" dependencies = [ "cfg-if", "const-hex", - "dirs", + "dirs 5.0.1", "dunce", "ethers-core", "futures-util", @@ -1275,12 +1550,12 @@ dependencies = [ "path-slash", "rayon", "regex", - "semver", + "semver 1.0.26", "serde", "serde_json", "sha2", "solang-parser", - "svm-rs", + "svm-rs 0.3.5", "svm-rs-builds", "thiserror 1.0.69", "tiny-keccak", @@ -1306,6 +1581,28 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fastrlp" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + +[[package]] +name = "fastrlp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" +dependencies = [ + "arrayvec", + "auto_impl", + "bytes", +] + [[package]] name = "ff" version = "0.13.1" @@ -1374,56 +1671,163 @@ dependencies = [ ] [[package]] -name = "foundry-config" -version = "0.2.0" +name = "foundry-compilers" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a64a9bdad47eb4d950523b8ff14e675db8f2226a2aef79063d9344449b3abd5" +checksum = "7eaa24a47bb84e1db38c84f03e8c90ca81050bd20beac8bdc99aae8afd0b8784" dependencies = [ - "Inflector", - "dirs-next", - "ethers-core", - "ethers-etherscan", - "ethers-solc", - "eyre", - "figment", - "globset", - "number_prefix", - "once_cell", - "open-fastrlp", + "alloy-json-abi", + "alloy-primitives 0.7.7", + "auto_impl", + "derivative", + "dirs 5.0.1", + "dyn-clone", + "foundry-compilers-artifacts", + "foundry-compilers-core", + "home", + "itertools 0.13.0", + "md-5", "path-slash", - "regex", - "reqwest", - "revm-primitives", - "semver", + "rayon", + "semver 1.0.26", "serde", "serde_json", - "serde_regex", + "solang-parser", + "svm-rs 0.5.14", "thiserror 1.0.69", - "toml 0.7.8", - "toml_edit 0.19.15", "tracing", - "walkdir", + "winnow 0.6.26", + "yansi 1.0.1", ] [[package]] -name = "fs2" -version = "0.4.3" +name = "foundry-compilers-artifacts" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +checksum = "3588ee6a986f89040d1158fb90459731580b404fb72b8c6c832c0ddbc95fed58" dependencies = [ - "libc", - "winapi", + "foundry-compilers-artifacts-solc", + "foundry-compilers-artifacts-vyper", ] [[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" +name = "foundry-compilers-artifacts-solc" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a149c5e8c326c7bae8f73cacb28c637f4bc2e535f950eec10348494990e9636f" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.7.7", + "foundry-compilers-core", + "md-5", + "path-slash", + "rayon", + "semver 1.0.26", + "serde", + "serde_json", + "serde_repr", + "thiserror 1.0.69", + "tracing", + "walkdir", + "yansi 1.0.1", +] + +[[package]] +name = "foundry-compilers-artifacts-vyper" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8645c9e7c070c81bf8c90f456416953234334f097b67445c773af98df74e27b0" +dependencies = [ + "alloy-json-abi", + "alloy-primitives 0.7.7", + "foundry-compilers-artifacts-solc", + "foundry-compilers-core", + "path-slash", + "semver 1.0.26", + "serde", +] + +[[package]] +name = "foundry-compilers-core" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66492aeb708f3d142c078457dba5f52b04ca5031012d48903a0bcb37d205d595" +dependencies = [ + "alloy-primitives 0.7.7", + "cfg-if", + "dunce", + "memmap2", + "once_cell", + "path-slash", + "regex", + "semver 1.0.26", + "serde", + "serde_json", + "thiserror 1.0.69", + "walkdir", +] + +[[package]] +name = "foundry-config" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a64a9bdad47eb4d950523b8ff14e675db8f2226a2aef79063d9344449b3abd5" +dependencies = [ + "Inflector", + "dirs-next", + "ethers-core", + "ethers-etherscan", + "ethers-solc", + "eyre", + "figment", + "globset", + "number_prefix", + "once_cell", + "open-fastrlp", + "path-slash", + "regex", + "reqwest 0.11.27", + "revm-primitives", + "semver 1.0.26", + "serde", + "serde_json", + "serde_regex", + "thiserror 1.0.69", + "toml 0.7.8", + "toml_edit 0.19.15", + "tracing", + "walkdir", +] + +[[package]] +name = "fs2" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "fs4" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c29c30684418547d476f0b48e84f4821639119c483b1eccd566c8cd0cd05f521" +dependencies = [ + "rustix 0.38.44", + "windows-sys 0.52.0", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ @@ -1557,8 +1961,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ "cfg-if", + "js-sys", "libc", "wasi 0.11.0+wasi-snapshot-preview1", + "wasm-bindgen", ] [[package]] @@ -1568,9 +1974,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", + "js-sys", "libc", "r-efi", "wasi 0.14.2+wasi-0.2.4", + "wasm-bindgen", ] [[package]] @@ -1632,7 +2040,7 @@ dependencies = [ "futures-core", "futures-sink", "futures-util", - "http", + "http 0.2.12", "indexmap", "slab", "tokio", @@ -1682,6 +2090,9 @@ name = "hex" version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +dependencies = [ + "serde", +] [[package]] name = "hex-literal" @@ -1695,7 +2106,7 @@ version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -1718,6 +2129,17 @@ dependencies = [ "itoa", ] +[[package]] +name = "http" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4a85d31aea989eead29a3aaf9e1115a180df8282431156e533de47660892565" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + [[package]] name = "http-body" version = "0.4.6" @@ -1725,7 +2147,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", - "http", + "http 0.2.12", + "pin-project-lite", +] + +[[package]] +name = "http-body" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http 1.3.1", +] + +[[package]] +name = "http-body-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http 1.3.1", + "http-body 1.0.1", "pin-project-lite", ] @@ -1752,8 +2197,8 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", + "http 0.2.12", + "http-body 0.4.6", "httparse", "httpdate", "itoa", @@ -1765,6 +2210,25 @@ dependencies = [ "want", ] +[[package]] +name = "hyper" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + [[package]] name = "hyper-rustls" version = "0.24.2" @@ -1772,11 +2236,49 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", - "http", - "hyper", - "rustls", + "http 0.2.12", + "hyper 0.14.32", + "rustls 0.21.12", + "tokio", + "tokio-rustls 0.24.1", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d191583f3da1305256f22463b9bb0471acad48a4e534a5218b9963e9c1f59b2" +dependencies = [ + "futures-util", + "http 1.3.1", + "hyper 1.6.0", + "hyper-util", + "rustls 0.23.25", + "rustls-native-certs", + "rustls-pki-types", "tokio", - "tokio-rustls", + "tokio-rustls 0.26.2", + "tower-service", + "webpki-roots 0.26.8", +] + +[[package]] +name = "hyper-util" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "hyper 1.6.0", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] @@ -2008,6 +2510,15 @@ version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + [[package]] name = "itertools" version = "0.11.0" @@ -2017,6 +2528,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.15" @@ -2079,6 +2599,16 @@ dependencies = [ "cpufeatures", ] +[[package]] +name = "keccak-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "505d1856a39b200489082f90d897c3f07c455563880bc5952e38eabf731c83b6" +dependencies = [ + "digest 0.10.7", + "sha3-asm", +] + [[package]] name = "lalrpop" version = "0.20.2" @@ -2086,9 +2616,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55cb077ad656299f160924eb2912aa147d7339ea7d69e1b5517326fdcec3c1ca" dependencies = [ "ascii-canvas", - "bit-set", + "bit-set 0.5.3", "ena", - "itertools", + "itertools 0.11.0", "lalrpop-util", "petgraph", "regex", @@ -2137,6 +2667,12 @@ dependencies = [ "libc", ] +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + [[package]] name = "linux-raw-sys" version = "0.9.3" @@ -2159,6 +2695,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "lockfree-object-pool" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9374ef4228402d4b7e403e5838cb880d9ee663314b0a900d5a6aabf0c213552e" + [[package]] name = "log" version = "0.4.27" @@ -2172,7 +2714,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" dependencies = [ "cfg-if", - "digest", + "digest 0.10.7", ] [[package]] @@ -2181,6 +2723,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[package]] +name = "memmap2" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" +dependencies = [ + "libc", +] + [[package]] name = "mime" version = "0.3.17" @@ -2325,6 +2876,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "openssl-probe" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" + [[package]] name = "option-ext" version = "0.2.0" @@ -2393,6 +2950,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "path-slash" version = "0.2.1" @@ -2405,7 +2968,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" dependencies = [ - "digest", + "digest 0.10.7", "hmac", "password-hash", "sha2", @@ -2417,7 +2980,7 @@ version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "digest", + "digest 0.10.7", "hmac", ] @@ -2459,6 +3022,17 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +[[package]] +name = "pest" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "198db74531d58c70a361c42201efde7e2591e976d518caf7662a47dc5720e7b6" +dependencies = [ + "memchr", + "thiserror 2.0.12", + "ucd-trie", +] + [[package]] name = "petgraph" version = "0.6.5" @@ -2476,7 +3050,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e9567389417feee6ce15dd6527a8a1ecac205ef62c2932bcf3d9f6fc5b78b414" dependencies = [ "futures", - "rustc_version", + "rustc_version 0.4.1", ] [[package]] @@ -2651,16 +3225,80 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14cae93065090804185d3b75f0bf93b8eeda30c7a9b4a33d3bdb3988d6229e50" dependencies = [ + "bit-set 0.8.0", + "bit-vec 0.8.0", "bitflags 2.9.0", "lazy_static", "num-traits", "rand 0.8.5", - "rand_chacha", + "rand_chacha 0.3.1", "rand_xorshift", "regex-syntax", + "rusty-fork", + "tempfile", "unarray", ] +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quinn" +version = "0.11.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3bd15a6f2967aef83887dcb9fec0014580467e33720d073560cf015a5683012" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls 0.23.25", + "socket2", + "thiserror 2.0.12", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc" +dependencies = [ + "bytes", + "getrandom 0.3.2", + "rand 0.9.0", + "ring 0.17.14", + "rustc-hash", + "rustls 0.23.25", + "rustls-pki-types", + "slab", + "thiserror 2.0.12", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "quote" version = "1.0.40" @@ -2689,7 +3327,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", + "rand_chacha 0.3.1", "rand_core 0.6.4", ] @@ -2699,6 +3337,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94" dependencies = [ + "rand_chacha 0.9.0", "rand_core 0.9.3", "zerocopy 0.8.24", ] @@ -2713,6 +3352,16 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.3", +] + [[package]] name = "rand_core" version = "0.6.4" @@ -2727,6 +3376,9 @@ name = "rand_core" version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" +dependencies = [ + "getrandom 0.3.2", +] [[package]] name = "rand_xorshift" @@ -2777,6 +3429,17 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "redox_users" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror 2.0.12", +] + [[package]] name = "regex" version = "1.11.1" @@ -2818,10 +3481,10 @@ dependencies = [ "futures-core", "futures-util", "h2", - "http", - "http-body", - "hyper", - "hyper-rustls", + "http 0.2.12", + "http-body 0.4.6", + "hyper 0.14.32", + "hyper-rustls 0.24.2", "ipnet", "js-sys", "log", @@ -2829,31 +3492,76 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", - "rustls", - "rustls-pemfile", + "rustls 0.21.12", + "rustls-pemfile 1.0.4", "serde", "serde_json", "serde_urlencoded", - "sync_wrapper", + "sync_wrapper 0.1.2", "system-configuration", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", + "webpki-roots 0.25.4", "winreg", ] +[[package]] +name = "reqwest" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d19c46a6fdd48bc4dab94b6103fccc55d34c67cc0ad04653aad4ea2a07cd7bbb" +dependencies = [ + "base64 0.22.1", + "bytes", + "futures-core", + "futures-util", + "http 1.3.1", + "http-body 1.0.1", + "http-body-util", + "hyper 1.6.0", + "hyper-rustls 0.27.5", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls 0.23.25", + "rustls-native-certs", + "rustls-pemfile 2.2.0", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper 1.0.2", + "tokio", + "tokio-rustls 0.26.2", + "tokio-socks", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "webpki-roots 0.26.8", + "windows-registry", +] + [[package]] name = "revm-primitives" version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51187b852d9e458816a2e19c81f1dd6c924077e1a8fccd16e4f044f865f299d7" dependencies = [ - "alloy-primitives", + "alloy-primitives 0.4.2", "alloy-rlp", "auto_impl", "bitflags 2.9.0", @@ -2908,7 +3616,7 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "digest", + "digest 0.10.7", ] [[package]] @@ -2961,9 +3669,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78a46eb779843b2c4f21fac5773e25d6d5b7c8f0922876c91541790d2ca27eef" dependencies = [ "alloy-rlp", + "ark-ff 0.3.0", + "ark-ff 0.4.2", + "bytes", + "fastrlp 0.3.1", + "fastrlp 0.4.0", + "num-bigint", + "num-integer", + "num-traits", + "parity-scale-codec", + "primitive-types", "proptest", "rand 0.8.5", "rand 0.9.0", + "rlp", "ruint-macro", "serde", "valuable", @@ -2982,19 +3701,47 @@ version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" +[[package]] +name = "rustc-hash" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" + [[package]] name = "rustc-hex" version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" +dependencies = [ + "semver 0.11.0", +] + [[package]] name = "rustc_version" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "semver", + "semver 1.0.26", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.9.0", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", ] [[package]] @@ -3006,38 +3753,93 @@ dependencies = [ "bitflags 2.9.0", "errno", "libc", - "linux-raw-sys", + "linux-raw-sys 0.9.3", "windows-sys 0.59.0", ] [[package]] -name = "rustls" -version = "0.21.12" +name = "rustls" +version = "0.21.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +dependencies = [ + "log", + "ring 0.17.14", + "rustls-webpki 0.101.7", + "sct", +] + +[[package]] +name = "rustls" +version = "0.23.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "822ee9188ac4ec04a2f0531e55d035fb2de73f18b41a63c70c2712503b6fb13c" +dependencies = [ + "once_cell", + "ring 0.17.14", + "rustls-pki-types", + "rustls-webpki 0.103.1", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcff2dd52b58a8d98a70243663a0d234c4e2b79235637849d15913394a247d3" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f56a14d1f48b391359b22f731fd4bd7e43c97f3c50eee276f3aa09c94784d3e" +checksum = "917ce264624a4b4db1c364dcc35bfca9ded014d0a958cd47ad3e960e988ea51c" dependencies = [ - "log", - "ring 0.17.14", - "rustls-webpki", - "sct", + "web-time", ] [[package]] -name = "rustls-pemfile" -version = "1.0.4" +name = "rustls-webpki" +version = "0.101.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" dependencies = [ - "base64 0.21.7", + "ring 0.17.14", + "untrusted 0.9.0", ] [[package]] name = "rustls-webpki" -version = "0.101.7" +version = "0.103.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" +checksum = "fef8b8769aaccf73098557a87cd1816b4f9c7c16811c9c77142aa695c16f2c03" dependencies = [ "ring 0.17.14", + "rustls-pki-types", "untrusted 0.9.0", ] @@ -3047,6 +3849,18 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eded382c5f5f786b989652c49544c4877d9f015cc22e145a5ea8ea66c2921cd2" +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + [[package]] name = "ryu" version = "1.0.20" @@ -3095,6 +3909,15 @@ dependencies = [ "syn 2.0.100", ] +[[package]] +name = "schannel" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +dependencies = [ + "windows-sys 0.59.0", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -3137,6 +3960,38 @@ dependencies = [ "zeroize", ] +[[package]] +name = "security-framework" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +dependencies = [ + "bitflags 2.9.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "semver" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" +dependencies = [ + "semver-parser", +] + [[package]] name = "semver" version = "1.0.26" @@ -3146,6 +4001,15 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +dependencies = [ + "pest", +] + [[package]] name = "send_wrapper" version = "0.4.0" @@ -3200,6 +4064,17 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] + [[package]] name = "serde_spanned" version = "0.6.8" @@ -3229,7 +4104,7 @@ checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3240,7 +4115,7 @@ checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" dependencies = [ "cfg-if", "cpufeatures", - "digest", + "digest 0.10.7", ] [[package]] @@ -3249,10 +4124,20 @@ version = "0.10.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" dependencies = [ - "digest", + "digest 0.10.7", "keccak", ] +[[package]] +name = "sha3-asm" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28efc5e327c837aa837c59eae585fc250715ef939ac32881bcc11677cd02d46" +dependencies = [ + "cc", + "cfg-if", +] + [[package]] name = "shlex" version = "1.3.0" @@ -3274,10 +4159,16 @@ version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ - "digest", + "digest 0.10.7", "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simple_asn1" version = "0.6.3" @@ -3327,7 +4218,7 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c425ce1c59f4b154717592f0bdf4715c3a1d55058883622d3157e1f0908a5b26" dependencies = [ - "itertools", + "itertools 0.11.0", "lalrpop", "lalrpop-util", "phf", @@ -3415,18 +4306,38 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "11297baafe5fa0c99d5722458eac6a5e25c01eb1b8e5cd137f54079093daa7a4" dependencies = [ - "dirs", + "dirs 5.0.1", "fs2", "hex", "once_cell", - "reqwest", - "semver", + "reqwest 0.11.27", + "semver 1.0.26", "serde", "serde_json", "sha2", "thiserror 1.0.69", "url", - "zip", + "zip 0.6.6", +] + +[[package]] +name = "svm-rs" +version = "0.5.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c86f1c4a401aa4526c0e823af56a4a967a8b445718cd1b0e87b14375e5bace8" +dependencies = [ + "const-hex", + "dirs 6.0.0", + "fs4", + "reqwest 0.12.15", + "semver 1.0.26", + "serde", + "serde_json", + "sha2", + "tempfile", + "thiserror 2.0.12", + "url", + "zip 2.5.0", ] [[package]] @@ -3437,9 +4348,9 @@ checksum = "aa64b5e8eecd3a8af7cfc311e29db31a268a62d5953233d3e8243ec77a71c4e3" dependencies = [ "build_const", "hex", - "semver", + "semver 1.0.26", "serde_json", - "svm-rs", + "svm-rs 0.3.5", ] [[package]] @@ -3470,6 +4381,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + [[package]] name = "synstructure" version = "0.13.1" @@ -3488,7 +4408,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation", + "core-foundation 0.9.4", "system-configuration-sys", ] @@ -3517,7 +4437,7 @@ dependencies = [ "fastrand", "getrandom 0.3.2", "once_cell", - "rustix", + "rustix 1.0.3", "windows-sys 0.59.0", ] @@ -3672,7 +4592,29 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ - "rustls", + "rustls 0.21.12", + "tokio", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +dependencies = [ + "rustls 0.23.25", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d4770b8024672c1101b3f6733eab95b18007dbe0847a8afe341fcf79e06043f" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", "tokio", ] @@ -3684,11 +4626,11 @@ checksum = "212d5dcb2a1ce06d81107c3d0ffa3121fe974b73f068c8282cb1c32328113b6c" dependencies = [ "futures-util", "log", - "rustls", + "rustls 0.21.12", "tokio", - "tokio-rustls", + "tokio-rustls 0.24.1", "tungstenite", - "webpki-roots", + "webpki-roots 0.25.4", ] [[package]] @@ -3764,6 +4706,27 @@ dependencies = [ "winnow 0.7.4", ] +[[package]] +name = "tower" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039ad9159c98b70ecfd540b2573b97f7f52c3e8d9f8ad57a24b916a536975f9" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper 1.0.2", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + [[package]] name = "tower-service" version = "0.3.3" @@ -3826,11 +4789,11 @@ dependencies = [ "byteorder", "bytes", "data-encoding", - "http", + "http 0.2.12", "httparse", "log", "rand 0.8.5", - "rustls", + "rustls 0.21.12", "sha1", "thiserror 1.0.69", "url", @@ -3843,6 +4806,12 @@ version = "1.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +[[package]] +name = "ucd-trie" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" + [[package]] name = "uint" version = "0.9.5" @@ -3951,6 +4920,15 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +[[package]] +name = "wait-timeout" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -4066,12 +5044,31 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + [[package]] name = "webpki-roots" version = "0.25.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" +[[package]] +name = "webpki-roots" +version = "0.26.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9" +dependencies = [ + "rustls-pki-types", +] + [[package]] name = "winapi" version = "0.3.9" @@ -4103,6 +5100,41 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows-link" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result", + "windows-strings", + "windows-targets 0.53.0", +] + +[[package]] +name = "windows-result" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c64fd11a4fd95df68efcfee5f44a294fe71b8bc6a91993e2791938abcc712252" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.48.0" @@ -4154,13 +5186,29 @@ dependencies = [ "windows_aarch64_gnullvm 0.52.6", "windows_aarch64_msvc 0.52.6", "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm", + "windows_i686_gnullvm 0.52.6", "windows_i686_msvc 0.52.6", "windows_x86_64_gnu 0.52.6", "windows_x86_64_gnullvm 0.52.6", "windows_x86_64_msvc 0.52.6", ] +[[package]] +name = "windows-targets" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e4c7e8ceaaf9cb7d7507c974735728ab453b67ef8f18febdd7c11fe59dca8b" +dependencies = [ + "windows_aarch64_gnullvm 0.53.0", + "windows_aarch64_msvc 0.53.0", + "windows_i686_gnu 0.53.0", + "windows_i686_gnullvm 0.53.0", + "windows_i686_msvc 0.53.0", + "windows_x86_64_gnu 0.53.0", + "windows_x86_64_gnullvm 0.53.0", + "windows_x86_64_msvc 0.53.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -4173,6 +5221,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -4185,6 +5239,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -4197,12 +5257,24 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +[[package]] +name = "windows_i686_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" + [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -4215,6 +5287,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +[[package]] +name = "windows_i686_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -4227,6 +5305,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" @@ -4239,6 +5323,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -4251,6 +5341,12 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" + [[package]] name = "winnow" version = "0.5.40" @@ -4260,6 +5356,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e90edd2ac1aa278a5c4599b1d89cf03074b610800f866d4026dc199d7929a28" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" version = "0.7.4" @@ -4311,7 +5416,7 @@ dependencies = [ "js-sys", "log", "pharos", - "rustc_version", + "rustc_version 0.4.1", "send_wrapper 0.6.0", "thiserror 1.0.69", "wasm-bindgen", @@ -4430,6 +5535,20 @@ name = "zeroize" version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.100", +] [[package]] name = "zerovec" @@ -4473,6 +5592,35 @@ dependencies = [ "zstd", ] +[[package]] +name = "zip" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27c03817464f64e23f6f37574b4fdc8cf65925b5bfd2b0f2aedf959791941f88" +dependencies = [ + "arbitrary", + "crc32fast", + "crossbeam-utils", + "flate2", + "indexmap", + "memchr", + "zopfli", +] + +[[package]] +name = "zopfli" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5019f391bac5cf252e93bbcc53d039ffd62c7bfb7c150414d61369afe57e946" +dependencies = [ + "bumpalo", + "crc32fast", + "lockfree-object-pool", + "log", + "once_cell", + "simd-adler32", +] + [[package]] name = "zstd" version = "0.11.2+zstd.1.5.2" diff --git a/core/Cargo.toml b/core/Cargo.toml index 63bbc76..c87192a 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -9,3 +9,4 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" anyhow = "1" tokio = { version = "1", features = ["full"] } +foundry-compilers = "0.10" diff --git a/core/src/compiler.rs b/core/src/compiler.rs new file mode 100644 index 0000000..e69de29 diff --git a/core/src/contracts/.github/workflows/test.yml b/core/src/contracts/.github/workflows/test.yml new file mode 100644 index 0000000..762a296 --- /dev/null +++ b/core/src/contracts/.github/workflows/test.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/core/src/contracts/.gitignore b/core/src/contracts/.gitignore new file mode 100644 index 0000000..85198aa --- /dev/null +++ b/core/src/contracts/.gitignore @@ -0,0 +1,14 @@ +# Compiler files +cache/ +out/ + +# Ignores development broadcast logs +!/broadcast +/broadcast/*/31337/ +/broadcast/**/dry-run/ + +# Docs +docs/ + +# Dotenv file +.env diff --git a/core/src/contracts/README.md b/core/src/contracts/README.md new file mode 100644 index 0000000..9265b45 --- /dev/null +++ b/core/src/contracts/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/core/src/contracts/foundry.toml b/core/src/contracts/foundry.toml new file mode 100644 index 0000000..25b918f --- /dev/null +++ b/core/src/contracts/foundry.toml @@ -0,0 +1,6 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/core/src/contracts/lib/forge-std b/core/src/contracts/lib/forge-std new file mode 160000 index 0000000..3b20d60 --- /dev/null +++ b/core/src/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 diff --git a/core/src/contracts/script/Counter.s.sol b/core/src/contracts/script/Counter.s.sol new file mode 100644 index 0000000..cdc1fe9 --- /dev/null +++ b/core/src/contracts/script/Counter.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console} from "forge-std/Script.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterScript is Script { + Counter public counter; + + function setUp() public {} + + function run() public { + vm.startBroadcast(); + + counter = new Counter(); + + vm.stopBroadcast(); + } +} diff --git a/core/src/contracts/src/Counter.sol b/core/src/contracts/src/Counter.sol new file mode 100644 index 0000000..aded799 --- /dev/null +++ b/core/src/contracts/src/Counter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract Counter { + uint256 public number; + + function setNumber(uint256 newNumber) public { + number = newNumber; + } + + function increment() public { + number++; + } +} diff --git a/core/src/contracts/test/Counter.t.sol b/core/src/contracts/test/Counter.t.sol new file mode 100644 index 0000000..54b724f --- /dev/null +++ b/core/src/contracts/test/Counter.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + counter.setNumber(0); + } + + function test_Increment() public { + counter.increment(); + assertEq(counter.number(), 1); + } + + function testFuzz_SetNumber(uint256 x) public { + counter.setNumber(x); + assertEq(counter.number(), x); + } +} From 713a707ec045c943702e0074544444c5dd20360d Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Mon, 31 Mar 2025 21:05:39 -0300 Subject: [PATCH 07/14] wip: no compiler version available --- .github/workflows/test.yml | 45 + .gitignore | 1 + .gitmodules | 3 + README.md | 66 ++ cli/src/main.rs | 9 + core/Cargo.toml | 2 +- core/cache/solidity-files-cache.json | 1 + core/src/compiler.rs | 25 + core/src/contracts/foundry.toml | 4 +- core/src/contracts/package.json | 18 + core/src/contracts/pnpm-lock.yaml | 1193 ++++++++++++++++++++++++++ core/src/contracts/src/MyOApp.sol | 80 ++ core/src/lib.rs | 1 + lib/forge-std | 1 + script/Counter.s.sol | 19 + src/Counter.sol | 14 + test/Counter.t.sol | 24 + 17 files changed, 1504 insertions(+), 2 deletions(-) create mode 100644 .github/workflows/test.yml create mode 100644 README.md create mode 100644 core/cache/solidity-files-cache.json create mode 100644 core/src/contracts/package.json create mode 100644 core/src/contracts/pnpm-lock.yaml create mode 100644 core/src/contracts/src/MyOApp.sol create mode 160000 lib/forge-std create mode 100644 script/Counter.s.sol create mode 100644 src/Counter.sol create mode 100644 test/Counter.t.sol diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 0000000..762a296 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,45 @@ +name: CI + +on: + push: + pull_request: + workflow_dispatch: + +env: + FOUNDRY_PROFILE: ci + +jobs: + check: + strategy: + fail-fast: true + + name: Foundry project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + with: + version: nightly + + - name: Show Forge version + run: | + forge --version + + - name: Run Forge fmt + run: | + forge fmt --check + id: fmt + + - name: Run Forge build + run: | + forge build --sizes + id: build + + - name: Run Forge tests + run: | + forge test -vvv + id: test diff --git a/.gitignore b/.gitignore index e7dd9f1..c167563 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /target wallets/ .env +lib/ diff --git a/.gitmodules b/.gitmodules index 6746890..36dace2 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,6 @@ [submodule "core/src/contracts/lib/forge-std"] path = core/src/contracts/lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "lib/forge-std"] + path = lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/README.md b/README.md new file mode 100644 index 0000000..9265b45 --- /dev/null +++ b/README.md @@ -0,0 +1,66 @@ +## Foundry + +**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** + +Foundry consists of: + +- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). +- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. +- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. +- **Chisel**: Fast, utilitarian, and verbose solidity REPL. + +## Documentation + +https://book.getfoundry.sh/ + +## Usage + +### Build + +```shell +$ forge build +``` + +### Test + +```shell +$ forge test +``` + +### Format + +```shell +$ forge fmt +``` + +### Gas Snapshots + +```shell +$ forge snapshot +``` + +### Anvil + +```shell +$ anvil +``` + +### Deploy + +```shell +$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key +``` + +### Cast + +```shell +$ cast +``` + +### Help + +```shell +$ forge --help +$ anvil --help +$ cast --help +``` diff --git a/cli/src/main.rs b/cli/src/main.rs index 8b39a22..71b2630 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,4 +1,5 @@ use clap::{Parser, Subcommand}; +use core::compiler::compile_contract; use core::{client, deployer}; use ethers::providers::{Http, Middleware, Provider}; use ethers::signers::Signer; @@ -30,6 +31,7 @@ enum Commands { password: Option, contract: String, }, + Compile, } #[derive(Subcommand)] @@ -113,6 +115,13 @@ async fn main() -> anyhow::Result<()> { let addr = deployer::deploy_contract(&contract, provider, wallet).await?; println!("Deployed `{}` at {}\n", contract, addr); } + Commands::Compile => { + println!("Compiling contract..."); + match compile_contract() { + Ok(_) => println!("Compilation complete"), + Err(e) => println!("Compilation failed: {}", e), + }; + } } Ok(()) diff --git a/core/Cargo.toml b/core/Cargo.toml index c87192a..bf727df 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -9,4 +9,4 @@ serde = { version = "1", features = ["derive"] } serde_json = "1" anyhow = "1" tokio = { version = "1", features = ["full"] } -foundry-compilers = "0.10" +foundry-compilers = "0.10.1" diff --git a/core/cache/solidity-files-cache.json b/core/cache/solidity-files-cache.json new file mode 100644 index 0000000..b871ed9 --- /dev/null +++ b/core/cache/solidity-files-cache.json @@ -0,0 +1 @@ +{"_format":"","paths":{"artifacts":"artifacts","build_infos":"artifacts/build-info","sources":"contracts","tests":"test","scripts":"script","libraries":["node_modules"]},"files":{},"builds":[]} \ No newline at end of file diff --git a/core/src/compiler.rs b/core/src/compiler.rs index e69de29..b1fdbd1 100644 --- a/core/src/compiler.rs +++ b/core/src/compiler.rs @@ -0,0 +1,25 @@ +use std::path::{Path, PathBuf}; + +use foundry_compilers::{solc::Solc, Project, ProjectPathsConfig}; + +pub fn compile_contract() -> Result<(), anyhow::Error> { + // configure the project with all its paths, solc, cache etc. + let project = Project::builder() + .paths( + ProjectPathsConfig::hardhat( + &Path::new(env!("CARGO_MANIFEST_DIR")) + .to_owned() + .join(PathBuf::from("src/contracts")), + ) + .unwrap(), + ) + .build(Default::default()) + .unwrap(); + // https://github.com/foundry-rs/compilers/blob/main/crates/compilers/tests/project.rs#L2627 + + println!("{:?}", project); + let output = project.compile().unwrap(); + + println!("{:?}\n", output); + Ok(()) +} diff --git a/core/src/contracts/foundry.toml b/core/src/contracts/foundry.toml index 25b918f..a1731d5 100644 --- a/core/src/contracts/foundry.toml +++ b/core/src/contracts/foundry.toml @@ -3,4 +3,6 @@ src = "src" out = "out" libs = ["lib"] -# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options +solc = "0.8.22" + +remappings = ['@layerzerolabs/=node_modules/@layerzerolabs/'] diff --git a/core/src/contracts/package.json b/core/src/contracts/package.json new file mode 100644 index 0000000..94bdd01 --- /dev/null +++ b/core/src/contracts/package.json @@ -0,0 +1,18 @@ +{ + "name": "contracts", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "@layerzerolabs/lz-evm-protocol-v2": "^3.0.83", + "@layerzerolabs/oapp-evm": "^0.3.2", + "install": "^0.13.0", + "pnpm": "^10.7.0" + } +} diff --git a/core/src/contracts/pnpm-lock.yaml b/core/src/contracts/pnpm-lock.yaml new file mode 100644 index 0000000..a15f008 --- /dev/null +++ b/core/src/contracts/pnpm-lock.yaml @@ -0,0 +1,1193 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@layerzerolabs/lz-evm-protocol-v2': + specifier: ^3.0.83 + version: 3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.3) + '@layerzerolabs/oapp-evm': + specifier: ^0.3.2 + version: 0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.83)(@layerzerolabs/lz-evm-protocol-v2@3.0.83)(@layerzerolabs/lz-evm-v1-0.7@3.0.83)(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0) + install: + specifier: ^0.13.0 + version: 0.13.0 + pnpm: + specifier: ^10.7.0 + version: 10.7.0 + +packages: + + /@axelar-network/axelar-gmp-sdk-solidity@5.10.0: + resolution: {integrity: sha512-s8SImALvYB+5AeiT3tbfWNBI2Mhqw1x91i/zM3DNpVUCnAR2HKtsB9T84KnUn/OJjOVgb4h0lv7q9smeYniRPw==} + engines: {node: '>=18'} + dev: false + + /@chainlink/contracts-ccip@0.7.6(ethers@5.8.0): + resolution: {integrity: sha512-yNbCBFpLs3R+ALymto9dQYKz3vatnjqYGu1pnMD0i2fHEMthiXe0+otaNCGNht6n8k7ruNaA0DNpz3F+2jHQXw==} + dependencies: + '@eth-optimism/contracts': 0.5.40(ethers@5.8.0) + '@openzeppelin/contracts': 4.3.3 + '@openzeppelin/contracts-upgradeable-4.7.3': /@openzeppelin/contracts-upgradeable@4.7.3 + '@openzeppelin/contracts-v0.7': /@openzeppelin/contracts@3.4.2 + transitivePeerDependencies: + - bufferutil + - ethers + - utf-8-validate + dev: false + + /@eth-optimism/contracts@0.5.40(ethers@5.8.0): + resolution: {integrity: sha512-MrzV0nvsymfO/fursTB7m/KunkPsCndltVgfdHaT1Aj5Vi6R/doKIGGkOofHX+8B6VMZpuZosKCMQ5lQuqjt8w==} + peerDependencies: + ethers: ^5 + dependencies: + '@eth-optimism/core-utils': 0.12.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@eth-optimism/contracts@0.6.0(ethers@5.8.0): + resolution: {integrity: sha512-vQ04wfG9kMf1Fwy3FEMqH2QZbgS0gldKhcBeBUPfO8zu68L61VI97UDXmsMQXzTsEAxK8HnokW3/gosl4/NW3w==} + peerDependencies: + ethers: ^5 + dependencies: + '@eth-optimism/core-utils': 0.12.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@eth-optimism/core-utils@0.12.0: + resolution: {integrity: sha512-qW+7LZYCz7i8dRa7SRlUKIo1VBU8lvN0HeXCxJR+z+xtMzMQpPds20XJNCMclszxYQHkXY00fOT6GvFw9ZL6nw==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bufio: 1.2.3 + chai: 4.5.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@ethersproject/abi@5.8.0: + resolution: {integrity: sha512-b9YS/43ObplgyV6SlyQsG53/vkSal0MNA1fskSC4mbnCMi8R+NkcH8K9FPYNESf6jUefBUniE4SOKms0E/KK1Q==} + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: false + + /@ethersproject/abstract-provider@5.8.0: + resolution: {integrity: sha512-wC9SFcmh4UK0oKuLJQItoQdzS/qZ51EJegK6EmAWlh+OptpQ/npECOR3QqECd8iGHC0RJb4WKbVdSfif4ammrg==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + dev: false + + /@ethersproject/abstract-signer@5.8.0: + resolution: {integrity: sha512-N0XhZTswXcmIZQdYtUnd79VJzvEwXQw6PK0dTl9VoYrEBxxCPXqS0Eod7q5TNKRxe1/5WUMuR0u0nqTF/avdCA==} + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + dev: false + + /@ethersproject/address@5.8.0: + resolution: {integrity: sha512-GhH/abcC46LJwshoN+uBNoKVFPxUuZm6dA257z0vZkKmU1+t8xTn8oK7B9qrj8W2rFRMch4gbJl6PmVxjxBEBA==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/rlp': 5.8.0 + dev: false + + /@ethersproject/base64@5.8.0: + resolution: {integrity: sha512-lN0oIwfkYj9LbPx4xEkie6rAMJtySbpOAFXSDVQaBnAzYfB4X2Qr+FXJGxMoc3Bxp2Sm8OwvzMrywxyw0gLjIQ==} + dependencies: + '@ethersproject/bytes': 5.8.0 + dev: false + + /@ethersproject/basex@5.8.0: + resolution: {integrity: sha512-PIgTszMlDRmNwW9nhS6iqtVfdTAKosA7llYXNmGPw4YAI1PUyMv28988wAb41/gHF/WqGdoLv0erHaRcHRKW2Q==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/properties': 5.8.0 + dev: false + + /@ethersproject/bignumber@5.8.0: + resolution: {integrity: sha512-ZyaT24bHaSeJon2tGPKIiHszWjD/54Sz8t57Toch475lCLljC6MgPmxk7Gtzz+ddNN5LuHea9qhAe0x3D+uYPA==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + bn.js: 5.2.1 + dev: false + + /@ethersproject/bytes@5.8.0: + resolution: {integrity: sha512-vTkeohgJVCPVHu5c25XWaWQOZ4v+DkGoC42/TS2ond+PARCxTJvgTFUNDZovyQ/uAQ4EcpqqowKydcdmRKjg7A==} + dependencies: + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/constants@5.8.0: + resolution: {integrity: sha512-wigX4lrf5Vu+axVTIvNsuL6YrV4O5AXl5ubcURKMEME5TnWBouUh0CDTWxZ2GpnRn1kcCgE7l8O5+VbV9QTTcg==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + dev: false + + /@ethersproject/contracts@5.8.0: + resolution: {integrity: sha512-0eFjGz9GtuAi6MZwhb4uvUM216F38xiuR0yYCjKJpNfSEy4HUM8hvqqBj9Jmm0IUz8l0xKEhWwLIhPgxNY0yvQ==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/transactions': 5.8.0 + dev: false + + /@ethersproject/hash@5.8.0: + resolution: {integrity: sha512-ac/lBcTbEWW/VGJij0CNSw/wPcw9bSRgCB0AIBz8CvED/jfvDoV9hsIIiWfvWmFEi8RcXtlNwp2jv6ozWOsooA==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: false + + /@ethersproject/hdnode@5.8.0: + resolution: {integrity: sha512-4bK1VF6E83/3/Im0ERnnUeWOY3P1BZml4ZD3wcH8Ys0/d1h1xaFt6Zc+Dh9zXf9TapGro0T4wvO71UTCp3/uoA==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + dev: false + + /@ethersproject/json-wallets@5.8.0: + resolution: {integrity: sha512-HxblNck8FVUtNxS3VTEYJAcwiKYsBIF77W15HufqlBF9gGfhmYOJtYZp8fSDZtn9y5EaXTE87zDwzxRoTFk11w==} + dependencies: + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + aes-js: 3.0.0 + scrypt-js: 3.0.1 + dev: false + + /@ethersproject/keccak256@5.8.0: + resolution: {integrity: sha512-A1pkKLZSz8pDaQ1ftutZoaN46I6+jvuqugx5KYNeQOPqq+JZ0Txm7dlWesCHB5cndJSu5vP2VKptKf7cksERng==} + dependencies: + '@ethersproject/bytes': 5.8.0 + js-sha3: 0.8.0 + dev: false + + /@ethersproject/logger@5.8.0: + resolution: {integrity: sha512-Qe6knGmY+zPPWTC+wQrpitodgBfH7XoceCGL5bJVejmH+yCS3R8jJm8iiWuvWbG76RUmyEG53oqv6GMVWqunjA==} + dev: false + + /@ethersproject/networks@5.8.0: + resolution: {integrity: sha512-egPJh3aPVAzbHwq8DD7Po53J4OUSsA1MjQp8Vf/OZPav5rlmWUaFLiq8cvQiGK0Z5K6LYzm29+VA/p4RL1FzNg==} + dependencies: + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/pbkdf2@5.8.0: + resolution: {integrity: sha512-wuHiv97BrzCmfEaPbUFpMjlVg/IDkZThp9Ri88BpjRleg4iePJaj2SW8AIyE8cXn5V1tuAaMj6lzvsGJkGWskg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/sha2': 5.8.0 + dev: false + + /@ethersproject/properties@5.8.0: + resolution: {integrity: sha512-PYuiEoQ+FMaZZNGrStmN7+lWjlsoufGIHdww7454FIaGdbe/p5rnaCXTr5MtBYl3NkeoVhHZuyzChPeGeKIpQw==} + dependencies: + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/providers@5.8.0: + resolution: {integrity: sha512-3Il3oTzEx3o6kzcg9ZzbE+oCZYyY+3Zh83sKkn4s1DZfTUjIegHnN2Cm0kbn9YFy45FDVcuCLLONhU7ny0SsCw==} + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/web': 5.8.0 + bech32: 1.1.4 + ws: 8.18.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@ethersproject/random@5.8.0: + resolution: {integrity: sha512-E4I5TDl7SVqyg4/kkA/qTfuLWAQGXmSOgYyO01So8hLfwgKvYK5snIlzxJMk72IFdG/7oh8yuSqY2KX7MMwg+A==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/rlp@5.8.0: + resolution: {integrity: sha512-LqZgAznqDbiEunaUvykH2JAoXTT9NV0Atqk8rQN9nx9SEgThA/WMx5DnW8a9FOufo//6FZOCHZ+XiClzgbqV9Q==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/sha2@5.8.0: + resolution: {integrity: sha512-dDOUrXr9wF/YFltgTBYS0tKslPEKr6AekjqDW2dbn1L1xmjGR+9GiKu4ajxovnrDbwxAKdHjW8jNcwfz8PAz4A==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + hash.js: 1.1.7 + dev: false + + /@ethersproject/signing-key@5.8.0: + resolution: {integrity: sha512-LrPW2ZxoigFi6U6aVkFN/fa9Yx/+4AtIUe4/HACTvKJdhm0eeb107EVCIQcrLZkxaSIgc/eCrX8Q1GtbH+9n3w==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + bn.js: 5.2.1 + elliptic: 6.6.1 + hash.js: 1.1.7 + dev: false + + /@ethersproject/solidity@5.8.0: + resolution: {integrity: sha512-4CxFeCgmIWamOHwYN9d+QWGxye9qQLilpgTU0XhYs1OahkclF+ewO+3V1U0mvpiuQxm5EHHmv8f7ClVII8EHsA==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: false + + /@ethersproject/strings@5.8.0: + resolution: {integrity: sha512-qWEAk0MAvl0LszjdfnZ2uC8xbR2wdv4cDabyHiBh3Cldq/T8dPH3V4BbBsAYJUeonwD+8afVXld274Ls+Y1xXg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/transactions@5.8.0: + resolution: {integrity: sha512-UglxSDjByHG0TuU17bDfCemZ3AnKO2vYrL5/2n2oXvKzvb7Cz+W9gOWXKARjp2URVwcWlQlPOEQyAviKwT4AHg==} + dependencies: + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + dev: false + + /@ethersproject/units@5.8.0: + resolution: {integrity: sha512-lxq0CAnc5kMGIiWW4Mr041VT8IhNM+Pn5T3haO74XZWFulk7wH1Gv64HqE96hT4a7iiNMdOCFEBgaxWuk8ETKQ==} + dependencies: + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/logger': 5.8.0 + dev: false + + /@ethersproject/wallet@5.8.0: + resolution: {integrity: sha512-G+jnzmgg6UxurVKRKvw27h0kvG75YKXZKdlLYmAHeF32TGUzHkOFd7Zn6QHOTYRFWnfjtSSFjBowKo7vfrXzPA==} + dependencies: + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + dev: false + + /@ethersproject/web@5.8.0: + resolution: {integrity: sha512-j7+Ksi/9KfGviws6Qtf9Q7KCqRhpwrYKQPs+JBA/rKVFF/yaWLHJEH3zfVP2plVu+eys0d2DlFmhoQJayFewcw==} + dependencies: + '@ethersproject/base64': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: false + + /@ethersproject/wordlists@5.8.0: + resolution: {integrity: sha512-2df9bbXicZws2Sb5S6ET493uJ0Z84Fjr3pC4tu/qlnZERibZCeUVuqdtt+7Tv9xxhUxHoIekIA7avrKUWHrezg==} + dependencies: + '@ethersproject/bytes': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/strings': 5.8.0 + dev: false + + /@layerzerolabs/lz-evm-messagelib-v2@3.0.83(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.83)(@layerzerolabs/lz-evm-v1-0.7@3.0.83)(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.3): + resolution: {integrity: sha512-H7lxnP6mQGsFXXVBMbC1SLE+85MZaLpv4PTfVg3utzFvxuy7d9EpjIBOxB4/RW4DFIO0MTYnncJO/736JfodOQ==} + peerDependencies: + '@arbitrum/nitro-contracts': ^1.1.0 + '@axelar-network/axelar-gmp-sdk-solidity': ^5.6.4 + '@chainlink/contracts-ccip': ^0.7.6 + '@eth-optimism/contracts': ^0.6.0 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.83 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.83 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + hardhat-deploy: ^0.12.4 + solidity-bytes-utils: ^0.8.0 + peerDependenciesMeta: + '@arbitrum/nitro-contracts': + optional: true + dependencies: + '@axelar-network/axelar-gmp-sdk-solidity': 5.10.0 + '@chainlink/contracts-ccip': 0.7.6(ethers@5.8.0) + '@eth-optimism/contracts': 0.6.0(ethers@5.8.0) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.3) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4) + '@openzeppelin/contracts': 5.2.0 + '@openzeppelin/contracts-upgradeable': 5.2.0(@openzeppelin/contracts@5.2.0) + hardhat-deploy: 0.12.4 + solidity-bytes-utils: 0.8.3 + dev: false + + /@layerzerolabs/lz-evm-protocol-v2@3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.3): + resolution: {integrity: sha512-PXC2BiMudtoxkgr01+6J9ew5W9sMoOFoPL6bLWc+6yR41aUf22Dpv/8MGkp7pXKwzqqOzQcVfIVsZbPL/XhSAg==} + peerDependencies: + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + hardhat-deploy: ^0.12.4 + solidity-bytes-utils: ^0.8.0 + dependencies: + '@openzeppelin/contracts': 5.2.0 + '@openzeppelin/contracts-upgradeable': 5.2.0(@openzeppelin/contracts@5.2.0) + hardhat-deploy: 0.12.4 + solidity-bytes-utils: 0.8.3 + dev: false + + /@layerzerolabs/lz-evm-v1-0.7@3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4): + resolution: {integrity: sha512-VVSR1FAIpeA5zDmOgsf1h1/2Nlxt4JYXDZa0lRZ4CMhFa8qujouOBIdvvM4Zvf2YwnqRTHTZ8Yb9tOn/saM3Ag==} + peerDependencies: + '@openzeppelin/contracts': 3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': 3.4.2-solc-0.7 || ^3.4.2 || ^4.0.0 || ^5.0.0 + hardhat-deploy: ^0.12.4 + dependencies: + '@openzeppelin/contracts': 5.2.0 + '@openzeppelin/contracts-upgradeable': 5.2.0(@openzeppelin/contracts@5.2.0) + hardhat-deploy: 0.12.4 + dev: false + + /@layerzerolabs/oapp-evm@0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.83)(@layerzerolabs/lz-evm-protocol-v2@3.0.83)(@layerzerolabs/lz-evm-v1-0.7@3.0.83)(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0): + resolution: {integrity: sha512-QqazLEl9KEPsipU/3m5eFDhyse+sG4bO2FWUEf/Kuee4JW6P3iIBI9wg0QfalUqLj0HL0ChFHL3yRTZVqzxrww==} + peerDependencies: + '@layerzerolabs/lz-evm-messagelib-v2': ^3.0.75 + '@layerzerolabs/lz-evm-protocol-v2': ^3.0.75 + '@layerzerolabs/lz-evm-v1-0.7': ^3.0.75 + '@openzeppelin/contracts': ^4.8.1 || ^5.0.0 + '@openzeppelin/contracts-upgradeable': ^4.8.1 || ^5.0.0 + dependencies: + '@layerzerolabs/lz-evm-messagelib-v2': 3.0.83(@axelar-network/axelar-gmp-sdk-solidity@5.10.0)(@chainlink/contracts-ccip@0.7.6)(@eth-optimism/contracts@0.6.0)(@layerzerolabs/lz-evm-protocol-v2@3.0.83)(@layerzerolabs/lz-evm-v1-0.7@3.0.83)(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.3) + '@layerzerolabs/lz-evm-protocol-v2': 3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4)(solidity-bytes-utils@0.8.3) + '@layerzerolabs/lz-evm-v1-0.7': 3.0.83(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0)(hardhat-deploy@0.12.4) + '@openzeppelin/contracts': 5.2.0 + '@openzeppelin/contracts-upgradeable': 5.2.0(@openzeppelin/contracts@5.2.0) + ethers: 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /@openzeppelin/contracts-upgradeable@4.7.3: + resolution: {integrity: sha512-+wuegAMaLcZnLCJIvrVUDzA9z/Wp93f0Dla/4jJvIhijRrPabjQbZe6fWiECLaJyfn5ci9fqf9vTw3xpQOad2A==} + dev: false + + /@openzeppelin/contracts-upgradeable@5.2.0(@openzeppelin/contracts@5.2.0): + resolution: {integrity: sha512-mZIu9oa4tQTlGiOJHk6D3LdJlqFqF6oNOSn6S6UVJtzfs9UsY9/dhMEbAVTwElxUtJnjpf6yA062+oBp+eOyPg==} + peerDependencies: + '@openzeppelin/contracts': 5.2.0 + dependencies: + '@openzeppelin/contracts': 5.2.0 + dev: false + + /@openzeppelin/contracts@3.4.2: + resolution: {integrity: sha512-z0zMCjyhhp4y7XKAcDAi3Vgms4T2PstwBdahiO0+9NaGICQKjynK3wduSRplTgk4LXmoO1yfDGO5RbjKYxtuxA==} + dev: false + + /@openzeppelin/contracts@4.3.3: + resolution: {integrity: sha512-tDBopO1c98Yk7Cv/PZlHqrvtVjlgK5R4J6jxLwoO7qxK4xqOiZG+zSkIvGFpPZ0ikc3QOED3plgdqjgNTnBc7g==} + dev: false + + /@openzeppelin/contracts@5.2.0: + resolution: {integrity: sha512-bxjNie5z89W1Ea0NZLZluFh8PrFNn9DH8DQlujEok2yjsOlraUPKID5p1Wk3qdNbf6XkQ1Os2RvfiHrrXLHWKA==} + dev: false + + /@types/qs@6.9.18: + resolution: {integrity: sha512-kK7dgTYDyGqS+e2Q4aK9X3D7q234CIZ1Bv0q/7Z5IwRDoADNU81xXJK/YVyLbLTZCoIwUoDoffFeF+p/eIklAA==} + dev: false + + /aes-js@3.0.0: + resolution: {integrity: sha512-H7wUZRn8WpTq9jocdxQ2c8x2sKo9ZVmzfRE13GiNJXfp7NcKYEdvl3vspKjXox6RIG2VtaRe4JFvxG4rqp2Zuw==} + dev: false + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /axios@0.21.4(debug@4.4.0): + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.9(debug@4.4.0) + transitivePeerDependencies: + - debug + dev: false + + /bech32@1.1.4: + resolution: {integrity: sha512-s0IrSOzLlbvX7yp4WBfPITzpAU8sqQcpsmwXDiKwrG4r491vwCO/XpejasRNl0piBMe/DvP4Tz0mIS/X1DPJBQ==} + dev: false + + /binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + dev: false + + /bn.js@4.12.1: + resolution: {integrity: sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==} + dev: false + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + dev: false + + /brorand@1.1.0: + resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==} + dev: false + + /bufio@1.2.3: + resolution: {integrity: sha512-5Tt66bRzYUSlVZatc0E92uDenreJ+DpTBmSAUwL4VSxJn3e6cUyYwx+PoqML0GRZatgA/VX8ybhxItF8InZgqA==} + engines: {node: '>=8.0.0'} + dev: false + + /call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + dev: false + + /call-bound@1.0.4: + resolution: {integrity: sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + get-intrinsic: 1.3.0 + dev: false + + /chai@4.5.0: + resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.1.0 + dev: false + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: false + + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.1.0 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + dev: false + + /elliptic@6.6.1: + resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} + dependencies: + bn.js: 4.12.1 + brorand: 1.1.0 + hash.js: 1.1.7 + hmac-drbg: 1.0.1 + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + + /encode-utf8@1.0.3: + resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==} + dev: false + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + dev: false + + /es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + dev: false + + /es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + dev: false + + /es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + dev: false + + /es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + dev: false + + /ethers@5.8.0: + resolution: {integrity: sha512-DUq+7fHrCg1aPDFCHx6UIPb3nmt2XMpM7Y/g2gLhsl3lIBqeAfOJIl1qEvRf2uq3BiKxmh6Fh5pfp2ieyek7Kg==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-provider': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/base64': 5.8.0 + '@ethersproject/basex': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/hash': 5.8.0 + '@ethersproject/hdnode': 5.8.0 + '@ethersproject/json-wallets': 5.8.0 + '@ethersproject/keccak256': 5.8.0 + '@ethersproject/logger': 5.8.0 + '@ethersproject/networks': 5.8.0 + '@ethersproject/pbkdf2': 5.8.0 + '@ethersproject/properties': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/random': 5.8.0 + '@ethersproject/rlp': 5.8.0 + '@ethersproject/sha2': 5.8.0 + '@ethersproject/signing-key': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/strings': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/units': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@ethersproject/web': 5.8.0 + '@ethersproject/wordlists': 5.8.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + dev: false + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /fmix@0.1.0: + resolution: {integrity: sha512-Y6hyofImk9JdzU8k5INtTXX1cu8LDlePWDFU5sftm9H+zKCr5SGrVjdhkvsim646cw5zD0nADj8oHyXMZmCZ9w==} + dependencies: + imul: 1.0.1 + dev: false + + /follow-redirects@1.15.9(debug@4.4.0): + resolution: {integrity: sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dependencies: + debug: 4.4.0 + dev: false + + /form-data@4.0.2: + resolution: {integrity: sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + mime-types: 2.1.35 + dev: false + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + dev: false + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: false + + /get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + dev: false + + /get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /hardhat-deploy@0.12.4: + resolution: {integrity: sha512-bYO8DIyeGxZWlhnMoCBon9HNZb6ji0jQn7ngP1t5UmGhC8rQYhji7B73qETMOFhzt5ECZPr+U52duj3nubsqdQ==} + dependencies: + '@ethersproject/abi': 5.8.0 + '@ethersproject/abstract-signer': 5.8.0 + '@ethersproject/address': 5.8.0 + '@ethersproject/bignumber': 5.8.0 + '@ethersproject/bytes': 5.8.0 + '@ethersproject/constants': 5.8.0 + '@ethersproject/contracts': 5.8.0 + '@ethersproject/providers': 5.8.0 + '@ethersproject/solidity': 5.8.0 + '@ethersproject/transactions': 5.8.0 + '@ethersproject/wallet': 5.8.0 + '@types/qs': 6.9.18 + axios: 0.21.4(debug@4.4.0) + chalk: 4.1.2 + chokidar: 3.6.0 + debug: 4.4.0 + enquirer: 2.4.1 + ethers: 5.8.0 + form-data: 4.0.2 + fs-extra: 10.1.0 + match-all: 1.2.7 + murmur-128: 0.2.1 + qs: 6.14.0 + zksync-ethers: 5.10.0(ethers@5.8.0) + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + dev: false + + /has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + dev: false + + /has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.1.0 + dev: false + + /hash.js@1.1.7: + resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==} + dependencies: + inherits: 2.0.4 + minimalistic-assert: 1.0.1 + dev: false + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hmac-drbg@1.0.1: + resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==} + dependencies: + hash.js: 1.1.7 + minimalistic-assert: 1.0.1 + minimalistic-crypto-utils: 1.0.1 + dev: false + + /imul@1.0.1: + resolution: {integrity: sha512-WFAgfwPLAjU66EKt6vRdTlKj4nAgIDQzh29JonLa4Bqtl6D8JrIMvWjCnx7xEjVNmP3U0fM5o8ZObk7d0f62bA==} + engines: {node: '>=0.10.0'} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /install@0.13.0: + resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} + engines: {node: '>= 0.10'} + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.3.0 + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /js-sha3@0.8.0: + resolution: {integrity: sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==} + dev: false + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + dev: false + + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: false + + /match-all@1.2.7: + resolution: {integrity: sha512-qSpsBKarh55r9KyXzFC3xBLRf2GlGasba2em9kbpRsSlGvdTAqjx3QD0r3FKSARiW+OE4iMHYsolM3aX9n5djw==} + dev: false + + /math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /minimalistic-assert@1.0.1: + resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} + dev: false + + /minimalistic-crypto-utils@1.0.1: + resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==} + dev: false + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /murmur-128@0.2.1: + resolution: {integrity: sha512-WseEgiRkI6aMFBbj8Cg9yBj/y+OdipwVC7zUo3W2W1JAJITwouUOtpqsmGSg67EQmwwSyod7hsVsWY5LsrfQVg==} + dependencies: + encode-utf8: 1.0.3 + fmix: 0.1.0 + imul: 1.0.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /object-inspect@1.13.4: + resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} + engines: {node: '>= 0.4'} + dev: false + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pnpm@10.7.0: + resolution: {integrity: sha512-a4Za1LYqHZhCth1nSjk5A7hx2SRJVPZSuIQsK1U8chdrJ49kxGPlLUD/+KujhcI1yMns9cx95P14uLttSWM6tg==} + engines: {node: '>=18.12'} + hasBin: true + dev: false + + /qs@6.14.0: + resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.1.0 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /scrypt-js@3.0.1: + resolution: {integrity: sha512-cdwTTnqPu0Hyvf5in5asVdZocVDTNRmR7XEcJuIzMjJeSHybHl7vpB66AzwTaIg6CLSbtjcxc8fqcySfnTkccA==} + dev: false + + /side-channel-list@1.0.0: + resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + dev: false + + /side-channel-map@1.0.1: + resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + dev: false + + /side-channel-weakmap@1.0.2: + resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==} + engines: {node: '>= 0.4'} + dependencies: + call-bound: 1.0.4 + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + object-inspect: 1.13.4 + side-channel-map: 1.0.1 + dev: false + + /side-channel@1.1.0: + resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} + engines: {node: '>= 0.4'} + dependencies: + es-errors: 1.3.0 + object-inspect: 1.13.4 + side-channel-list: 1.0.0 + side-channel-map: 1.0.1 + side-channel-weakmap: 1.0.2 + dev: false + + /solidity-bytes-utils@0.8.3: + resolution: {integrity: sha512-sbOHjKF9miqASaqYYC1vvxNnBrzA/wuFPQlOle7rZOSkDiFmCd5x8wQfx2vN95tNGfy8Cf1e5QumW8ZwcByBuQ==} + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /type-detect@4.1.0: + resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==} + engines: {node: '>=4'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + dev: false + + /ws@8.18.0: + resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /zksync-ethers@5.10.0(ethers@5.8.0): + resolution: {integrity: sha512-OAjTGAHF9wbdkRGkj7XZuF/a1Sk/FVbwH4pmLjAKlR7mJ7sQtQhBhrPU2dCc67xLaNvEESPfwil19ES5wooYFg==} + engines: {node: '>=16.0.0'} + peerDependencies: + ethers: ~5.7.0 + dependencies: + ethers: 5.8.0 + dev: false diff --git a/core/src/contracts/src/MyOApp.sol b/core/src/contracts/src/MyOApp.sol new file mode 100644 index 0000000..fcebb9e --- /dev/null +++ b/core/src/contracts/src/MyOApp.sol @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.22; + +import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; +import {OApp, MessagingFee, Origin} from "@layerzerolabs/oapp-evm/contracts/oapp/OApp.sol"; +import {MessagingReceipt} from "@layerzerolabs/oapp-evm/contracts/oapp/OAppSender.sol"; +import {OAppOptionsType3} from "@layerzerolabs/oapp-evm/contracts/oapp/libs/OAppOptionsType3.sol"; + +contract MyOApp is OApp, OAppOptionsType3 { + constructor( + address _endpoint, + address _delegate + ) OApp(_endpoint, _delegate) Ownable(_delegate) {} + + string public data = "Nothing received yet."; + + /** + * @notice Sends a message from the source chain to a destination chain. + * @param _dstEid The endpoint ID of the destination chain. + * @param _message The message string to be sent. + * @param _options Additional options for message execution. + * @dev Encodes the message as bytes and sends it using the `_lzSend` internal function. + * @return receipt A `MessagingReceipt` struct containing details of the message sent. + */ + function send( + uint32 _dstEid, + string memory _message, + bytes calldata _options + ) external payable returns (MessagingReceipt memory receipt) { + bytes memory _payload = abi.encode(_message); + receipt = _lzSend( + _dstEid, + _payload, + _options, + MessagingFee(msg.value, 0), + payable(msg.sender) + ); + } + + /** + * @notice Quotes the gas needed to pay for the full omnichain transaction in native gas or ZRO token. + * @param _dstEid Destination chain's endpoint ID. + * @param _message The message. + * @param _options Message execution options (e.g., for sending gas to destination). + * @param _payInLzToken Whether to return fee in ZRO token. + * @return fee A `MessagingFee` struct containing the calculated gas fee in either the native token or ZRO token. + */ + function quote( + uint32 _dstEid, + string memory _message, + bytes memory _options, + bool _payInLzToken + ) public view returns (MessagingFee memory fee) { + bytes memory payload = abi.encode(_message); + fee = _quote(_dstEid, payload, _options, _payInLzToken); + } + + /** + * @dev Internal function override to handle incoming messages from another chain. + * @dev _origin A struct containing information about the message sender. + * @dev _guid A unique global packet identifier for the message. + * @param payload The encoded message payload being received. + * + * @dev The following params are unused in the current implementation of the OApp. + * @dev _executor The address of the Executor responsible for processing the message. + * @dev _extraData Arbitrary data appended by the Executor to the message. + * + * Decodes the received payload and processes it as per the business logic defined in the function. + */ + function _lzReceive( + Origin calldata /*_origin*/, + bytes32 /*_guid*/, + bytes calldata payload, + address /*_executor*/, + bytes calldata /*_extraData*/ + ) internal override { + data = abi.decode(payload, (string)); + } +} diff --git a/core/src/lib.rs b/core/src/lib.rs index 1d15ffc..cc10537 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,3 +1,4 @@ pub mod artifacts; pub mod client; +pub mod compiler; pub mod deployer; diff --git a/lib/forge-std b/lib/forge-std new file mode 160000 index 0000000..3b20d60 --- /dev/null +++ b/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 diff --git a/script/Counter.s.sol b/script/Counter.s.sol new file mode 100644 index 0000000..cdc1fe9 --- /dev/null +++ b/script/Counter.s.sol @@ -0,0 +1,19 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Script, console} from "forge-std/Script.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterScript is Script { + Counter public counter; + + function setUp() public {} + + function run() public { + vm.startBroadcast(); + + counter = new Counter(); + + vm.stopBroadcast(); + } +} diff --git a/src/Counter.sol b/src/Counter.sol new file mode 100644 index 0000000..aded799 --- /dev/null +++ b/src/Counter.sol @@ -0,0 +1,14 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract Counter { + uint256 public number; + + function setNumber(uint256 newNumber) public { + number = newNumber; + } + + function increment() public { + number++; + } +} diff --git a/test/Counter.t.sol b/test/Counter.t.sol new file mode 100644 index 0000000..54b724f --- /dev/null +++ b/test/Counter.t.sol @@ -0,0 +1,24 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +import {Test, console} from "forge-std/Test.sol"; +import {Counter} from "../src/Counter.sol"; + +contract CounterTest is Test { + Counter public counter; + + function setUp() public { + counter = new Counter(); + counter.setNumber(0); + } + + function test_Increment() public { + counter.increment(); + assertEq(counter.number(), 1); + } + + function testFuzz_SetNumber(uint256 x) public { + counter.setNumber(x); + assertEq(counter.number(), x); + } +} From fb5c07f59de233d638ae1c8450bde105fae864bc Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Tue, 1 Apr 2025 14:41:20 -0300 Subject: [PATCH 08/14] compiler compiles --- .gitignore | 3 + .gitmodules | 3 + Cargo.toml | 1 + cli/Cargo.toml | 2 +- core/Cargo.toml | 2 +- core/README.md | 10 +++ core/cache/solidity-files-cache.json | 1 - core/src/compiler.rs | 27 ++++---- core/src/contracts/.github/workflows/test.yml | 45 ------------- core/src/contracts/README.md | 66 ------------------- core/src/contracts/foundry.toml | 8 --- core/src/contracts/lib/forge-std | 1 - core/src/contracts/script/Counter.s.sol | 19 ------ core/src/contracts/src/Counter.sol | 14 ---- core/src/contracts/test/Counter.t.sol | 24 ------- core/src/{contracts => solidity}/.gitignore | 0 .../src => solidity/contracts}/MyOApp.sol | 0 core/src/solidity/foundry.toml | 10 +++ core/src/{contracts => solidity}/package.json | 3 +- .../{contracts => solidity}/pnpm-lock.yaml | 20 +----- src/Counter.sol | 14 ---- test/Counter.t.sol | 24 ------- 22 files changed, 46 insertions(+), 251 deletions(-) create mode 100644 core/README.md delete mode 100644 core/cache/solidity-files-cache.json delete mode 100644 core/src/contracts/.github/workflows/test.yml delete mode 100644 core/src/contracts/README.md delete mode 100644 core/src/contracts/foundry.toml delete mode 160000 core/src/contracts/lib/forge-std delete mode 100644 core/src/contracts/script/Counter.s.sol delete mode 100644 core/src/contracts/src/Counter.sol delete mode 100644 core/src/contracts/test/Counter.t.sol rename core/src/{contracts => solidity}/.gitignore (100%) rename core/src/{contracts/src => solidity/contracts}/MyOApp.sol (100%) create mode 100644 core/src/solidity/foundry.toml rename core/src/{contracts => solidity}/package.json (87%) rename core/src/{contracts => solidity}/pnpm-lock.yaml (98%) delete mode 100644 src/Counter.sol delete mode 100644 test/Counter.t.sol diff --git a/.gitignore b/.gitignore index c167563..dead384 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ wallets/ .env lib/ +node_modules +artifacts +cache diff --git a/.gitmodules b/.gitmodules index 36dace2..85dc837 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "lib/forge-std"] path = lib/forge-std url = https://github.com/foundry-rs/forge-std +[submodule "core/src/contracts/lib/openzeppelin-contracts"] + path = core/src/contracts/lib/openzeppelin-contracts + url = https://github.com/openzeppelin/openzeppelin-contracts diff --git a/Cargo.toml b/Cargo.toml index 15f4e01..ae89b34 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,3 @@ [workspace] members = ["core", "cli"] +resolver = "3" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index a93adca..6f57100 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "cli" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] clap = { version = "4", features = ["derive"] } diff --git a/core/Cargo.toml b/core/Cargo.toml index bf727df..db1b8f3 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "core" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] ethers = { version = "2", features = ["abigen"] } diff --git a/core/README.md b/core/README.md new file mode 100644 index 0000000..65e0d2b --- /dev/null +++ b/core/README.md @@ -0,0 +1,10 @@ +Set a global version is required. + +`svm use 0.8.22` + +Hardhat folder structure uses `contracts` folder for contracts; on `compiler.rs` we indicate the root directory. +Remapping are taken from the `remappings` field in the `foundry.toml` file. + +```sh +cargo run -p cli -- --chain base_sepolia compile +``` diff --git a/core/cache/solidity-files-cache.json b/core/cache/solidity-files-cache.json deleted file mode 100644 index b871ed9..0000000 --- a/core/cache/solidity-files-cache.json +++ /dev/null @@ -1 +0,0 @@ -{"_format":"","paths":{"artifacts":"artifacts","build_infos":"artifacts/build-info","sources":"contracts","tests":"test","scripts":"script","libraries":["node_modules"]},"files":{},"builds":[]} \ No newline at end of file diff --git a/core/src/compiler.rs b/core/src/compiler.rs index b1fdbd1..fac1e6f 100644 --- a/core/src/compiler.rs +++ b/core/src/compiler.rs @@ -1,25 +1,24 @@ -use std::path::{Path, PathBuf}; +use std::{ + path::{Path, PathBuf}, + process::Output, +}; -use foundry_compilers::{solc::Solc, Project, ProjectPathsConfig}; +use foundry_compilers::{Project, ProjectPathsConfig}; pub fn compile_contract() -> Result<(), anyhow::Error> { - // configure the project with all its paths, solc, cache etc. + let contracts_path = Path::new(env!("CARGO_MANIFEST_DIR")) + .to_owned() + .join(PathBuf::from("src/solidity")); + let project = Project::builder() - .paths( - ProjectPathsConfig::hardhat( - &Path::new(env!("CARGO_MANIFEST_DIR")) - .to_owned() - .join(PathBuf::from("src/contracts")), - ) - .unwrap(), - ) + .paths(ProjectPathsConfig::hardhat(&contracts_path).unwrap()) + .set_no_artifacts(false) .build(Default::default()) .unwrap(); - // https://github.com/foundry-rs/compilers/blob/main/crates/compilers/tests/project.rs#L2627 - println!("{:?}", project); + println!("Project:\n {:?}\n", project); let output = project.compile().unwrap(); - println!("{:?}\n", output); + println!("Output:\n {:?}\n", output); Ok(()) } diff --git a/core/src/contracts/.github/workflows/test.yml b/core/src/contracts/.github/workflows/test.yml deleted file mode 100644 index 762a296..0000000 --- a/core/src/contracts/.github/workflows/test.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: CI - -on: - push: - pull_request: - workflow_dispatch: - -env: - FOUNDRY_PROFILE: ci - -jobs: - check: - strategy: - fail-fast: true - - name: Foundry project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - submodules: recursive - - - name: Install Foundry - uses: foundry-rs/foundry-toolchain@v1 - with: - version: nightly - - - name: Show Forge version - run: | - forge --version - - - name: Run Forge fmt - run: | - forge fmt --check - id: fmt - - - name: Run Forge build - run: | - forge build --sizes - id: build - - - name: Run Forge tests - run: | - forge test -vvv - id: test diff --git a/core/src/contracts/README.md b/core/src/contracts/README.md deleted file mode 100644 index 9265b45..0000000 --- a/core/src/contracts/README.md +++ /dev/null @@ -1,66 +0,0 @@ -## Foundry - -**Foundry is a blazing fast, portable and modular toolkit for Ethereum application development written in Rust.** - -Foundry consists of: - -- **Forge**: Ethereum testing framework (like Truffle, Hardhat and DappTools). -- **Cast**: Swiss army knife for interacting with EVM smart contracts, sending transactions and getting chain data. -- **Anvil**: Local Ethereum node, akin to Ganache, Hardhat Network. -- **Chisel**: Fast, utilitarian, and verbose solidity REPL. - -## Documentation - -https://book.getfoundry.sh/ - -## Usage - -### Build - -```shell -$ forge build -``` - -### Test - -```shell -$ forge test -``` - -### Format - -```shell -$ forge fmt -``` - -### Gas Snapshots - -```shell -$ forge snapshot -``` - -### Anvil - -```shell -$ anvil -``` - -### Deploy - -```shell -$ forge script script/Counter.s.sol:CounterScript --rpc-url --private-key -``` - -### Cast - -```shell -$ cast -``` - -### Help - -```shell -$ forge --help -$ anvil --help -$ cast --help -``` diff --git a/core/src/contracts/foundry.toml b/core/src/contracts/foundry.toml deleted file mode 100644 index a1731d5..0000000 --- a/core/src/contracts/foundry.toml +++ /dev/null @@ -1,8 +0,0 @@ -[profile.default] -src = "src" -out = "out" -libs = ["lib"] - -solc = "0.8.22" - -remappings = ['@layerzerolabs/=node_modules/@layerzerolabs/'] diff --git a/core/src/contracts/lib/forge-std b/core/src/contracts/lib/forge-std deleted file mode 160000 index 3b20d60..0000000 --- a/core/src/contracts/lib/forge-std +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 3b20d60d14b343ee4f908cb8079495c07f5e8981 diff --git a/core/src/contracts/script/Counter.s.sol b/core/src/contracts/script/Counter.s.sol deleted file mode 100644 index cdc1fe9..0000000 --- a/core/src/contracts/script/Counter.s.sol +++ /dev/null @@ -1,19 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Script, console} from "forge-std/Script.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterScript is Script { - Counter public counter; - - function setUp() public {} - - function run() public { - vm.startBroadcast(); - - counter = new Counter(); - - vm.stopBroadcast(); - } -} diff --git a/core/src/contracts/src/Counter.sol b/core/src/contracts/src/Counter.sol deleted file mode 100644 index aded799..0000000 --- a/core/src/contracts/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/core/src/contracts/test/Counter.t.sol b/core/src/contracts/test/Counter.t.sol deleted file mode 100644 index 54b724f..0000000 --- a/core/src/contracts/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function test_Increment() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testFuzz_SetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -} diff --git a/core/src/contracts/.gitignore b/core/src/solidity/.gitignore similarity index 100% rename from core/src/contracts/.gitignore rename to core/src/solidity/.gitignore diff --git a/core/src/contracts/src/MyOApp.sol b/core/src/solidity/contracts/MyOApp.sol similarity index 100% rename from core/src/contracts/src/MyOApp.sol rename to core/src/solidity/contracts/MyOApp.sol diff --git a/core/src/solidity/foundry.toml b/core/src/solidity/foundry.toml new file mode 100644 index 0000000..d96a19c --- /dev/null +++ b/core/src/solidity/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +src = "src" +out = "out" +libs = ["lib"] + + +remappings = [ + '@openzeppelin/=node_modules/@openzeppelin/', + '@layerzerolabs/=node_modules/@layerzerolabs/', +] diff --git a/core/src/contracts/package.json b/core/src/solidity/package.json similarity index 87% rename from core/src/contracts/package.json rename to core/src/solidity/package.json index 94bdd01..5110f29 100644 --- a/core/src/contracts/package.json +++ b/core/src/solidity/package.json @@ -12,7 +12,6 @@ "dependencies": { "@layerzerolabs/lz-evm-protocol-v2": "^3.0.83", "@layerzerolabs/oapp-evm": "^0.3.2", - "install": "^0.13.0", - "pnpm": "^10.7.0" + "@openzeppelin/contracts": "^5.2.0" } } diff --git a/core/src/contracts/pnpm-lock.yaml b/core/src/solidity/pnpm-lock.yaml similarity index 98% rename from core/src/contracts/pnpm-lock.yaml rename to core/src/solidity/pnpm-lock.yaml index a15f008..5d51a3e 100644 --- a/core/src/contracts/pnpm-lock.yaml +++ b/core/src/solidity/pnpm-lock.yaml @@ -11,12 +11,9 @@ dependencies: '@layerzerolabs/oapp-evm': specifier: ^0.3.2 version: 0.3.2(@layerzerolabs/lz-evm-messagelib-v2@3.0.83)(@layerzerolabs/lz-evm-protocol-v2@3.0.83)(@layerzerolabs/lz-evm-v1-0.7@3.0.83)(@openzeppelin/contracts-upgradeable@5.2.0)(@openzeppelin/contracts@5.2.0) - install: - specifier: ^0.13.0 - version: 0.13.0 - pnpm: - specifier: ^10.7.0 - version: 10.7.0 + '@openzeppelin/contracts': + specifier: ^5.2.0 + version: 5.2.0 packages: @@ -964,11 +961,6 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: false - /install@0.13.0: - resolution: {integrity: sha512-zDml/jzr2PKU9I8J/xyZBQn8rPCAY//UOYNmR01XwNwyfhEWObo2SWfSl1+0tm1u6PhxLwDnfsT/6jB7OUxqFA==} - engines: {node: '>= 0.10'} - dev: false - /is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -1071,12 +1063,6 @@ packages: engines: {node: '>=8.6'} dev: false - /pnpm@10.7.0: - resolution: {integrity: sha512-a4Za1LYqHZhCth1nSjk5A7hx2SRJVPZSuIQsK1U8chdrJ49kxGPlLUD/+KujhcI1yMns9cx95P14uLttSWM6tg==} - engines: {node: '>=18.12'} - hasBin: true - dev: false - /qs@6.14.0: resolution: {integrity: sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==} engines: {node: '>=0.6'} diff --git a/src/Counter.sol b/src/Counter.sol deleted file mode 100644 index aded799..0000000 --- a/src/Counter.sol +++ /dev/null @@ -1,14 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -contract Counter { - uint256 public number; - - function setNumber(uint256 newNumber) public { - number = newNumber; - } - - function increment() public { - number++; - } -} diff --git a/test/Counter.t.sol b/test/Counter.t.sol deleted file mode 100644 index 54b724f..0000000 --- a/test/Counter.t.sol +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-License-Identifier: UNLICENSED -pragma solidity ^0.8.13; - -import {Test, console} from "forge-std/Test.sol"; -import {Counter} from "../src/Counter.sol"; - -contract CounterTest is Test { - Counter public counter; - - function setUp() public { - counter = new Counter(); - counter.setNumber(0); - } - - function test_Increment() public { - counter.increment(); - assertEq(counter.number(), 1); - } - - function testFuzz_SetNumber(uint256 x) public { - counter.setNumber(x); - assertEq(counter.number(), x); - } -} From f1dbb1315e138742a81aeb53c07d7641942daee7 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Tue, 1 Apr 2025 17:05:34 -0300 Subject: [PATCH 09/14] add simple contract for testing purposes --- core/src/artifacts.rs | 21 +++++++++++------- core/src/client.rs | 9 ++++++-- core/src/compiler.rs | 12 +++++----- core/src/deployer.rs | 18 +++++++++++---- .../solidity/contracts/SimpleIncrement.sol | 22 +++++++++++++++++++ 5 files changed, 62 insertions(+), 20 deletions(-) create mode 100644 core/src/solidity/contracts/SimpleIncrement.sol diff --git a/core/src/artifacts.rs b/core/src/artifacts.rs index ff5d340..c618f4d 100644 --- a/core/src/artifacts.rs +++ b/core/src/artifacts.rs @@ -1,11 +1,16 @@ use anyhow::{Context, Result}; -use ethers::abi::Abi; +use ethers::{abi::Abi, types::Bytes, utils::hex::decode}; use std::fs; fn contract_path(contract_name: &str) -> String { + let artifacts_dir = + std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src/solidity/artifacts"); + format!( - "contracts/{}/out/{}.sol/{}.json", - contract_name, contract_name, contract_name + "{}/{}.sol/{}.json", + artifacts_dir.display(), + contract_name, + contract_name ) } @@ -19,14 +24,14 @@ pub fn load_abi(contract_name: &str) -> Result { Ok(abi) } -pub fn load_bytecode(contract_name: &str) -> Result { +pub fn load_bytecode(contract_name: &str) -> Result { let path = contract_path(contract_name); let json = fs::read_to_string(&path) .with_context(|| format!("Failed to read bytecode from {}", path))?; let v: serde_json::Value = serde_json::from_str(&json)?; - let bytecode = v["bytecode"]["object"] + let bytecode_str = v["bytecode"]["object"] .as_str() - .context("Missing bytecode object")? - .to_string(); - Ok(bytecode) + .context("Missing bytecode object")?; + let bytecode = decode(bytecode_str.strip_prefix("0x").unwrap_or(bytecode_str))?; + Ok(Bytes::from(bytecode)) } diff --git a/core/src/client.rs b/core/src/client.rs index 5ab25b2..ce92585 100644 --- a/core/src/client.rs +++ b/core/src/client.rs @@ -1,12 +1,17 @@ use anyhow::Result; -use ethers::signers::{LocalWallet, Wallet}; +use ethers::signers::{LocalWallet, Signer, Wallet}; use std::path::Path; /// Load a wallet from a keystore file. /// `cast wallet new .` pub async fn wallet_from_keystore(path: &str, password: &str) -> Result { let path = Path::new(path); - let wallet = Wallet::decrypt_keystore(&path, password)?; + let mut wallet = Wallet::decrypt_keystore(&path, password)?; + + // TODO Replace with chain id from provider + let chain_id: u64 = 84532; + wallet = wallet.with_chain_id(chain_id); + println!("Wallet loaded successfully."); Ok(wallet) } diff --git a/core/src/compiler.rs b/core/src/compiler.rs index fac1e6f..765a026 100644 --- a/core/src/compiler.rs +++ b/core/src/compiler.rs @@ -1,8 +1,6 @@ -use std::{ - path::{Path, PathBuf}, - process::Output, -}; +use std::path::{Path, PathBuf}; +use anyhow::Error; use foundry_compilers::{Project, ProjectPathsConfig}; pub fn compile_contract() -> Result<(), anyhow::Error> { @@ -14,10 +12,12 @@ pub fn compile_contract() -> Result<(), anyhow::Error> { .paths(ProjectPathsConfig::hardhat(&contracts_path).unwrap()) .set_no_artifacts(false) .build(Default::default()) - .unwrap(); + .map_err(|e| Error::new(e).context("Failed to build project"))?; println!("Project:\n {:?}\n", project); - let output = project.compile().unwrap(); + let output = project + .compile() + .map_err(|e| Error::new(e).context("Failed to compile contracts"))?; println!("Output:\n {:?}\n", output); Ok(()) diff --git a/core/src/deployer.rs b/core/src/deployer.rs index 22c25d5..0fcfd08 100644 --- a/core/src/deployer.rs +++ b/core/src/deployer.rs @@ -1,6 +1,6 @@ use crate::artifacts; use anyhow::Result; -use ethers::prelude::*; +use ethers::{abi::Token, prelude::*}; use std::sync::Arc; pub async fn deploy_contract( @@ -8,12 +8,22 @@ pub async fn deploy_contract( provider: Provider, wallet: LocalWallet, ) -> Result
{ + let endpoint_address = "0x0000000000000000000000000000000000000001".parse::
()?; + let constructor_args = vec![ + abi::Token::Address(endpoint_address), + abi::Token::Address(endpoint_address), + ]; + let abi = artifacts::load_abi(contract_name)?; let bytecode = artifacts::load_bytecode(contract_name)?; + println!("ABI {:?}\nBytecode {:?}", abi, bytecode); let client = Arc::new(SignerMiddleware::new(provider, wallet)); - let factory = ContractFactory::new(abi, Bytes::from(bytecode.as_bytes().to_vec()), client); - let deployer = factory.deploy(())?.send().await?; + let factory = ContractFactory::new(abi, bytecode, Arc::new(client.clone())); + + println!("Factory {:?}", factory); + + let deployed = factory.deploy(constructor_args)?.send().await?; - Ok(deployer.address()) + Ok(deployed.address()) } diff --git a/core/src/solidity/contracts/SimpleIncrement.sol b/core/src/solidity/contracts/SimpleIncrement.sol new file mode 100644 index 0000000..015dc44 --- /dev/null +++ b/core/src/solidity/contracts/SimpleIncrement.sol @@ -0,0 +1,22 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.0; + +contract SimpleIncrement { + uint256 private _value; + + event ValueIncremented(address indexed by, uint256 newValue); + + constructor() { + _value = 0; + } + + function increment() public returns (uint256) { + _value += 1; + emit ValueIncremented(msg.sender, _value); + return _value; + } + + function getValue() public view returns (uint256) { + return _value; + } +} From 8f7c03cbb1767c43920f2f02a83f07c6ab8dfb8c Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Wed, 2 Apr 2025 15:25:37 -0300 Subject: [PATCH 10/14] deploy success --- cli/src/main.rs | 2 +- core/src/deployer.rs | 37 ++++++++++++------- .../solidity/contracts/SimpleIncrement.sol | 22 ----------- 3 files changed, 24 insertions(+), 37 deletions(-) delete mode 100644 core/src/solidity/contracts/SimpleIncrement.sol diff --git a/cli/src/main.rs b/cli/src/main.rs index 71b2630..d9c63b6 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -113,7 +113,7 @@ async fn main() -> anyhow::Result<()> { } => { let wallet = get_wallet_from_keystore(path.as_str(), password).await?; let addr = deployer::deploy_contract(&contract, provider, wallet).await?; - println!("Deployed `{}` at {}\n", contract, addr); + println!("Deployed `{}` at {:?}\n", contract, addr); } Commands::Compile => { println!("Compiling contract..."); diff --git a/core/src/deployer.rs b/core/src/deployer.rs index 0fcfd08..8e8fd9c 100644 --- a/core/src/deployer.rs +++ b/core/src/deployer.rs @@ -1,6 +1,6 @@ use crate::artifacts; use anyhow::Result; -use ethers::{abi::Token, prelude::*}; +use ethers::prelude::*; use std::sync::Arc; pub async fn deploy_contract( @@ -8,22 +8,31 @@ pub async fn deploy_contract( provider: Provider, wallet: LocalWallet, ) -> Result
{ - let endpoint_address = "0x0000000000000000000000000000000000000001".parse::
()?; - let constructor_args = vec![ - abi::Token::Address(endpoint_address), - abi::Token::Address(endpoint_address), - ]; + // TODO Extract + let endpoint_address = "0x6EDCE65403992e310A62460808c4b910D972f10f".parse::
()?; + let delegator_address = "0x6EDCE65403992e310A62460808c4b910D972f10f".parse::
()?; - let abi = artifacts::load_abi(contract_name)?; - let bytecode = artifacts::load_bytecode(contract_name)?; - println!("ABI {:?}\nBytecode {:?}", abi, bytecode); - let client = Arc::new(SignerMiddleware::new(provider, wallet)); - - let factory = ContractFactory::new(abi, bytecode, Arc::new(client.clone())); + // FIXME abi is not used, is replaced by abigen! macro. Remove from artifacts module + // let abi = artifacts::load_abi(contract_name)?; + // TODO Move closer to artifact reading + abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); - println!("Factory {:?}", factory); + // FIXME bytecode is not used, is replaced by abigen! macro. Remove from artifacts module + // let bytecode = artifacts::load_bytecode(contract_name)?; + let client = Arc::new(SignerMiddleware::new(provider, wallet)); - let deployed = factory.deploy(constructor_args)?.send().await?; + // Tuples are used. + let deployed = MyOApp::deploy(client, (endpoint_address, delegator_address)) + .map_err(|e| { + println!("Deployment preparation error: {:?}", e); + anyhow::Error::from(e) + })? + .send() + .await + .map_err(|e| { + println!("Deployment execution error: {:?}", e); + anyhow::Error::from(e) + })?; Ok(deployed.address()) } diff --git a/core/src/solidity/contracts/SimpleIncrement.sol b/core/src/solidity/contracts/SimpleIncrement.sol deleted file mode 100644 index 015dc44..0000000 --- a/core/src/solidity/contracts/SimpleIncrement.sol +++ /dev/null @@ -1,22 +0,0 @@ -// SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; - -contract SimpleIncrement { - uint256 private _value; - - event ValueIncremented(address indexed by, uint256 newValue); - - constructor() { - _value = 0; - } - - function increment() public returns (uint256) { - _value += 1; - emit ValueIncremented(msg.sender, _value); - return _value; - } - - function getValue() public view returns (uint256) { - return _value; - } -} From 78424242ab32ac14142a0302d28f88832c25ea8f Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Tue, 8 Apr 2025 16:46:32 -0300 Subject: [PATCH 11/14] Refactor CLI and core modules with layer-zero support --- Cargo.lock | 1 + cli/src/cli.rs | 38 +++++++++++++++ cli/src/helpers.rs | 27 +++++++++++ cli/src/main.rs | 105 +++++++++++++---------------------------- core/Cargo.toml | 1 + core/src/artifacts.rs | 37 --------------- core/src/client.rs | 23 ++++++--- core/src/deployer.rs | 22 +++------ core/src/layer_zero.rs | 78 ++++++++++++++++++++++++++++++ core/src/lib.rs | 3 +- core/src/provider.rs | 44 +++++++++++++++++ 11 files changed, 248 insertions(+), 131 deletions(-) create mode 100644 cli/src/cli.rs create mode 100644 cli/src/helpers.rs delete mode 100644 core/src/artifacts.rs create mode 100644 core/src/layer_zero.rs create mode 100644 core/src/provider.rs diff --git a/Cargo.lock b/Cargo.lock index f0b2529..1c19b03 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -838,6 +838,7 @@ dependencies = [ "anyhow", "ethers", "foundry-compilers", + "foundry-config", "serde", "serde_json", "tokio", diff --git a/cli/src/cli.rs b/cli/src/cli.rs new file mode 100644 index 0000000..b0212b8 --- /dev/null +++ b/cli/src/cli.rs @@ -0,0 +1,38 @@ +use clap::{Parser, Subcommand}; + +#[derive(Parser)] +#[command(name = "deploy-cli")] +#[command(about = "Deploy contracts and manage deployer", long_about = None)] +pub struct Cli { + #[arg(long)] + pub chain: String, + + #[command(subcommand)] + pub command: Commands, +} +#[derive(Subcommand)] +pub enum Commands { + Wallet { + #[command(subcommand)] + action: WalletAction, + }, + Deploy { + #[arg(long)] + path: String, + #[arg(long, hide = true)] + password: Option, + contract: String, + }, + Compile, +} + +#[derive(Subcommand)] +pub enum WalletAction { + New, + Balance { + #[arg(long)] + path: String, + #[arg(long, hide = true)] + password: Option, + }, +} diff --git a/cli/src/helpers.rs b/cli/src/helpers.rs new file mode 100644 index 0000000..d227ea7 --- /dev/null +++ b/cli/src/helpers.rs @@ -0,0 +1,27 @@ +use ethers::providers::{Http, Provider}; +use rpassword::prompt_password; + +/// Retrieves a wallet from a keystore file. +/// +/// This function provides user prompting for password input when needed, +/// but delegates the actual keystore loading and wallet creation to the +/// `client::wallet_from_keystore` function which contains the core logic. +/// +/// # Arguments +/// * `path` - Path to the keystore file +/// * `provider` - Optional Ethereum provider +/// * `password` - Optional password (will prompt user if None) +/// +/// # Returns +/// A Result containing the loaded LocalWallet or an error +pub async fn get_wallet_from_keystore( + path: &str, + provider: Option>, + password: Option, +) -> anyhow::Result { + let password = match password { + Some(pass) => pass, + None => prompt_password("Enter password: ")?, + }; + core::client::wallet_from_keystore(path, provider, &password).await +} diff --git a/cli/src/main.rs b/cli/src/main.rs index d9c63b6..1b4d0ea 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -1,81 +1,32 @@ -use clap::{Parser, Subcommand}; +pub mod cli; +pub mod helpers; + +use crate::cli::{Cli, Commands, WalletAction}; +use clap::Parser as _; use core::compiler::compile_contract; -use core::{client, deployer}; -use ethers::providers::{Http, Middleware, Provider}; +use core::deployer; +use core::provider::get_providers_with_endpoints; +use ethers::providers::Middleware; use ethers::signers::Signer; use ethers::types::Address; -use foundry_config::Config; -use rpassword::prompt_password; use std::process::Command; -#[derive(Parser)] -#[command(name = "deploy-cli")] -#[command(about = "Deploy contracts and manage deployer", long_about = None)] -struct Cli { - #[arg(long)] - chain: String, - - #[command(subcommand)] - command: Commands, -} -#[derive(Subcommand)] -enum Commands { - Wallet { - #[command(subcommand)] - action: WalletAction, - }, - Deploy { - #[arg(long)] - path: String, - #[arg(long, hide = true)] - password: Option, - contract: String, - }, - Compile, -} - -#[derive(Subcommand)] -enum WalletAction { - New, - Balance { - #[arg(long)] - path: String, - #[arg(long, hide = true)] - password: Option, - }, -} - -async fn get_wallet_from_keystore( - path: &str, - password: Option, -) -> anyhow::Result { - let password = match password { - Some(pass) => pass, - None => prompt_password("Enter password: ")?, - }; - client::wallet_from_keystore(path, &password).await -} - -fn get_provider(chain_alias: &str) -> anyhow::Result> { - let config = Config::load(); - - let rpc_url: String = config - .get_rpc_url_with_alias(chain_alias) - .ok_or_else(|| anyhow::anyhow!("Error trying to get RPC URL from config"))? - .map_err(|e| anyhow::anyhow!("Error getting RPC URL: {}", e))? - .into_owned(); - - Provider::::try_from(rpc_url) - .map_err(|e| anyhow::anyhow!("Error instantiating provider: {}", e)) -} - #[tokio::main] async fn main() -> anyhow::Result<()> { dotenvy::dotenv().ok(); let cli = Cli::parse(); let chain = cli.chain; - let provider = get_provider(chain.as_str()).expect("Provider setup failed"); + + let providers = match get_providers_with_endpoints() { + Ok(providers) => providers, + Err(e) => return Err(e), + }; + + let rpc_info = match providers.get(chain.as_str()) { + Some(rpc_info) => rpc_info.clone(), + None => return Err(anyhow::anyhow!("Chain '{}' not found", chain)), + }; match cli.command { Commands::Wallet { action } => match action { @@ -96,9 +47,16 @@ async fn main() -> anyhow::Result<()> { ); } WalletAction::Balance { path, password } => { - let wallet = get_wallet_from_keystore(path.as_str(), password).await?; + let wallet = helpers::get_wallet_from_keystore( + path.as_str(), + Some(rpc_info.clone().provider), + password, + ) + .await?; + let addr: Address = wallet.address(); - let balance = provider.get_balance(addr, None).await?; + let balance = rpc_info.provider.get_balance(addr, None).await?; + println!( "Deployer: {:?}\nBalance: {} ETH", addr, @@ -111,8 +69,13 @@ async fn main() -> anyhow::Result<()> { password, contract, } => { - let wallet = get_wallet_from_keystore(path.as_str(), password).await?; - let addr = deployer::deploy_contract(&contract, provider, wallet).await?; + let wallet = helpers::get_wallet_from_keystore( + path.as_str(), + Some(rpc_info.provider.clone()), + password, + ) + .await?; + let addr = deployer::deploy_oapp_contract(rpc_info, wallet).await?; println!("Deployed `{}` at {:?}\n", contract, addr); } Commands::Compile => { diff --git a/core/Cargo.toml b/core/Cargo.toml index db1b8f3..ccf8f5c 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -10,3 +10,4 @@ serde_json = "1" anyhow = "1" tokio = { version = "1", features = ["full"] } foundry-compilers = "0.10.1" +foundry-config = "0.2" diff --git a/core/src/artifacts.rs b/core/src/artifacts.rs deleted file mode 100644 index c618f4d..0000000 --- a/core/src/artifacts.rs +++ /dev/null @@ -1,37 +0,0 @@ -use anyhow::{Context, Result}; -use ethers::{abi::Abi, types::Bytes, utils::hex::decode}; -use std::fs; - -fn contract_path(contract_name: &str) -> String { - let artifacts_dir = - std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("src/solidity/artifacts"); - - format!( - "{}/{}.sol/{}.json", - artifacts_dir.display(), - contract_name, - contract_name - ) -} - -pub fn load_abi(contract_name: &str) -> Result { - let path = contract_path(contract_name); - let json = - fs::read_to_string(&path).with_context(|| format!("failed to read abi from {}", path))?; - let v: serde_json::Value = serde_json::from_str(&json)?; - let abi_str = serde_json::to_string(&v["abi"])?; - let abi = serde_json::from_str(&abi_str)?; - Ok(abi) -} - -pub fn load_bytecode(contract_name: &str) -> Result { - let path = contract_path(contract_name); - let json = fs::read_to_string(&path) - .with_context(|| format!("Failed to read bytecode from {}", path))?; - let v: serde_json::Value = serde_json::from_str(&json)?; - let bytecode_str = v["bytecode"]["object"] - .as_str() - .context("Missing bytecode object")?; - let bytecode = decode(bytecode_str.strip_prefix("0x").unwrap_or(bytecode_str))?; - Ok(Bytes::from(bytecode)) -} diff --git a/core/src/client.rs b/core/src/client.rs index ce92585..6d01a2b 100644 --- a/core/src/client.rs +++ b/core/src/client.rs @@ -1,16 +1,27 @@ use anyhow::Result; -use ethers::signers::{LocalWallet, Signer, Wallet}; +use ethers::{ + providers::{Http, Middleware, Provider}, + signers::{LocalWallet, Signer, Wallet}, +}; use std::path::Path; /// Load a wallet from a keystore file. -/// `cast wallet new .` -pub async fn wallet_from_keystore(path: &str, password: &str) -> Result { +/// `cast wallet new .` is needed to call from CLI first. +pub async fn wallet_from_keystore( + path: &str, + provider: Option>, + password: &str, +) -> Result { let path = Path::new(path); let mut wallet = Wallet::decrypt_keystore(&path, password)?; - // TODO Replace with chain id from provider - let chain_id: u64 = 84532; - wallet = wallet.with_chain_id(chain_id); + match provider { + Some(provider) => { + let chain_id = provider.get_chainid().await?.as_u64(); + wallet = wallet.with_chain_id(chain_id); + } + None => (), + } println!("Wallet loaded successfully."); Ok(wallet) diff --git a/core/src/deployer.rs b/core/src/deployer.rs index 8e8fd9c..59706ec 100644 --- a/core/src/deployer.rs +++ b/core/src/deployer.rs @@ -1,27 +1,17 @@ -use crate::artifacts; +use crate::provider::RpcInfo; use anyhow::Result; use ethers::prelude::*; use std::sync::Arc; -pub async fn deploy_contract( - contract_name: &str, - provider: Provider, - wallet: LocalWallet, -) -> Result
{ - // TODO Extract - let endpoint_address = "0x6EDCE65403992e310A62460808c4b910D972f10f".parse::
()?; - let delegator_address = "0x6EDCE65403992e310A62460808c4b910D972f10f".parse::
()?; +pub async fn deploy_oapp_contract(rpc_info: RpcInfo, wallet: LocalWallet) -> Result
{ + let endpoint_address = rpc_info.endpoint; + let delegator_address = wallet.address(); - // FIXME abi is not used, is replaced by abigen! macro. Remove from artifacts module - // let abi = artifacts::load_abi(contract_name)?; - // TODO Move closer to artifact reading + // FIXME Hardcoded string abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); - // FIXME bytecode is not used, is replaced by abigen! macro. Remove from artifacts module - // let bytecode = artifacts::load_bytecode(contract_name)?; - let client = Arc::new(SignerMiddleware::new(provider, wallet)); + let client = Arc::new(SignerMiddleware::new(rpc_info.clone().provider, wallet)); - // Tuples are used. let deployed = MyOApp::deploy(client, (endpoint_address, delegator_address)) .map_err(|e| { println!("Deployment preparation error: {:?}", e); diff --git a/core/src/layer_zero.rs b/core/src/layer_zero.rs new file mode 100644 index 0000000..c670ab5 --- /dev/null +++ b/core/src/layer_zero.rs @@ -0,0 +1,78 @@ +use std::sync::Arc; + +use ethers::prelude::*; +use ethers::types::H256; + +use crate::deployer::deploy_oapp_contract; +use crate::provider::get_providers_with_endpoints; + +// TODO Make strings an enum of possible chains +pub async fn deploy_on_chains( + chains: &[String], + deployer: &LocalWallet, +) -> Result<(), anyhow::Error> { + let mut addresses = Vec::new(); + + let providers = get_providers_with_endpoints()?; + + // Deploy the oapp on each chain + for chain in chains { + println!("Deploying provider on chain {}", chain); + + let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain) { + rpc_info.clone() + } else { + println!("Chain {} not found in providers, skipping", chain); + continue; + }; + + let chain_id = rpc_info_for_current_chain + .provider + .get_chainid() + .await? + .as_u64(); + let wallet = deployer.clone().with_chain_id(chain_id); + + let oapp_addr = + deploy_oapp_contract(rpc_info_for_current_chain.clone(), wallet.clone()).await?; + addresses.push((chain.clone(), oapp_addr)); + } + + abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); + + // Set up peer connections (each with n-1 others) + for (i, (chain_i, addr_i)) in addresses.iter().enumerate() { + for (j, (chain_j, addr_j)) in addresses.iter().enumerate() { + if i != j { + println!("Connecting {} to {}", chain_i, chain_j); + // Instantiate OApp contract using its address + + let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain_i) { + rpc_info.clone() + } else { + println!("Chain {} not found in providers, skipping", chain_i); + continue; + }; + + let client = Arc::new(SignerMiddleware::new( + rpc_info_for_current_chain.clone().provider, + deployer.clone(), + )); + let oapp_contract = MyOApp::new(*addr_i, client); + + // Convert the address to the 20-byte format required by LayerZero + let peer_addr = H256::from(*addr_j).to_fixed_bytes(); + let eid = match chain_i.as_str() { + "base_sepolia" => 40245, + "optimism_sepolia" => 40232, + _ => 1, + }; + // oapp_contract + oapp_contract.set_peer(eid, peer_addr).await?; + } + } + } + + println!("Layer Zero network successfully deployed and connected!"); + Ok(()) +} diff --git a/core/src/lib.rs b/core/src/lib.rs index cc10537..f9d0dd8 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,4 +1,5 @@ -pub mod artifacts; pub mod client; pub mod compiler; pub mod deployer; +pub mod layer_zero; +pub mod provider; diff --git a/core/src/provider.rs b/core/src/provider.rs new file mode 100644 index 0000000..13d0001 --- /dev/null +++ b/core/src/provider.rs @@ -0,0 +1,44 @@ +use ethers::providers::{Http, Provider}; +use ethers::types::Address; +use foundry_config::Config; +use std::collections::HashMap; + +#[derive(Clone)] +pub struct RpcInfo { + pub provider: Provider, + pub endpoint: Address, +} + +pub fn get_providers_with_endpoints() -> anyhow::Result> { + let config = Config::load(); + + let rpc_endpoints = config.rpc_endpoints.clone(); + let mut rpc_info: HashMap = HashMap::new(); + + for (alias, raw_url) in rpc_endpoints.iter() { + let provider = Provider::::try_from(raw_url.to_string().clone()) + .map_err(|e| anyhow::anyhow!("Error instantiating provider: {}", e))?; + + let endpoint_default_address = + "0x6EDCE65403992e310A62460808c4b910D972f10f".parse::
()?; + + let endpoint = if let Some(addr_str) = + std::env::var(format!("ENDPOINT_{}", alias.to_uppercase())).ok() + { + addr_str + .parse::
() + .map_err(|_| anyhow::anyhow!("Invalid endpoint address format for {}", alias))? + } else { + endpoint_default_address + }; + + rpc_info.insert(alias.clone(), (RpcInfo { provider, endpoint }).clone()); + } + + // let result = match rpc_info.get(chain_alias) { + // Some(rpc_info) => Ok(rpc_info.clone()), + // None => Err(anyhow::anyhow!("Provider not found for {}", chain_alias)), + // }; + + Ok(rpc_info) +} From 5b870fc422ae9a51e1484465af75aa2165c528d0 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Wed, 9 Apr 2025 13:30:03 -0300 Subject: [PATCH 12/14] Refactor cross-chain OApp deployment and messaging --- Cargo.lock | 1 + cli/src/cli.rs | 3 +- cli/src/main.rs | 11 +++-- core/Cargo.toml | 1 + core/src/layer_zero.rs | 79 +++++++++++++++++++++++++++---- core/src/lib.rs | 1 + core/src/lz_options.rs | 104 +++++++++++++++++++++++++++++++++++++++++ core/src/provider.rs | 8 ++-- foundry.toml | 4 -- 9 files changed, 192 insertions(+), 20 deletions(-) create mode 100644 core/src/lz_options.rs diff --git a/Cargo.lock b/Cargo.lock index 1c19b03..b79dcb4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -836,6 +836,7 @@ name = "core" version = "0.1.0" dependencies = [ "anyhow", + "dotenvy", "ethers", "foundry-compilers", "foundry-config", diff --git a/cli/src/cli.rs b/cli/src/cli.rs index b0212b8..e83efb9 100644 --- a/cli/src/cli.rs +++ b/cli/src/cli.rs @@ -21,7 +21,8 @@ pub enum Commands { path: String, #[arg(long, hide = true)] password: Option, - contract: String, + #[arg(long, num_args = 1..)] + chainlist: Vec, }, Compile, } diff --git a/cli/src/main.rs b/cli/src/main.rs index 1b4d0ea..b90e7c1 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -4,7 +4,7 @@ pub mod helpers; use crate::cli::{Cli, Commands, WalletAction}; use clap::Parser as _; use core::compiler::compile_contract; -use core::deployer; +use core::layer_zero::deploy_on_chains; use core::provider::get_providers_with_endpoints; use ethers::providers::Middleware; use ethers::signers::Signer; @@ -28,6 +28,8 @@ async fn main() -> anyhow::Result<()> { None => return Err(anyhow::anyhow!("Chain '{}' not found", chain)), }; + println!("{:?}", rpc_info); + match cli.command { Commands::Wallet { action } => match action { WalletAction::New => { @@ -67,7 +69,7 @@ async fn main() -> anyhow::Result<()> { Commands::Deploy { path, password, - contract, + chainlist, } => { let wallet = helpers::get_wallet_from_keystore( path.as_str(), @@ -75,8 +77,9 @@ async fn main() -> anyhow::Result<()> { password, ) .await?; - let addr = deployer::deploy_oapp_contract(rpc_info, wallet).await?; - println!("Deployed `{}` at {:?}\n", contract, addr); + //let addr = deployer::deploy_oapp_contract(rpc_info, wallet).await?; + deploy_on_chains(&chainlist, &wallet).await?; + // println!("Deployed `{}` at {:?}\n", contract, addr); } Commands::Compile => { println!("Compiling contract..."); diff --git a/core/Cargo.toml b/core/Cargo.toml index ccf8f5c..8847f21 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -11,3 +11,4 @@ anyhow = "1" tokio = { version = "1", features = ["full"] } foundry-compilers = "0.10.1" foundry-config = "0.2" +dotenvy = "0.15" diff --git a/core/src/layer_zero.rs b/core/src/layer_zero.rs index c670ab5..c619a30 100644 --- a/core/src/layer_zero.rs +++ b/core/src/layer_zero.rs @@ -4,6 +4,7 @@ use ethers::prelude::*; use ethers::types::H256; use crate::deployer::deploy_oapp_contract; +use crate::lz_options::build_options_with_lz_receive; use crate::provider::get_providers_with_endpoints; // TODO Make strings an enum of possible chains @@ -13,11 +14,12 @@ pub async fn deploy_on_chains( ) -> Result<(), anyhow::Error> { let mut addresses = Vec::new(); + println!("Start"); let providers = get_providers_with_endpoints()?; // Deploy the oapp on each chain for chain in chains { - println!("Deploying provider on chain {}", chain); + println!("Deploying MyOApp on chain {}", chain); let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain) { rpc_info.clone() @@ -35,14 +37,14 @@ pub async fn deploy_on_chains( let oapp_addr = deploy_oapp_contract(rpc_info_for_current_chain.clone(), wallet.clone()).await?; - addresses.push((chain.clone(), oapp_addr)); + addresses.push((chain.clone(), oapp_addr, wallet)); } abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); // Set up peer connections (each with n-1 others) - for (i, (chain_i, addr_i)) in addresses.iter().enumerate() { - for (j, (chain_j, addr_j)) in addresses.iter().enumerate() { + for (i, (chain_i, addr_i, local_sender)) in addresses.iter().enumerate() { + for (j, (chain_j, addr_j, _)) in addresses.iter().enumerate() { if i != j { println!("Connecting {} to {}", chain_i, chain_j); // Instantiate OApp contract using its address @@ -56,23 +58,84 @@ pub async fn deploy_on_chains( let client = Arc::new(SignerMiddleware::new( rpc_info_for_current_chain.clone().provider, - deployer.clone(), + local_sender.clone(), )); - let oapp_contract = MyOApp::new(*addr_i, client); + + let oapp_contract = MyOApp::new(*addr_i, client.clone()); // Convert the address to the 20-byte format required by LayerZero let peer_addr = H256::from(*addr_j).to_fixed_bytes(); - let eid = match chain_i.as_str() { + let eid = match chain_j.as_str() { "base_sepolia" => 40245, "optimism_sepolia" => 40232, _ => 1, }; // oapp_contract - oapp_contract.set_peer(eid, peer_addr).await?; + println!("Set peer for {} with value {}", chain_i, eid); + oapp_contract.set_peer(eid, peer_addr).send().await?; + println!( + "Peers {:?} for {} in {}", + oapp_contract.peers(eid).call().await?, + addr_i, + chain_i + ); + println!("{:?}", client.get_chainid().await?); } } } + for (i, (chain_i, addr_i, local_sender)) in addresses.iter().enumerate() { + for (j, (chain_j, _addr_j, _)) in addresses.iter().enumerate() { + if i != j { + println!("Sending message from {} to {} started", chain_i, chain_j); + // Instantiate OApp contract using its address + + let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain_i) { + rpc_info.clone() + } else { + println!("Chain {} not found in providers, skipping", chain_i); + continue; + }; + + let client = Arc::new(SignerMiddleware::new( + rpc_info_for_current_chain.clone().provider, + local_sender.clone(), + )); + let oapp_contract = MyOApp::new(*addr_i, client); + + // FIXME Add all this to object RpcInfo. + let eid = match chain_j.as_str() { + "base_sepolia" => 40245, + "optimism_sepolia" => 40232, + _ => 1, + }; + let message = format!("Hi from {}", chain_i); + let adapter_params = Bytes::from(build_options_with_lz_receive(200_000, 0)); + + // quote fee + let quote_result = oapp_contract + .quote(eid, message.clone(), adapter_params.clone(), false) + .call() + .await?; + + let native_fee: U256 = quote_result.native_fee; + + // oapp_contract + let tx_request = oapp_contract + .send(eid, message, adapter_params) + .value(native_fee); + + // FIXME await borrows? + let tx = tx_request.send().await?; + + println!("Sending message from {} to {} finished", chain_i, chain_j); + println!( + "Check message status on LayerZero Scan: https://testnet.layerzeroscan.com/tx/{:?}", + tx + ); + } + } + } println!("Layer Zero network successfully deployed and connected!"); Ok(()) } diff --git a/core/src/lib.rs b/core/src/lib.rs index f9d0dd8..5031624 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -2,4 +2,5 @@ pub mod client; pub mod compiler; pub mod deployer; pub mod layer_zero; +pub mod lz_options; pub mod provider; diff --git a/core/src/lz_options.rs b/core/src/lz_options.rs new file mode 100644 index 0000000..c87cac8 --- /dev/null +++ b/core/src/lz_options.rs @@ -0,0 +1,104 @@ +use ethers::abi::{Token, encode_packed}; + +/// Encode a Solidity `uint16` as exactly 2 bytes (big-endian) as `abi.encodePacked(uint16)`. +fn encode_uint16_be(value: u16) -> Token { + // 2-byte big-endian representation + let bytes = value.to_be_bytes(); + Token::FixedBytes(bytes.to_vec()) +} + +/// Encode a Solidity `uint128` as exactly 16 bytes (big-endian) as `abi.encodePacked(uint128)`. +fn encode_uint128_be(value: u128) -> Token { + // 16-byte big-endian representation + let bytes = value.to_be_bytes(); // 16 bytes + Token::FixedBytes(bytes.to_vec()) +} + +/// Encode a Solidity `uint8` as exactly 1 byte. +fn encode_uint8(value: u8) -> Token { + Token::FixedBytes(vec![value]) +} + +// ------------------------- +// "newOptions()" -> 0x0003 +// ------------------------- + +/// Equivalent of Solidity's `newOptions() => abi.encodePacked(TYPE_3)` +fn new_options() -> Vec { + // TYPE_3 = 3 => 2 bytes big-endian: 0x0003 + let tokens = vec![encode_uint16_be(3)]; + encode_packed(&tokens).unwrap() +} + +// --------------------------------------------- +// encodeLzReceiveOption(_gas, _value) -> 16/32 bytes +// --------------------------------------------- + +/// If `_value == 0`, encode `_gas` only (16 bytes). +/// Otherwise encode `_gas` + `_value` (32 bytes). +fn encode_lz_receive_option(gas: u128, value: u128) -> Vec { + let gas_token = encode_uint128_be(gas); + + if value == 0 { + // Single 16-byte chunk + encode_packed(&[gas_token]).unwrap() + } else { + // 16 bytes for gas + 16 bytes for value => 32 total + let value_token = encode_uint128_be(value); + encode_packed(&[gas_token, value_token]).unwrap() + } +} + +// ----------------------------------------------------- +// addExecutorOption(_options, _optionType, _optionData) +// ----------------------------------------------------- + +/// Equivalent to: +/// abi.encodePacked( +/// _options, +/// WORKER_ID (1 byte), +/// uint16(_option.length + 1), // 2 bytes +/// _optionType (1 byte), +/// _option +/// ) +fn add_executor_option(existing: &[u8], option_type: u8, new_option: &[u8]) -> Vec { + let worker_id: u8 = 1; // WORKER_ID + let length = (new_option.len() + 1) as u16; + + // Build tokens in the same order as abi.encodePacked + let tokens = vec![ + // existing `bytes` + Token::Bytes(existing.to_vec()), // The previous bytes + // worker_id => 1 byte + encode_uint8(worker_id), + // length => 2 bytes big-endian + encode_uint16_be(length), + // optionType => 1 byte + encode_uint8(option_type), + // new_option => dynamic bytes + Token::Bytes(new_option.to_vec()), + ]; + + encode_packed(&tokens).unwrap() +} + +// ----------------------------------------------------- +// addExecutorLzReceiveOption(_options, gas, value) +// ----------------------------------------------------- + +/// `_options` -> add the "lzReceive" sub-option (with `_gas`, `_value`) +fn add_executor_lz_receive_option(options: &[u8], gas: u128, value: u128) -> Vec { + // Build the sub-option data + let opt_data = encode_lz_receive_option(gas, value); + + // OPTION_TYPE_LZRECEIVE = 1 + let option_type_lzreceive = 1u8; + add_executor_option(options, option_type_lzreceive, &opt_data) +} + +/// This replicates: +/// `Options.newOptions().addExecutorLzReceiveOption(gas, value).toBytes()` +pub fn build_options_with_lz_receive(gas: u128, value: u128) -> Vec { + let base = new_options(); // => 0x0003 + add_executor_lz_receive_option(&base, gas, value) +} diff --git a/core/src/provider.rs b/core/src/provider.rs index 13d0001..9a5767a 100644 --- a/core/src/provider.rs +++ b/core/src/provider.rs @@ -1,20 +1,22 @@ +use dotenvy; use ethers::providers::{Http, Provider}; use ethers::types::Address; use foundry_config::Config; use std::collections::HashMap; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct RpcInfo { pub provider: Provider, pub endpoint: Address, } pub fn get_providers_with_endpoints() -> anyhow::Result> { + dotenvy::dotenv().ok(); // load .env let config = Config::load(); + println!("Config {:?}", config); let rpc_endpoints = config.rpc_endpoints.clone(); let mut rpc_info: HashMap = HashMap::new(); - for (alias, raw_url) in rpc_endpoints.iter() { let provider = Provider::::try_from(raw_url.to_string().clone()) .map_err(|e| anyhow::anyhow!("Error instantiating provider: {}", e))?; @@ -32,7 +34,7 @@ pub fn get_providers_with_endpoints() -> anyhow::Result endpoint_default_address }; - rpc_info.insert(alias.clone(), (RpcInfo { provider, endpoint }).clone()); + rpc_info.insert(alias.clone(), RpcInfo { provider, endpoint }); } // let result = match rpc_info.get(chain_alias) { diff --git a/foundry.toml b/foundry.toml index 6136251..3bb845d 100644 --- a/foundry.toml +++ b/foundry.toml @@ -4,10 +4,6 @@ out = "out" libs = ["lib"] [rpc_endpoints] -arbitrum = "https://arb-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" arbitrum_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -avalanche = "https://avax-mainnet.g.alchemy.com/v2/${API_KEY_ALCHEMY}" base_sepolia = "https://base-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -optimism = "https://1rpc.io/op" optimism_sepolia = "https://opt-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -sepolia = "https://eth-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" From af860d3b831ef40e3a0310fb44c8c609bdd17c30 Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Wed, 9 Apr 2025 20:38:31 -0300 Subject: [PATCH 13/14] refactor --- Cargo.lock | 1 + cli/src/main.rs | 81 ++++++++----- core/Cargo.toml | 1 + core/src/chain.rs | 61 ++++++++++ core/src/deployer.rs | 19 +-- core/src/layer_zero.rs | 256 ++++++++++++++++++++++++----------------- core/src/lib.rs | 1 + core/src/lz_options.rs | 2 + core/src/provider.rs | 71 +++++++----- foundry.toml | 8 +- 10 files changed, 322 insertions(+), 179 deletions(-) create mode 100644 core/src/chain.rs diff --git a/Cargo.lock b/Cargo.lock index b79dcb4..de96e26 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -840,6 +840,7 @@ dependencies = [ "ethers", "foundry-compilers", "foundry-config", + "futures", "serde", "serde_json", "tokio", diff --git a/cli/src/main.rs b/cli/src/main.rs index b90e7c1..0a62d33 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -3,13 +3,15 @@ pub mod helpers; use crate::cli::{Cli, Commands, WalletAction}; use clap::Parser as _; +use core::chain::SupportedChain; use core::compiler::compile_contract; -use core::layer_zero::deploy_on_chains; -use core::provider::get_providers_with_endpoints; +use core::layer_zero::{deploy_on_chains, setup_peer_connections}; +use core::provider::build_chain_clients; use ethers::providers::Middleware; use ethers::signers::Signer; use ethers::types::Address; use std::process::Command; +use std::str::FromStr; #[tokio::main] async fn main() -> anyhow::Result<()> { @@ -18,18 +20,6 @@ async fn main() -> anyhow::Result<()> { let cli = Cli::parse(); let chain = cli.chain; - let providers = match get_providers_with_endpoints() { - Ok(providers) => providers, - Err(e) => return Err(e), - }; - - let rpc_info = match providers.get(chain.as_str()) { - Some(rpc_info) => rpc_info.clone(), - None => return Err(anyhow::anyhow!("Chain '{}' not found", chain)), - }; - - println!("{:?}", rpc_info); - match cli.command { Commands::Wallet { action } => match action { WalletAction::New => { @@ -49,15 +39,14 @@ async fn main() -> anyhow::Result<()> { ); } WalletAction::Balance { path, password } => { - let wallet = helpers::get_wallet_from_keystore( - path.as_str(), - Some(rpc_info.clone().provider), - password, - ) - .await?; + let wallet = + helpers::get_wallet_from_keystore(path.as_str(), None, password).await?; let addr: Address = wallet.address(); - let balance = rpc_info.provider.get_balance(addr, None).await?; + let chain_object = SupportedChain::from_str(&chain).unwrap(); + let clients = build_chain_clients(&wallet).await?; + let provider = clients.get(&chain_object).unwrap().provider(); + let balance = provider.get_balance(addr, None).await?; println!( "Deployer: {:?}\nBalance: {} ETH", @@ -71,15 +60,47 @@ async fn main() -> anyhow::Result<()> { password, chainlist, } => { - let wallet = helpers::get_wallet_from_keystore( - path.as_str(), - Some(rpc_info.provider.clone()), - password, - ) - .await?; - //let addr = deployer::deploy_oapp_contract(rpc_info, wallet).await?; - deploy_on_chains(&chainlist, &wallet).await?; - // println!("Deployed `{}` at {:?}\n", contract, addr); + let wallet = helpers::get_wallet_from_keystore(path.as_str(), None, password).await?; + + let supported_chains = chainlist + .iter() + .map(|chain_str| { + chain_str + .parse::() + .expect("Invalid chain") + }) + .collect::>(); + + let deployed = deploy_on_chains(&supported_chains, &wallet).await?; + for (chain, addr) in supported_chains.iter().zip(deployed.iter()) { + println!("Chain {}: Deployed contract at address: {:?}", chain, addr); + } + + // TODO make this optional + setup_peer_connections(&wallet, &deployed).await?; + // Send cross-chain message from each chain to every other chain + println!("Sending cross-chain messages..."); + for (src_idx, src_chain) in supported_chains.iter().enumerate() { + for (dst_idx, dst_chain) in supported_chains.iter().enumerate() { + if src_idx != dst_idx { + let message = format!("Hi {} from {}", dst_chain, src_chain); + match core::layer_zero::send_cross_chain_message( + &wallet, &deployed, src_chain, dst_chain, message, + ) + .await + { + Ok(_) => println!( + "Successfully sent message from {} to {}", + src_chain, dst_chain + ), + Err(e) => println!( + "Failed to send message from {} to {}: {}", + src_chain, dst_chain, e + ), + } + } + } + } } Commands::Compile => { println!("Compiling contract..."); diff --git a/core/Cargo.toml b/core/Cargo.toml index 8847f21..7ac70d7 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -12,3 +12,4 @@ tokio = { version = "1", features = ["full"] } foundry-compilers = "0.10.1" foundry-config = "0.2" dotenvy = "0.15" +futures = "0.3.31" diff --git a/core/src/chain.rs b/core/src/chain.rs new file mode 100644 index 0000000..10f7f4c --- /dev/null +++ b/core/src/chain.rs @@ -0,0 +1,61 @@ +use ethers::types::Address; +use std::str::FromStr; + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum SupportedChain { + BaseSepolia, + OptimismSepolia, + ArbitrumSepolia, + GnosisChiado, + LineaSepolia, +} + +impl std::fmt::Display for SupportedChain { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + SupportedChain::BaseSepolia => write!(f, "base_sepolia"), + SupportedChain::OptimismSepolia => write!(f, "optimism_sepolia"), + SupportedChain::ArbitrumSepolia => write!(f, "arbitrum_sepolia"), + SupportedChain::GnosisChiado => write!(f, "gnosis_chiado"), + SupportedChain::LineaSepolia => write!(f, "linea_sepolia"), + } + } +} + +impl FromStr for SupportedChain { + type Err = String; + + fn from_str(s: &str) -> Result { + match s.to_lowercase().as_str() { + "base_sepolia" => Ok(SupportedChain::BaseSepolia), + "optimism_sepolia" => Ok(SupportedChain::OptimismSepolia), + "arbitrum_sepolia" => Ok(SupportedChain::ArbitrumSepolia), + "gnosis_chiado" => Ok(SupportedChain::GnosisChiado), + "linea_sepolia" => Ok(SupportedChain::LineaSepolia), + _ => Err(format!("Unsupported chain alias: {}", s)), + } + } +} + +impl SupportedChain { + pub fn lz_endpoint_id(&self) -> u32 { + match self { + SupportedChain::BaseSepolia => 40245, + SupportedChain::OptimismSepolia => 40232, + SupportedChain::ArbitrumSepolia => 40231, + SupportedChain::GnosisChiado => 40145, + SupportedChain::LineaSepolia => 40287, + } + } + pub fn endpoint_address(&self) -> Address { + match self { + SupportedChain::BaseSepolia + | SupportedChain::OptimismSepolia + | SupportedChain::ArbitrumSepolia + | SupportedChain::GnosisChiado + | SupportedChain::LineaSepolia => "0x6EDCE65403992e310A62460808c4b910D972f10f" + .parse::
() + .unwrap(), + } + } +} diff --git a/core/src/deployer.rs b/core/src/deployer.rs index 59706ec..8b2e5e8 100644 --- a/core/src/deployer.rs +++ b/core/src/deployer.rs @@ -1,18 +1,19 @@ -use crate::provider::RpcInfo; use anyhow::Result; use ethers::prelude::*; -use std::sync::Arc; -pub async fn deploy_oapp_contract(rpc_info: RpcInfo, wallet: LocalWallet) -> Result
{ - let endpoint_address = rpc_info.endpoint; - let delegator_address = wallet.address(); +use crate::{chain::SupportedChain, provider::ChainClient}; - // FIXME Hardcoded string - abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); +// FIXME Hardcoded string +abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); - let client = Arc::new(SignerMiddleware::new(rpc_info.clone().provider, wallet)); +pub async fn deploy_oapp_contract( + chain: &SupportedChain, + chain_client: &ChainClient, +) -> Result
{ + let endpoint_address = chain.endpoint_address(); + let delegator_address = chain_client.address(); - let deployed = MyOApp::deploy(client, (endpoint_address, delegator_address)) + let deployed = MyOApp::deploy(chain_client.clone(), (endpoint_address, delegator_address)) .map_err(|e| { println!("Deployment preparation error: {:?}", e); anyhow::Error::from(e) diff --git a/core/src/layer_zero.rs b/core/src/layer_zero.rs index c619a30..791914a 100644 --- a/core/src/layer_zero.rs +++ b/core/src/layer_zero.rs @@ -1,141 +1,181 @@ -use std::sync::Arc; +use std::collections::HashMap; use ethers::prelude::*; use ethers::types::H256; +use futures::future::join_all; +use crate::chain::SupportedChain; use crate::deployer::deploy_oapp_contract; use crate::lz_options::build_options_with_lz_receive; -use crate::provider::get_providers_with_endpoints; +use crate::provider::build_chain_clients; -// TODO Make strings an enum of possible chains +abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); pub async fn deploy_on_chains( - chains: &[String], + chains: &[SupportedChain], deployer: &LocalWallet, -) -> Result<(), anyhow::Error> { - let mut addresses = Vec::new(); - - println!("Start"); - let providers = get_providers_with_endpoints()?; - - // Deploy the oapp on each chain - for chain in chains { - println!("Deploying MyOApp on chain {}", chain); - - let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain) { - rpc_info.clone() - } else { - println!("Chain {} not found in providers, skipping", chain); - continue; - }; - - let chain_id = rpc_info_for_current_chain - .provider - .get_chainid() - .await? - .as_u64(); - let wallet = deployer.clone().with_chain_id(chain_id); - - let oapp_addr = - deploy_oapp_contract(rpc_info_for_current_chain.clone(), wallet.clone()).await?; - addresses.push((chain.clone(), oapp_addr, wallet)); +) -> Result, anyhow::Error> { + let chain_clients = build_chain_clients(deployer).await?; + + // Deploy the oapp on each chain using tokio + let mut chain_addresses = HashMap::new(); + + let futures = chains.iter().map(|chain| { + let chain_client = chain_clients.get(chain).unwrap().clone(); + let chain_clone = chain.clone(); + async move { + println!("Deploying MyOApp on chain {}", chain_clone); + let oapp_addr = deploy_oapp_contract(&chain_clone, &chain_client).await?; + Ok::<(SupportedChain, H160), anyhow::Error>((chain_clone, oapp_addr)) + } + }); + + let results = join_all(futures).await; + + for result in results { + let (chain, addr) = result?; + chain_addresses.insert(chain, addr); } - abigen!(MyOApp, "core/src/solidity/artifacts/MyOApp.sol/MyOApp.json"); + Ok(chain_addresses) +} + +pub async fn setup_peer_connections( + deployer: &LocalWallet, + addresses: &HashMap, +) -> Result<(), anyhow::Error> { + let chain_clients = build_chain_clients(deployer).await?; // Set up peer connections (each with n-1 others) - for (i, (chain_i, addr_i, local_sender)) in addresses.iter().enumerate() { - for (j, (chain_j, addr_j, _)) in addresses.iter().enumerate() { - if i != j { + for chain_i in addresses.keys() { + for chain_j in addresses.keys() { + if chain_i != chain_j { println!("Connecting {} to {}", chain_i, chain_j); - // Instantiate OApp contract using its address - - let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain_i) { - rpc_info.clone() - } else { - println!("Chain {} not found in providers, skipping", chain_i); - continue; - }; - let client = Arc::new(SignerMiddleware::new( - rpc_info_for_current_chain.clone().provider, - local_sender.clone(), - )); + let addr_i = addresses.get(chain_i).unwrap(); + let addr_j = addresses.get(chain_j).unwrap(); + let client = chain_clients.get(chain_i).unwrap().clone(); + // Instantiate OApp contract using its address let oapp_contract = MyOApp::new(*addr_i, client.clone()); // Convert the address to the 20-byte format required by LayerZero let peer_addr = H256::from(*addr_j).to_fixed_bytes(); - let eid = match chain_j.as_str() { - "base_sepolia" => 40245, - "optimism_sepolia" => 40232, - _ => 1, - }; + let eid = chain_j.lz_endpoint_id(); + // oapp_contract println!("Set peer for {} with value {}", chain_i, eid); oapp_contract.set_peer(eid, peer_addr).send().await?; - println!( - "Peers {:?} for {} in {}", - oapp_contract.peers(eid).call().await?, - addr_i, - chain_i - ); - println!("{:?}", client.get_chainid().await?); } } } + Ok(()) +} - for (i, (chain_i, addr_i, local_sender)) in addresses.iter().enumerate() { - for (j, (chain_j, _addr_j, _)) in addresses.iter().enumerate() { - if i != j { - println!("Sending message from {} to {} started", chain_i, chain_j); - // Instantiate OApp contract using its address +pub async fn send_cross_chain_message( + deployer: &LocalWallet, + addresses: &HashMap, + source_chain: &SupportedChain, + destination_chain: &SupportedChain, + message: String, +) -> Result { + if source_chain == destination_chain { + return Err(anyhow::anyhow!( + "Source and destination chains must be different" + )); + } - let rpc_info_for_current_chain = if let Some(rpc_info) = providers.get(chain_i) { - rpc_info.clone() - } else { - println!("Chain {} not found in providers, skipping", chain_i); - continue; - }; - - let client = Arc::new(SignerMiddleware::new( - rpc_info_for_current_chain.clone().provider, - local_sender.clone(), - )); - let oapp_contract = MyOApp::new(*addr_i, client); - - // FIXME Add all this to object RpcInfo. - let eid = match chain_j.as_str() { - "base_sepolia" => 40245, - "optimism_sepolia" => 40232, - _ => 1, - }; - let message = format!("Hi from {}", chain_i); - let adapter_params = Bytes::from(build_options_with_lz_receive(200_000, 0)); - - // quote fee - let quote_result = oapp_contract - .quote(eid, message.clone(), adapter_params.clone(), false) - .call() - .await?; - - let native_fee: U256 = quote_result.native_fee; + if !addresses.contains_key(source_chain) || !addresses.contains_key(destination_chain) { + return Err(anyhow::anyhow!( + "Source or destination chain not found in addresses" + )); + } - // oapp_contract - let tx_request = oapp_contract - .send(eid, message, adapter_params) - .value(native_fee); - - // FIXME await borrows? - let tx = tx_request.send().await?; - - println!("Sending message from {} to {} finished", chain_i, chain_j); - println!( - "Check message status on LayerZero Scan: https://testnet.layerzeroscan.com/tx/{:?}", - tx - ); + let chain_clients = build_chain_clients(deployer).await?; + let source_addr = addresses.get(source_chain).unwrap(); + let client = chain_clients.get(source_chain).unwrap().clone(); + + // Instantiate OApp contract using its address + let oapp_contract = MyOApp::new(*source_addr, client); + + // Get the endpoint ID for the destination chain + let eid = destination_chain.lz_endpoint_id(); + + // Prepare adapter params + let adapter_params = Bytes::from(build_options_with_lz_receive(200_000, 0)); + + // Quote the fee + let quote_result = oapp_contract + .quote(eid, message.clone(), adapter_params.clone(), false) + .call() + .await?; + + let native_fee: U256 = quote_result.native_fee; + + // Send the message + println!( + "Sending message from {} to {}", + source_chain, destination_chain + ); + let tx = oapp_contract + .send(eid, message, adapter_params) + .value(native_fee); + + let tx_hash = tx.send().await?.tx_hash(); + + println!( + "Message sent from {} to {}. Transaction hash: {:?}", + source_chain, destination_chain, tx_hash + ); + println!( + "Check message status on LayerZero Scan: https://testnet.layerzeroscan.com/tx/{:?}", + tx_hash + ); + + Ok(tx_hash) +} + +pub async fn send_messages_to_all_chains( + deployer: &LocalWallet, + addresses: &HashMap, + source_chain: &SupportedChain, + message: String, +) -> Result, anyhow::Error> { + if !addresses.contains_key(source_chain) { + return Err(anyhow::anyhow!("Source chain not found in addresses")); + } + + let futures = addresses + .keys() + .filter(|&chain| chain != source_chain) + .map(|dest_chain| { + let deployer_clone = deployer.clone(); + let addresses_clone = addresses.clone(); + let source_chain_clone = source_chain.clone(); + let dest_chain_clone = dest_chain.clone(); + let message_clone = message.clone(); + + async move { + send_cross_chain_message( + &deployer_clone, + &addresses_clone, + &source_chain_clone, + &dest_chain_clone, + message_clone, + ) + .await } + }); + + let results = join_all(futures).await; + + // Collect successful transaction hashes + let mut tx_hashes = Vec::new(); + for result in results { + match result { + Ok(hash) => tx_hashes.push(hash), + Err(e) => println!("Error sending message: {}", e), } } - println!("Layer Zero network successfully deployed and connected!"); - Ok(()) + + Ok(tx_hashes) } diff --git a/core/src/lib.rs b/core/src/lib.rs index 5031624..f2149b7 100644 --- a/core/src/lib.rs +++ b/core/src/lib.rs @@ -1,3 +1,4 @@ +pub mod chain; pub mod client; pub mod compiler; pub mod deployer; diff --git a/core/src/lz_options.rs b/core/src/lz_options.rs index c87cac8..2c728cb 100644 --- a/core/src/lz_options.rs +++ b/core/src/lz_options.rs @@ -1,5 +1,7 @@ use ethers::abi::{Token, encode_packed}; +// ChatGPT Translation of required functions. +// TODO improve and use builder pattern with all features and testing. /// Encode a Solidity `uint16` as exactly 2 bytes (big-endian) as `abi.encodePacked(uint16)`. fn encode_uint16_be(value: u16) -> Token { // 2-byte big-endian representation diff --git a/core/src/provider.rs b/core/src/provider.rs index 9a5767a..a46d9b5 100644 --- a/core/src/provider.rs +++ b/core/src/provider.rs @@ -1,46 +1,59 @@ use dotenvy; -use ethers::providers::{Http, Provider}; -use ethers::types::Address; -use foundry_config::Config; +use ethers::middleware::SignerMiddleware; +use ethers::providers::{Http, Middleware, Provider}; +use ethers::signers::{LocalWallet, Signer}; +use foundry_config::{Config, RpcEndpoint}; use std::collections::HashMap; +use std::str::FromStr; +use std::sync::Arc; -#[derive(Clone, Debug)] -pub struct RpcInfo { - pub provider: Provider, - pub endpoint: Address, -} +use crate::chain::SupportedChain; + +pub type ProviderHttp = Provider; +pub type WalletLocal = LocalWallet; +pub type ChainMiddleware = SignerMiddleware; +pub type ChainClient = Arc; -pub fn get_providers_with_endpoints() -> anyhow::Result> { +pub fn get_rpc_endpoints_from_foundry_config() +-> anyhow::Result> { dotenvy::dotenv().ok(); // load .env + let config = Config::load(); println!("Config {:?}", config); - let rpc_endpoints = config.rpc_endpoints.clone(); - let mut rpc_info: HashMap = HashMap::new(); + let mut rpc_endpoints = HashMap::new(); + for (alias, endpoint) in config.rpc_endpoints.iter() { + match SupportedChain::from_str(alias) { + Ok(supported_chain) => { + rpc_endpoints.insert(supported_chain, endpoint.clone()); + } + Err(e) => { + eprintln!("Chain alias is not supported: {}", e); + continue; + } + } + } + Ok(rpc_endpoints) +} + +pub async fn build_chain_clients( + wallet: &LocalWallet, +) -> anyhow::Result> { + let rpc_endpoints = get_rpc_endpoints_from_foundry_config().unwrap(); + + let mut clients: HashMap = HashMap::new(); for (alias, raw_url) in rpc_endpoints.iter() { let provider = Provider::::try_from(raw_url.to_string().clone()) .map_err(|e| anyhow::anyhow!("Error instantiating provider: {}", e))?; - let endpoint_default_address = - "0x6EDCE65403992e310A62460808c4b910D972f10f".parse::
()?; + let chain_id = provider.get_chainid().await?.as_u64(); - let endpoint = if let Some(addr_str) = - std::env::var(format!("ENDPOINT_{}", alias.to_uppercase())).ok() - { - addr_str - .parse::
() - .map_err(|_| anyhow::anyhow!("Invalid endpoint address format for {}", alias))? - } else { - endpoint_default_address - }; + let signer_middleware = + SignerMiddleware::new(provider, wallet.clone().with_chain_id(chain_id)); + let arc_client = Arc::new(signer_middleware); - rpc_info.insert(alias.clone(), RpcInfo { provider, endpoint }); + clients.insert(alias.clone(), arc_client); } - // let result = match rpc_info.get(chain_alias) { - // Some(rpc_info) => Ok(rpc_info.clone()), - // None => Err(anyhow::anyhow!("Provider not found for {}", chain_alias)), - // }; - - Ok(rpc_info) + Ok(clients) } diff --git a/foundry.toml b/foundry.toml index 3bb845d..168fb7d 100644 --- a/foundry.toml +++ b/foundry.toml @@ -4,6 +4,8 @@ out = "out" libs = ["lib"] [rpc_endpoints] -arbitrum_sepolia = "https://arb-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -base_sepolia = "https://base-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" -optimism_sepolia = "https://opt-sepolia.g.alchemy.com/v2/${API_KEY_ALCHEMY}" +arbitrum_sepolia = "https://arb-sepolia.g.alchemy.com/v2/xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" +base_sepolia = "https://base-sepolia.g.alchemy.com/v2/xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" +optimism_sepolia = "https://opt-sepolia.g.alchemy.com/v2/xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" +gnosis_chiado = "https://gnosis-chiado.g.alchemy.com/v2/xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" +linea_sepolia = "https://linea-sepolia.g.alchemy.com/v2/xKOtf2A3zmDOAX34JC42TkIsuW0kYfmX" From e25f11b1a99c34774eada49c10f5bc50a706b48c Mon Sep 17 00:00:00 2001 From: Maximiliano Molina Date: Thu, 10 Apr 2025 11:56:19 -0300 Subject: [PATCH 14/14] Update provider to use NonceManagerMiddleware --- core/src/deployer.rs | 4 +++- core/src/layer_zero.rs | 9 +++++++-- core/src/provider.rs | 13 +++++++------ 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/core/src/deployer.rs b/core/src/deployer.rs index 8b2e5e8..8cb0a03 100644 --- a/core/src/deployer.rs +++ b/core/src/deployer.rs @@ -11,7 +11,9 @@ pub async fn deploy_oapp_contract( chain_client: &ChainClient, ) -> Result
{ let endpoint_address = chain.endpoint_address(); - let delegator_address = chain_client.address(); + + let underlying_signer = chain_client.inner(); // returns &SignerMiddleware, LocalWallet> + let delegator_address = underlying_signer.signer().address(); let deployed = MyOApp::deploy(chain_client.clone(), (endpoint_address, delegator_address)) .map_err(|e| { diff --git a/core/src/layer_zero.rs b/core/src/layer_zero.rs index 791914a..2d2e649 100644 --- a/core/src/layer_zero.rs +++ b/core/src/layer_zero.rs @@ -64,7 +64,9 @@ pub async fn setup_peer_connections( // oapp_contract println!("Set peer for {} with value {}", chain_i, eid); - oapp_contract.set_peer(eid, peer_addr).send().await?; + let call = oapp_contract.set_peer(eid, peer_addr); + let _pending_tx = call.send().await?; + // pending_tx.confirmations(1).await?; // using nonce manager } } } @@ -120,7 +122,9 @@ pub async fn send_cross_chain_message( .send(eid, message, adapter_params) .value(native_fee); - let tx_hash = tx.send().await?.tx_hash(); + let receipt = tx.send().await?; + let tx_hash = receipt.tx_hash(); + // receipt.confirmations(1).await?; // using nonce manager println!( "Message sent from {} to {}. Transaction hash: {:?}", @@ -134,6 +138,7 @@ pub async fn send_cross_chain_message( Ok(tx_hash) } +// TODO Is possible to parallelize this function but only for a given source chain fixed pub async fn send_messages_to_all_chains( deployer: &LocalWallet, addresses: &HashMap, diff --git a/core/src/provider.rs b/core/src/provider.rs index a46d9b5..da1d2dd 100644 --- a/core/src/provider.rs +++ b/core/src/provider.rs @@ -1,5 +1,5 @@ use dotenvy; -use ethers::middleware::SignerMiddleware; +use ethers::middleware::{NonceManagerMiddleware, SignerMiddleware}; use ethers::providers::{Http, Middleware, Provider}; use ethers::signers::{LocalWallet, Signer}; use foundry_config::{Config, RpcEndpoint}; @@ -11,7 +11,7 @@ use crate::chain::SupportedChain; pub type ProviderHttp = Provider; pub type WalletLocal = LocalWallet; -pub type ChainMiddleware = SignerMiddleware; +pub type ChainMiddleware = NonceManagerMiddleware>; pub type ChainClient = Arc; pub fn get_rpc_endpoints_from_foundry_config() @@ -19,7 +19,6 @@ pub fn get_rpc_endpoints_from_foundry_config() dotenvy::dotenv().ok(); // load .env let config = Config::load(); - println!("Config {:?}", config); let mut rpc_endpoints = HashMap::new(); for (alias, endpoint) in config.rpc_endpoints.iter() { @@ -48,9 +47,11 @@ pub async fn build_chain_clients( let chain_id = provider.get_chainid().await?.as_u64(); - let signer_middleware = - SignerMiddleware::new(provider, wallet.clone().with_chain_id(chain_id)); - let arc_client = Arc::new(signer_middleware); + let signer = SignerMiddleware::new(provider, wallet.clone().with_chain_id(chain_id)); + let address = signer.address(); + let nonce_manager = NonceManagerMiddleware::new(signer, address); + + let arc_client = Arc::new(nonce_manager); clients.insert(alias.clone(), arc_client); }