From bb7071c042805c6f3f653ef6056408769cdf5113 Mon Sep 17 00:00:00 2001 From: Roberts Pumpurs <33699735+roberts-pumpurs@users.noreply.github.com> Date: Fri, 1 Nov 2024 10:02:44 +0200 Subject: [PATCH] feat: remove all solana references (#29) --- CONTRIBUTING.md | 2 +- Cargo.lock | 7150 ++--------------- Cargo.toml | 32 +- README.md | 2 +- config.example.toml | 26 - crates/common-serde-utils/Cargo.toml | 5 - crates/common-serde-utils/src/lib.rs | 25 - crates/effective-tx-sender/Cargo.toml | 20 - crates/effective-tx-sender/src/lib.rs | 219 - crates/file-based-storage/Cargo.toml | 18 - crates/file-based-storage/src/lib.rs | 140 - crates/retrying-solana-http-sender/Cargo.toml | 25 - crates/retrying-solana-http-sender/src/lib.rs | 130 - crates/solana-axelar-relayer/Cargo.toml | 38 - crates/solana-axelar-relayer/build.rs | 13 - crates/solana-axelar-relayer/src/main.rs | 192 - crates/solana-axelar-relayer/src/telemetry.rs | 136 - crates/solana-event-forwarder/Cargo.toml | 29 - .../solana-event-forwarder/src/component.rs | 529 -- crates/solana-event-forwarder/src/config.rs | 29 - crates/solana-event-forwarder/src/lib.rs | 7 - .../solana-gateway-task-processor/Cargo.toml | 37 - .../src/component.rs | 668 -- .../src/config.rs | 163 - .../solana-gateway-task-processor/src/lib.rs | 7 - crates/solana-listener/Cargo.toml | 29 - crates/solana-listener/src/component.rs | 99 - .../src/component/log_processor.rs | 79 - .../src/component/signature_batch_scanner.rs | 193 - .../component/signature_realtime_scanner.rs | 138 - crates/solana-listener/src/config.rs | 87 - crates/solana-listener/src/lib.rs | 8 - deny.toml | 5 - doc/adr/0001-record-architecture-decisions.md | 19 - doc/adr/0002-configuration.md | 40 - doc/adr/0003-solana-event-fetching.md | 64 - doc/adr/0004-solana-tx-sending.md | 50 - 37 files changed, 896 insertions(+), 9557 deletions(-) delete mode 100644 config.example.toml delete mode 100644 crates/effective-tx-sender/Cargo.toml delete mode 100644 crates/effective-tx-sender/src/lib.rs delete mode 100644 crates/file-based-storage/Cargo.toml delete mode 100644 crates/file-based-storage/src/lib.rs delete mode 100644 crates/retrying-solana-http-sender/Cargo.toml delete mode 100644 crates/retrying-solana-http-sender/src/lib.rs delete mode 100644 crates/solana-axelar-relayer/Cargo.toml delete mode 100644 crates/solana-axelar-relayer/build.rs delete mode 100644 crates/solana-axelar-relayer/src/main.rs delete mode 100644 crates/solana-axelar-relayer/src/telemetry.rs delete mode 100644 crates/solana-event-forwarder/Cargo.toml delete mode 100644 crates/solana-event-forwarder/src/component.rs delete mode 100644 crates/solana-event-forwarder/src/config.rs delete mode 100644 crates/solana-event-forwarder/src/lib.rs delete mode 100644 crates/solana-gateway-task-processor/Cargo.toml delete mode 100644 crates/solana-gateway-task-processor/src/component.rs delete mode 100644 crates/solana-gateway-task-processor/src/config.rs delete mode 100644 crates/solana-gateway-task-processor/src/lib.rs delete mode 100644 crates/solana-listener/Cargo.toml delete mode 100644 crates/solana-listener/src/component.rs delete mode 100644 crates/solana-listener/src/component/log_processor.rs delete mode 100644 crates/solana-listener/src/component/signature_batch_scanner.rs delete mode 100644 crates/solana-listener/src/component/signature_realtime_scanner.rs delete mode 100644 crates/solana-listener/src/config.rs delete mode 100644 crates/solana-listener/src/lib.rs delete mode 100644 doc/adr/0001-record-architecture-decisions.md delete mode 100644 doc/adr/0002-configuration.md delete mode 100644 doc/adr/0003-solana-event-fetching.md delete mode 100644 doc/adr/0004-solana-tx-sending.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 4aa0d55..c5c6f74 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ -# Contributing to Solana Axelar Relayer +# Contributing to Axelar Relayer Core First off, thanks for taking the time to contribute! 🎉👍 diff --git a/Cargo.lock b/Cargo.lock index a0f1e48..47b626e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 4 -[[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.21.0" @@ -33,53 +23,6 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "512761e0bb2578dd7380c6baaa0f4ce03e84f95e960231d1dec8bf4d7d6e2627" -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[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 = "aes-gcm-siv" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae0784134ba9375416d469ec31e7c5f9fa94405049cf08c5ce5b4698be673e0d" -dependencies = [ - "aead", - "aes", - "cipher", - "ctr", - "polyval", - "subtle", - "zeroize", -] - -[[package]] -name = "ahash" -version = "0.7.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" -dependencies = [ - "getrandom 0.2.15", - "once_cell", - "version_check", -] - [[package]] name = "ahash" version = "0.8.11" @@ -87,7 +30,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if", - "getrandom 0.2.15", "once_cell", "version_check", "zerocopy", @@ -102,128 +44,22 @@ dependencies = [ "memchr", ] -[[package]] -name = "alloc-no-stdlib" -version = "2.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" - -[[package]] -name = "alloc-stdlib" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" -dependencies = [ - "alloc-no-stdlib", -] - [[package]] name = "allocator-api2" version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" -[[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.18", - "hex-literal", - "itoa", - "k256", - "keccak-asm", - "proptest", - "rand 0.8.5", - "ruint", - "serde", - "tiny-keccak", -] - -[[package]] -name = "alloy-rlp" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" -dependencies = [ - "arrayvec", - "bytes", -] - -[[package]] -name = "alloy-sol-macro" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b40397ddcdcc266f59f959770f601ce1280e699a91fc1862f29cef91707cd09" -dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "alloy-sol-macro-expander" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "867a5469d61480fea08c7333ffeca52d5b621f5ca2e44f271b117ec1fc9a0525" -dependencies = [ - "alloy-sol-macro-input", - "const-hex", - "heck", - "indexmap 2.6.0", - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", - "syn-solidity", - "tiny-keccak", -] - -[[package]] -name = "alloy-sol-macro-input" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e482dc33a32b6fadbc0f599adea520bd3aaa585c141a80b404d0a3e3fa72528" -dependencies = [ - "const-hex", - "dunce", - "heck", - "proc-macro2", - "quote", - "syn 2.0.85", - "syn-solidity", -] - -[[package]] -name = "alloy-sol-types" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a91ca40fa20793ae9c3841b83e74569d1cc9af29a2f5237314fd3452d51e38c7" -dependencies = [ - "alloy-primitives", - "alloy-sol-macro", - "const-hex", - "serde", -] - [[package]] name = "amplifier-api" version = "0.1.0" dependencies = [ - "base64 0.22.1", - "bnum 0.12.0", + "base64", + "bnum", "chrono", "pretty_assertions", "redact", - "reqwest 0.12.8", + "reqwest", "rstest", "serde", "simd-json", @@ -250,15 +86,6 @@ dependencies = [ "libc", ] -[[package]] -name = "ansi_term" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" -dependencies = [ - "winapi", -] - [[package]] name = "anstream" version = "0.6.15" @@ -309,6299 +136,1556 @@ dependencies = [ ] [[package]] -name = "anyhow" -version = "1.0.91" +name = "async-compression" +version = "0.4.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c042108f3ed77fd83760a5fd79b53be043192bb3b9dba91d8c574c0ada7850c8" +checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" +dependencies = [ + "flate2", + "futures-core", + "memchr", + "pin-project-lite", + "tokio", +] [[package]] -name = "ark-bn254" -version = "0.4.0" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a22f4561524cd949590d78d7d4c5df8f592430d221f7f3c9497bbafd8972120f" -dependencies = [ - "ark-ec", - "ark-ff 0.4.2", - "ark-std 0.4.0", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "ark-ec" -version = "0.4.2" +name = "autocfg" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba" -dependencies = [ - "ark-ff 0.4.2", - "ark-poly", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "hashbrown 0.13.2", - "itertools 0.10.5", - "num-traits", - "zeroize", -] +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] -name = "ark-ff" -version = "0.3.0" +name = "backtrace" +version = "0.3.71" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" 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 0.4.6", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide 0.7.4", + "object", + "rustc-demangle", ] [[package]] -name = "ark-ff" -version = "0.4.2" +name = "base64" +version = "0.22.1" 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 0.4.6", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "ark-ff-asm" -version = "0.3.0" +name = "bitflags" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" -dependencies = [ - "quote", - "syn 1.0.109", -] +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" [[package]] -name = "ark-ff-asm" -version = "0.4.2" +name = "bnum" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" -dependencies = [ - "quote", - "syn 1.0.109", -] +checksum = "50202def95bf36cb7d1d7a7962cea1c36a3f8ad42425e5d2b71d7acb8041b5b8" [[package]] -name = "ark-ff-macros" -version = "0.3.0" +name = "bumpalo" +version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "quote", - "syn 1.0.109", -] +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" [[package]] -name = "ark-ff-macros" -version = "0.4.2" +name = "byteorder" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint 0.4.6", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] -name = "ark-poly" -version = "0.4.2" +name = "bytes" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf" -dependencies = [ - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "hashbrown 0.13.2", -] +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" [[package]] -name = "ark-serialize" -version = "0.3.0" +name = "cc" +version = "1.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" +checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", + "shlex", ] [[package]] -name = "ark-serialize" -version = "0.4.2" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" -dependencies = [ - "ark-serialize-derive", - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint 0.4.6", -] +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "ark-serialize-derive" -version = "0.4.2" +name = "chrono" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.6", ] [[package]] -name = "ark-std" -version = "0.3.0" +name = "clap" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" dependencies = [ - "num-traits", - "rand 0.8.5", + "clap_builder", + "clap_derive", ] [[package]] -name = "ark-std" -version = "0.4.0" +name = "clap_builder" +version = "4.5.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" dependencies = [ - "num-traits", - "rand 0.8.5", + "anstream", + "anstyle", + "clap_lex", + "strsim", ] [[package]] -name = "arrayref" -version = "0.3.9" +name = "clap_derive" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "arrayvec" -version = "0.7.6" +name = "clap_lex" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] -name = "ascii" -version = "0.9.3" +name = "color-eyre" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eab1c04a571841102f5345a8fc0f6bb3d31c315dec879b5c6e42e40ce7ffa34e" +checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" +dependencies = [ + "backtrace", + "color-spantrace", + "eyre", + "indenter", + "once_cell", + "owo-colors", + "tracing-error", +] [[package]] -name = "asn1-rs" -version = "0.5.2" +name = "color-spantrace" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6fd5ddaf0351dff5b8da21b2fb4ff8e08ddd02857f0bf69c47639106c0fff0" +checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" dependencies = [ - "asn1-rs-derive", - "asn1-rs-impl", - "displaydoc", - "nom", - "num-traits", - "rusticata-macros", - "thiserror", - "time", + "once_cell", + "owo-colors", + "tracing-core", + "tracing-error", ] [[package]] -name = "asn1-rs-derive" -version = "0.4.0" +name = "colorchoice" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726535892e8eae7e70657b4c8ea93d26b8553afb1ce617caee529ef96d7dee6c" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "common-serde-utils" +version = "0.1.0" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "synstructure", + "serde", ] [[package]] -name = "asn1-rs-impl" -version = "0.1.0" +name = "cordyceps" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2777730b2039ac0f95f093556e61b6d26cebed5393ca6f152717777cec3a42ed" +checksum = "ec10f0a762d93c4498d2e97a333805cb6250d60bead623f71d8034f9a4152ba3" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "loom", + "tracing", ] [[package]] -name = "assert_matches" -version = "1.5.0" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "async-channel" -version = "1.9.0" +name = "crc32fast" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", + "cfg-if", ] [[package]] -name = "async-compression" -version = "0.4.17" +name = "crossbeam-utils" +version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857" -dependencies = [ - "brotli", - "flate2", - "futures-core", - "memchr", - "pin-project-lite", - "tokio", -] +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" [[package]] -name = "async-mutex" -version = "1.4.0" +name = "diatomic-waker" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e" -dependencies = [ - "event-listener", -] +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" [[package]] -name = "async-stream" -version = "0.3.6" +name = "diff" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] +checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" [[package]] -name = "async-stream-impl" -version = "0.3.6" +name = "equivalent" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "async-trait" -version = "0.1.83" +name = "eyre" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", + "indenter", + "once_cell", ] [[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" - -[[package]] -name = "atty" -version = "0.2.14" +name = "fastrand" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" dependencies = [ - "hermit-abi 0.1.19", - "libc", - "winapi", + "instant", ] [[package]] -name = "auto_impl" -version = "1.2.0" +name = "fixedbitset" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] -name = "autocfg" -version = "1.4.0" +name = "flate2" +version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" - -[[package]] -name = "axelar-executable" -version = "0.1.0" -source = "git+https://github.com/eigerco/solana-axelar.git?branch=main#09c8619fb9dc3ea61cf855150886266f01f208a7" +checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" dependencies = [ - "axelar-message-primitives", - "axelar-rkyv-encoding", - "borsh 1.5.1", - "gmp-gateway", - "solana-program", + "crc32fast", + "miniz_oxide 0.8.0", ] [[package]] -name = "axelar-message-primitives" -version = "0.1.0" -source = "git+https://github.com/eigerco/solana-axelar.git?branch=main#09c8619fb9dc3ea61cf855150886266f01f208a7" -dependencies = [ - "alloy-sol-types", - "anyhow", - "bnum 0.10.0", - "borsh 1.5.1", - "bytemuck", - "ethers-core", - "hex", - "libsecp256k1", - "rkyv", - "sha3 0.10.8", - "solana-program", - "thiserror", +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" +dependencies = [ + "num-traits", ] [[package]] -name = "axelar-rkyv-encoding" -version = "0.1.0" -source = "git+https://github.com/eigerco/solana-axelar.git?branch=main#09c8619fb9dc3ea61cf855150886266f01f208a7" -dependencies = [ - "bnum 0.10.0", - "bs58", - "ed25519-dalek 2.1.1", - "hex", - "libsecp256k1", - "rkyv", - "sha3 0.10.8", - "solana-program", - "thiserror", -] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "axum" -version = "0.7.7" +name = "form_urlencoded" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "504e3947307ac8326a5437504c517c4b56716c9d98fac0028c2acc7ca47d70ae" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ - "async-trait", - "axum-core", - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", "percent-encoding", - "pin-project-lite", - "rustversion", - "serde", - "sync_wrapper 1.0.1", - "tower 0.5.1", - "tower-layer", - "tower-service", ] [[package]] -name = "axum-core" -version = "0.4.5" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "async-trait", - "bytes", + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "mime", - "pin-project-lite", - "rustversion", - "sync_wrapper 1.0.1", - "tower-layer", - "tower-service", ] [[package]] -name = "backoff" -version = "0.4.0" +name = "futures-buffered" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62ddb9cb1ec0a098ad4bbf9344d0713fa193ae1a80af55febcff2627b6a00c1" +checksum = "34acda8ae8b63fbe0b2195c998b180cff89a8212fb2622a78b572a9f1c6f7684" dependencies = [ + "cordyceps", + "diatomic-waker", "futures-core", - "getrandom 0.2.15", - "instant", "pin-project-lite", - "rand 0.8.5", - "tokio", ] [[package]] -name = "backtrace" -version = "0.3.71" +name = "futures-channel" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide 0.7.4", - "object", - "rustc-demangle", + "futures-core", + "futures-sink", ] [[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff" - -[[package]] -name = "base64" -version = "0.13.1" +name = "futures-concurrency" +version = "7.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "d9b724496da7c26fcce66458526ce68fc2ecf4aaaa994281cf322ded5755520c" +dependencies = [ + "fixedbitset", + "futures-buffered", + "futures-core", + "futures-lite", + "pin-project", + "slab", + "smallvec", +] [[package]] -name = "base64" -version = "0.21.7" +name = "futures-core" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] -name = "base64" -version = "0.22.1" +name = "futures-executor" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] [[package]] -name = "base64ct" -version = "1.6.0" +name = "futures-io" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] -name = "bincode" -version = "1.3.3" +name = "futures-lite" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" dependencies = [ - "serde", + "fastrand", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", ] [[package]] -name = "bit-set" -version = "0.5.3" +name = "futures-macro" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "bit-vec", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "bit-vec" -version = "0.6.3" +name = "futures-sink" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] -name = "bitflags" -version = "1.3.2" +name = "futures-task" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] -name = "bitflags" -version = "2.6.0" +name = "futures-timer" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" -dependencies = [ - "serde", -] +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] -name = "bitvec" -version = "1.0.1" +name = "futures-util" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ - "funty", - "radium", - "tap", - "wyz", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", ] [[package]] -name = "blake3" -version = "1.5.1" +name = "generator" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30cca6d3674597c30ddf2c587bf8d9d65c9a84d2326d941cc79c9842dfe0ef52" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" dependencies = [ - "arrayref", - "arrayvec", "cc", - "cfg-if", - "constant_time_eq", - "digest 0.10.7", + "libc", + "log", + "rustversion", + "windows", ] [[package]] -name = "block-buffer" -version = "0.9.0" +name = "getrandom" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" dependencies = [ - "block-padding", - "generic-array", + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", ] [[package]] -name = "block-buffer" -version = "0.10.4" +name = "gimli" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] -name = "block-padding" -version = "0.2.1" +name = "glob" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] -name = "bnum" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56953345e39537a3e18bdaeba4cb0c58a78c1f61f361dc0fa7c5c7340ae87c5f" -dependencies = [ - "serde", - "serde-big-array", -] - -[[package]] -name = "bnum" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50202def95bf36cb7d1d7a7962cea1c36a3f8ad42425e5d2b71d7acb8041b5b8" - -[[package]] -name = "borsh" -version = "0.10.4" +name = "h2" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115e54d64eb62cdebad391c19efc9dce4981c690c85a33a12199d99bb9546fee" +checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" dependencies = [ - "borsh-derive 0.10.4", - "hashbrown 0.13.2", + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "borsh" -version = "1.5.1" +name = "halfbrown" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6362ed55def622cddc70a4746a68554d7b687713770de539e59a739b249f8ed" +checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" dependencies = [ - "borsh-derive 1.5.1", - "cfg_aliases 0.2.1", + "hashbrown 0.14.5", + "serde", ] [[package]] -name = "borsh-derive" -version = "0.10.4" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "831213f80d9423998dd696e2c5345aba6be7a0bd8cd19e31c5243e13df1cef89" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate 0.1.5", - "proc-macro2", - "syn 1.0.109", + "ahash", + "allocator-api2", ] [[package]] -name = "borsh-derive" -version = "1.5.1" +name = "hashbrown" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ef8005764f53cd4dca619f5bf64cafd4664dada50ece25e4d81de54c80cc0b" -dependencies = [ - "once_cell", - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 2.0.85", - "syn_derive", -] +checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" [[package]] -name = "borsh-derive-internal" -version = "0.10.4" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65d6ba50644c98714aa2a70d13d7df3cd75cd2b523a2b452bf010443800976b3" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "borsh-schema-derive-internal" -version = "0.10.4" +name = "hermit-abi" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "276691d96f063427be83e6692b86148e488ebba9f48f77788724ca027ba3b6d4" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] -name = "brotli" -version = "7.0.0" +name = "http" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc97b8f16f944bba54f0433f07e30be199b6dc2bd25937444bbad560bcea29bd" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", - "brotli-decompressor", + "bytes", + "fnv", + "itoa", ] [[package]] -name = "brotli-decompressor" -version = "4.0.1" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a45bd2e4095a8b518033b128020dd4a55aab1c0a381ba4404a472630f4bc362" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "alloc-no-stdlib", - "alloc-stdlib", + "bytes", + "http", ] [[package]] -name = "bs58" -version = "0.5.1" +name = "http-body-util" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" +checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ - "tinyvec", + "bytes", + "futures-util", + "http", + "http-body", + "pin-project-lite", ] [[package]] -name = "bumpalo" -version = "3.16.0" +name = "httparse" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] -name = "bv" -version = "0.11.1" +name = "hyper" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8834bb1d8ee5dc048ee3124f2c7c1afcc6bc9aed03f11e9dfd8c69470a5db340" +checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" dependencies = [ - "feature-probe", - "serde", + "bytes", + "futures-channel", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", ] [[package]] -name = "byte-slice-cast" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" - -[[package]] -name = "bytecheck" -version = "0.6.12" +name = "hyper-rustls" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", + "futures-util", + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", + "webpki-roots", ] [[package]] -name = "bytecheck_derive" -version = "0.6.12" +name = "hyper-util" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "bytemuck" -version = "1.19.0" +name = "iana-time-zone" +version = "0.1.61" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" +checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" dependencies = [ - "bytemuck_derive", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "bytemuck_derive" -version = "1.8.0" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcfcc3cd946cb52f0bbfdbbcfa2f4e24f75ebb6c0e1002f7c25904fada18b9ec" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", + "cc", ] [[package]] -name = "byteorder" -version = "1.5.0" +name = "idna" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] [[package]] -name = "bytes" -version = "1.8.0" +name = "indenter" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" -dependencies = [ - "serde", -] +checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" [[package]] -name = "caps" -version = "0.5.5" +name = "indexmap" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190baaad529bcfbde9e1a19022c42781bdb6ff9de25721abdb8fd98c0807730b" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ - "libc", - "thiserror", + "equivalent", + "hashbrown 0.15.0", ] [[package]] -name = "cc" -version = "1.1.31" +name = "instant" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" dependencies = [ - "jobserver", - "libc", - "shlex", + "cfg-if", ] [[package]] -name = "cfg-if" -version = "1.0.0" +name = "ipnet" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] -name = "cfg_aliases" -version = "0.1.1" +name = "is_terminal_polyfill" +version = "1.70.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" [[package]] -name = "cfg_aliases" -version = "0.2.1" +name = "itoa" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] -name = "chrono" -version = "0.4.38" +name = "js-sys" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ - "android-tzdata", - "iana-time-zone", - "js-sys", - "num-traits", - "serde", "wasm-bindgen", - "windows-targets 0.52.6", ] [[package]] -name = "cipher" -version = "0.4.4" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", -] +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "clap" -version = "2.34.0" +name = "lexical-core" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c" +checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458" dependencies = [ - "ansi_term", - "atty", - "bitflags 1.3.2", - "strsim 0.8.0", - "textwrap 0.11.0", - "unicode-width", - "vec_map", + "lexical-parse-float", + "lexical-parse-integer", + "lexical-util", + "lexical-write-float", + "lexical-write-integer", ] [[package]] -name = "clap" -version = "3.2.25" +name = "lexical-parse-float" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123" +checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0" dependencies = [ - "atty", - "bitflags 1.3.2", - "clap_lex 0.2.4", - "indexmap 1.9.3", - "once_cell", - "strsim 0.10.0", - "termcolor", - "textwrap 0.16.1", + "lexical-parse-integer", + "lexical-util", + "static_assertions", ] [[package]] -name = "clap" -version = "4.5.20" +name = "lexical-parse-integer" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61" dependencies = [ - "clap_builder", - "clap_derive", + "lexical-util", + "static_assertions", ] [[package]] -name = "clap_builder" -version = "4.5.20" +name = "lexical-util" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0" dependencies = [ - "anstream", - "anstyle", - "clap_lex 0.7.2", - "strsim 0.11.1", + "static_assertions", ] [[package]] -name = "clap_derive" -version = "4.5.18" +name = "lexical-write-float" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809" dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.85", + "lexical-util", + "lexical-write-integer", + "static_assertions", ] [[package]] -name = "clap_lex" -version = "0.2.4" +name = "lexical-write-integer" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5" +checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162" dependencies = [ - "os_str_bytes", + "lexical-util", + "static_assertions", ] [[package]] -name = "clap_lex" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" - -[[package]] -name = "color-eyre" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55146f5e46f237f7423d74111267d4597b59b0dad0ffaf7303bce9945d843ad5" -dependencies = [ - "backtrace", - "color-spantrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", - "tracing-error", -] - -[[package]] -name = "color-spantrace" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2" -dependencies = [ - "once_cell", - "owo-colors", - "tracing-core", - "tracing-error", -] - -[[package]] -name = "colorchoice" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" - -[[package]] -name = "combine" -version = "3.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3da6baa321ec19e1cc41d31bf599f00c783d0517095cdaf0332e3fe8d20680" -dependencies = [ - "ascii", - "byteorder", - "either", - "memchr", - "unreachable", -] - -[[package]] -name = "common-serde-utils" -version = "0.1.0" -dependencies = [ - "serde", - "solana-sdk", - "tracing", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" +name = "libc" +version = "0.2.161" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] +checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" [[package]] -name = "console" -version = "0.15.8" +name = "log" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.52.0", -] +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" [[package]] -name = "console_error_panic_hook" -version = "0.1.7" +name = "loom" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a06aeb73f470f66dcdbf7223caeebb85984942f22f1adb2a088cf9668146bbbc" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" dependencies = [ "cfg-if", - "wasm-bindgen", -] - -[[package]] -name = "console_log" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89f72f65e8501878b8a004d5a1afb780987e2ce2b4532c562e367a72c57499f" -dependencies = [ - "log", - "web-sys", + "generator", + "scoped-tls", + "tracing", + "tracing-subscriber", ] [[package]] -name = "const-hex" -version = "1.13.1" +name = "matchers" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0121754e84117e65f9d90648ee6aa4882a6e63110307ab73967a4c5e7e69e586" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" dependencies = [ - "cfg-if", - "cpufeatures", - "hex", - "proptest", - "serde", + "regex-automata 0.1.10", ] [[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "constant_time_eq" -version = "0.3.1" +name = "memchr" +version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c74b8349d32d297c9134b8c88677813a227df8f779daa29bfc29c183fe3dca6" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" [[package]] -name = "convert_case" -version = "0.4.0" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "cordyceps" -version = "0.3.2" +name = "miniz_oxide" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec10f0a762d93c4498d2e97a333805cb6250d60bead623f71d8034f9a4152ba3" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" dependencies = [ - "loom", - "tracing", + "adler", ] [[package]] -name = "core-foundation" -version = "0.9.4" +name = "miniz_oxide" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" dependencies = [ - "core-foundation-sys", - "libc", + "adler2", ] [[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.14" +name = "mio" +version = "0.8.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", + "wasi", + "windows-sys 0.48.0", ] [[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-channel" -version = "0.5.13" +name = "nu-ansi-term" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" dependencies = [ - "crossbeam-utils", + "overload", + "winapi", ] [[package]] -name = "crossbeam-deque" -version = "0.8.5" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "autocfg", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "num_cpus" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "crossbeam-utils", + "hermit-abi", + "libc", ] [[package]] -name = "crossbeam-utils" -version = "0.8.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" +name = "object" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", + "memchr", ] [[package]] -name = "crypto-common" -version = "0.1.6" +name = "once_cell" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] -name = "crypto-mac" -version = "0.8.0" +name = "overload" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array", - "subtle", -] +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] -name = "ctr" -version = "0.9.2" +name = "owo-colors" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] - -[[package]] -name = "curve25519-dalek" -version = "3.2.1" -source = "git+https://github.com/dalek-cryptography/curve25519-dalek?rev=8274d5cbb6fc3f38cdc742b4798173895cd2a290#8274d5cbb6fc3f38cdc742b4798173895cd2a290" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.5.1", - "serde", - "subtle", - "zeroize", -] +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "parking" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version 0.4.1", - "subtle", - "zeroize", -] +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "percent-encoding" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] -name = "darling" -version = "0.20.10" +name = "pin-project" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f63b86c8a8826a49b8c21f08a2d07338eec8d900540f8630dc76284be802989" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ - "darling_core", - "darling_macro", + "pin-project-internal", ] [[package]] -name = "darling_core" -version = "0.20.10" +name = "pin-project-internal" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95133861a8032aaea082871032f5815eb9e98cef03fa916ab4500513994df9e5" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ - "fnv", - "ident_case", "proc-macro2", "quote", - "strsim 0.11.1", - "syn 2.0.85", -] - -[[package]] -name = "darling_macro" -version = "0.20.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" -dependencies = [ - "darling_core", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "data-encoding" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8566979429cf69b49a5c740c60791108e86440e8be149bbea4fe54d2c32d6e2" - -[[package]] -name = "der" -version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0" -dependencies = [ - "const-oid", - "zeroize", + "syn", ] [[package]] -name = "der-parser" -version = "8.2.0" +name = "pin-project-lite" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbd676fbbab537128ef0278adb5576cf363cff6aa22a7b24effe97347cfab61e" -dependencies = [ - "asn1-rs", - "displaydoc", - "nom", - "num-bigint 0.4.6", - "num-traits", - "rusticata-macros", -] +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] -name = "deranged" -version = "0.3.11" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" -dependencies = [ - "powerfmt", -] +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "derivation-path" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e5c37193a1db1d8ed868c03ec7b152175f26160a5b740e5e484143877e0adf0" - -[[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_more" -version = "0.99.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f33878137e4dafd7fa914ad4e259e18a4e8e532b9617a2d0150262bf53abfce" -dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.85", -] - -[[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.85", -] - -[[package]] -name = "dialoguer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" -dependencies = [ - "console", - "shell-words", - "tempfile", - "zeroize", -] - -[[package]] -name = "diatomic-waker" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" - -[[package]] -name = "diff" -version = "0.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" -dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common", - "subtle", -] - -[[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.85", -] - -[[package]] -name = "dlopen2" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b4f5f101177ff01b8ec4ecc81eead416a8aa42819a2869311b3420fa114ffa" -dependencies = [ - "dlopen2_derive", - "libc", - "once_cell", - "winapi", -] - -[[package]] -name = "dlopen2_derive" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cbae11b3de8fce2a456e8ea3dada226b35fe791f0dc1d360c0941f0bb681f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "downcast" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "eager" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abe71d579d1812060163dff96056261deb5bf6729b100fa2e36a68b9649ba3d3" - -[[package]] -name = "ecdsa" -version = "0.16.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" -dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature 2.2.0", - "spki", -] - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature 1.6.4", -] - -[[package]] -name = "ed25519" -version = "2.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" -dependencies = [ - "pkcs8", - "signature 2.2.0", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c762bae6dcaf24c4c84667b8579785430908723d5c889f469d76a41d59cc7a9d" -dependencies = [ - "curve25519-dalek 3.2.1", - "ed25519 1.5.3", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "zeroize", -] - -[[package]] -name = "ed25519-dalek" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871" -dependencies = [ - "curve25519-dalek 4.1.3", - "ed25519 2.2.3", - "serde", - "sha2 0.10.8", - "subtle", - "zeroize", -] - -[[package]] -name = "ed25519-dalek-bip32" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d2be62a4061b872c8c0873ee4fc6f101ce7b889d039f019c5fa2af471a59908" -dependencies = [ - "derivation-path", - "ed25519-dalek 1.0.1", - "hmac 0.12.1", - "sha2 0.10.8", -] - -[[package]] -name = "effective-tx-sender" -version = "0.1.0" -dependencies = [ - "eyre", - "futures", - "itertools 0.12.1", - "solana-client", - "solana-sdk", - "thiserror", - "tracing", -] - -[[package]] -name = "either" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" - -[[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 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", -] - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[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 = "enum-iterator" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fd242f399be1da0a5354aa462d57b4ab2b4ee0683cc552f7c007d2d12d36e94" -dependencies = [ - "enum-iterator-derive", -] - -[[package]] -name = "enum-iterator-derive" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ab991c1362ac86c61ab6f556cff143daa22e5a15e4e189df818b2fd19fe65b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "env_logger" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7" -dependencies = [ - "atty", - "humantime", - "log", - "regex", - "termcolor", -] - -[[package]] -name = "equivalent" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" - -[[package]] -name = "errno" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[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 0.10.8", - "thiserror", - "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-core" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82d80cc6ad30b14a48ab786523af33b37f28a8623fc06afd55324816ef18fb1f" -dependencies = [ - "arrayvec", - "bytes", - "chrono", - "const-hex", - "elliptic-curve", - "ethabi", - "generic-array", - "k256", - "num_enum", - "open-fastrlp", - "rand 0.8.5", - "rlp", - "serde", - "serde_json", - "strum", - "tempfile", - "thiserror", - "tiny-keccak", - "unicode-xid", -] - -[[package]] -name = "event-listener" -version = "2.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" - -[[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 = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" -dependencies = [ - "instant", -] - -[[package]] -name = "fastrand" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" - -[[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 = "feature-probe" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835a3dc7d1ec9e75e2b5fb4ba75396837112d2060b03f7d43bc1897c7f7211da" - -[[package]] -name = "ff" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" -dependencies = [ - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "file-based-storage" -version = "0.1.0" -dependencies = [ - "amplifier-api", - "bytemuck", - "memmap2 0.9.5", - "relayer-amplifier-state", - "tracing", -] - -[[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.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - -[[package]] -name = "flate2" -version = "1.0.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1b589b4dc103969ad3cf85c950899926ec64300a1a46d76c03a6072957036f0" -dependencies = [ - "crc32fast", - "miniz_oxide 0.8.0", -] - -[[package]] -name = "float-cmp" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" -dependencies = [ - "num-traits", -] - -[[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 = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - -[[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-buffered" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34acda8ae8b63fbe0b2195c998b180cff89a8212fb2622a78b572a9f1c6f7684" -dependencies = [ - "cordyceps", - "diatomic-waker", - "futures-core", - "pin-project-lite", -] - -[[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-concurrency" -version = "7.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b724496da7c26fcce66458526ce68fc2ecf4aaaa994281cf322ded5755520c" -dependencies = [ - "fixedbitset", - "futures-buffered", - "futures-core", - "futures-lite", - "pin-project", - "slab", - "smallvec", -] - -[[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-lite" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" -dependencies = [ - "fastrand 1.9.0", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - -[[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.85", -] - -[[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" - -[[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 = "generator" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" -dependencies = [ - "cc", - "libc", - "log", - "rustversion", - "windows", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "serde", - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "gethostname" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.2.15" -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]] -name = "gimli" -version = "0.28.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" - -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - -[[package]] -name = "gmp-gateway" -version = "0.1.0" -source = "git+https://github.com/eigerco/solana-axelar.git?branch=main#09c8619fb9dc3ea61cf855150886266f01f208a7" -dependencies = [ - "arrayref", - "axelar-message-primitives", - "axelar-rkyv-encoding", - "base64 0.21.7", - "bincode", - "bitflags 2.6.0", - "bitvec", - "borsh 1.5.1", - "hex", - "itertools 0.12.1", - "libsecp256k1", - "num-derive", - "num-traits", - "program-utils", - "rkyv", - "rs_merkle", - "solana-program", - "thiserror", -] - -[[package]] -name = "goblin" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7666983ed0dd8d21a6f6576ee00053ca0926fb281a5522577a4dbd0f1b54143" -dependencies = [ - "log", - "plain", - "scroll", -] - -[[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 0.2.12", - "indexmap 2.6.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "h2" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http 1.1.0", - "indexmap 2.6.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "halfbrown" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8588661a8607108a5ca69cab034063441a0413a0b041c13618a7dd348021ef6f" -dependencies = [ - "hashbrown 0.14.5", - "serde", -] - -[[package]] -name = "hash32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" -dependencies = [ - "byteorder", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.8", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.11", -] - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash 0.8.11", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb" - -[[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.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33" -dependencies = [ - "libc", -] - -[[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 = "histogram" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cb882ccb290b8646e554b157ab0b71e64e8d5bef775cd66b6531e52d302669" - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac", - "digest 0.9.0", -] - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest 0.9.0", - "generic-array", - "hmac 0.8.1", -] - -[[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" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" -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 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.1.0", -] - -[[package]] -name = "http-body-util" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" -dependencies = [ - "bytes", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" - -[[package]] -name = "hyper" -version = "0.14.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" -dependencies = [ - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", - "want", -] - -[[package]] -name = "hyper" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "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 0.2.12", - "hyper 0.14.31", - "rustls 0.21.12", - "tokio", - "tokio-rustls 0.24.1", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08afdbb5c31130e3034af566421053ab03787c640246a446327f550d11bcb333" -dependencies = [ - "futures-util", - "http 1.1.0", - "hyper 1.5.0", - "hyper-util", - "rustls 0.23.15", - "rustls-pki-types", - "tokio", - "tokio-rustls 0.26.0", - "tower-service", - "webpki-roots 0.26.6", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3203a961e5c83b6f5498933e78b6b263e208c197b63e9c6c53cc82ffd3f63793" -dependencies = [ - "hyper 1.5.0", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41296eb09f183ac68eec06e03cdbea2e759633d4067b2f6552fc2e009bcad08b" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http 1.1.0", - "http-body 1.0.1", - "hyper 1.5.0", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "235e081f3925a06703c2d0117ea8b91f042756fd6e7a6e5d901e8ca1a996b220" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "wasm-bindgen", - "windows-core", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[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.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "indenter" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683" - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", -] - -[[package]] -name = "indexmap" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" -dependencies = [ - "equivalent", - "hashbrown 0.15.0", -] - -[[package]] -name = "indicatif" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763a5a8f45087d6bcea4222e7b72c291a054edf80e4ef6efd2a4979878c7bea3" -dependencies = [ - "console", - "instant", - "number_prefix", - "portable-atomic", - "unicode-width", -] - -[[package]] -name = "indoc" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5" - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -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.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" - -[[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.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" - -[[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.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "jsonrpc-core" -version = "18.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" -dependencies = [ - "futures", - "futures-executor", - "futures-util", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[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 0.10.8", -] - -[[package]] -name = "keccak" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" -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 = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" - -[[package]] -name = "lexical-core" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0431c65b318a590c1de6b8fd6e72798c92291d27762d94c9e6c37ed7a73d8458" -dependencies = [ - "lexical-parse-float", - "lexical-parse-integer", - "lexical-util", - "lexical-write-float", - "lexical-write-integer", -] - -[[package]] -name = "lexical-parse-float" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb17a4bdb9b418051aa59d41d65b1c9be5affab314a872e5ad7f06231fb3b4e0" -dependencies = [ - "lexical-parse-integer", - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-parse-integer" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5df98f4a4ab53bf8b175b363a34c7af608fe31f93cc1fb1bf07130622ca4ef61" -dependencies = [ - "lexical-util", - "static_assertions", -] - -[[package]] -name = "lexical-util" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85314db53332e5c192b6bca611fb10c114a80d1b831ddac0af1e9be1b9232ca0" -dependencies = [ - "static_assertions", -] - -[[package]] -name = "lexical-write-float" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7c3ad4e37db81c1cbe7cf34610340adc09c322871972f74877a712abc6c809" -dependencies = [ - "lexical-util", - "lexical-write-integer", - "static_assertions", -] - -[[package]] -name = "lexical-write-integer" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb89e9f6958b83258afa3deed90b5de9ef68eef090ad5086c791cd2345610162" -dependencies = [ - "lexical-util", - "static_assertions", -] - -[[package]] -name = "libc" -version = "0.2.161" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1" - -[[package]] -name = "libm" -version = "0.2.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" - -[[package]] -name = "libsecp256k1" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9d220bc1feda2ac231cb78c3d26f27676b8cf82c96971f7aeef3d0cf2797c73" -dependencies = [ - "arrayref", - "base64 0.12.3", - "digest 0.9.0", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand 0.7.3", - "serde", - "sha2 0.9.9", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f6ab710cec28cef759c5f18671a27dae2a5f952cdaaee1d8e2908cb2478a80" -dependencies = [ - "crunchy", - "digest 0.9.0", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccab96b584d38fac86a83f07e659f0deafd0253dc096dab5a36d53efe653c5c3" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67abfe149395e3aa1c48a2beb32b068e2334402df8181f818d3aee2b304c4f5d" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" - -[[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.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" - -[[package]] -name = "loom" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" -dependencies = [ - "cfg-if", - "generator", - "scoped-tls", - "tracing", - "tracing-subscriber", -] - -[[package]] -name = "matchers" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" -dependencies = [ - "regex-automata 0.1.10", -] - -[[package]] -name = "matchit" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" - -[[package]] -name = "memchr" -version = "2.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" - -[[package]] -name = "memmap2" -version = "0.5.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" -dependencies = [ - "libc", -] - -[[package]] -name = "memmap2" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f" -dependencies = [ - "libc", -] - -[[package]] -name = "memoffset" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" -dependencies = [ - "autocfg", -] - -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "mime_guess" -version = "2.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" -dependencies = [ - "mime", - "unicase", -] - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" -dependencies = [ - "adler", -] - -[[package]] -name = "miniz_oxide" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2d80299ef12ff69b16a84bb182e3b9df68b5a91574d3d4fa6e41b65deec4df1" -dependencies = [ - "adler2", -] - -[[package]] -name = "mio" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" -dependencies = [ - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", - "windows-sys 0.48.0", -] - -[[package]] -name = "mockall" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4c28b3fb6d753d28c20e826cd46ee611fda1cf3cde03a443a974043247c065a" -dependencies = [ - "cfg-if", - "downcast", - "fragile", - "mockall_derive", - "predicates", - "predicates-tree", -] - -[[package]] -name = "mockall_derive" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "341014e7f530314e9a1fdbc7400b244efea7122662c96bfa248c31da5bfb2020" -dependencies = [ - "cfg-if", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "nix" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab2156c4fce2f8df6c499cc1c763e4394b7482525bf2a9701c9d79d215f519e4" -dependencies = [ - "bitflags 2.6.0", - "cfg-if", - "cfg_aliases 0.1.1", - "libc", - "memoffset", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nu-ansi-term" -version = "0.46.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" -dependencies = [ - "overload", - "winapi", -] - -[[package]] -name = "num" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8536030f9fea7127f841b45bb6243b27255787fb4eb83958aa1ef9d2fdc0c36" -dependencies = [ - "num-bigint 0.2.6", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[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-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg", - "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-derive" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[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-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c000134b5dbf44adc5cb772486d335293351644b801551abe8f75c84cfa4aef" -dependencies = [ - "autocfg", - "num-bigint 0.2.6", - "num-integer", - "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 0.3.9", - "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 3.2.0", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[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.32.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" -dependencies = [ - "memchr", -] - -[[package]] -name = "oid-registry" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bedf36ffb6ba96c2eb7144ef6270557b52e54b20c0a8e1eb2ff99a6c6959bff" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[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 = "openssl-probe" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" - -[[package]] -name = "opentelemetry" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "803801d3d3b71cd026851a53f974ea03df3d179cb758b260136a6c9e22e196af" -dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "once_cell", - "pin-project-lite", - "thiserror", -] - -[[package]] -name = "opentelemetry-appender-tracing" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11338a346937cdcce64971604422817318c1301145ca845e01c21bb21824b007" -dependencies = [ - "opentelemetry", - "tracing", - "tracing-core", - "tracing-subscriber", -] - -[[package]] -name = "opentelemetry-otlp" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "596b1719b3cab83addb20bcbffdf21575279d9436d9ccccfe651a3bf0ab5ab06" -dependencies = [ - "async-trait", - "futures-core", - "http 1.1.0", - "opentelemetry", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "thiserror", - "tokio", - "tonic", -] - -[[package]] -name = "opentelemetry-proto" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c43620e8f93359eb7e627a3b16ee92d8585774986f24f2ab010817426c5ce61" -dependencies = [ - "opentelemetry", - "opentelemetry_sdk", - "prost", - "tonic", -] - -[[package]] -name = "opentelemetry-semantic-conventions" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b8e442487022a943e2315740e443dc5ee95fd541c18f509a5a6251b408a9f95" - -[[package]] -name = "opentelemetry_sdk" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0da0d6b47a3dbc6e9c9e36a0520e25cf943e046843818faaa3f87365a548c82" -dependencies = [ - "async-trait", - "futures-channel", - "futures-executor", - "futures-util", - "glob", - "once_cell", - "opentelemetry", - "percent-encoding", - "rand 0.8.5", - "serde_json", - "thiserror", - "tokio", - "tokio-stream", -] - -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" - -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - -[[package]] -name = "owo-colors" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" - -[[package]] -name = "parity-scale-codec" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" -dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[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 = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pbkdf2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "216eaa586a190f0a738f2f918511eecfa90f13295abec0e457cdebcceda80cbd" -dependencies = [ - "crypto-mac", -] - -[[package]] -name = "pbkdf2" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" -dependencies = [ - "digest 0.10.7", -] - -[[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 = "percentage" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd23b938276f14057220b707937bcb42fa76dda7560e57a2da30cb52d557937" -dependencies = [ - "num", -] - -[[package]] -name = "pest" -version = "2.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" -dependencies = [ - "memchr", - "thiserror", - "ucd-trie", -] - -[[package]] -name = "pin-project" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" - -[[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.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" - -[[package]] -name = "plain" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" - -[[package]] -name = "polyval" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d1fe60d06143b2430aa532c94cfe9e29783047f06c0d7fd359a9a51b729fa25" -dependencies = [ - "cfg-if", - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "portable-atomic" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2" - -[[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.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "predicates" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e9086cc7640c29a356d1a29fd134380bee9d8f79a17410aa76e7ad295f42c97" -dependencies = [ - "anstyle", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae8177bee8e75d6846599c6b9ff679ed51e882816914eec639944d7c9aa11931" - -[[package]] -name = "predicates-tree" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41b740d195ed3166cd147c8047ec98db0e22ec019eb8eeb76d343b795304fb13" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "pretty_assertions" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" -dependencies = [ - "diff", - "yansi", -] - -[[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 = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml 0.5.11", -] - -[[package]] -name = "proc-macro-crate" -version = "3.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" -dependencies = [ - "proc-macro-error-attr", - "proc-macro2", - "quote", - "syn 1.0.109", - "version_check", -] - -[[package]] -name = "proc-macro-error-attr" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" -dependencies = [ - "proc-macro2", - "quote", - "version_check", -] - -[[package]] -name = "proc-macro2" -version = "1.0.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "program-utils" -version = "0.1.0" -source = "git+https://github.com/eigerco/solana-axelar.git?branch=main#09c8619fb9dc3ea61cf855150886266f01f208a7" -dependencies = [ - "borsh 1.5.1", - "rkyv", - "solana-program", - "thiserror", -] - -[[package]] -name = "proptest" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c2511913b88df1637da85cc8d96ec8e43a3f8bb8ccb71ee1ac240d6f3df58d" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags 2.6.0", - "lazy_static", - "num-traits", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_xorshift", - "regex-syntax 0.8.5", - "rusty-fork", - "tempfile", - "unarray", -] - -[[package]] -name = "prost" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b0487d90e047de87f984913713b85c601c05609aad5b0df4b4573fbf69aa13f" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-derive" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9552f850d5f0964a4e4d0bf306459ac29323ddfbae05e35a7c0d35cb0803cc5" -dependencies = [ - "anyhow", - "itertools 0.13.0", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "quanta" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" -dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi 0.11.0+wasi-snapshot-preview1", - "web-sys", - "winapi", -] - -[[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.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc2c5017e4b43d5995dcea317bc46c1e09404c0a9664d2908f7f02dfe943d75" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto 0.10.6", - "quinn-udp 0.4.1", - "rustc-hash 1.1.0", - "rustls 0.21.12", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" -dependencies = [ - "bytes", - "pin-project-lite", - "quinn-proto 0.11.8", - "quinn-udp 0.5.5", - "rustc-hash 2.0.0", - "rustls 0.23.15", - "socket2", - "thiserror", - "tokio", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "141bf7dfde2fbc246bfd3fe12f2455aa24b0fbd9af535d8c86c7bd1381ff2b1a" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring 0.16.20", - "rustc-hash 1.1.0", - "rustls 0.21.12", - "rustls-native-certs", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-proto" -version = "0.11.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" -dependencies = [ - "bytes", - "rand 0.8.5", - "ring 0.17.8", - "rustc-hash 2.0.0", - "rustls 0.23.15", - "slab", - "thiserror", - "tinyvec", - "tracing", -] - -[[package]] -name = "quinn-udp" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "055b4e778e8feb9f93c4e439f71dc2156ef13360b432b799e179a8c4cdf0b1d7" -dependencies = [ - "bytes", - "libc", - "socket2", - "tracing", - "windows-sys 0.48.0", -] - -[[package]] -name = "quinn-udp" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" -dependencies = [ - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.59.0", -] - -[[package]] -name = "quote" -version = "1.0.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[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.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[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_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[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 = "raw-cpuid" -version = "11.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" -dependencies = [ - "bitflags 2.6.0", -] - -[[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 = "redact" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0020ec469b096d56edb1ed0f0f141d957863302170f8d9c4bfda1a12969e5969" -dependencies = [ - "serde", -] - -[[package]] -name = "redox_syscall" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" -dependencies = [ - "bitflags 2.6.0", -] - -[[package]] -name = "ref-cast" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[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 0.4.8", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", -] - -[[package]] -name = "regex-automata" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax 0.8.5", -] - -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - -[[package]] -name = "regex-syntax" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" - -[[package]] -name = "relative-path" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" - -[[package]] -name = "relayer-amplifier-api-integration" -version = "0.1.0" -dependencies = [ - "amplifier-api", - "common-serde-utils", - "eyre", - "futures", - "futures-concurrency", - "quanta", - "relayer-amplifier-state", - "relayer-engine", - "serde", - "tokio", - "tokio-stream", - "tracing", - "typed-builder", - "url", -] - -[[package]] -name = "relayer-amplifier-state" -version = "0.1.0" -dependencies = [ - "amplifier-api", -] - -[[package]] -name = "relayer-engine" -version = "0.1.0" -dependencies = [ - "eyre", - "serde", - "tokio", - "tracing", - "url", -] - -[[package]] -name = "rend" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "reqwest" -version = "0.11.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd67538700a17451e7cba03ac727fb961abb7607553461627b97de0b89cf4a62" -dependencies = [ - "async-compression", - "base64 0.21.7", - "bytes", - "encoding_rs", - "futures-core", - "futures-util", - "h2 0.3.26", - "http 0.2.12", - "http-body 0.4.6", - "hyper 0.14.31", - "hyper-rustls 0.24.2", - "ipnet", - "js-sys", - "log", - "mime", - "mime_guess", - "once_cell", - "percent-encoding", - "pin-project-lite", - "rustls 0.21.12", - "rustls-pemfile 1.0.4", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 0.1.2", - "system-configuration", - "tokio", - "tokio-rustls 0.24.1", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "webpki-roots 0.25.4", - "winreg", -] - -[[package]] -name = "reqwest" -version = "0.12.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" -dependencies = [ - "async-compression", - "base64 0.22.1", - "bytes", - "futures-core", - "futures-util", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.5.0", - "hyper-rustls 0.27.3", - "hyper-util", - "ipnet", - "js-sys", - "log", - "mime", - "once_cell", - "percent-encoding", - "pin-project-lite", - "quinn 0.11.5", - "rustls 0.23.15", - "rustls-pemfile 2.2.0", - "rustls-pki-types", - "serde", - "serde_json", - "serde_urlencoded", - "sync_wrapper 1.0.1", - "tokio", - "tokio-rustls 0.26.0", - "tokio-util", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "wasm-streams", - "web-sys", - "webpki-roots 0.26.6", - "windows-registry", -] - -[[package]] -name = "reqwest-middleware" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a735987236a8e238bf0296c7e351b999c188ccc11477f311b82b55c93984216" -dependencies = [ - "anyhow", - "async-trait", - "http 0.2.12", - "reqwest 0.11.27", - "serde", - "task-local-extensions", - "thiserror", -] - -[[package]] -name = "retrying-solana-http-sender" -version = "0.1.0" -dependencies = [ - "async-trait", - "backoff", - "serde", - "serde_json", - "solana-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-sdk", - "tokio", - "tracing", - "typed-builder", - "url", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "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 0.5.2", - "untrusted 0.7.1", - "web-sys", - "winapi", -] - -[[package]] -name = "ring" -version = "0.17.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.15", - "libc", - "spin 0.9.8", - "untrusted 0.9.0", - "windows-sys 0.52.0", -] - -[[package]] -name = "rkyv" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9008cd6385b9e161d8229e1f6549dd23c3d022f132a2ea37ac3a10ac4935779b" -dependencies = [ - "bitvec", - "bytecheck", - "bytes", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503d1d27590a2b0a3a4ca4c94755aa2875657196ecbf401a42eff41d7de532c0" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[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 = "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 = "rs_merkle" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b241d2e59b74ef9e98d94c78c47623d04c8392abaf82014dfd372a16041128f" -dependencies = [ - "sha2 0.10.8", -] - -[[package]] -name = "rstest" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afd55a67069d6e434a95161415f5beeada95a01c7b815508a82dcb0e1593682" -dependencies = [ - "futures", - "futures-timer", - "rstest_macros", - "rustc_version 0.4.1", -] - -[[package]] -name = "rstest_macros" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" -dependencies = [ - "cfg-if", - "glob", - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "regex", - "relative-path", - "rustc_version 0.4.1", - "syn 2.0.85", - "unicode-ident", -] - -[[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.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c3cc4c2511671f327125da14133d0c5c5d137f006a1017a16f557bc85b16286" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "bytes", - "fastrlp", - "num-bigint 0.4.6", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rlp", - "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-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" - -[[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 1.0.23", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "0.38.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" -dependencies = [ - "bitflags 2.6.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.52.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.8", - "rustls-webpki 0.101.7", - "sct", -] - -[[package]] -name = "rustls" -version = "0.23.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" -dependencies = [ - "once_cell", - "ring 0.17.8", - "rustls-pki-types", - "rustls-webpki 0.102.8", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9aace74cb666635c918e9c12bc0d348266037aa8eb599b5cba565709a8dff00" -dependencies = [ - "openssl-probe", - "rustls-pemfile 1.0.4", - "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.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" - -[[package]] -name = "rustls-webpki" -version = "0.101.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6275d1ee7a1cd780b64aca7726599a1dbc893b1e64144529e55c3c2f745765" -dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", -] - -[[package]] -name = "rustls-webpki" -version = "0.102.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" -dependencies = [ - "ring 0.17.8", - "rustls-pki-types", - "untrusted 0.9.0", -] - -[[package]] -name = "rustversion" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" - -[[package]] -name = "scale-info" -version = "2.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa7ffc1c0ef49b0452c6e2986abf2b07743320641ffd5fc63d552458e3b779b" -dependencies = [ - "cfg-if", - "derive_more 1.0.0", - "parity-scale-codec", - "scale-info-derive", -] - -[[package]] -name = "scale-info-derive" -version = "2.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46385cc24172cf615450267463f937c10072516359b3ff1cb24228a4a08bf951" -dependencies = [ - "proc-macro-crate 3.2.0", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "schannel" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1" -dependencies = [ - "windows-sys 0.59.0", -] - -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "scroll" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04c565b551bafbef4157586fa379538366e4385d42082f255bfd96e4fe8519da" -dependencies = [ - "scroll_derive", -] - -[[package]] -name = "scroll_derive" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "sct" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da046153aa2352493d6cb7da4b6e5c0c057d8a1d0a9aa8560baffdd945acd414" -dependencies = [ - "ring 0.17.8", - "untrusted 0.9.0", -] - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[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 = "security-framework" -version = "2.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" -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.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" - -[[package]] -name = "semver-parser" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" -dependencies = [ - "pest", -] - -[[package]] -name = "serde" -version = "1.0.213" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde-big-array" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_bytes" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "387cc504cb06bb40a96c8e04e951fe01854cf6bc921053c954e4a606d9675c6a" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_derive" -version = "1.0.213" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "serde_json" -version = "1.0.132" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" -dependencies = [ - "itoa", - "memchr", - "ryu", - "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 = "serde_with" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07ff71d2c147a7b57362cead5e22f772cd52f6ab31cfcd9edcd7f6aeb2a0afbe" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "881b6f881b17d13214e5d494c939ebab463d01264ce1811e9d4ac3a882e7695f" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - -[[package]] -name = "sha2" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha3" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81199417d4e5de3f04b1e871023acea7389672c4135918f05aa9cbf2f2fa809" -dependencies = [ - "block-buffer 0.9.0", - "digest 0.9.0", - "keccak", - "opaque-debug", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "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 = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[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 = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-json" -version = "0.13.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0228a564470f81724e30996bbc2b171713b37b15254a6440c7e2d5449b95691" -dependencies = [ - "getrandom 0.2.15", - "halfbrown", - "lexical-core", - "ref-cast", - "serde", - "serde_json", - "simdutf8", - "value-trait", -] - -[[package]] -name = "simdutf8" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" - -[[package]] -name = "siphasher" -version = "0.3.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" - -[[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.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" - -[[package]] -name = "socket2" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" -dependencies = [ - "libc", - "windows-sys 0.52.0", -] - -[[package]] -name = "solana-account-decoder" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad3f0b04a6f8d8778488fe2c3e77e97866d8b61378c8a4d91e188e1444f98186" -dependencies = [ - "Inflector", - "base64 0.22.1", - "bincode", - "bs58", - "bv", - "lazy_static", - "serde", - "serde_derive", - "serde_json", - "solana-config-program", - "solana-sdk", - "spl-token", - "spl-token-2022", - "spl-token-group-interface", - "spl-token-metadata-interface", - "thiserror", - "zstd", -] - -[[package]] -name = "solana-axelar-relayer" -version = "0.1.0" -dependencies = [ - "amplifier-api", - "color-eyre", - "eyre", - "file-based-storage", - "indoc", - "opentelemetry", - "opentelemetry-appender-tracing", - "opentelemetry-otlp", - "opentelemetry-semantic-conventions", - "opentelemetry_sdk", - "pretty_assertions", - "relayer-amplifier-api-integration", - "relayer-engine", - "retrying-solana-http-sender", - "serde", - "solana-event-forwarder", - "solana-gateway-task-processor", - "solana-listener", - "temp-env", - "tokio", - "toml 0.8.19", - "tracing-error", - "tracing-subscriber", -] - -[[package]] -name = "solana-clap-utils" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "855bb216b0862bc10ae515b1400a3f677527881f3e3df51e24bb1ba0bd514fcc" -dependencies = [ - "chrono", - "clap 2.34.0", - "rpassword", - "solana-remote-wallet", - "solana-sdk", - "thiserror", - "tiny-bip39", - "uriparse", - "url", -] - -[[package]] -name = "solana-client" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e17a2e3cf4aa6b7ed64d33ea656507af4e754832ad3c8733fab6ff5eeb8b4249" -dependencies = [ - "async-trait", - "bincode", - "dashmap", - "futures", - "futures-util", - "indexmap 2.6.0", - "indicatif", - "log", - "quinn 0.10.2", - "rayon", - "solana-connection-cache", - "solana-measure", - "solana-metrics", - "solana-pubsub-client", - "solana-quic-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-rpc-client-nonce-utils", - "solana-sdk", - "solana-streamer", - "solana-thin-client", - "solana-tpu-client", - "solana-udp-client", - "thiserror", - "tokio", -] - -[[package]] -name = "solana-compute-budget" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29e90b1be747a3f2373c8b7f2e1bd4291249fc588647524789ff877cc57e7ad8" -dependencies = [ - "rustc_version 0.4.1", - "solana-sdk", -] - -[[package]] -name = "solana-config-program" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "193009c562956c9672cb1fd6439a444367b1b0fd67f20f435ab6a4026e5ed187" -dependencies = [ - "bincode", - "chrono", - "serde", - "serde_derive", - "solana-program-runtime", - "solana-sdk", -] - -[[package]] -name = "solana-connection-cache" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe5a15ec1f3f9860e6171e5dd2d497974e7167f0ba15c8215d448b30f3bee12f" -dependencies = [ - "async-trait", - "bincode", - "crossbeam-channel", - "futures-util", - "indexmap 2.6.0", - "log", - "rand 0.8.5", - "rayon", - "solana-measure", - "solana-metrics", - "solana-sdk", - "thiserror", - "tokio", -] - -[[package]] -name = "solana-curve25519" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0d6ca4dc435e6048f871424cd5ace2aeb06c2c82229d684903b03fb351072d4" -dependencies = [ - "bytemuck", - "bytemuck_derive", - "curve25519-dalek 3.2.1", - "solana-program", - "thiserror", -] - -[[package]] -name = "solana-event-forwarder" -version = "0.1.0" -dependencies = [ - "axelar-message-primitives", - "axelar-rkyv-encoding", - "base64 0.22.1", - "bs58", - "eyre", - "futures", - "gmp-gateway", - "pretty_assertions", - "relayer-amplifier-api-integration", - "relayer-engine", - "solana-listener", - "solana-sdk", - "test-log", - "tracing", -] - -[[package]] -name = "solana-gateway-task-processor" -version = "0.1.0" -dependencies = [ - "amplifier-api", - "async-trait", - "axelar-executable", - "axelar-rkyv-encoding", - "bs58", - "common-serde-utils", - "effective-tx-sender", - "eyre", - "futures", - "gmp-gateway", - "mockall", - "num-traits", - "relayer-amplifier-api-integration", - "relayer-amplifier-state", - "relayer-engine", - "serde", - "serde_json", - "solana-client", - "solana-sdk", - "solana-transaction-status", - "tracing", - "typed-builder", -] - -[[package]] -name = "solana-inline-spl" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f94111dea93785d063d62894046f2a1c2fd822f107aa59c82272a34d2b98cfd4" -dependencies = [ - "bytemuck", - "rustc_version 0.4.1", - "solana-sdk", -] - -[[package]] -name = "solana-listener" -version = "0.1.0" -dependencies = [ - "chrono", - "common-serde-utils", - "eyre", - "futures", - "gmp-gateway", - "relayer-engine", - "serde", - "solana-client", - "solana-sdk", - "solana-transaction-status", - "tokio", - "tracing", - "typed-builder", - "url", -] - -[[package]] -name = "solana-logger" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7369915bd82d09dcb14a5ebba3431c4e54f19f2de0521ac56627d38016d45408" -dependencies = [ - "env_logger", - "lazy_static", - "log", -] - -[[package]] -name = "solana-measure" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b583a9a2a43e02231636662663d7804b70c1c0f3a42b1a641ab5d5964bc8ebf" -dependencies = [ - "log", - "solana-sdk", -] - -[[package]] -name = "solana-metrics" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68602687aeb613bd73933f27ce11b1ad58896a6a2fa71497fecae2987e614f61" -dependencies = [ - "crossbeam-channel", - "gethostname", - "lazy_static", - "log", - "reqwest 0.11.27", - "solana-sdk", - "thiserror", -] - -[[package]] -name = "solana-net-utils" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44f41b767c25ec128957b73414efe0797877240e1a9f033e910ab3bcd54748be" -dependencies = [ - "bincode", - "clap 3.2.25", - "crossbeam-channel", - "log", - "nix", - "rand 0.8.5", - "serde", - "serde_derive", - "socket2", - "solana-logger", - "solana-sdk", - "solana-version", - "static_assertions", - "tokio", - "url", -] - -[[package]] -name = "solana-perf" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4e7809a71f40bc1d551c86203f11c463926dcfe5a892e74357de618aeffe13a" -dependencies = [ - "ahash 0.8.11", - "bincode", - "bv", - "caps", - "curve25519-dalek 3.2.1", - "dlopen2", - "fnv", - "lazy_static", - "libc", - "log", - "nix", - "rand 0.8.5", - "rayon", - "rustc_version 0.4.1", - "serde", - "solana-metrics", - "solana-rayon-threadlimit", - "solana-sdk", - "solana-vote-program", -] - -[[package]] -name = "solana-program" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2625a23c3813b620141ee447819b08d1b9a5f1c69a309754834e3f35798a21fb" -dependencies = [ - "ark-bn254", - "ark-ec", - "ark-ff 0.4.2", - "ark-serialize 0.4.2", - "base64 0.22.1", - "bincode", - "bitflags 2.6.0", - "blake3", - "borsh 0.10.4", - "borsh 1.5.1", - "bs58", - "bv", - "bytemuck", - "bytemuck_derive", - "console_error_panic_hook", - "console_log", - "curve25519-dalek 3.2.1", - "getrandom 0.2.15", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memoffset", - "num-bigint 0.4.6", - "num-derive", - "num-traits", - "parking_lot", - "rand 0.8.5", - "rustc_version 0.4.1", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "sha2 0.10.8", - "sha3 0.10.8", - "solana-sdk-macro", - "thiserror", - "wasm-bindgen", -] - -[[package]] -name = "solana-program-runtime" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f6f48b286f452feb1f2151ffa4243a382affc126d90c60ad804d2759175b996" -dependencies = [ - "base64 0.22.1", - "bincode", - "eager", - "enum-iterator", - "itertools 0.12.1", - "libc", - "log", - "num-derive", - "num-traits", - "percentage", - "rand 0.8.5", - "rustc_version 0.4.1", - "serde", - "solana-compute-budget", - "solana-measure", - "solana-metrics", - "solana-sdk", - "solana-type-overrides", - "solana-vote", - "solana_rbpf", - "thiserror", -] - -[[package]] -name = "solana-pubsub-client" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f03618c313746b6c69ff04c00d210f8c4549b8c9e172ac90eb1d003e810e5353" -dependencies = [ - "crossbeam-channel", - "futures-util", - "log", - "reqwest 0.11.27", - "semver 1.0.23", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-rpc-client-api", - "solana-sdk", - "thiserror", - "tokio", - "tokio-stream", - "tokio-tungstenite", - "tungstenite", - "url", -] - -[[package]] -name = "solana-quic-client" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f54213cdc6f6a869f86603385563a78bc89012cfeb921e0a7ba8710d32f65fe" -dependencies = [ - "async-mutex", - "async-trait", - "futures", - "itertools 0.12.1", - "lazy_static", - "log", - "quinn 0.10.2", - "quinn-proto 0.10.6", - "rustls 0.21.12", - "solana-connection-cache", - "solana-measure", - "solana-metrics", - "solana-net-utils", - "solana-rpc-client-api", - "solana-sdk", - "solana-streamer", - "thiserror", - "tokio", -] - -[[package]] -name = "solana-rayon-threadlimit" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "369b4d9a8e15906219ee60c1ce6c336ad04fe1217c9c1d625e1960ba5b174d24" -dependencies = [ - "lazy_static", - "num_cpus", -] - -[[package]] -name = "solana-remote-wallet" -version = "2.0.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d30c4d54739ca1f56113699c086d2dd5e7423eb5f894d0312757cace61e193" -dependencies = [ - "console", - "dialoguer", - "log", - "num-derive", - "num-traits", - "parking_lot", - "qstring", - "semver 1.0.23", - "solana-sdk", - "thiserror", - "uriparse", -] - -[[package]] -name = "solana-rpc-client" -version = "2.0.14" +name = "ppv-lite86" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12219fb033d7de4e0fe6c613d7ebea5e457d2ca71890ead6c2a3cb5e4534275" +checksum = "77957b295656769bb8ad2b6a6b09d897d94f05c41b069aede1fcdaa675eaea04" dependencies = [ - "async-trait", - "base64 0.22.1", - "bincode", - "bs58", - "indicatif", - "log", - "reqwest 0.11.27", - "reqwest-middleware", - "semver 1.0.23", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-rpc-client-api", - "solana-sdk", - "solana-transaction-status", - "solana-version", - "solana-vote-program", - "tokio", + "zerocopy", ] [[package]] -name = "solana-rpc-client-api" -version = "2.0.14" +name = "pretty_assertions" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dc975656b2bd12d9a0d3b37d7188be83d5d40928d48c50450f4e1adab0eb795" +checksum = "3ae130e2f271fbc2ac3a40fb1d07180839cdbbe443c7a27e1e3c13c5cac0116d" dependencies = [ - "anyhow", - "base64 0.22.1", - "bs58", - "jsonrpc-core", - "reqwest 0.11.27", - "reqwest-middleware", - "semver 1.0.23", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-inline-spl", - "solana-sdk", - "solana-transaction-status", - "solana-version", - "thiserror", + "diff", + "yansi", ] [[package]] -name = "solana-rpc-client-nonce-utils" -version = "2.0.14" +name = "proc-macro-crate" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d251b055f02d2fbbf30da82f10229e2bfe2c4ced7724b8d1311b6184a83589bb" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "clap 2.34.0", - "solana-clap-utils", - "solana-rpc-client", - "solana-sdk", - "thiserror", + "toml_edit", ] [[package]] -name = "solana-sdk" -version = "2.0.14" +name = "proc-macro2" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bec7d84513d65700740755c512a0d58b9f60dbbce683379c399d2c357b3ceb0" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" dependencies = [ - "bincode", - "bitflags 2.6.0", - "borsh 1.5.1", - "bs58", - "bytemuck", - "bytemuck_derive", - "byteorder", - "chrono", - "derivation-path", - "digest 0.10.7", - "ed25519-dalek 1.0.1", - "ed25519-dalek-bip32", - "generic-array", - "getrandom 0.1.16", - "hmac 0.12.1", - "itertools 0.12.1", - "js-sys", - "lazy_static", - "libsecp256k1", - "log", - "memmap2 0.5.10", - "num_enum", - "pbkdf2 0.11.0", - "qstring", - "rand 0.7.3", - "rand 0.8.5", - "rustc_version 0.4.1", - "rustversion", - "serde", - "serde_bytes", - "serde_derive", - "serde_json", - "serde_with", - "sha2 0.10.8", - "sha3 0.10.8", - "siphasher", - "solana-program", - "solana-sdk-macro", - "thiserror", - "uriparse", - "wasm-bindgen", + "unicode-ident", ] [[package]] -name = "solana-sdk-macro" -version = "2.0.14" +name = "quanta" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93a5a1eabc890415d326707afe62cd7a2009236e8d899c1519566fc8f7e3977b" +checksum = "8e5167a477619228a0b284fac2674e3c388cba90631d7b7de620e6f1fcd08da5" dependencies = [ - "bs58", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.85", + "crossbeam-utils", + "libc", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", ] [[package]] -name = "solana-security-txt" -version = "1.1.1" +name = "quinn" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "468aa43b7edb1f9b7b7b686d5c3aeb6630dc1708e86e31343499dd5c4d775183" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +dependencies = [ + "bytes", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash", + "rustls", + "socket2", + "thiserror", + "tokio", + "tracing", +] [[package]] -name = "solana-streamer" -version = "2.0.14" +name = "quinn-proto" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a66633bc2a7bf49f9d94ec7728bc92ca7e1a563ec2d1752b1501170f48392b1" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ - "async-channel", "bytes", - "crossbeam-channel", - "dashmap", - "futures-util", - "histogram", - "indexmap 2.6.0", - "itertools 0.12.1", - "libc", - "log", - "nix", - "pem", - "percentage", - "quinn 0.10.2", - "quinn-proto 0.10.6", - "rand 0.8.5", - "rustls 0.21.12", - "smallvec", - "solana-measure", - "solana-metrics", - "solana-perf", - "solana-sdk", - "solana-transaction-metrics-tracker", + "rand", + "ring", + "rustc-hash", + "rustls", + "slab", "thiserror", - "tokio", - "x509-parser", + "tinyvec", + "tracing", ] [[package]] -name = "solana-thin-client" -version = "2.0.14" +name = "quinn-udp" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc6717f63e619d8062f9ba9f874dec1fa21e5dbaf85f9a6bc8adba1b97c4df46" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ - "bincode", - "log", - "rayon", - "solana-connection-cache", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-sdk", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.59.0", ] [[package]] -name = "solana-tpu-client" -version = "2.0.14" +name = "quote" +version = "1.0.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c524c75954fd3ca8f7cdcb386ab70b8861c671a82ed7310e8ed50aa4318b093c" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" dependencies = [ - "async-trait", - "bincode", - "futures-util", - "indexmap 2.6.0", - "indicatif", - "log", - "rayon", - "solana-connection-cache", - "solana-measure", - "solana-metrics", - "solana-pubsub-client", - "solana-rpc-client", - "solana-rpc-client-api", - "solana-sdk", - "thiserror", - "tokio", + "proc-macro2", ] [[package]] -name = "solana-transaction-metrics-tracker" -version = "2.0.14" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439f96c03d9c2f133b51fa82f227a09cf1f8d5fc63b70d7754d75c02bb7f9e5e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "Inflector", - "base64 0.22.1", - "bincode", - "lazy_static", - "log", - "rand 0.8.5", - "solana-perf", - "solana-sdk", + "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "solana-transaction-status" -version = "2.0.14" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b6361f2bb0020a269108e8630c174ad97a72e8ba1fe52a7ccaae27fc1219c7" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "Inflector", - "base64 0.22.1", - "bincode", - "borsh 1.5.1", - "bs58", - "lazy_static", - "log", - "serde", - "serde_derive", - "serde_json", - "solana-account-decoder", - "solana-sdk", - "spl-associated-token-account", - "spl-memo", - "spl-token", - "spl-token-2022", - "spl-token-group-interface", - "spl-token-metadata-interface", - "thiserror", + "ppv-lite86", + "rand_core", ] [[package]] -name = "solana-type-overrides" -version = "2.0.14" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ee8181704d686981cf4c1365a15f16e1b680542c160ddd4d07ec33e0be747a" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "lazy_static", - "rand 0.8.5", + "getrandom", ] [[package]] -name = "solana-udp-client" -version = "2.0.14" +name = "raw-cpuid" +version = "11.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50a813338c28da988ec0e0fd8c53f756f93c63f403a3ac46ba2c15138dd60a4" +checksum = "1ab240315c661615f2ee9f0f2cd32d5a7343a84d5ebcccb99d46e6637565e7b0" dependencies = [ - "async-trait", - "solana-connection-cache", - "solana-net-utils", - "solana-sdk", - "solana-streamer", - "thiserror", - "tokio", + "bitflags", ] [[package]] -name = "solana-version" -version = "2.0.14" +name = "redact" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe60c22d8bd1325ab3379950dcc14027fa40e3de9a39a0b22645f81803d6cfaf" +checksum = "0020ec469b096d56edb1ed0f0f141d957863302170f8d9c4bfda1a12969e5969" dependencies = [ - "log", - "rustc_version 0.4.1", - "semver 1.0.23", "serde", - "serde_derive", - "solana-sdk", ] [[package]] -name = "solana-vote" -version = "2.0.14" +name = "ref-cast" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62a9aa08d6d925b438d569d5e56bad9eb98fd2acd91bf76274ed59045dc77f9f" +checksum = "ccf0a6f84d5f1d581da8b41b47ec8600871962f2a528115b542b362d4b744931" dependencies = [ - "itertools 0.12.1", - "log", - "rustc_version 0.4.1", - "serde", - "serde_derive", - "solana-sdk", - "thiserror", + "ref-cast-impl", ] [[package]] -name = "solana-vote-program" -version = "2.0.14" +name = "ref-cast-impl" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7a9b9023943c6ba747d6e1c5bf16343e510060cbef3f576d8527b33938c48a" +checksum = "bcc303e793d3734489387d205e9b186fac9c6cfacedd98cbb2e8a5943595f3e6" dependencies = [ - "bincode", - "log", - "num-derive", - "num-traits", - "rustc_version 0.4.1", - "serde", - "serde_derive", - "solana-metrics", - "solana-program", - "solana-program-runtime", - "solana-sdk", - "thiserror", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "solana-zk-token-sdk" -version = "2.0.14" +name = "regex" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c9c1b81daa97afa8690da1a72a453f4c7faf4dc05c4205074b2cbd8f4e5490c" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ - "aes-gcm-siv", - "base64 0.22.1", - "bincode", - "bytemuck", - "bytemuck_derive", - "byteorder", - "curve25519-dalek 3.2.1", - "itertools 0.12.1", - "lazy_static", - "merlin", - "num-derive", - "num-traits", - "rand 0.7.3", - "serde", - "serde_derive", - "serde_json", - "sha3 0.9.1", - "solana-curve25519", - "solana-program", - "solana-sdk", - "subtle", - "thiserror", - "zeroize", + "aho-corasick", + "memchr", + "regex-automata 0.4.8", + "regex-syntax 0.8.5", ] [[package]] -name = "solana_rbpf" -version = "0.8.4" +name = "regex-automata" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff08afd63f70a1ba712fb0017be41e93b017f7e874785b54bb5ec9aa8949781d" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" dependencies = [ - "byteorder", - "combine", - "goblin", - "hash32", - "libc", - "log", - "rand 0.8.5", - "rustc-demangle", - "scroll", - "thiserror", - "winapi", + "regex-syntax 0.6.29", ] [[package]] -name = "spin" -version = "0.5.2" +name = "regex-automata" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" +checksum = "368758f23274712b504848e9d5a6f010445cc8b87a7cdb4d7cbee666c1288da3" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.5", +] [[package]] -name = "spin" -version = "0.9.8" +name = "regex-syntax" +version = "0.6.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] -name = "spki" -version = "0.7.3" +name = "regex-syntax" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] -name = "spl-associated-token-account" -version = "4.0.0" +name = "relative-path" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68034596cf4804880d265f834af1ff2f821ad5293e41fa0f8f59086c181fc38e" -dependencies = [ - "assert_matches", - "borsh 1.5.1", - "num-derive", - "num-traits", - "solana-program", - "spl-token", - "spl-token-2022", - "thiserror", -] +checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" [[package]] -name = "spl-discriminator" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a38ea8b6dedb7065887f12d62ed62c1743aa70749e8558f963609793f6fb12bc" +name = "relayer-amplifier-api-integration" +version = "0.1.0" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator-derive", + "amplifier-api", + "common-serde-utils", + "eyre", + "futures", + "futures-concurrency", + "quanta", + "relayer-amplifier-state", + "relayer-engine", + "serde", + "tokio", + "tokio-stream", + "tracing", + "typed-builder", + "url", ] [[package]] -name = "spl-discriminator-derive" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9e8418ea6269dcfb01c712f0444d2c75542c04448b480e87de59d2865edc750" +name = "relayer-amplifier-state" +version = "0.1.0" dependencies = [ - "quote", - "spl-discriminator-syn", - "syn 2.0.85", + "amplifier-api", ] [[package]] -name = "spl-discriminator-syn" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c1f05593b7ca9eac7caca309720f2eafb96355e037e6d373b909a80fe7b69b9" +name = "relayer-engine" +version = "0.1.0" dependencies = [ - "proc-macro2", - "quote", - "sha2 0.10.8", - "syn 2.0.85", - "thiserror", + "eyre", + "serde", + "tokio", + "tracing", + "url", ] [[package]] -name = "spl-memo" -version = "5.0.0" +name = "reqwest" +version = "0.12.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0dba2f2bb6419523405d21c301a32c9f9568354d4742552e7972af801f4bdb3" +checksum = "f713147fbe92361e52392c73b8c9e48c04c6625bce969ef54dc901e58e042a7b" dependencies = [ - "solana-program", + "async-compression", + "base64", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-rustls", + "tokio-util", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "webpki-roots", + "windows-registry", ] [[package]] -name = "spl-pod" -version = "0.3.1" +name = "ring" +version = "0.17.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c704c88fc457fa649ba3aabe195c79d885c3f26709efaddc453c8de352c90b87" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ - "borsh 1.5.1", - "bytemuck", - "bytemuck_derive", - "solana-program", - "solana-zk-token-sdk", - "spl-program-error", + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", ] [[package]] -name = "spl-program-error" -version = "0.5.0" +name = "rstest" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7b28bed65356558133751cc32b48a7a5ddfc59ac4e941314630bbed1ac10532" +checksum = "9afd55a67069d6e434a95161415f5beeada95a01c7b815508a82dcb0e1593682" dependencies = [ - "num-derive", - "num-traits", - "solana-program", - "spl-program-error-derive", - "thiserror", + "futures", + "futures-timer", + "rstest_macros", + "rustc_version", ] [[package]] -name = "spl-program-error-derive" -version = "0.4.1" +name = "rstest_macros" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d375dd76c517836353e093c2dbb490938ff72821ab568b545fd30ab3256b3e" +checksum = "4165dfae59a39dd41d8dec720d3cbfbc71f69744efb480a3920f5d4e0cc6798d" dependencies = [ + "cfg-if", + "glob", + "proc-macro-crate", "proc-macro2", "quote", - "sha2 0.10.8", - "syn 2.0.85", + "regex", + "relative-path", + "rustc_version", + "syn", + "unicode-ident", ] [[package]] -name = "spl-tlv-account-resolution" -version = "0.7.0" +name = "rustc-demangle" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a75a5f0fcc58126693ed78a17042e9dc53f07e357d6be91789f7d62aff61a4" -dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", -] +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" [[package]] -name = "spl-token" -version = "6.0.0" +name = "rustc-hash" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a0f06ac7f23dc0984931b1fe309468f14ea58e32660439c1cef19456f5d0e3" -dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-program", - "thiserror", -] +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] -name = "spl-token-2022" -version = "4.0.0" +name = "rustc_version" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c10f3483e48679619c76598d4e4aebb955bc49b0a5cc63323afbf44135c9bf" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" dependencies = [ - "arrayref", - "bytemuck", - "num-derive", - "num-traits", - "num_enum", - "solana-program", - "solana-security-txt", - "solana-zk-token-sdk", - "spl-memo", - "spl-pod", - "spl-token", - "spl-token-group-interface", - "spl-token-metadata-interface", - "spl-transfer-hook-interface", - "spl-type-length-value", - "thiserror", + "semver", ] [[package]] -name = "spl-token-group-interface" -version = "0.3.0" +name = "rustls" +version = "0.23.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df8752b85a5ecc1d9f3a43bce3dd9a6a053673aacf5deb513d1cbb88d3534ffd" +checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] -name = "spl-token-metadata-interface" -version = "0.4.0" +name = "rustls-pemfile" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6c2318ddff97e006ed9b1291ebec0750a78547f870f62a69c56fe3b46a5d8fc" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "borsh 1.5.1", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-type-length-value", + "rustls-pki-types", ] [[package]] -name = "spl-transfer-hook-interface" -version = "0.7.0" +name = "rustls-pki-types" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a110f33d941275d9f868b96daaa993f1e73b6806cc8836e43075b4d3ad8338a7" -dependencies = [ - "arrayref", - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", - "spl-tlv-account-resolution", - "spl-type-length-value", -] +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" [[package]] -name = "spl-type-length-value" -version = "0.5.0" +name = "rustls-webpki" +version = "0.102.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdcd73ec187bc409464c60759232e309f83b52a18a9c5610bf281c9c6432918c" +checksum = "64ca1bc8749bd4cf37b5ce386cc146580777b4e8572c7b97baf22c83f444bee9" dependencies = [ - "bytemuck", - "solana-program", - "spl-discriminator", - "spl-pod", - "spl-program-error", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.8.0" +name = "rustversion" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] -name = "strsim" -version = "0.10.0" +name = "ryu" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" [[package]] -name = "strsim" -version = "0.11.1" +name = "scoped-tls" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" [[package]] -name = "strum" -version = "0.26.3" +name = "semver" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" -dependencies = [ - "strum_macros", -] +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" [[package]] -name = "strum_macros" -version = "0.26.4" +name = "serde" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +checksum = "3ea7893ff5e2466df8d720bb615088341b295f849602c6956047f8f80f0e9bc1" dependencies = [ - "heck", - "proc-macro2", - "quote", - "rustversion", - "syn 2.0.85", + "serde_derive", ] [[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" +name = "serde_derive" +version = "1.0.213" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +checksum = "7e85ad2009c50b58e87caa8cd6dac16bdf511bbfb7af6c33df902396aa480fa5" dependencies = [ "proc-macro2", "quote", - "unicode-ident", + "syn", ] [[package]] -name = "syn" -version = "2.0.85" +name = "serde_json" +version = "1.0.132" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" +checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03" dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", + "itoa", + "memchr", + "ryu", + "serde", ] [[package]] -name = "syn-solidity" -version = "0.7.7" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c837dc8852cb7074e46b444afb81783140dab12c58867b49fb3898fbafedf7ea" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.85", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] -name = "syn_derive" -version = "0.1.8" +name = "sharded-slab" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "proc-macro-error", - "proc-macro2", - "quote", - "syn 2.0.85", + "lazy_static", ] [[package]] -name = "sync_wrapper" -version = "0.1.2" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "sync_wrapper" -version = "1.0.1" +name = "signal-hook-registry" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" dependencies = [ - "futures-core", + "libc", ] [[package]] -name = "synstructure" -version = "0.12.6" +name = "simd-json" +version = "0.13.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f" +checksum = "a0228a564470f81724e30996bbc2b171713b37b15254a6440c7e2d5449b95691" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", - "unicode-xid", + "getrandom", + "halfbrown", + "lexical-core", + "ref-cast", + "serde", + "serde_json", + "simdutf8", + "value-trait", ] [[package]] -name = "system-configuration" -version = "0.5.1" +name = "simdutf8" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] -name = "system-configuration-sys" -version = "0.5.0" +name = "slab" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ - "core-foundation-sys", - "libc", + "autocfg", ] [[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "task-local-extensions" -version = "0.1.4" +name = "smallvec" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba323866e5d033818e3240feeb9f7db2c4296674e4d9e16b97b7bf8f490434e8" -dependencies = [ - "pin-utils", -] +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" [[package]] -name = "temp-env" -version = "0.3.6" +name = "socket2" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96374855068f47402c3121c6eed88d29cb1de8f3ab27090e273e420bdabcf050" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ - "parking_lot", + "libc", + "windows-sys 0.52.0", ] [[package]] -name = "tempfile" -version = "3.13.0" +name = "spin" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f2c9fc62d0beef6951ccffd757e241266a2c833136efbe35af6cd2567dca5b" -dependencies = [ - "cfg-if", - "fastrand 2.1.1", - "once_cell", - "rustix", - "windows-sys 0.59.0", -] +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] -name = "termcolor" -version = "1.4.1" +name = "static_assertions" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" -dependencies = [ - "winapi-util", -] +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" [[package]] -name = "termtree" -version = "0.4.1" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3369f5ac52d5eb6ab48c6b4ffdc8efbcad6b89c765749064ba298f2c68a16a76" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "test-log" -version = "0.2.16" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dffced63c2b5c7be278154d76b479f9f9920ed34e7574201407f0b14e2bbb93" -dependencies = [ - "test-log-macros", - "tracing-subscriber", -] +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "test-log-macros" -version = "0.2.16" +name = "syn" +version = "2.0.85" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5999e24eaa32083191ba4e425deb75cdf25efefabe5aaccb7446dd0d4122a3f5" +checksum = "5023162dfcd14ef8f32034d8bcd4cc5ddc61ef7a247c024a33e24e1f24d21b56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "unicode-ident", ] [[package]] -name = "textwrap" -version = "0.11.0" +name = "sync_wrapper" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" dependencies = [ - "unicode-width", + "futures-core", ] -[[package]] -name = "textwrap" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d434d3f8967a09480fb04132ebe0a3e088c173e6d0ee7897abbdf4eab0f8b9" - [[package]] name = "thiserror" version = "1.0.65" @@ -6617,78 +1701,19 @@ version = "1.0.65" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae71770322cbd277e69d762a16c444af02aa0575ac0d174f0b9562d3b37f8602" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.85", -] - -[[package]] -name = "thread_local" -version = "1.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" -dependencies = [ - "cfg-if", - "once_cell", -] - -[[package]] -name = "time" -version = "0.3.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tiny-bip39" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffc59cb9dfc85bb312c3a78fd6aa8a8582e310b0fa885d5bb877f6dcc601839d" -dependencies = [ - "anyhow", - "hmac 0.8.1", - "once_cell", - "pbkdf2 0.4.0", - "rand 0.7.3", - "rustc-hash 1.1.0", - "sha2 0.9.9", - "thiserror", - "unicode-normalization", - "wasm-bindgen", - "zeroize", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tiny-keccak" -version = "2.0.2" +name = "thread_local" +version = "1.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" dependencies = [ - "crunchy", + "cfg-if", + "once_cell", ] [[package]] @@ -6717,7 +1742,6 @@ dependencies = [ "libc", "mio", "num_cpus", - "parking_lot", "pin-project-lite", "signal-hook-registry", "socket2", @@ -6733,17 +1757,7 @@ checksum = "5f5ae998a069d4b5aba8ee9dad856af7d520c3699e6159b185c2acd48155d39a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "tokio-rustls" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" -dependencies = [ - "rustls 0.21.12", - "tokio", + "syn", ] [[package]] @@ -6752,7 +1766,7 @@ version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c7bc40d0e5a97695bb96e27995cd3a08538541b0a846f65bba7a359f36700d4" dependencies = [ - "rustls 0.23.15", + "rustls", "rustls-pki-types", "tokio", ] @@ -6768,21 +1782,6 @@ dependencies = [ "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 0.21.12", - "tokio", - "tokio-rustls 0.24.1", - "tungstenite", - "webpki-roots 0.25.4", -] - [[package]] name = "tokio-util" version = "0.7.12" @@ -6796,35 +1795,11 @@ dependencies = [ "tokio", ] -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "toml" -version = "0.8.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1ed1f98e3fdc28d6d910e6737ae6ab1a93bf1985935a1193e68f93eeb68d24e" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[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" @@ -6832,83 +1807,11 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.6.0", - "serde", - "serde_spanned", + "indexmap", "toml_datetime", "winnow", ] -[[package]] -name = "tonic" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877c5b330756d856ffcc4553ab34a5684481ade925ecc54bcd1bf02b1d0d4d52" -dependencies = [ - "async-stream", - "async-trait", - "axum", - "base64 0.22.1", - "bytes", - "h2 0.4.6", - "http 1.1.0", - "http-body 1.0.1", - "http-body-util", - "hyper 1.5.0", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "prost", - "socket2", - "tokio", - "tokio-stream", - "tower 0.4.13", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "indexmap 1.9.3", - "pin-project", - "pin-project-lite", - "rand 0.8.5", - "slab", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tower" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2873938d487c3cfb9aed7546dc9f2711d867c9f90c46b889989a2cb84eba6b4f" -dependencies = [ - "futures-core", - "futures-util", - "pin-project-lite", - "sync_wrapper 0.1.2", - "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" @@ -6921,7 +1824,6 @@ version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -6935,7 +1837,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn", ] [[package]] @@ -6969,18 +1871,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", - "valuable", - "valuable-serde", -] - [[package]] name = "tracing-subscriber" version = "0.3.18" @@ -6991,17 +1881,12 @@ dependencies = [ "nu-ansi-term", "once_cell", "regex", - "serde", - "serde_json", "sharded-slab", "smallvec", "thread_local", "tracing", "tracing-core", "tracing-log", - "tracing-serde", - "valuable", - "valuable-serde", ] [[package]] @@ -7010,27 +1895,6 @@ 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 0.2.12", - "httparse", - "log", - "rand 0.8.5", - "rustls 0.21.12", - "sha1", - "thiserror", - "url", - "utf-8", - "webpki-roots 0.24.0", -] - [[package]] name = "typed-builder" version = "0.18.2" @@ -7048,45 +1912,9 @@ checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", -] - -[[package]] -name = "typenum" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", + "syn", ] -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - -[[package]] -name = "unicase" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" - [[package]] name = "unicode-bidi" version = "0.3.17" @@ -7108,59 +1936,12 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-width" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" - -[[package]] -name = "unicode-xid" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "unreachable" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" -dependencies = [ - "void", -] - -[[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 = "uriparse" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" -dependencies = [ - "fnv", - "lazy_static", -] - [[package]] name = "url" version = "2.5.2" @@ -7173,12 +1954,6 @@ dependencies = [ "serde", ] -[[package]] -name = "utf-8" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" - [[package]] name = "utf8parse" version = "0.2.2" @@ -7191,7 +1966,7 @@ version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a" dependencies = [ - "getrandom 0.2.15", + "getrandom", "serde", ] @@ -7201,16 +1976,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "valuable-serde" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5285cfff30cdabe26626736a54d989687dd9cab84f51f4048b61d6d0ae8b0907" -dependencies = [ - "serde", - "valuable", -] - [[package]] name = "value-trait" version = "0.8.1" @@ -7223,33 +1988,12 @@ dependencies = [ "ryu", ] -[[package]] -name = "vec_map" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1bddf1187be692e79c5ffeab891132dfb0f236ed36a43c7ed39f1165ee20191" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "wait-timeout" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" -dependencies = [ - "libc", -] - [[package]] name = "waker-fn" version = "1.2.0" @@ -7265,12 +2009,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -7299,7 +2037,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.85", + "syn", "wasm-bindgen-shared", ] @@ -7333,7 +2071,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7367,21 +2105,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "webpki-roots" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b291546d5d9d1eab74f069c77749f2cb8504a12caa20f0f2de93ddbf6f411888" -dependencies = [ - "rustls-webpki 0.101.7", -] - -[[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.6" @@ -7407,15 +2130,6 @@ 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" @@ -7627,43 +2341,6 @@ 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 = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x509-parser" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0ecbeb7b67ce215e40e3cc7f2ff902f94a223acf44995934763467e7b1febc8" -dependencies = [ - "asn1-rs", - "base64 0.13.1", - "data-encoding", - "der-parser", - "lazy_static", - "nom", - "oid-registry", - "rusticata-macros", - "thiserror", - "time", -] - [[package]] name = "xshell" version = "0.2.6" @@ -7683,7 +2360,7 @@ checksum = "9d422e8e38ec76e2f06ee439ccc765e9c6a9638b9e7c9f2e8255e4d41e8bd852" name = "xtask" version = "0.1.0" dependencies = [ - "clap 4.5.20", + "clap", "color-eyre", "eyre", "xshell", @@ -7713,7 +2390,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.85", + "syn", ] [[package]] @@ -7721,46 +2398,3 @@ 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.85", -] - -[[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.13+zstd.1.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38ff0f21cfee8f97d94cef41359e0c89aa6113028ab0291aa8ca0038995a95aa" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/Cargo.toml b/Cargo.toml index fae70ee..58b6231 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,8 +3,8 @@ cargo-features = ["codegen-backend"] [workspace.package] version = "0.1.0" authors = [] -repository = "https://github.com/eigerco/solana-axelar-relayer-internal" -homepage = "https://github.com/eigerco/solana-axelar-relayer-internal" +repository = "https://github.com/eigerco/axelar-relayer" +homepage = "https://github.com/eigerco/axelar-relayer" license = "MIT/Apache-2.0" edition = "2021" @@ -65,21 +65,8 @@ unused_must_use = { level = "deny", priority = -1 } relayer-engine = { path = "crates/relayer-engine" } relayer-amplifier-api-integration = { path = "crates/relayer-amplifier-api-integration" } relayer-amplifier-state = { path = "crates/relayer-amplifier-state" } -file-based-storage = { path = "crates/file-based-storage" } amplifier-api = { path = "crates/amplifier-api" } -solana-listener = { path = "crates/solana-listener" } common-serde-utils = { path = "crates/common-serde-utils" } -solana-event-forwarder = { path = "crates/solana-event-forwarder" } -solana-tx-pusher = { path = "crates/solana-tx-pusher" } -retrying-solana-http-sender = { path = "crates/retrying-solana-http-sender" } -solana-gateway-task-processor = { path = "crates/solana-gateway-task-processor" } -effective-tx-sender = { path = "crates/effective-tx-sender" } - -# Solana Gateway -gmp-gateway = { git = "https://github.com/eigerco/solana-axelar.git", branch = "main", features = ["no-entrypoint"] } -axelar-rkyv-encoding = { git = "https://github.com/eigerco/solana-axelar.git", branch = "main" } -axelar-message-primitives = { git = "https://github.com/eigerco/solana-axelar.git", branch = "main" } -axelar-executable = { git = "https://github.com/eigerco/solana-axelar.git", branch = "main" } # CLI clap = { version = "4", features = ["derive"] } @@ -126,14 +113,6 @@ color-eyre = "0.6" # HTTP reqwest = { version = "0.12", default-features = false, features = ["json", "gzip", "deflate", "rustls-tls", "stream", "http2"] } -# Solana -solana-client = "2" -solana-rpc-client = "2" -solana-rpc-client-api = "2" -solana-program = "2" -solana-sdk = "2" -solana-transaction-status = "2" - # Async tokio = { version = "1", features = ["rt", "signal", "rt-multi-thread", "macros"] } tokio-stream = { version = "0.1" } @@ -164,10 +143,3 @@ panic = "abort" [profile.dev] debug = 0 # codegen-backend = "cranelift" (not supported on m1 mac) - -[patch.crates-io] -# curve25519-dalek 3.x pin zeroize to <1.4 -# which conflicts with other dependencies requiring zeroize ^1.5. -# We’re patching it here to unpin zeroize, using commit from a PR, see -# https://github.com/dalek-cryptography/curve25519-dalek/pull/606 -curve25519-dalek = { git = "https://github.com/dalek-cryptography/curve25519-dalek", rev = "8274d5cbb6fc3f38cdc742b4798173895cd2a290" } diff --git a/README.md b/README.md index 38b0ddc..e74eef7 100644 --- a/README.md +++ b/README.md @@ -1 +1 @@ -# Solana Axelar Relayer +# Axelar Relayer core libraries diff --git a/config.example.toml b/config.example.toml deleted file mode 100644 index 4a0510f..0000000 --- a/config.example.toml +++ /dev/null @@ -1,26 +0,0 @@ -storage_path = "./storage" -[amplifier_component] -# pem format cert -identity = ''' ------BEGIN CERTIFICATE----- -... ------END CERTIFICATE----- ------BEGIN PRIVATE KEY----- -... ------END PRIVATE KEY----- -''' -url = "https://amplifier-devnet-amplifier.devnet.axelar.dev/" -chain = "solana-devnet" - -[relayer_engine] -[relayer_engine.health_check] -bind_addr = "0.0.0.0:3000" - -[solana_listener_component] -solana_http_rpc = "https://api.devnet.solana.com" - -# the officia ws endpoints hosted by solana sometimes refuse to accept new connections / drop the connection frequently. -# using helius hosted nodes (even the free tier) often at times yields better results. -solana_ws = "wss://api.devnet.solana.com" -# solana_ws = "wss://devnet.helius-rpc.com/?{your api key}" -missed_signature_catchup_strategy = "until_beginning" diff --git a/crates/common-serde-utils/Cargo.toml b/crates/common-serde-utils/Cargo.toml index 045e245..688efb8 100644 --- a/crates/common-serde-utils/Cargo.toml +++ b/crates/common-serde-utils/Cargo.toml @@ -9,11 +9,6 @@ edition.workspace = true [dependencies] serde.workspace = true -solana-sdk = { workspace = true, optional = true } -tracing.workspace = true - -[features] -solana-sdk = ["dep:solana-sdk"] [lints] workspace = true diff --git a/crates/common-serde-utils/src/lib.rs b/crates/common-serde-utils/src/lib.rs index 827d5d9..35e4999 100644 --- a/crates/common-serde-utils/src/lib.rs +++ b/crates/common-serde-utils/src/lib.rs @@ -19,28 +19,3 @@ where let duration = Duration::from_millis(raw_number); Ok(duration) } - -/// Decode [`solana_sdk::pubkey::Pubkey`] from a string in base58 format. -/// -/// # Errors -/// Returns an error if the provided string is not a valid base58-encoded public key. -/// -/// # Errors -/// This function will return an error if: -/// - The deserialized string is not valid base58 data. -/// - The deserialized string cannot be parsed into a [`solana_sdk::pubkey::Pubkey`]. -#[cfg(feature = "solana-sdk")] -pub fn pubkey_decode<'de, D>(deserializer: D) -> Result -where - D: Deserializer<'de>, -{ - use core::str::FromStr as _; - - let raw_string = String::deserialize(deserializer)?; - let pubkey = solana_sdk::pubkey::Pubkey::from_str(raw_string.as_str()) - .inspect_err(|err| { - tracing::error!(?err, "cannot parse base58 data"); - }) - .map_err(serde::de::Error::custom)?; - Ok(pubkey) -} diff --git a/crates/effective-tx-sender/Cargo.toml b/crates/effective-tx-sender/Cargo.toml deleted file mode 100644 index 052fdfe..0000000 --- a/crates/effective-tx-sender/Cargo.toml +++ /dev/null @@ -1,20 +0,0 @@ -[package] -name = "effective-tx-sender" -version.workspace = true -authors.workspace = true -repository.workspace = true -homepage.workspace = true -license.workspace = true -edition.workspace = true - -[dependencies] -eyre.workspace = true -thiserror.workspace = true -solana-sdk.workspace = true -solana-client.workspace = true -itertools.workspace = true -futures.workspace = true -tracing.workspace = true - -[lints] -workspace = true diff --git a/crates/effective-tx-sender/src/lib.rs b/crates/effective-tx-sender/src/lib.rs deleted file mode 100644 index a43922f..0000000 --- a/crates/effective-tx-sender/src/lib.rs +++ /dev/null @@ -1,219 +0,0 @@ -//! Utility that estimates the optimal compute budget and compute unit price to maximize the -//! chances of successfully submitting a transaction on the Solana network. -//! -//! This module provides the `EffectiveTxSender` struct, which helps simulate transactions -//! to determine the required compute units and appropriate compute unit price based on recent -//! network conditions. - -use core::marker::PhantomData; -use std::collections::VecDeque; - -use futures::TryFutureExt as _; -use itertools::Itertools as _; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_client::rpc_response::RpcSimulateTransactionResult; -use solana_sdk::compute_budget::ComputeBudgetInstruction; -use solana_sdk::instruction::Instruction; -use solana_sdk::signature::{Keypair, Signature}; -use solana_sdk::signer::Signer as _; - -/// Typestate representing the transaction sender before simulation to evaluate compute limits. -pub struct Unevaluated; - -/// Typestate representing the transaction sender after evaluating the best compute limits. -pub struct Evaluated; - -/// A transaction sender that pre-calculates the optimal compute budget and compute unit price -/// to maximize the chances of transaction inclusion. -/// -/// Internally, it maintains a deque of instructions, prepending compute budget and unit price -/// instructions after evaluation. -pub struct EffectiveTxSender<'a, T> { - solana_rpc_client: &'a RpcClient, - ixs: VecDeque, - solana_keypair: &'a Keypair, - hash: solana_sdk::hash::Hash, - _type: PhantomData, -} - -impl<'a> EffectiveTxSender<'a, Unevaluated> { - /// Creates a new `EffectiveTxSender` instance with the provided instructions. - /// - /// After initialization, the internal instruction deque contains the provided instructions. - #[tracing::instrument(skip_all)] - pub fn new( - solana_rpc_client: &'a RpcClient, - solana_keypair: &'a Keypair, - ixs: VecDeque, - ) -> Self { - Self { - solana_rpc_client, - hash: solana_sdk::hash::Hash::new_from_array([0; 32]), - ixs, - solana_keypair, - _type: PhantomData, - } - } - - /// Evaluates the compute budget and compute unit price instructions based on simulation. - /// - /// This method simulates the transaction to determine the optimal compute budget and compute - /// unit price. It updates the instruction deque by prepending the computed instructions. - /// - /// Returns an error if the simulation fails. - #[tracing::instrument(skip_all)] - pub async fn evaluate_compute_ixs( - mut self, - ) -> Result, ComputeBudgetError> { - const MAX_COMPUTE_BUDGET: u32 = 1_399_850; - // Add the max possible compute budget instruction for simulation - let cu_budget_for_simulation = - ComputeBudgetInstruction::set_compute_unit_limit(MAX_COMPUTE_BUDGET); - - self.ixs.push_front(cu_budget_for_simulation); - let valid_slice = self.ixs.make_contiguous(); - - let compute_budget = - compute_budget(valid_slice, self.solana_keypair, self.solana_rpc_client); - let compute_unit_price = compute_unit_price(valid_slice, self.solana_rpc_client) - .map_err(eyre::Error::from) - .map_err(ComputeBudgetError::Generic); - - let (compute_unit_price, (compute_budget, hash)) = - futures::try_join!(compute_unit_price, compute_budget)?; - - self.ixs.push_front(compute_unit_price); - let valid_slice = self.ixs.make_contiguous(); - #[expect( - clippy::indexing_slicing, - reason = "we're guaranteed to have 2 elements at this point" - )] - { - valid_slice[1] = compute_budget; - }; - - Ok(EffectiveTxSender { - solana_rpc_client: self.solana_rpc_client, - ixs: self.ixs, - hash, - solana_keypair: self.solana_keypair, - _type: PhantomData, - }) - } -} - -impl<'a> EffectiveTxSender<'a, Evaluated> { - /// Signs and sends the transaction. - #[tracing::instrument(skip_all, err)] - pub async fn send_tx(self) -> eyre::Result { - let valid_slice = self.ixs.as_slices().0; - let tx = solana_sdk::transaction::Transaction::new_signed_with_payer( - valid_slice, - Some(&self.solana_keypair.pubkey()), - &[self.solana_keypair], - self.hash, - ); - - let signature = self - .solana_rpc_client - .send_and_confirm_transaction(&tx) - .await?; - Ok(signature) - } -} - -/// Error type representing possible failures during compute budget evaluation. -#[derive(thiserror::Error, Debug)] -pub enum ComputeBudgetError { - /// Error occurred during transaction simulation. - #[error("Simulation error: {0:?}")] - SimulationError(RpcSimulateTransactionResult), - /// Generic, non-recoverable error. - #[error("Generic error: {0}")] - Generic(eyre::Error), -} - -/// Computes the optimal compute budget instruction based on transaction simulation. -/// -/// Simulates the transaction to estimate the compute units consumed, then adds a top-up percentage -/// to ensure sufficient compute units during execution. -/// -/// Returns the compute budget instruction and the latest blockhash. -pub(crate) async fn compute_budget( - ixs: &[Instruction], - solana_keypair: &Keypair, - solana_rpc_client: &RpcClient, -) -> Result<(Instruction, solana_sdk::hash::Hash), ComputeBudgetError> { - const PERCENT_POINTS_TO_TOP_UP: u64 = 10; - - let hash = solana_rpc_client - .get_latest_blockhash() - .await - .map_err(eyre::Error::from) - .map_err(ComputeBudgetError::Generic)?; - let tx_to_simulate = solana_sdk::transaction::Transaction::new_signed_with_payer( - ixs, - Some(&solana_keypair.pubkey()), - &[solana_keypair], - hash, - ); - let simulation_result = solana_rpc_client - .simulate_transaction(&tx_to_simulate) - .await - .map_err(eyre::Error::from) - .map_err(ComputeBudgetError::Generic)?; - if simulation_result.value.err.is_some() { - return Err(ComputeBudgetError::SimulationError(simulation_result.value)); - } - let computed_units = simulation_result.value.units_consumed.unwrap_or(0); - let top_up = computed_units - .checked_div(PERCENT_POINTS_TO_TOP_UP) - .unwrap_or(0); - let compute_budget = computed_units.saturating_add(top_up); - let ix = ComputeBudgetInstruction::set_compute_unit_limit( - compute_budget - .try_into() - .map_err(eyre::Error::from) - .map_err(ComputeBudgetError::Generic)?, - ); - Ok((ix, hash)) -} - -/// Computes the optimal compute unit price instruction based on recent prioritization fees. -/// -/// Analyzes recent prioritization fees for accounts involved in the transaction to calculate an -/// average fee, which is then used to set the compute unit price. -/// -/// Returns the compute unit price instruction. -pub(crate) async fn compute_unit_price( - ixs: &[Instruction], - solana_rpc_client: &RpcClient, -) -> Result { - const MAX_ACCOUNTS: usize = 128; - const N_SLOTS_TO_CHECK: usize = 10; - - let all_touched_accounts = ixs - .iter() - .flat_map(|x| x.accounts.as_slice()) - .take(MAX_ACCOUNTS) - .map(|x| x.pubkey) - .collect_vec(); - let fees = solana_rpc_client - .get_recent_prioritization_fees(&all_touched_accounts) - .await?; - let (sum, count) = fees - .into_iter() - .rev() - .take(N_SLOTS_TO_CHECK) - .map(|x| x.prioritization_fee) - // Simple rolling average of the last `N_SLOTS_TO_CHECK` items. - .fold((0_u64, 0_u64), |(sum, count), fee| { - (sum.saturating_add(fee), count.saturating_add(1)) - }); - let average = if count > 0 { - sum.checked_div(count).unwrap_or(0) - } else { - 0 - }; - Ok(ComputeBudgetInstruction::set_compute_unit_price(average)) -} diff --git a/crates/file-based-storage/Cargo.toml b/crates/file-based-storage/Cargo.toml deleted file mode 100644 index 6235db1..0000000 --- a/crates/file-based-storage/Cargo.toml +++ /dev/null @@ -1,18 +0,0 @@ -[package] -name = "file-based-storage" -version.workspace = true -authors.workspace = true -repository.workspace = true -homepage.workspace = true -license.workspace = true -edition.workspace = true - -[dependencies] -relayer-amplifier-state.workspace = true -amplifier-api.workspace = true -memmap2.workspace = true -tracing.workspace = true -bytemuck.workspace = true - -[lints] -workspace = true diff --git a/crates/file-based-storage/src/lib.rs b/crates/file-based-storage/src/lib.rs deleted file mode 100644 index 0116643..0000000 --- a/crates/file-based-storage/src/lib.rs +++ /dev/null @@ -1,140 +0,0 @@ -#![expect(clippy::allow_attributes_without_reason)] -#![expect(clippy::allow_attributes)] - -//! simple memory storage implementation using memory maps -use std::fs::OpenOptions; -use std::io::{self, Seek as _, SeekFrom, Write as _}; -use std::path::Path; -use std::sync::{Arc, Mutex}; - -use amplifier_api::types::{uuid, TaskItemId}; -use bytemuck::{Pod, Zeroable}; -use memmap2::MmapMut; - -/// Memory map wrapper that implements the state to successfully store and retrieve latest task item -/// id -#[derive(Debug, Clone)] -pub struct MemmapState { - mmap: Arc>, -} - -#[repr(C)] -#[derive(Default, Debug, Copy, Clone, Pod, Zeroable)] -struct InternalState { - latest_queried_task_item_id: u128, - latest_processed_task_item_id: u128, -} - -#[expect( - clippy::expect_used, - clippy::unwrap_in_result, - reason = "irrecoverable error" -)] -impl MemmapState { - /// Creates a new [`MemmapState`] with the memory-mapped file at the given path. - /// - /// # Errors - /// If the file cannot be created / opened - /// - /// # Panics - /// If the expected state of the [`InternalState`] will be larger than `u64` - pub fn new>(path: P) -> io::Result { - // Open or create the file with read and write permissions - let mut file = OpenOptions::new() - .read(true) - .write(true) - .create(true) - .truncate(false) - .open(path)?; - - // Ensure the file is at least the size of InternalState - let default_state = InternalState::default(); - let default_state_bytes = bytemuck::bytes_of(&default_state); - let expected_len = default_state_bytes - .len() - .try_into() - .expect("the size of default state must fit in a u64"); - if file.metadata()?.len() < expected_len { - file.set_len(expected_len)?; - file.seek(SeekFrom::Start(0))?; - file.write_all(default_state_bytes)?; - } - - // Create a mutable memory map of the file - // SAFETY: - // we ensured that the size is large enough - let mmap = unsafe { MmapMut::map_mut(&file)? }; - mmap.flush_async()?; - - Ok(Self { - mmap: Arc::new(Mutex::new(mmap)), - }) - } - - // Generic helper function for getting a TaskItemId - fn get_task_item_id(&self, field_accessor: F) -> Option - where - F: Fn(&InternalState) -> u128, - { - let mmap = self.mmap.lock().expect("lock should not be poisoned"); - let data = bytemuck::from_bytes::(&mmap[..]); - let task_item_id = field_accessor(data); - drop(mmap); - - if task_item_id == 0 { - None - } else { - Some(TaskItemId(uuid::Uuid::from_u128(task_item_id))) - } - } - - // Generic helper function for setting a TaskItemId - fn set_task_item_id( - &self, - task_item_id: &TaskItemId, - field_mutator: F, - ) -> Result<(), io::Error> - where - F: Fn(&mut InternalState, u128), - { - let mut mmap = self.mmap.lock().expect("lock should not be poisoned"); - let raw_u128 = task_item_id.0.as_u128(); - let data = bytemuck::from_bytes_mut::(&mut mmap[..]); - field_mutator(data, raw_u128); - mmap.flush_async()?; - drop(mmap); - Ok(()) - } -} - -impl relayer_amplifier_state::State for MemmapState { - type Err = io::Error; - - #[tracing::instrument(skip(self), level = "trace", ret)] - fn latest_queried_task_id(&self) -> Option { - tracing::trace!("getting latest queried task item id"); - self.get_task_item_id(|data| data.latest_queried_task_item_id) - } - - #[tracing::instrument(skip(self), err)] - fn set_latest_queried_task_id(&self, task_item_id: TaskItemId) -> Result<(), Self::Err> { - tracing::info!("updating latest queried task item id"); - self.set_task_item_id(&task_item_id, |data, value| { - data.latest_queried_task_item_id = value; - }) - } - - #[tracing::instrument(skip(self), level = "trace", ret)] - fn latest_processed_task_id(&self) -> Option { - tracing::trace!("getting latest processed task item id"); - self.get_task_item_id(|data| data.latest_processed_task_item_id) - } - - #[tracing::instrument(skip(self), err)] - fn set_latest_processed_task_id(&self, task_item_id: TaskItemId) -> Result<(), Self::Err> { - tracing::info!("updating latest processed task item id"); - self.set_task_item_id(&task_item_id, |data, value| { - data.latest_processed_task_item_id = value; - }) - } -} diff --git a/crates/retrying-solana-http-sender/Cargo.toml b/crates/retrying-solana-http-sender/Cargo.toml deleted file mode 100644 index 993d5c1..0000000 --- a/crates/retrying-solana-http-sender/Cargo.toml +++ /dev/null @@ -1,25 +0,0 @@ -[package] -name = "retrying-solana-http-sender" -version.workspace = true -authors.workspace = true -repository.workspace = true -homepage.workspace = true -license.workspace = true -edition.workspace = true - -[dependencies] -async-trait.workspace = true -backoff.workspace = true -serde_json.workspace = true -solana-client.workspace = true -solana-sdk.workspace = true -solana-rpc-client.workspace = true -solana-rpc-client-api.workspace = true -tokio.workspace = true -tracing.workspace = true -serde.workspace = true -typed-builder.workspace = true -url.workspace = true - -[lints] -workspace = true diff --git a/crates/retrying-solana-http-sender/src/lib.rs b/crates/retrying-solana-http-sender/src/lib.rs deleted file mode 100644 index a7c2887..0000000 --- a/crates/retrying-solana-http-sender/src/lib.rs +++ /dev/null @@ -1,130 +0,0 @@ -//! Simple HTTP client that will limit the amount of concurrent requests. -//! It will also retry the HTTP calls if they failed with a an exponential backoff strategy. -//! Intended to rate-limit Solana RPC calls. - -use core::time::Duration; -use std::sync::Arc; - -use async_trait::async_trait; -use backoff::future::retry; -use backoff::ExponentialBackoffBuilder; -use serde::Deserialize; -use serde_json::Value; -use solana_client::client_error::{ClientError, ClientErrorKind}; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_client::rpc_client::RpcClientConfig; -use solana_client::rpc_sender::RpcTransportStats; -use solana_rpc_client::http_sender::HttpSender; -use solana_rpc_client::rpc_sender::RpcSender; -use solana_rpc_client_api::client_error::Result as ClientResult; -use solana_rpc_client_api::request::RpcRequest; -use solana_sdk::commitment_config::CommitmentConfig; -use tokio::sync::Semaphore; -use tracing::error; -use typed_builder::TypedBuilder; - -/// The maximum elapsed time for retrying failed requests. -const TWO_MINUTES: Duration = Duration::from_millis(2 * 60 * 1_000); - -/// Create a new Solana RPC client based on the provided config -#[must_use] -pub fn new_client(config: &Config) -> Arc { - let sender = RetryingHttpSender::new( - config.solana_http_rpc.to_string(), - config.max_concurrent_rpc_requests, - ); - let config = RpcClientConfig::with_commitment(CommitmentConfig::finalized()); - let client = RpcClient::new_sender(sender, config); - Arc::new(client) -} - -/// A wrapper around `HttpSender` that adds retry logic for sending RPC -/// requests. -pub struct RetryingHttpSender { - http_client: HttpSender, - request_permit: Arc, -} - -impl RetryingHttpSender { - /// Initialize a new - #[must_use] - pub fn new(url: String, max_concurrent_requests: usize) -> Self { - let http = HttpSender::new(url); - let request_permit = Arc::new(Semaphore::new(max_concurrent_requests)); - Self { - http_client: http, - request_permit, - } - } - - async fn send_internal( - &self, - request: RpcRequest, - params: &Value, - ) -> Result> { - use ClientErrorKind::{ - Custom, Io, Middleware, Reqwest, RpcError, SerdeJson, SigningError, TransactionError, - }; - // get the permit to make the request - let _permit = Arc::clone(&self.request_permit) - .acquire_owned() - .await - .expect("the semaphore will never be closed"); - - // make the actual request - self.http_client - .send(request, params.clone()) - .await - .inspect_err(|error| error!(%error)) - .map_err(|error| match *error.kind() { - // Retry on networking-io related errors - Io(_) | Reqwest(_) => backoff::Error::transient(error), - // Fail instantly on other errors - SerdeJson(_) | RpcError(_) | SigningError(_) | TransactionError(_) | Custom(_) => { - backoff::Error::permanent(error) - } - Middleware(_) => backoff::Error::permanent(error), - }) - } -} - -#[async_trait] -impl RpcSender for RetryingHttpSender { - #[tracing::instrument(skip(self), name = "retrying_http_sender")] - async fn send(&self, request: RpcRequest, params: Value) -> ClientResult { - let strategy = ExponentialBackoffBuilder::new() - .with_max_elapsed_time(Some(TWO_MINUTES)) - .build(); - let operation = || self.send_internal(request, ¶ms); - retry(strategy, operation).await - } - - fn get_transport_stats(&self) -> RpcTransportStats { - self.http_client.get_transport_stats() - } - - fn url(&self) -> String { - self.http_client.url() - } -} - -/// Configuration for initialising the [`RetryingHttpSender`] -#[derive(Debug, Deserialize, Clone, PartialEq, Eq, TypedBuilder)] -pub struct Config { - /// How many rpc requests we process at the same time - #[builder(default = config_defaults::max_concurrent_rpc_requests())] - #[serde( - rename = "max_concurrent_rpc_requests", - default = "config_defaults::max_concurrent_rpc_requests" - )] - pub max_concurrent_rpc_requests: usize, - - /// The rpc of the solana node - pub solana_http_rpc: url::Url, -} - -mod config_defaults { - pub(crate) const fn max_concurrent_rpc_requests() -> usize { - 5 - } -} diff --git a/crates/solana-axelar-relayer/Cargo.toml b/crates/solana-axelar-relayer/Cargo.toml deleted file mode 100644 index 476e094..0000000 --- a/crates/solana-axelar-relayer/Cargo.toml +++ /dev/null @@ -1,38 +0,0 @@ -[package] -name = "solana-axelar-relayer" -version = { workspace = true } -authors = { workspace = true } -repository = { workspace = true } -homepage = { workspace = true } -license = { workspace = true } -edition = { workspace = true } - -[dependencies] -relayer-engine.workspace = true -eyre.workspace = true -color-eyre.workspace = true -toml.workspace = true -tokio.workspace = true -serde.workspace = true -relayer-amplifier-api-integration.workspace = true -solana-listener.workspace = true -solana-event-forwarder.workspace = true -solana-gateway-task-processor.workspace = true -retrying-solana-http-sender.workspace = true -tracing-subscriber.workspace = true -tracing-error.workspace = true -opentelemetry.workspace = true -opentelemetry-otlp.workspace = true -opentelemetry-semantic-conventions.workspace = true -opentelemetry_sdk.workspace = true -opentelemetry-appender-tracing.workspace = true -file-based-storage.workspace = true - -[dev-dependencies] -temp-env.workspace = true -amplifier-api.workspace = true -pretty_assertions.workspace = true -indoc.workspace = true - -[lints] -workspace = true diff --git a/crates/solana-axelar-relayer/build.rs b/crates/solana-axelar-relayer/build.rs deleted file mode 100644 index 67cc51f..0000000 --- a/crates/solana-axelar-relayer/build.rs +++ /dev/null @@ -1,13 +0,0 @@ -//! store the git commit hash as a static env variable that's accessible at build time via env!() -//! macro - -fn main() { - // Execute `git rev-parse --short HEAD` and store it in GIT_ENV variable - let git_hash = std::process::Command::new("git") - .args(["rev-parse", "--short", "HEAD"]) - .output() - .expect("Failed to execute git command") - .stdout; - let git_hash = core::str::from_utf8(&git_hash).expect("hash is not a valid utf8"); - println!("cargo:rustc-env=GIT_HASH={git_hash}"); -} diff --git a/crates/solana-axelar-relayer/src/main.rs b/crates/solana-axelar-relayer/src/main.rs deleted file mode 100644 index 48a58f5..0000000 --- a/crates/solana-axelar-relayer/src/main.rs +++ /dev/null @@ -1,192 +0,0 @@ -//! Transaction relayer for Solana-Axelar integration - -use std::path::PathBuf; -use std::sync::Arc; - -use relayer_amplifier_api_integration::Amplifier; -use relayer_engine::{RelayerComponent, RelayerEngine}; -use serde::Deserialize; - -mod telemetry; - -#[tokio::main] -async fn main() { - // Load configuration - let tracing_endpoint = std::env::var("TRACING_ENDPOINT").ok(); - let config_file = std::env::var("CONFIG") - .unwrap_or_else(|_| "config.toml".to_owned()) - .parse::() - .expect("invalid file path"); - - // Initialize tracing - telemetry::init_telemetry(tracing_endpoint).expect("could not init telemetry"); - color_eyre::install().expect("color eyre could not be installed"); - - let config_file = std::fs::read_to_string(config_file).expect("cannot read config file"); - let config = toml::from_str::(&config_file).expect("invalid config file"); - - let file_based_storage = file_based_storage::MemmapState::new(config.storage_path) - .expect("could not init file based storage"); - - let rpc_client = retrying_solana_http_sender::new_client(&config.solana_rpc); - let event_forwarder_config = solana_event_forwarder::Config::new( - &config.solana_listener_component, - &config.amplifier_component, - ); - let name_on_amplifier = config.amplifier_component.chain.clone(); - let (amplifier_component, amplifier_client, amplifier_task_receiver) = - Amplifier::new(config.amplifier_component, file_based_storage.clone()); - let gateway_task_processor = solana_gateway_task_processor::SolanaTxPusher::new( - config.solana_gateway_task_processor, - name_on_amplifier.clone(), - Arc::clone(&rpc_client), - amplifier_task_receiver, - file_based_storage, - ); - let (solana_listener_component, solana_listener_client) = solana_listener::SolanaListener::new( - config.solana_listener_component, - Arc::clone(&rpc_client), - ); - let solana_event_forwarder_component = solana_event_forwarder::SolanaEventForwarder::new( - event_forwarder_config, - solana_listener_client, - amplifier_client, - ); - let components: Vec> = vec![ - Box::new(amplifier_component), - Box::new(solana_listener_component), - Box::new(solana_event_forwarder_component), - Box::new(gateway_task_processor), - ]; - RelayerEngine::new(config.relayer_engine, components) - .start_and_wait_for_shutdown() - .await; -} - -pub(crate) const fn get_service_version() -> &'static str { - env!("GIT_HASH") -} - -pub(crate) const fn get_service_name() -> &'static str { - concat!(env!("CARGO_PKG_NAME"), env!("GIT_HASH")) -} - -/// Top-level configuration for the relayer. -#[derive(Debug, Deserialize, PartialEq)] -pub struct Config { - /// Configuration for the Amplifier API processor - pub amplifier_component: relayer_amplifier_api_integration::Config, - /// Configuration for the Solana transaction listener processor - pub solana_listener_component: solana_listener::Config, - /// Configuration for the Solana transaction listener processor - pub solana_gateway_task_processor: solana_gateway_task_processor::Config, - /// Meta-configuration on the engine - pub relayer_engine: relayer_engine::Config, - /// Shared configuration for the Solana RPC client - pub solana_rpc: retrying_solana_http_sender::Config, - /// Path to the storage configuration file - pub storage_path: std::path::PathBuf, -} - -#[expect( - clippy::panic_in_result_fn, - reason = "assertions in tests that return Result is fine" -)] -#[cfg(test)] -mod tests { - use core::net::SocketAddr; - use core::str::FromStr as _; - use core::time::Duration; - - use amplifier_api::identity::Identity; - use pretty_assertions::assert_eq; - use solana_listener::solana_sdk::pubkey::Pubkey; - use solana_listener::solana_sdk::signature::{Keypair, Signature}; - use solana_listener::MissedSignatureCatchupStrategy; - - use crate::Config; - - #[test] - fn parse_toml() -> eyre::Result<()> { - let amplifier_url = "https://examlple.com".parse()?; - let healthcheck_bind_addr = "127.0.0.1:8000"; - let chain = "solana-devnet"; - let gateway_program_address = Pubkey::new_unique(); - let gateway_program_address_as_str = gateway_program_address.to_string(); - let solana_rpc = "https://api.solana-devnet.com".parse()?; - let solana_ws = "wss://api.solana-devnet.com".parse()?; - let solana_tx_scan_poll_period = Duration::from_millis(42); - let solana_tx_scan_poll_period_ms = solana_tx_scan_poll_period.as_millis(); - let max_concurrent_rpc_requests = 100; - let signing_keypair = Keypair::new(); - let signing_keypair_as_str = signing_keypair.to_base58_string(); - let latest_processed_signature = Signature::new_unique().to_string(); - let identity = identity_fixture(); - let missed_signature_catchup_strategy = "until_beginning"; - let input = indoc::formatdoc! {r#" - storage_path = "./store" - - [amplifier_component] - identity = ''' - {identity} - ''' - url = "{amplifier_url}" - chain = "{chain}" - - [relayer_engine] - [relayer_engine.health_check] - bind_addr = "{healthcheck_bind_addr}" - - [solana_listener_component] - gateway_program_address = "{gateway_program_address_as_str}" - solana_ws = "{solana_ws}" - tx_scan_poll_period_in_milliseconds = {solana_tx_scan_poll_period_ms} - missed_signature_catchup_strategy = "{missed_signature_catchup_strategy}" - latest_processed_signature = "{latest_processed_signature}" - - [solana_gateway_task_processor] - signing_keypair = "{signing_keypair_as_str}" - gateway_program_address = "{gateway_program_address_as_str}" - - [solana_rpc] - max_concurrent_rpc_requests = {max_concurrent_rpc_requests} - solana_http_rpc = "{solana_rpc}" - "#}; - - let parsed: Config = toml::from_str(&input)?; - let expected = Config { - amplifier_component: relayer_amplifier_api_integration::Config::builder() - .identity(Identity::new_from_pem_bytes(identity_fixture().as_bytes())?) - .url(amplifier_url) - .chain(chain.to_owned()) - .build(), - relayer_engine: relayer_engine::Config { - health_check: relayer_engine::HealthCheckConfig { - bind_addr: SocketAddr::from_str(healthcheck_bind_addr)?, - }, - }, - solana_listener_component: solana_listener::Config { - gateway_program_address, - tx_scan_poll_period: solana_tx_scan_poll_period, - solana_ws, - missed_signature_catchup_strategy: MissedSignatureCatchupStrategy::UntilBeginning, - latest_processed_signature: Some(Signature::from_str(&latest_processed_signature)?), - }, - solana_gateway_task_processor: solana_gateway_task_processor::Config { - gateway_program_address, - signing_keypair, - }, - solana_rpc: retrying_solana_http_sender::Config { - max_concurrent_rpc_requests, - solana_http_rpc: solana_rpc, - }, - storage_path: "./store".parse().unwrap(), - }; - assert_eq!(parsed, expected); - Ok(()) - } - - fn identity_fixture() -> String { - include_str!("../../amplifier-api/fixtures/example_cert.pem").to_owned() - } -} diff --git a/crates/solana-axelar-relayer/src/telemetry.rs b/crates/solana-axelar-relayer/src/telemetry.rs deleted file mode 100644 index 35344f6..0000000 --- a/crates/solana-axelar-relayer/src/telemetry.rs +++ /dev/null @@ -1,136 +0,0 @@ -use opentelemetry::logs::LogError; -use opentelemetry::metrics::MetricsError; -use opentelemetry::trace::TraceError; -use opentelemetry::{global, KeyValue}; -use opentelemetry_appender_tracing::layer::OpenTelemetryTracingBridge; -use opentelemetry_otlp::{ExportConfig, WithExportConfig as _}; -use opentelemetry_sdk::logs::{Logger, LoggerProvider}; -use opentelemetry_sdk::trace::Config; -use opentelemetry_sdk::{runtime, trace as sdktrace, Resource}; -use tracing_error::ErrorLayer; -use tracing_subscriber::prelude::*; -use tracing_subscriber::{EnvFilter, Registry}; - -use crate::{get_service_name, get_service_version}; - -// Aliases for readability -type TracerProviderResult = Result; -type MeterProviderResult = Result; -type LoggerProviderResult = Result; - -pub(crate) fn init_telemetry(exporter_endpoint: Option) -> eyre::Result<()> { - if let Some(endpoint) = exporter_endpoint { - let endpoint = endpoint.as_str(); // Convert once and reuse - - let tracer = init_tracer_provider(endpoint)?; - let metrics = init_metrics(endpoint)?; - let logs = init_logs(endpoint)?; - - global::set_tracer_provider(tracer); - global::set_meter_provider(metrics); - - let logs_layer = OpenTelemetryTracingBridge::new(&logs); - - setup_subscriber(Some(logs_layer))?; - } else { - setup_subscriber(None)?; - } - - Ok(()) -} - -fn init_tracer_provider(exporter_endpoint: &str) -> TracerProviderResult { - opentelemetry_otlp::new_pipeline() - .tracing() - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(exporter_endpoint), - ) - .with_trace_config(Config::default().with_resource(resources())) - .install_batch(runtime::Tokio) -} - -fn init_metrics(exporter_endpoint: &str) -> MeterProviderResult { - let export_config = ExportConfig { - endpoint: exporter_endpoint.to_owned(), - ..ExportConfig::default() - }; - - opentelemetry_otlp::new_pipeline() - .metrics(runtime::Tokio) - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_export_config(export_config), - ) - .with_resource(resources()) - .build() -} - -fn init_logs(exporter_endpoint: &str) -> LoggerProviderResult { - opentelemetry_otlp::new_pipeline() - .logging() - .with_resource(resources()) - .with_exporter( - opentelemetry_otlp::new_exporter() - .tonic() - .with_endpoint(exporter_endpoint), - ) - .install_batch(runtime::Tokio) -} - -fn resources() -> Resource { - Resource::new(vec![ - KeyValue::new( - opentelemetry_semantic_conventions::resource::SERVICE_NAME, - get_service_name(), - ), - KeyValue::new( - opentelemetry_semantic_conventions::resource::SERVICE_VERSION, - get_service_version(), - ), - ]) -} - -fn setup_subscriber( - logs_layer: Option>, -) -> eyre::Result<()> { - let subscriber = Registry::default(); - let filter = EnvFilter::new("relayer_engine=info") - .add_directive("solana_axelar_relayer=info".parse()?) - .add_directive("relayer_amplifier_api_integration=info".parse()?) - .add_directive("amplifier_api=info".parse()?) - .add_directive("solana_listener=info".parse()?) - .add_directive("solana_event_forwarder=info".parse()?) - .add_directive("solana_gateway_task_processor=info".parse()?) - .add_directive("effective_tx_sender=info".parse()?) - .add_directive("file_based_storage=info".parse()?) - .add_directive("hyper=error".parse()?) - .add_directive("tonic=error".parse()?) - .add_directive("reqwest=error".parse()?) - .add_directive(EnvFilter::from_default_env().to_string().parse()?); - - let output_layer = tracing_subscriber::fmt::layer() - .with_line_number(true) - .with_ansi(true) - .with_file(true) - .with_writer(std::io::stderr); - - // use json logging for release builds - let subscriber = subscriber.with(filter).with(ErrorLayer::default()); - let subscriber = if cfg!(debug_assertions) { - subscriber.with(output_layer.boxed()) - } else { - subscriber.with(output_layer.json().with_current_span(true).boxed()) - }; - - // init with the otlp logging layer - if let Some(logs_layer) = logs_layer { - subscriber.with(logs_layer).init(); - } else { - subscriber.init(); - } - - Ok(()) -} diff --git a/crates/solana-event-forwarder/Cargo.toml b/crates/solana-event-forwarder/Cargo.toml deleted file mode 100644 index 5735927..0000000 --- a/crates/solana-event-forwarder/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "solana-event-forwarder" -version.workspace = true -authors.workspace = true -repository.workspace = true -homepage.workspace = true -license.workspace = true -edition.workspace = true - -[dependencies] -futures.workspace = true -relayer-amplifier-api-integration.workspace = true -solana-listener.workspace = true -relayer-engine.workspace = true -gmp-gateway.workspace = true -tracing.workspace = true -eyre.workspace = true -bs58.workspace = true -solana-sdk.workspace = true -axelar-message-primitives.workspace = true -axelar-rkyv-encoding.workspace = true - -[dev-dependencies] -base64.workspace = true -pretty_assertions.workspace = true -test-log.workspace = true - -[lints] -workspace = true diff --git a/crates/solana-event-forwarder/src/component.rs b/crates/solana-event-forwarder/src/component.rs deleted file mode 100644 index cbc9cba..0000000 --- a/crates/solana-event-forwarder/src/component.rs +++ /dev/null @@ -1,529 +0,0 @@ -use core::future::Future; -use core::pin::Pin; - -use axelar_message_primitives::U256; -use axelar_rkyv_encoding::rkyv::{self, Deserialize as _}; -use futures::{SinkExt as _, StreamExt as _}; -use gmp_gateway::events::{EventContainer, GatewayEvent}; -use relayer_amplifier_api_integration::amplifier_api::types::{ - BigInt, CallEvent, CallEventMetadata, CommandId, Event, EventBase, EventId, EventMetadata, - GatewayV2Message, MessageApprovedEvent, MessageApprovedEventMetadata, MessageId, - PublishEventsRequest, SignersRotatedEvent, SignersRotatedMetadata, Token, TxEvent, TxId, -}; -use relayer_amplifier_api_integration::AmplifierCommand; -use solana_sdk::pubkey::Pubkey; - -/// The core component that is responsible for ingesting raw Solana events. -/// -/// As a result, the logs get parsed, filtererd and mapped to Amplifier API events. -#[derive(Debug)] -pub struct SolanaEventForwarder { - config: crate::Config, - solana_listener_client: solana_listener::SolanaListenerClient, - amplifier_client: relayer_amplifier_api_integration::AmplifierCommandClient, -} - -impl relayer_engine::RelayerComponent for SolanaEventForwarder { - fn process(self: Box) -> Pin> + Send>> { - use futures::FutureExt as _; - - self.process_internal().boxed() - } -} - -impl SolanaEventForwarder { - /// Instantiate a new `SolanaEventForwarder` using the pre-configured configuration. - #[must_use] - pub const fn new( - config: crate::Config, - solana_listener_client: solana_listener::SolanaListenerClient, - amplifier_client: relayer_amplifier_api_integration::AmplifierCommandClient, - ) -> Self { - Self { - config, - solana_listener_client, - amplifier_client, - } - } - - #[tracing::instrument(skip_all, name = "Solana log forwarder")] - pub(crate) async fn process_internal(mut self) -> eyre::Result<()> { - let match_context = MatchContext::new(self.config.gateway_program_id.to_string().as_str()); - - while let Some(message) = self.solana_listener_client.log_receiver.next().await { - let gateway_program_stack = build_program_event_stack(&match_context, &message.logs); - let total_cost = message.cost_in_lamports; - - // Collect all successful events into a vector - let events_vec = gateway_program_stack - .into_iter() - .filter_map(|x| { - if let ProgramInvocationState::Succeeded(events) = x { - Some(events) - } else { - None - } - }) - .flatten() - .collect::>(); - - // Calculate the number of events - let num_events = events_vec.len(); - - // Compute the price per event, handling the case where num_events is zero - let price_for_event = total_cost.checked_div(num_events.try_into()?).unwrap_or(0); - - // Map the events to amplifier events with the calculated price - let events_to_send = events_vec - .into_iter() - .filter_map(|(log_index, event)| { - map_gateway_event_to_amplifier_event( - self.config.source_chain_name.as_str(), - &event, - &message, - log_index, - price_for_event, - ) - }) - .collect::>(); - - // Only send events if there are any from successful invocations - if events_to_send.is_empty() { - continue; - } - - tracing::info!(count = ?events_to_send.len(), "sending solana events to amplifier component"); - let command = AmplifierCommand::PublishEvents(PublishEventsRequest { - events: events_to_send, - }); - self.amplifier_client.sender.send(command).await?; - } - eyre::bail!("Listener has stopped unexpectedly"); - } -} - -#[derive(Debug, PartialEq, Eq)] -enum ProgramInvocationState { - InProgress(Vec<(usize, EventContainer)>), - Succeeded(Vec<(usize, EventContainer)>), - Failed, -} - -#[expect(clippy::struct_field_names, reason = "improves readability")] -struct MatchContext { - /// the log prefix that indicates that we've entered the target program - expected_start: String, - /// the log prefix that indicates that the target program succeeded - expected_success: String, - /// the log prefix that indicates that the target program failed - expected_failure: String, -} - -impl MatchContext { - pub(crate) fn new(gateway_program_id: &str) -> Self { - Self { - expected_start: format!("Program {gateway_program_id} invoke"), - expected_success: format!("Program {gateway_program_id} success"), - expected_failure: format!("Program {gateway_program_id} failed"), - } - } -} - -fn build_program_event_stack(ctx: &MatchContext, logs: &[T]) -> Vec -where - T: AsRef, -{ - let logs = logs.iter().enumerate(); - let mut program_stack: Vec = Vec::new(); - - for (idx, log) in logs { - tracing::trace!(log =?log.as_ref(), "incoming log from Solana"); - if log.as_ref().starts_with(ctx.expected_start.as_str()) { - // Start a new program invocation - program_stack.push(ProgramInvocationState::InProgress(Vec::new())); - } else if log.as_ref().starts_with(ctx.expected_success.as_str()) { - handle_success_log(&mut program_stack); - } else if log.as_ref().starts_with(ctx.expected_failure.as_str()) { - handle_failure_log(&mut program_stack); - } else { - // Process logs if inside a program invocation - parse_execution_log(&mut program_stack, log, idx); - } - } - program_stack -} - -fn parse_execution_log(program_stack: &mut [ProgramInvocationState], log: &T, idx: usize) -where - T: AsRef, -{ - let Some(&mut ProgramInvocationState::InProgress(ref mut events)) = program_stack.last_mut() - else { - return; - }; - let Some(gateway_event) = GatewayEvent::parse_log(log.as_ref()) else { - return; - }; - events.push((idx, gateway_event)); -} - -fn handle_failure_log(program_stack: &mut Vec) { - // Mark the current program invocation as failed - if program_stack.pop().is_some() { - program_stack.push(ProgramInvocationState::Failed); - } else { - tracing::warn!("Program failure without matching invocation"); - } -} - -fn handle_success_log(program_stack: &mut Vec) { - // Mark the current program invocation as succeeded - let Some(state) = program_stack.pop() else { - tracing::warn!("Program success without matching invocation"); - return; - }; - match state { - ProgramInvocationState::InProgress(events) => { - program_stack.push(ProgramInvocationState::Succeeded(events)); - } - ProgramInvocationState::Succeeded(_) | ProgramInvocationState::Failed => { - // This should not happen - tracing::warn!("Unexpected state when marking program success"); - } - } -} - -#[expect( - clippy::too_many_lines, - clippy::cognitive_complexity, - reason = "easier to read when all the transformations in one place rather than scattered around" -)] -fn map_gateway_event_to_amplifier_event( - source_chain: &str, - event: &EventContainer, - message: &solana_listener::SolanaTransaction, - log_index: usize, - price_per_event_in_lamports: u64, -) -> Option { - use gmp_gateway::events::ArchivedGatewayEvent::{ - CallContract, MessageApproved, MessageExecuted, OperatorshipTransferred, SignersRotated, - }; - let signature = message.signature.to_string(); - let event_id = EventId::new(&signature, log_index); - let tx_id = TxId(signature.clone()); - - #[expect( - clippy::little_endian_bytes, - reason = "we are guaranteed correct conversion" - )] - match *event.parse() { - CallContract(ref call_contract) => { - let message_id = MessageId::new(&signature, log_index); - let source_address = Pubkey::new_from_array(call_contract.sender).to_string(); - let amplifier_event = Event::Call( - CallEvent::builder() - .base( - EventBase::builder() - .event_id(event_id) - .meta(Some( - EventMetadata::builder() - .tx_id(Some(tx_id)) - .timestamp(message.timestamp) - .from_address(Some(source_address.clone())) - .finalized(Some(true)) - .extra(CallEventMetadata::builder().build()) - .build(), - )) - .build(), - ) - .message( - GatewayV2Message::builder() - .message_id(message_id) - .source_chain(source_chain.to_owned()) - .source_address(source_address) - .destination_address(call_contract.destination_address.to_string()) - .payload_hash(call_contract.payload_hash.to_vec()) - .build(), - ) - .destination_chain(call_contract.destination_chain.to_string()) - .payload(call_contract.payload.to_vec()) - .build(), - ); - Some(amplifier_event) - } - SignersRotated(ref signers) => { - tracing::info!(?signers, "Signers rotated"); - - let decoded_u256: U256 = signers - .new_epoch - .deserialize(&mut rkyv::Infallible) - .unwrap(); - let le_bytes = decoded_u256.to_le_bytes(); - let (le_u64, _) = le_bytes.split_first_chunk::<8>()?; - let epoch = u64::from_le_bytes(*le_u64); - - let amplifier_event = Event::SignersRotated( - SignersRotatedEvent::builder() - .base( - EventBase::builder() - .event_id(event_id) - .meta(Some( - EventMetadata::builder() - .tx_id(Some(tx_id)) - .timestamp(message.timestamp) - .finalized(Some(true)) - .extra( - SignersRotatedMetadata::builder() - .signer_hash(signers.new_signers_hash.to_vec()) - .epoch(epoch) - .build(), - ) - .build(), - )) - .build(), - ) - .cost( - Token::builder() - .token_id(None) - .amount(BigInt::from_u64(price_per_event_in_lamports)) - .build(), - ) - .build(), - ); - Some(amplifier_event) - } - MessageApproved(ref approved_message) => { - let command_id = approved_message.command_id; - let message_id = TxEvent( - String::from_utf8(approved_message.message_id.to_vec()) - .expect("message id is not a valid String"), - ); - let amplifier_event = Event::MessageApproved( - MessageApprovedEvent::builder() - .base( - EventBase::builder() - .event_id(event_id) - .meta(Some( - EventMetadata::builder() - .tx_id(Some(tx_id)) - .timestamp(message.timestamp) - .from_address(Some( - String::from_utf8(approved_message.source_address.to_vec()) - .expect("source address is not a valid string"), - )) - .finalized(Some(true)) - .extra( - MessageApprovedEventMetadata::builder() - .command_id(Some(CommandId( - bs58::encode(command_id).into_string(), - ))) - .build(), - ) - .build(), - )) - .build(), - ) - .message( - GatewayV2Message::builder() - .message_id(message_id) - .source_chain( - String::from_utf8(approved_message.source_chain.to_vec()) - .expect("invalid source chain"), - ) - .source_address( - String::from_utf8(approved_message.source_address.to_vec()) - .expect("invalid source address"), - ) - .destination_address( - Pubkey::new_from_array(approved_message.destination_address) - .to_string(), - ) - .payload_hash(approved_message.payload_hash.to_vec()) - .build(), - ) - .cost( - Token::builder() - .amount(BigInt::from_u64(price_per_event_in_lamports)) - .build(), - ) - .build(), - ); - tracing::info!(message_id = ?approved_message.message_id, "Message approved"); - Some(amplifier_event) - } - MessageExecuted(ref _executed_message) => { - tracing::warn!( - "current gateway event does not produce enough artifacts to relay this message" - ); - None - } - OperatorshipTransferred(ref new_operatorship) => { - tracing::info!(?new_operatorship, "Operatorship transferred"); - None - } - } -} - -#[cfg(test)] -mod tests { - use gmp_gateway::events::CallContract; - use pretty_assertions::assert_eq; - use test_log::test; - - use super::*; - - static GATEWAY_EXAMPLE_ID: &str = "gtwEpzTprUX7TJLx1hFXNeqCXJMsoxYQhQaEbnuDcj1"; - - // Include the test_call_data function - fn fixture_call_data() -> (String, EventContainer) { - use base64::prelude::*; - // Simple `CallContract` fixture - let event = gmp_gateway::events::GatewayEvent::CallContract(CallContract { - sender: Pubkey::new_unique().to_bytes(), - destination_chain: "ethereum".to_owned(), - destination_address: "0x9e3e785dD9EA3826C9cBaFb1114868bc0e79539a".to_owned(), - payload: vec![42, 42], - payload_hash: Pubkey::new_unique().to_bytes(), - }); - let event = event.encode(); - let event_container = EventContainer::new(event.to_vec()).unwrap(); - let base64_data = BASE64_STANDARD.encode(&event); - (base64_data, event_container) - } - - fn fixture_match_context() -> MatchContext { - MatchContext::new(GATEWAY_EXAMPLE_ID) - } - - #[test] - fn test_simple_event() { - // Use the test_call_data fixture - let (base64_data, event) = fixture_call_data(); - - // Sample logs with multiple gateway calls, some succeed and some fail - let logs = vec![ - format!("Program {GATEWAY_EXAMPLE_ID} invoke [1]"), // Invocation 1 starts - "Program log: Instruction: Call Contract".to_owned(), - format!("Program data: {}", base64_data), - format!("Program {GATEWAY_EXAMPLE_ID} success"), // Invocation 1 succeeds - ]; - - let result = build_program_event_stack(&fixture_match_context(), &logs); - - // Expected result: two successful invocations with their events, one failed invocation - let expected = vec![ProgramInvocationState::Succeeded(vec![(2, event)])]; - - assert_eq!(result, expected); - } - - #[test] - fn test_multiple_gateway_calls_some_succeed_some_fail() { - // Use the test_call_data fixture - let (base64_data, event) = fixture_call_data(); - - // Sample logs with multiple gateway calls, some succeed and some fail - let logs = vec![ - format!("Program {GATEWAY_EXAMPLE_ID} invoke [1]"), // Invocation 1 starts - "Program log: Instruction: Call Contract".to_owned(), - format!("Program data: {}", base64_data), - format!("Program {GATEWAY_EXAMPLE_ID} success"), // Invocation 1 succeeds - format!("Program {GATEWAY_EXAMPLE_ID} invoke [2]"), // Invocation 2 starts - "Program log: Instruction: Call Contract".to_owned(), - format!("Program data: {}", base64_data), - format!("Program {GATEWAY_EXAMPLE_ID} failed"), // Invocation 2 fails - format!("Program {GATEWAY_EXAMPLE_ID} invoke [3]"), // Invocation 3 starts - "Program log: Instruction: Call Contract".to_owned(), - format!("Program data: {}", base64_data), - format!("Program {GATEWAY_EXAMPLE_ID} success"), // Invocation 3 succeeds - ]; - - let result = build_program_event_stack(&fixture_match_context(), &logs); - - // Expected result: two successful invocations with their events, one failed invocation - let expected = vec![ - ProgramInvocationState::Succeeded(vec![(2, event.clone())]), - ProgramInvocationState::Failed, - ProgramInvocationState::Succeeded(vec![(10, event)]), - ]; - - assert_eq!(result, expected); - } - - #[test] - fn test_no_gateway_calls() { - // Logs with no gateway calls - let logs = vec![ - "Program some_other_program invoke [1]".to_owned(), - "Program log: Instruction: Do something".to_owned(), - "Program some_other_program success".to_owned(), - ]; - - let result = build_program_event_stack(&fixture_match_context(), &logs); - - // Expected result: empty stack - let expected: Vec = Vec::new(); - - assert_eq!(result, expected); - } - - #[test] - fn test_gateway_call_with_no_events() { - // Gateway call that succeeds but has no events - let logs = vec![ - format!("Program {GATEWAY_EXAMPLE_ID} invoke [1]"), - "Program log: Instruction: Do something".to_owned(), - format!("Program {GATEWAY_EXAMPLE_ID} success"), - ]; - - let result = build_program_event_stack(&fixture_match_context(), &logs); - - // Expected result: one successful invocation with no events - let expected = vec![ProgramInvocationState::Succeeded(vec![])]; - - assert_eq!(result, expected); - } - - #[test] - fn test_gateway_call_failure_with_events() { - // Use the test_call_data fixture - let (base64_data, _event) = fixture_call_data(); - - // Gateway call that fails but has events (events should be discarded) - let logs = vec![ - format!("Program {GATEWAY_EXAMPLE_ID} invoke [1]"), - format!("Program data: {}", base64_data), - format!("Program {GATEWAY_EXAMPLE_ID} failed"), - ]; - - let result = build_program_event_stack(&fixture_match_context(), &logs); - - // Expected result: one failed invocation - let expected = vec![ProgramInvocationState::Failed]; - - assert_eq!(result, expected); - } - - #[test] - fn test_real_life_data_set() { - let logs = vec![ - "Program meme9s3tVXUYLLmPomrk36sEDodjKu4zjUuKn12tSic invoke [1] ", - "Program log: Instruction: Native ", - "Program log: Instruction: SendToGateway ", - "Program gtwEpzTprUX7TJLx1hFXNeqCXJMsoxYQhQaEbnuDcj1 invoke [2] ", - "Program log: Instruction: Call Contract ", - "Program data: YXZhbGFuY2hlLWZ1amkweDQzNjZhMDQxYkE0MjM3RjliNzU1M0I4YTczZThBRjFmMmVlMUY0ZDFoZWxsbwAAAAAAAAABGmAGtWFiOdXkE8Fe9cROo6h2dsYneWtnOVWA1xsoSByK/5UGhcLtS8MXTzRyKHtW2VF7nJSBJzGaCaejberIDgAAAHz///8qAAAAgv///6T///8FAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", - "Program gtwEpzTprUX7TJLx1hFXNeqCXJMsoxYQhQaEbnuDcj1 consumed 4737 of 196074 compute units ", - "Program gtwEpzTprUX7TJLx1hFXNeqCXJMsoxYQhQaEbnuDcj1 success ", - "Program meme9s3tVXUYLLmPomrk36sEDodjKu4zjUuKn12tSic consumed 8781 of 200000 compute units ", - "Program meme9s3tVXUYLLmPomrk36sEDodjKu4zjUuKn12tSic success ", - ]; - let ctx = MatchContext::new("gtwEpzTprUX7TJLx1hFXNeqCXJMsoxYQhQaEbnuDcj1"); - let mut result = build_program_event_stack(&ctx, &logs); - assert_eq!(result.len(), 1); - let state = result.pop().unwrap(); - let ProgramInvocationState::Succeeded(item) = state else { - panic!("state is not of `succeeded` version"); - }; - assert_eq!(item.len(), 1); - } -} diff --git a/crates/solana-event-forwarder/src/config.rs b/crates/solana-event-forwarder/src/config.rs deleted file mode 100644 index ab4f912..0000000 --- a/crates/solana-event-forwarder/src/config.rs +++ /dev/null @@ -1,29 +0,0 @@ -use solana_sdk::pubkey::Pubkey; - -/// Config for the [`crate::SolanaEventForwarder`] component. -/// -/// Parses events coming in from [`solana_listener::SolanaListener`] and forwards them to the -/// [`relayer_amplifier_api_integration::Amplifier`] component. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct Config { - /// The chain name that we're listening for. - /// This value must be the same one that Amplifier API is expected to interact with - pub source_chain_name: String, - /// The Solana gateway program id. - pub gateway_program_id: Pubkey, -} - -impl Config { - /// Create a new configuration based on the [`solana_listener::Config`] and - /// [`relayer_amplifier_api_integration::Config`] configurations. - #[must_use] - pub fn new( - sol_listener_cfg: &solana_listener::Config, - amplifier_cfg: &relayer_amplifier_api_integration::Config, - ) -> Self { - Self { - source_chain_name: amplifier_cfg.chain.clone(), - gateway_program_id: sol_listener_cfg.gateway_program_address, - } - } -} diff --git a/crates/solana-event-forwarder/src/lib.rs b/crates/solana-event-forwarder/src/lib.rs deleted file mode 100644 index 7f3f7f5..0000000 --- a/crates/solana-event-forwarder/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! Parse Solana events, trnasform them into Amplifier API events -//! forward the Amplifier API events over to the Amplifier API - -mod component; -mod config; -pub use component::SolanaEventForwarder; -pub use config::Config; diff --git a/crates/solana-gateway-task-processor/Cargo.toml b/crates/solana-gateway-task-processor/Cargo.toml deleted file mode 100644 index 0151c9e..0000000 --- a/crates/solana-gateway-task-processor/Cargo.toml +++ /dev/null @@ -1,37 +0,0 @@ -[package] -name = "solana-gateway-task-processor" -version.workspace = true -authors.workspace = true -repository.workspace = true -homepage.workspace = true -license.workspace = true -edition.workspace = true - -[dependencies] -eyre.workspace = true -solana-sdk.workspace = true -typed-builder.workspace = true -solana-client.workspace = true -serde.workspace = true -gmp-gateway.workspace = true -axelar-rkyv-encoding.workspace = true -tracing.workspace = true -futures.workspace = true -common-serde-utils = { workspace = true, features = ["solana-sdk"] } -bs58.workspace = true -relayer-engine.workspace = true -amplifier-api.workspace = true -relayer-amplifier-api-integration.workspace = true -effective-tx-sender.workspace = true -axelar-executable.workspace = true -num-traits.workspace = true -relayer-amplifier-state.workspace = true - -[dev-dependencies] -serde_json.workspace = true -mockall.workspace = true -async-trait.workspace = true -solana-transaction-status.workspace = true - -[lints] -workspace = true diff --git a/crates/solana-gateway-task-processor/src/component.rs b/crates/solana-gateway-task-processor/src/component.rs deleted file mode 100644 index f267354..0000000 --- a/crates/solana-gateway-task-processor/src/component.rs +++ /dev/null @@ -1,668 +0,0 @@ -use core::future::Future; -use core::pin::Pin; -use core::task::Poll; -use std::collections::VecDeque; -use std::sync::Arc; - -use amplifier_api::types::TaskItem; -use axelar_rkyv_encoding::types::{HasheableMessageVec, VerifierSet}; -use effective_tx_sender::ComputeBudgetError; -use futures::stream::{FusedStream as _, FuturesOrdered, FuturesUnordered}; -use futures::StreamExt as _; -use gmp_gateway::commands::OwnedCommand; -use gmp_gateway::state::GatewayApprovedCommand; -use gmp_gateway::{hasher_impl, instructions}; -use num_traits::FromPrimitive as _; -use relayer_amplifier_state::State; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_client::rpc_response::RpcSimulateTransactionResult; -use solana_sdk::instruction::{Instruction, InstructionError}; -use solana_sdk::program_pack::Pack as _; -use solana_sdk::pubkey::Pubkey; -use solana_sdk::signature::{Keypair, Signature}; -use solana_sdk::signer::Signer as _; -use solana_sdk::transaction::TransactionError; -use tracing::{info_span, instrument, Instrument as _}; - -use crate::config; - -/// A component that pushes transactions over to the Solana blockchain. -/// The transactions to push are dependant on the events that the Amplifier API will provide -pub struct SolanaTxPusher { - config: config::Config, - name_on_amplifier: String, - rpc_client: Arc, - task_receiver: relayer_amplifier_api_integration::AmplifierTaskReceiver, - state: S, -} - -impl relayer_engine::RelayerComponent for SolanaTxPusher { - fn process(self: Box) -> Pin> + Send>> { - use futures::FutureExt as _; - - self.process_internal().boxed() - } -} - -impl SolanaTxPusher { - /// Create a new [`SolanaTxPusher`] component - #[must_use] - pub const fn new( - config: config::Config, - name_on_amplifier: String, - rpc_client: Arc, - task_receiver: relayer_amplifier_api_integration::AmplifierTaskReceiver, - state: S, - ) -> Self { - Self { - config, - name_on_amplifier, - rpc_client, - task_receiver, - state, - } - } - - async fn process_internal(self) -> eyre::Result<()> { - let config_metadata = self.get_config_metadata().await.map(Arc::new)?; - let state = self.state.clone(); - - let keypair = Arc::new(self.config.signing_keypair.insecure_clone()); - let mut futures_ordered = FuturesOrdered::new(); - let mut rx = self.task_receiver.receiver.fuse(); - let mut task_stream = futures::stream::poll_fn(move |cx| { - // check if we have new requests to add to the join set - match rx.poll_next_unpin(cx) { - Poll::Ready(Some(task)) => { - // spawn the task on the joinset, returning the error - tracing::info!(?task, "received task from amplifier API"); - futures_ordered.push_back({ - let solana_rpc_client = Arc::clone(&self.rpc_client); - let keypair = Arc::clone(&keypair); - let config_metadata = Arc::clone(&config_metadata); - async move { - let command_id = task.id.clone(); - let res = - process_task(&keypair, &solana_rpc_client, task, &config_metadata) - .await; - (command_id, res) - } - }); - } - Poll::Pending => (), - Poll::Ready(None) => { - tracing::error!("receiver channel closed"); - } - } - // check if any background tasks are done - match futures_ordered.poll_next_unpin(cx) { - Poll::Ready(Some(res)) => Poll::Ready(Some(res)), - // futures unordered returns `Poll::Ready(None)` when it's empty - Poll::Ready(None) => { - if rx.is_terminated() { - return Poll::Ready(None) - } - Poll::Pending - } - Poll::Pending => Poll::Pending, - } - }); - - while let Some((task_item_id, task_result)) = task_stream.next().await { - state.set_latest_processed_task_id(task_item_id)?; - let Err(err) = task_result else { - continue; - }; - - tracing::error!(?err, "background task returned an error"); - } - - eyre::bail!("fatal error") - } - - async fn get_config_metadata(&self) -> Result { - let gateway_root_pda = gmp_gateway::get_gateway_root_config_pda().0; - let data = self.rpc_client.get_account_data(&gateway_root_pda).await?; - let root_config = gmp_gateway::state::GatewayConfig::unpack_from_slice(&data)?; - let config_metadata = ConfigMetadata { - gateway_root_pda, - domain_separator: root_config.domain_separator, - name_of_the_solana_chain: self.name_on_amplifier.clone(), - }; - Ok(config_metadata) - } -} - -struct ConfigMetadata { - name_of_the_solana_chain: String, - gateway_root_pda: Pubkey, - domain_separator: [u8; 32], -} - -#[instrument(skip_all)] -async fn process_task( - keypair: &Keypair, - solana_rpc_client: &RpcClient, - task: TaskItem, - metadata: &ConfigMetadata, -) -> eyre::Result<()> { - use amplifier_api::types::Task::{Execute, GatewayTx, Refund, Verify}; - use axelar_rkyv_encoding::types::Payload::{Messages, VerifierSet}; - let signer = keypair.pubkey(); - let gateway_root_pda = gmp_gateway::get_gateway_root_config_pda().0; - - #[expect( - clippy::todo, - reason = "fine for the time being, will be refactored later" - )] - #[expect( - clippy::unreachable, - reason = "will be removed in the future, only there because of outdated gateway API" - )] - match task.task { - Verify(_verify_task) => todo!(), - GatewayTx(gateway_transaction_task) => { - let execute_data_bytes = gateway_transaction_task.execute_data.as_ref(); - - let decoded_execute_data = - axelar_rkyv_encoding::types::ExecuteData::from_bytes(execute_data_bytes) - .map_err(|_err| eyre::eyre!("cannot decode execute data"))?; - let signing_verifier_set = decoded_execute_data.proof.verifier_set(); - let (signing_verifier_set_pda, _) = gmp_gateway::get_verifier_set_tracker_pda( - &gmp_gateway::id(), - signing_verifier_set.hash(hasher_impl()), - ); - - match decoded_execute_data.payload { - Messages(messages) => { - ProcessMessages::builder() - .messages(messages) - .signer(signer) - .gateway_root_pda(gateway_root_pda) - .metadata(metadata) - .execute_data_bytes(execute_data_bytes) - .signing_verifier_set_pda(signing_verifier_set_pda) - .solana_rpc_client(solana_rpc_client) - .keypair(keypair) - .build() - .execute() - .await?; - } - VerifierSet(new_verifier_set) => { - ProcessVerifierSet::builder() - .new_verifier_set(new_verifier_set) - .signer(signer) - .gateway_root_pda(gateway_root_pda) - .metadata(metadata) - .execute_data_bytes(execute_data_bytes) - .signing_verifier_set_pda(signing_verifier_set_pda) - .solana_rpc_client(solana_rpc_client) - .keypair(keypair) - .build() - .execute() - .await?; - } - } - } - Execute(execute_task) => { - // communicate with the destination program - async { - let payload = execute_task.payload; - let message = axelar_rkyv_encoding::types::Message::new( - axelar_rkyv_encoding::types::CrossChainId::new( - execute_task.message.source_chain, - execute_task.message.message_id.0, - ), - execute_task.message.source_address, - metadata.name_of_the_solana_chain.clone(), - execute_task.message.destination_address, - execute_task - .message - .payload_hash - .try_into() - .unwrap_or_default(), - ); - - // this interface will be refactored in the next gateway version - let command = OwnedCommand::ApproveMessage(message); - let (gateway_approved_message_pda, _, _) = - GatewayApprovedCommand::pda(&gateway_root_pda, &command); - let OwnedCommand::ApproveMessage(message) = command else { - unreachable!() - }; - tracing::debug!(?gateway_approved_message_pda, "approved message PDA"); - - let ix = axelar_executable::construct_axelar_executable_ix( - message, - payload, - gateway_approved_message_pda, - gateway_root_pda, - )?; - let send_transaction_result = - send_transaction(solana_rpc_client, keypair, ix).await; - - let Err(err) = send_transaction_result else { - // tx was successfully executed - return Ok(()) - }; - - // tx was not executed -- inspect root cause - let ComputeBudgetError::SimulationError(ref simulation) = err else { - // some kid of irrecoverable error - return Err(eyre::Error::from(err)) - }; - tracing::warn!(?simulation.err,"simulation err"); - - // NOTE: this error makes it look like the command is not approved, but in fact it's - // the error that is returned if a message was approved & executed. - // This will be altered in the future Gateway impl - let command_already_executed_error = simulation - .err - .as_ref() - .and_then(|err| { - if let TransactionError::InstructionError( - 1, // <-- 0th idx is the ComputeBudget prefix - InstructionError::Custom(err_code), - ) = *err - { - return gmp_gateway::error::GatewayError::from_u32(err_code) - } - None - }) - .is_some_and(|received_err| { - gmp_gateway::error::GatewayError::GatewayCommandNotApproved == received_err - }); - if command_already_executed_error { - tracing::warn!("message already executed"); - return eyre::Result::Ok(()); - } - - // Return the simulation error - Err(eyre::Error::from(err)) - } - .instrument(info_span!("execute task")) - .in_current_span() - .await?; - } - Refund(_refund_task) => todo!(), - }; - - Ok(()) -} - -#[derive(typed_builder::TypedBuilder)] -struct ProcessMessages<'a> { - messages: HasheableMessageVec, - signer: Pubkey, - gateway_root_pda: Pubkey, - metadata: &'a ConfigMetadata, - execute_data_bytes: &'a [u8], - signing_verifier_set_pda: Pubkey, - solana_rpc_client: &'a RpcClient, - keypair: &'a Keypair, -} - -impl<'a> ProcessMessages<'a> { - #[tracing::instrument(skip_all, name = "approve messages flow")] - async fn execute(&self) -> eyre::Result<()> { - let execute_data_pda = InitializeApproveMessagesExecuteData::builder() - .signer(self.signer) - .gateway_root_pda(self.gateway_root_pda) - .domain_separator(&self.metadata.domain_separator) - .execute_data_bytes(self.execute_data_bytes) - .solana_rpc_client(self.solana_rpc_client) - .keypair(self.keypair) - .build() - .execute() - .instrument(info_span!("init execute data")) - .in_current_span() - .await?; - - // Compose messages - let mut future_set = self - .messages - .iter() - .filter_map(|message| { - let command = OwnedCommand::ApproveMessage(message.clone()); - let (approved_message_pda, _bump, _seed) = - GatewayApprovedCommand::pda(&self.metadata.gateway_root_pda, &command); - let ix = instructions::initialize_pending_command( - &self.metadata.gateway_root_pda, - &self.signer, - command, - ) - .ok()?; - - let output = async move { - let send_transaction_result = - send_transaction(self.solana_rpc_client, self.keypair, ix).await; - - let Err(err) = send_transaction_result else { - // tx was successfully executed - return Ok(approved_message_pda) - }; - - // tx was not executed -- inspect root cause - let ComputeBudgetError::SimulationError(ref simulation) = err else { - // some kid of irrecoverable error - return Err(eyre::Error::from(err)) - }; - - // this is the error for when a message PDA was already registered - if matches!( - simulation.err, - Some(TransactionError::InstructionError( - 1, // <-- 0th idx is the ComputeBudget prefix - InstructionError::InvalidAccountData - )) - ) { - return eyre::Result::Ok(approved_message_pda); - } - - // Return the simulation error - Err(eyre::Error::from(err)) - } - .instrument(tracing::info_span!( - "registering command PDA", - ?approved_message_pda - )) - .in_current_span(); - - Some(output) - }) - .collect::>(); - - let mut command_accounts = Vec::new(); - while let Some(result) = future_set.next().await { - let pubkey = result?; - command_accounts.push(pubkey); - } - - ApproveMessages::builder() - .execute_data_pda(execute_data_pda) - .gateway_root_pda(&self.metadata.gateway_root_pda) - .command_accounts(&command_accounts) - .signing_verifier_set_pda(self.signing_verifier_set_pda) - .solana_rpc_client(self.solana_rpc_client) - .keypair(self.keypair) - .build() - .execute() - .instrument(info_span!("verify signatures")) - .await?; - - Ok(()) - } -} - -#[derive(typed_builder::TypedBuilder)] -struct ProcessVerifierSet<'a> { - new_verifier_set: VerifierSet, - signer: Pubkey, - gateway_root_pda: Pubkey, - metadata: &'a ConfigMetadata, - execute_data_bytes: &'a [u8], - signing_verifier_set_pda: Pubkey, - solana_rpc_client: &'a RpcClient, - keypair: &'a Keypair, -} - -impl<'a> ProcessVerifierSet<'a> { - #[instrument(skip_all)] - pub async fn execute(&self) -> eyre::Result<()> { - let execute_data_pda = InitializeRotateSignersExecuteData::builder() - .signer(self.signer) - .gateway_root_pda(self.gateway_root_pda) - .domain_separator(&self.metadata.domain_separator) - .execute_data_bytes(self.execute_data_bytes) - .solana_rpc_client(self.solana_rpc_client) - .keypair(self.keypair) - .build() - .execute() - .await?; - - let new_signing_verifier_set_pda = - get_new_signing_verifier_set_pda(&self.new_verifier_set)?; - - RotateSigners::builder() - .execute_data_pda(execute_data_pda) - .gateway_root_pda(&self.metadata.gateway_root_pda) - .signing_verifier_set_pda(self.signing_verifier_set_pda) - .new_signing_verifier_set_pda(new_signing_verifier_set_pda) - .signer(self.signer) - .solana_rpc_client(self.solana_rpc_client) - .keypair(self.keypair) - .build() - .execute() - .await?; - - Ok(()) - } -} - -#[derive(typed_builder::TypedBuilder)] -struct LogFinder<'a> { - simulation: &'a RpcSimulateTransactionResult, - log_to_search: &'a str, -} - -impl<'a> LogFinder<'a> { - const fn new(simulation: &'a RpcSimulateTransactionResult, log_to_search: &'a str) -> Self { - Self { - simulation, - log_to_search, - } - } - - #[instrument(skip_all)] - pub fn find(&self) -> bool { - self.simulation - .logs - .as_ref() - .is_some_and(|logs| logs.iter().any(|log| log.starts_with(self.log_to_search))) - } -} - -#[derive(typed_builder::TypedBuilder)] -struct InitializeApproveMessagesExecuteData<'a> { - signer: Pubkey, - gateway_root_pda: Pubkey, - domain_separator: &'a [u8; 32], - execute_data_bytes: &'a [u8], - solana_rpc_client: &'a RpcClient, - keypair: &'a Keypair, -} - -impl<'a> InitializeApproveMessagesExecuteData<'a> { - #[instrument(skip_all)] - pub async fn execute(&self) -> eyre::Result { - let (ix, execute_data) = instructions::initialize_approve_messages_execute_data( - self.signer, - self.gateway_root_pda, - self.domain_separator, - self.execute_data_bytes, - )?; - let (execute_data_pda, ..) = gmp_gateway::get_execute_data_pda( - &self.gateway_root_pda, - &execute_data.hash_decoded_contents(), - ); - - let send_transaction_result = - send_transaction(self.solana_rpc_client, self.keypair, ix).await; - - let Err(err) = send_transaction_result else { - // tx was successfully executed - return Ok(execute_data_pda) - }; - - // tx was not executed -- inspect root cause - let ComputeBudgetError::SimulationError(ref simulation) = err else { - // some kid of irrecoverable error - return Err(eyre::Error::from(err)) - }; - - // This happens if the PDA was already initialised - if LogFinder::new( - simulation, - "Program log: Execute Datat PDA already initialized", - ) - .find() - { - // Acceptable simulation error; proceed as successful - return Ok(execute_data_pda) - } - - // Return the simulation error - Err(eyre::Error::from(err)) - } -} - -#[derive(typed_builder::TypedBuilder)] -struct InitializeRotateSignersExecuteData<'a> { - signer: Pubkey, - gateway_root_pda: Pubkey, - domain_separator: &'a [u8; 32], - execute_data_bytes: &'a [u8], - solana_rpc_client: &'a RpcClient, - keypair: &'a Keypair, -} - -impl<'a> InitializeRotateSignersExecuteData<'a> { - #[instrument(skip_all)] - pub async fn execute(&self) -> eyre::Result { - let (ix, execute_data) = instructions::initialize_rotate_signers_execute_data( - self.signer, - self.gateway_root_pda, - self.domain_separator, - self.execute_data_bytes, - )?; - let (execute_data_pda, ..) = gmp_gateway::get_execute_data_pda( - &self.gateway_root_pda, - &execute_data.hash_decoded_contents(), - ); - tracing::info!(?execute_data_pda, "execute data PDA"); - - let send_transaction_result = - send_transaction(self.solana_rpc_client, self.keypair, ix).await; - - let Err(err) = send_transaction_result else { - // tx was successfully executed - return Ok(execute_data_pda) - }; - - // tx was not executed -- inspect root cause - let ComputeBudgetError::SimulationError(ref simulation) = err else { - // some kid of irrecoverable error - return Err(eyre::Error::from(err)) - }; - - // This happens if the PDA was already initialised - if LogFinder::new( - simulation, - "Program log: Execute Datat PDA already initialized", - ) - .find() - { - // Acceptable simulation error; proceed as successful - return Ok(execute_data_pda) - } - - // Return the simulation error - Err(eyre::Error::from(err)) - } -} - -#[derive(typed_builder::TypedBuilder)] -struct ApproveMessages<'a> { - execute_data_pda: Pubkey, - gateway_root_pda: &'a Pubkey, - command_accounts: &'a [Pubkey], - signing_verifier_set_pda: Pubkey, - solana_rpc_client: &'a RpcClient, - keypair: &'a Keypair, -} - -impl<'a> ApproveMessages<'a> { - #[instrument(skip_all)] - pub async fn execute(&self) -> eyre::Result<()> { - let ix = instructions::approve_messages( - self.execute_data_pda, - *self.gateway_root_pda, - self.command_accounts, - self.signing_verifier_set_pda, - )?; - - let send_transaction_result = - send_transaction(self.solana_rpc_client, self.keypair, ix).await; - - let Err(err) = send_transaction_result else { - // tx was successfully executed - return Ok(()) - }; - - // tx was not executed -- inspect root cause - let ComputeBudgetError::SimulationError(ref simulation) = err else { - // some kid of irrecoverable error - return Err(eyre::Error::from(err)) - }; - - // This can happen if the verifier set is too old - if LogFinder::new(simulation, "Program log: Proof validation failed").find() { - // Acceptable simulation error; proceed as successful - return Ok(()) - } - - // Return the simulation error - Err(eyre::Error::from(err)) - } -} - -#[derive(typed_builder::TypedBuilder)] -struct RotateSigners<'a> { - execute_data_pda: Pubkey, - gateway_root_pda: &'a Pubkey, - signing_verifier_set_pda: Pubkey, - new_signing_verifier_set_pda: Pubkey, - signer: Pubkey, - solana_rpc_client: &'a RpcClient, - keypair: &'a Keypair, -} - -impl<'a> RotateSigners<'a> { - #[instrument(skip_all)] - pub async fn execute(&self) -> eyre::Result<()> { - let ix = instructions::rotate_signers( - self.execute_data_pda, - *self.gateway_root_pda, - None, - self.signing_verifier_set_pda, - self.new_signing_verifier_set_pda, - self.signer, - )?; - send_transaction(self.solana_rpc_client, self.keypair, ix).await?; - Ok(()) - } -} - -#[instrument(skip_all)] -fn get_new_signing_verifier_set_pda(new_verifier_set: &VerifierSet) -> eyre::Result { - let (new_signing_verifier_set_pda, _) = gmp_gateway::get_verifier_set_tracker_pda( - &gmp_gateway::id(), - new_verifier_set.hash(hasher_impl()), - ); - Ok(new_signing_verifier_set_pda) -} - -#[instrument(skip_all)] -async fn send_transaction( - solana_rpc_client: &RpcClient, - keypair: &Keypair, - ix: Instruction, -) -> Result { - effective_tx_sender::EffectiveTxSender::new(solana_rpc_client, keypair, VecDeque::from([ix])) - .evaluate_compute_ixs() - .await? - .send_tx() - .await - .map_err(eyre::Error::from) - .map_err(ComputeBudgetError::Generic) -} diff --git a/crates/solana-gateway-task-processor/src/config.rs b/crates/solana-gateway-task-processor/src/config.rs deleted file mode 100644 index cc173f8..0000000 --- a/crates/solana-gateway-task-processor/src/config.rs +++ /dev/null @@ -1,163 +0,0 @@ -use serde::Deserialize; -use solana_sdk::pubkey::Pubkey; -use solana_sdk::signature::Keypair; -use typed_builder::TypedBuilder; - -/// Configuration for the [`SolanaTxPusher`] component -#[derive(Debug, Deserialize, PartialEq, TypedBuilder)] -pub struct Config { - /// Gateway program id - #[serde(deserialize_with = "common_serde_utils::pubkey_decode")] - #[builder(default = config_defaults::gateway_program_address())] - #[serde(default = "config_defaults::gateway_program_address")] - pub gateway_program_address: Pubkey, - - /// The signing keypair for transactions. - /// Can be represented as a base58 string or 64 element array `[42, 42, ..]` - #[serde(deserialize_with = "serde_utils::deserialize_keypair")] - pub signing_keypair: Keypair, -} - -pub(crate) mod config_defaults { - use solana_sdk::pubkey::Pubkey; - - pub(crate) const fn gateway_program_address() -> Pubkey { - gmp_gateway::id() - } -} - -#[expect(clippy::min_ident_chars, reason = "part of trait definitions")] -mod serde_utils { - - use serde::de::{self, Deserializer, Visitor}; - use solana_sdk::signature::Keypair; - - pub(crate) fn deserialize_keypair<'de, D>(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - deserializer.deserialize_any(KeypairVisitor) - } - - struct KeypairVisitor; - - impl<'de> Visitor<'de> for KeypairVisitor { - type Value = Keypair; - - fn expecting(&self, formatter: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - formatter - .write_str("a base58 encoded string or an array of 64 bytes representing a keypair") - } - - fn visit_str(self, v: &str) -> Result - where - E: de::Error, - { - // Try Base58 decoding - if let Ok(keypair_bytes) = bs58::decode(v).into_vec() { - if keypair_bytes.len() == 64 { - return Keypair::from_bytes(&keypair_bytes).map_err(de::Error::custom); - } - } - - Err(de::Error::custom("Invalid keypair encoding or length")) - } - - fn visit_seq(self, mut seq: A) -> Result - where - A: serde::de::SeqAccess<'de>, - { - let mut bytes = Vec::with_capacity(64); - while let Some(value) = seq.next_element::()? { - bytes.push(value); - } - if bytes.len() != 64 { - return Err(de::Error::custom("Invalid keypair length")); - } - Keypair::from_bytes(&bytes).map_err(de::Error::custom) - } - } -} - -#[cfg(test)] -mod tests { - use serde_json::json; - use solana_sdk::signature::Keypair; - - use super::*; - - #[test] - fn test_deserialize_keypair_base58() { - // Generate a new Keypair and encode it in Base58 - let keypair = Keypair::new(); - let keypair_bytes = keypair.to_bytes(); - let base58_encoded = bs58::encode(&keypair_bytes).into_string(); - - // Prepare JSON data - let data = json!({ - "gateway_program_address": Pubkey::new_unique().to_string(), - "signing_keypair": base58_encoded - }); - - // Deserialize Config - let config: Config = serde_json::from_value(data).expect("Failed to deserialize Config"); - - // Check if the deserialized keypair matches the original - assert_eq!(config.signing_keypair.to_bytes(), keypair_bytes); - } - - #[test] - fn test_deserialize_keypair_array() { - // Generate a new Keypair - let keypair = Keypair::new(); - let keypair_bytes = keypair.to_bytes(); - - // Prepare JSON data - let data = json!({ - "gateway_program_address": Pubkey::new_unique().to_string(), - "signing_keypair": keypair_bytes.to_vec() - }); - - // Deserialize Config - let config: Config = serde_json::from_value(data).expect("Failed to deserialize Config"); - - // Check if the deserialized keypair matches the original - assert_eq!(config.signing_keypair.to_bytes(), keypair_bytes); - } - - #[test] - fn test_deserialize_keypair_invalid_length() { - // Create an invalid keypair byte array of incorrect length - let invalid_bytes = vec![0_u8; 63]; // Should be 64 bytes - - // Prepare JSON data - let data = json!({ - "gateway_program_address": Pubkey::new_unique().to_string(), - "signing_keypair": invalid_bytes - }); - - // Attempt to deserialize Config - let result: Result = serde_json::from_value(data); - - // Check that deserialization fails - result.unwrap_err(); - } - - #[test] - fn test_deserialize_keypair_invalid_encoding() { - // Provide an invalid encoded string - let invalid_encoded = "invalid_keypair_string"; - - // Prepare JSON data - let data = json!({ - "gateway_program_address": Pubkey::new_unique().to_string(), - "signing_keypair": invalid_encoded - }); - - // Attempt to deserialize Config - let result: Result = serde_json::from_value(data); - - // Check that deserialization fails - result.unwrap_err(); - } -} diff --git a/crates/solana-gateway-task-processor/src/lib.rs b/crates/solana-gateway-task-processor/src/lib.rs deleted file mode 100644 index 044b672..0000000 --- a/crates/solana-gateway-task-processor/src/lib.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! Parse Amplifier API events, translate them to transaction actions to exesute on the Solana -//! blockchain - -mod component; -mod config; -pub use component::SolanaTxPusher; -pub use config::Config; diff --git a/crates/solana-listener/Cargo.toml b/crates/solana-listener/Cargo.toml deleted file mode 100644 index a2c0087..0000000 --- a/crates/solana-listener/Cargo.toml +++ /dev/null @@ -1,29 +0,0 @@ -[package] -name = "solana-listener" -version.workspace = true -authors.workspace = true -repository.workspace = true -homepage.workspace = true -license.workspace = true -edition.workspace = true - -[dependencies] -typed-builder.workspace = true -futures.workspace = true -tracing.workspace = true -tokio.workspace = true -eyre.workspace = true -url.workspace = true -serde.workspace = true -relayer-engine.workspace = true -chrono.workspace = true - -gmp-gateway.workspace = true -common-serde-utils = { workspace = true, features = ["solana-sdk"] } - -solana-client.workspace = true -solana-sdk.workspace = true -solana-transaction-status.workspace = true - -[lints] -workspace = true diff --git a/crates/solana-listener/src/component.rs b/crates/solana-listener/src/component.rs deleted file mode 100644 index 7ae0d8e..0000000 --- a/crates/solana-listener/src/component.rs +++ /dev/null @@ -1,99 +0,0 @@ -use core::future::Future; -use core::pin::Pin; -use std::sync::Arc; - -use chrono::{DateTime, Utc}; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::signature::Signature; - -use crate::config; - -mod log_processor; -mod signature_batch_scanner; -mod signature_realtime_scanner; - -/// Typical message with the produced work. -/// Contains the handle to a task that resolves into a -/// [`SolanaTransaction`]. -#[derive(Debug, Clone)] -pub struct SolanaTransaction { - /// signature of the transaction (id) - pub signature: Signature, - /// optional timespamp - pub timestamp: Option>, - /// The raw transaction logs - pub logs: Vec, - /// the slot number of the tx - pub slot: u64, - /// How expensive was the transaction expressed in lamports - pub cost_in_lamports: u64, -} - -pub(crate) type MessageSender = futures::channel::mpsc::UnboundedSender; - -/// The listener component that has the core functionality: -/// - monitor (poll) the solana blockchain for new signatures coming from the gateway program -/// - fetch the actual event data from the provided signature -/// - forward the tx event data to the `SolanaListenerClient` -pub struct SolanaListener { - config: config::Config, - rpc_client: Arc, - sender: MessageSender, -} - -/// Utility client used for communicating with the `SolanaListener` instance -#[derive(Debug)] -pub struct SolanaListenerClient { - /// Receive transaction messagese from `SolanaListener` instance - pub log_receiver: futures::channel::mpsc::UnboundedReceiver, -} - -impl relayer_engine::RelayerComponent for SolanaListener { - fn process(self: Box) -> Pin> + Send>> { - use futures::FutureExt as _; - - self.process_internal().boxed() - } -} - -impl SolanaListener { - /// Instantiate a new `SolanaListener` using the pre-configured configuration. - /// - /// The returned variable also returns a helper client that encompasses ways to communicate with - /// the underlying `SolanaListener` instance. - #[must_use] - pub fn new(config: config::Config, rpc_client: Arc) -> (Self, SolanaListenerClient) { - let (tx_outgoing, rx_outgoing) = futures::channel::mpsc::unbounded(); - let this = Self { - config, - rpc_client, - sender: tx_outgoing, - }; - let client = SolanaListenerClient { - log_receiver: rx_outgoing, - }; - (this, client) - } - - #[tracing::instrument(skip_all, name = "Solana Listener")] - pub(crate) async fn process_internal(self) -> eyre::Result<()> { - // we fetch potentially missed signatures based on the provided the config - let latest = signature_batch_scanner::scan_old_signatures( - &self.config, - &self.sender, - &self.rpc_client, - ) - .await?; - - // we start processing realtime logs - signature_realtime_scanner::process_realtime_logs( - self.config, - latest, - self.rpc_client, - self.sender, - ) - .await?; - - eyre::bail!("listener crashed"); - } -} diff --git a/crates/solana-listener/src/component/log_processor.rs b/crates/solana-listener/src/component/log_processor.rs deleted file mode 100644 index d31cd14..0000000 --- a/crates/solana-listener/src/component/log_processor.rs +++ /dev/null @@ -1,79 +0,0 @@ -use std::sync::Arc; - -use chrono::DateTime; -use eyre::OptionExt as _; -use futures::SinkExt as _; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_sdk::commitment_config::CommitmentConfig; -use solana_sdk::signature::Signature; -use solana_transaction_status::option_serializer::OptionSerializer; -use solana_transaction_status::{EncodedConfirmedTransactionWithStatusMeta, UiTransactionEncoding}; -use tokio::task::JoinSet; - -use super::{MessageSender, SolanaTransaction}; - -pub(crate) async fn fetch_and_send( - fetched_signatures: impl Iterator, - rpc_client: Arc, - signature_sender: MessageSender, -) -> Result<(), eyre::Error> { - let mut log_fetch_js = JoinSet::new(); - for signature in fetched_signatures { - log_fetch_js.spawn({ - let rpc_client = Arc::clone(&rpc_client); - let mut signature_sender = signature_sender.clone(); - async move { - let tx = fetch_logs(signature, &rpc_client).await?; - signature_sender.send(tx).await?; - Result::<_, eyre::Report>::Ok(()) - } - }); - } - while let Some(item) = log_fetch_js.join_next().await { - if let Err(err) = item? { - tracing::warn!(?err, "error when parsing tx"); - } - } - Ok(()) -} - -pub(crate) async fn fetch_logs( - signature: Signature, - rpc_client: &RpcClient, -) -> eyre::Result { - use solana_client::rpc_config::RpcTransactionConfig; - let config = RpcTransactionConfig { - encoding: Some(UiTransactionEncoding::Binary), - commitment: Some(CommitmentConfig::confirmed()), - max_supported_transaction_version: Some(0), - }; - - let EncodedConfirmedTransactionWithStatusMeta { - slot, - transaction: transaction_with_meta, - block_time, - } = rpc_client - .get_transaction_with_config(&signature, config) - .await?; - - let meta = transaction_with_meta - .meta - .ok_or_eyre("metadata not included with logs")?; - - let OptionSerializer::Some(logs) = meta.log_messages else { - eyre::bail!("logs not included"); - }; - if meta.err.is_some() { - eyre::bail!("tx was not successful"); - } - - let transaction = SolanaTransaction { - signature, - logs, - slot, - timestamp: block_time.and_then(|secs| DateTime::from_timestamp(secs, 0)), - cost_in_lamports: meta.fee, - }; - - Ok(transaction) -} diff --git a/crates/solana-listener/src/component/signature_batch_scanner.rs b/crates/solana-listener/src/component/signature_batch_scanner.rs deleted file mode 100644 index fc4b9a3..0000000 --- a/crates/solana-listener/src/component/signature_batch_scanner.rs +++ /dev/null @@ -1,193 +0,0 @@ -use core::str::FromStr as _; -use std::sync::Arc; - -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_client::rpc_client::GetConfirmedSignaturesForAddress2Config; -use solana_sdk::commitment_config::CommitmentConfig; -use solana_sdk::pubkey::Pubkey; -use solana_sdk::signature::Signature; - -use super::{MessageSender, SolanaTransaction}; -use crate::component::log_processor; -use crate::config::MissedSignatureCatchupStrategy; - -#[tracing::instrument(skip_all, name = "scan old signatures")] -pub(crate) async fn scan_old_signatures( - config: &crate::Config, - signature_sender: &futures::channel::mpsc::UnboundedSender, - rpc_client: &Arc, -) -> Result, eyre::Error> { - let latest_processed_signature = match ( - &config.missed_signature_catchup_strategy, - config.latest_processed_signature, - ) { - (&MissedSignatureCatchupStrategy::None, None) => { - tracing::info!( - "Starting from the latest available signature as no catch-up is configured and no latest signature is known." - ); - None - } - (&MissedSignatureCatchupStrategy::None, Some(latest_signature)) => { - tracing::info!( - ?latest_signature, - "Starting from the latest processed signature", - ); - Some(latest_signature) - } - ( - &MissedSignatureCatchupStrategy::UntilSignatureReached(target_signature), - latest_signature, - ) => { - tracing::info!( - ?target_signature, - ?latest_signature, - "Catching up missed signatures until target signature", - ); - fetch_batches_in_range( - config, - Arc::clone(rpc_client), - signature_sender, - Some(target_signature), - latest_signature, - ) - .await? - } - (&MissedSignatureCatchupStrategy::UntilBeginning, latest_signature) => { - tracing::info!( - ?latest_signature, - "Catching up all missed signatures starting from", - ); - fetch_batches_in_range( - config, - Arc::clone(rpc_client), - signature_sender, - None, - latest_signature, - ) - .await? - } - }; - - Ok(latest_processed_signature) -} - -#[tracing::instrument(skip_all, err)] -pub(crate) async fn fetch_batches_in_range( - config: &crate::Config, - rpc_client: Arc, - signature_sender: &MessageSender, - t1_signature: Option, - mut t2_signature: Option, -) -> Result, eyre::Error> { - let mut interval = tokio::time::interval(config.tx_scan_poll_period); - interval.set_missed_tick_behavior(tokio::time::MissedTickBehavior::Skip); - - // Track the chronologically youngest t2 that we've seen - let mut chronologically_newest_signature = t2_signature; - - loop { - let mut fetcher = SignatureRangeFetcher { - t1: t1_signature, - t2: t2_signature, - rpc_client: Arc::clone(&rpc_client), - address: config.gateway_program_address, - signature_sender: signature_sender.clone(), - }; - - let res = fetcher.fetch().await?; - match res { - FetchingState::Completed => break, - FetchingState::FetchAgain { new_t2 } => { - // Set the newest signature only once - if chronologically_newest_signature.is_none() { - chronologically_newest_signature = Some(new_t2); - } - - // Update t2 to fetch older signatures - t2_signature = Some(new_t2); - } - } - // Sleep to avoid rate limiting - interval.tick().await; - } - Ok(chronologically_newest_signature) -} - -enum FetchingState { - Completed, - FetchAgain { new_t2: Signature }, -} - -struct SignatureRangeFetcher { - t1: Option, - t2: Option, - rpc_client: Arc, - address: Pubkey, - signature_sender: MessageSender, -} - -impl SignatureRangeFetcher { - #[tracing::instrument(skip(self), fields(t1 = ?self.t1, t2 = ?self.t2))] - async fn fetch(&mut self) -> eyre::Result { - /// The maximum allowed by the Solana RPC is 1000. We use a smaller limit to reduce load. - const LIMIT: usize = 10; - - tracing::debug!(?self.address, "Fetching signatures"); - - let fetched_signatures = self - .rpc_client - .get_signatures_for_address_with_config( - &self.address, - GetConfirmedSignaturesForAddress2Config { - // start searching backwards from this transaction signature. If not provided - // the search starts from the top of the highest max confirmed block. - before: self.t2, - // search until this transaction signature, if found before limit reached - until: self.t1, - limit: Some(LIMIT), - commitment: Some(CommitmentConfig::finalized()), - }, - ) - .await?; - - let total_signatures = fetched_signatures.len(); - tracing::info!(total_signatures, "Fetched new set of signatures"); - - if fetched_signatures.is_empty() { - tracing::info!("No more signatures to fetch"); - return Ok(FetchingState::Completed); - } - - let (chronologically_oldest_signature, _) = - match (fetched_signatures.last(), fetched_signatures.first()) { - (Some(oldest), Some(newest)) => ( - Signature::from_str(&oldest.signature)?, - Signature::from_str(&newest.signature)?, - ), - _ => return Ok(FetchingState::Completed), - }; - - let fetched_signatures_iter = fetched_signatures - .into_iter() - .flat_map(|status| Signature::from_str(&status.signature)) - .rev(); - - // Fetch logs and send them via the sender - log_processor::fetch_and_send( - fetched_signatures_iter, - Arc::clone(&self.rpc_client), - self.signature_sender.clone(), - ) - .await?; - - if total_signatures < LIMIT { - tracing::info!("Fetched all available signatures in the range"); - Ok(FetchingState::Completed) - } else { - tracing::info!("More signatures available, continuing fetch"); - Ok(FetchingState::FetchAgain { - new_t2: chronologically_oldest_signature, - }) - } - } -} diff --git a/crates/solana-listener/src/component/signature_realtime_scanner.rs b/crates/solana-listener/src/component/signature_realtime_scanner.rs deleted file mode 100644 index 6a0de9b..0000000 --- a/crates/solana-listener/src/component/signature_realtime_scanner.rs +++ /dev/null @@ -1,138 +0,0 @@ -use core::pin::Pin; -use core::str::FromStr as _; -use std::sync::Arc; - -use futures::stream::{poll_fn, FuturesUnordered, StreamExt as _}; -use futures::task::Poll; -use futures::{SinkExt as _, Stream as _}; -use solana_client::nonblocking::rpc_client::RpcClient; -use solana_client::rpc_config::{RpcTransactionLogsConfig, RpcTransactionLogsFilter}; -use solana_sdk::commitment_config::CommitmentConfig; -use solana_sdk::signature::Signature; -use tracing::{info_span, Instrument as _}; - -use super::MessageSender; -use crate::component::log_processor::fetch_logs; -use crate::component::signature_batch_scanner; -use crate::SolanaTransaction; - -#[tracing::instrument(skip_all, err, name = "realtime log ingestion")] -pub(crate) async fn process_realtime_logs( - config: crate::Config, - latest_processed_signature: Option, - rpc_client: Arc, - mut signature_sender: MessageSender, -) -> Result<(), eyre::Error> { - let gateway_program_address = config.gateway_program_address; - 'outer: loop { - tracing::info!( - endpoint = ?config.solana_ws.as_str(), - ?gateway_program_address, - "init new WS connection" - ); - let client = - solana_client::nonblocking::pubsub_client::PubsubClient::new(config.solana_ws.as_str()) - .await?; - let (ws_stream, _unsubscribe) = client - .logs_subscribe( - RpcTransactionLogsFilter::Mentions(vec![gateway_program_address.to_string()]), - RpcTransactionLogsConfig { - commitment: Some(CommitmentConfig::finalized()), - }, - ) - .await?; - let mut ws_stream = ws_stream.fuse(); - - 'first: loop { - // Get the first item from the ws_stream - let first_item = ws_stream.next().await; - let Some(first_item) = first_item else { - // Reconnect if connection dropped - continue 'outer; - }; - // Process the first item - if first_item.value.err.is_none() { - if let Ok(sig) = Signature::from_str(&first_item.value.signature) { - let t2_signature = fetch_logs(sig, &rpc_client).await?; - - // Fetch missed batches - signature_batch_scanner::fetch_batches_in_range( - &config, - Arc::clone(&rpc_client), - &signature_sender, - Some(t2_signature.signature), - latest_processed_signature, - ) - .instrument(info_span!("fetching missed signatures")) - .await?; - // Send the first item - signature_sender.send(t2_signature).await?; - break 'first; - } - } - } - - // Create the FuturesUnordered - let mut fetch_futures = FuturesUnordered::new(); - - // Manual polling using poll_fn - tracing::info!("waiting realtime logs"); - - let rpc_client = Arc::clone(&rpc_client); - let mut merged_stream = poll_fn(move |cx| { - // Poll fetch_futures - let poll_next_unpin = fetch_futures.poll_next_unpin(cx); - match poll_next_unpin { - Poll::Ready(Some(fetch_result)) => { - cx.waker().wake_by_ref(); - return Poll::Ready(Some(fetch_result)) - } - Poll::Ready(None) | Poll::Pending => {} // No more futures to poll - } - - // Poll ws_stream - match Pin::new(&mut ws_stream).poll_next(cx) { - Poll::Ready(Some(item)) => { - if item.value.err.is_none() { - if let Ok(sig) = Signature::from_str(&item.value.signature) { - // Push fetch_logs future into fetch_futures - let rpc_client = Arc::clone(&rpc_client); - let fetch_future = async move { - let log_item = fetch_logs(sig, &rpc_client).await?; - tracing::info!(item = ?log_item.signature, "found tx"); - eyre::Result::Ok(log_item) - }; - fetch_futures.push(fetch_future); - } - } - // We return Pending here because the actual result will come from - // fetch_futures - cx.waker().wake_by_ref(); - Poll::Pending - } - Poll::Ready(None) => { - // WS stream ended - tracing::warn!("websocket stream exited"); - Poll::Ready(None) - } - Poll::Pending => Poll::Pending, - } - }); - - // Process the merged stream - while let Option::>::Some(result) = - merged_stream.next().await - { - match result { - Ok(log_item) => { - // Send the fetched log item - signature_sender.send(log_item).await?; - } - Err(err) => { - // Handle error in fetch_logs - tracing::error!(?err, "Error in merged stream"); - } - } - } - } -} diff --git a/crates/solana-listener/src/config.rs b/crates/solana-listener/src/config.rs deleted file mode 100644 index d93e757..0000000 --- a/crates/solana-listener/src/config.rs +++ /dev/null @@ -1,87 +0,0 @@ -//! Configuration structures and primitives for the [`crate::RelayerEngine`] - -use core::time::Duration; - -use serde::Deserialize; -use solana_sdk::pubkey::Pubkey; -use solana_sdk::signature::Signature; -use typed_builder::TypedBuilder; - -/// Top-level configuration for the solana component. -#[derive(Debug, Deserialize, Clone, PartialEq, Eq, TypedBuilder)] -pub struct Config { - /// Gateway program id - #[serde(deserialize_with = "common_serde_utils::pubkey_decode")] - #[builder(default = config_defaults::gateway_program_address())] - #[serde(default = "config_defaults::gateway_program_address")] - pub gateway_program_address: Pubkey, - - /// The websocket endpoint of the solana node - pub solana_ws: url::Url, - - /// This defines how to handle missed signatures upon startup - pub missed_signature_catchup_strategy: MissedSignatureCatchupStrategy, - - /// This defines the latest signature that we have parsed - #[serde(default)] - #[serde(deserialize_with = "serde_utils::signature_decode")] - pub latest_processed_signature: Option, - - /// How often we want to poll the network for new signatures - #[builder(default = config_defaults::tx_scan_poll_period())] - #[serde( - rename = "tx_scan_poll_period_in_milliseconds", - default = "config_defaults::tx_scan_poll_period", - deserialize_with = "common_serde_utils::duration_ms_decode" - )] - pub tx_scan_poll_period: Duration, -} - -/// The strategy which defines on how we want to handle parsing historical signatures. -/// -/// It is useful for when you want to double-check or suspect that the relayer has missed some txs -/// in the past. -#[derive(Debug, Deserialize, Clone, PartialEq, Eq)] -#[serde(rename_all = "snake_case")] -pub enum MissedSignatureCatchupStrategy { - /// Don't parse historical signatures at all - None, - /// Parse all signatures until the initial gateway deployment - UntilBeginning, - /// Parse all signtatures until we reach the desired end signature. - UntilSignatureReached(Signature), -} - -pub(crate) mod config_defaults { - use core::time::Duration; - - use solana_sdk::pubkey::Pubkey; - - pub(crate) const fn tx_scan_poll_period() -> Duration { - Duration::from_millis(1000) - } - - pub(crate) const fn gateway_program_address() -> Pubkey { - gmp_gateway::ID - } -} - -mod serde_utils { - use core::str::FromStr as _; - - use serde::{Deserialize as _, Deserializer}; - use solana_sdk::signature::Signature; - - pub(crate) fn signature_decode<'de, D>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - Option::::deserialize(deserializer)? - .map(|raw_string| { - Signature::from_str(&raw_string).map_err(|err| { - serde::de::Error::custom(format!("Cannot parse signature: {err}")) - }) - }) - .transpose() - } -} diff --git a/crates/solana-listener/src/lib.rs b/crates/solana-listener/src/lib.rs deleted file mode 100644 index e61136c..0000000 --- a/crates/solana-listener/src/lib.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Solana transaction scanner - -mod component; -mod config; - -pub use component::{SolanaListener, SolanaListenerClient, SolanaTransaction}; -pub use config::{Config, MissedSignatureCatchupStrategy}; -pub use solana_sdk; diff --git a/deny.toml b/deny.toml index e905e63..2854d4d 100644 --- a/deny.toml +++ b/deny.toml @@ -73,11 +73,6 @@ feature-depth = 1 # output a note when they are encountered. ignore = [ { id = "RUSTSEC-2024-0370", reason = "porc-macro-error: not an issue: unmaintanined but very popular" }, - { id = "RUSTSEC-2022-0093", reason = "ed25519-dalek: need to wait for solana to upgrade internally" }, - { id = "RUSTSEC-2024-0375", reason = "dependency of solana lib" }, - { id = "RUSTSEC-2021-0145", reason = "dependency of solana lib" }, - { id = "RUSTSEC-2021-0139", reason = "dependency of solana lib" }, - # { id = "RUSTSEC-2024-0344", reason = "ed25519-dalek: need to wait for solana to upgrade internally" }, # "a-crate-that-is-yanked@0.1.1", # you can also ignore yanked crate versions if you wish # { crate = "a-crate-that-is-yanked@0.1.1", reason = "you can specify why you are ignoring the yanked crate" }, ] diff --git a/doc/adr/0001-record-architecture-decisions.md b/doc/adr/0001-record-architecture-decisions.md deleted file mode 100644 index e3d4113..0000000 --- a/doc/adr/0001-record-architecture-decisions.md +++ /dev/null @@ -1,19 +0,0 @@ -# 1. Record architecture decisions - -Date: 2024-09-25 - -## Status - -Accepted - -## Context - -We need to record the architectural decisions made on this project. - -## Decision - -We will use Architecture Decision Records, as [described here](https://adr.github.io/). - -## Consequences - -Feel free to install [adrs Rust CLI tool](https://github.com/joshrotenberg/adrs). Or write the documents by hand. diff --git a/doc/adr/0002-configuration.md b/doc/adr/0002-configuration.md deleted file mode 100644 index ddc044d..0000000 --- a/doc/adr/0002-configuration.md +++ /dev/null @@ -1,40 +0,0 @@ -# 2. configuration - -Date: 2024-09-25 - -## Status - -Accepted - -## Context - -The relayer needs to be initialised with settings that allow it to: - -- read data from the Solana blockchain (get signtatures and tx data) -- write data to the Solana blockchain (send txs to the Gateway and destination programs). - This requires a private key to be present for signing purposes. -- read data from the Amplifier API -- write data to the Amplifier API - -To optimize for compile times and make testing easier, we're splitting the code into: - -- library (`relayer-engine`) that will be responsible for the business logic. It defines the public config interfacte. -- binary (`relayer`) that will be responsible for telemetry, tracing, parsing the config -- all the pipework for setting up the engine. - -## Decision - -The relayer will read the data form a config TOML file. Sensitive data, like Solana private key, -can be injected via env variables, which will become a part of the configuration. - -## Consequences - -Pros: - -- Configuration is strongly structured, and always easy to reference. -- Dynamically overriding variables like the pirvate key via env variables is simpler (that having to upload a whole file) - when configuring the servica via k8s or other cloud infra. - -Cons: - -- Having the ability to dynamically set config overrides via env variables may convolute - the setup process. Especially when an env variable is not any more secure than a local config file. diff --git a/doc/adr/0003-solana-event-fetching.md b/doc/adr/0003-solana-event-fetching.md deleted file mode 100644 index ff7b187..0000000 --- a/doc/adr/0003-solana-event-fetching.md +++ /dev/null @@ -1,64 +0,0 @@ -# 3. Solana Event Parsing - -Date: 2024-10-17 - -## Status - -Accepted - -## Context - -We need to fetch logs from the Solana blockchain, examine them, compose them into an Amplifier API event, and forward it to the Axelar blockchain. On Solana, logs are attached to `signatures`, which act as unique transaction identifiers. We are interested in signatures that involve the Gateway program ID. - -Solana's RPC offers methods for interacting with the blockchain: - -- The [`getSignaturesForAddress`](https://solana.com/docs/rpc/http/getsignaturesforaddress) method allows fetching signatures in a range. It can be used to poll the node and query historical signatures in batches. However, this method does not return the logs associated with the signatures. -- The [`getTransaction`](https://solana.com/docs/rpc/http/gettransaction) method can be used to fetch the transaction details, including logs, for a given signature. This means that we need at least two RPC calls for every signature: one to fetch the signatures and another to fetch the transaction logs. - -Additionally, Solana offers a WebSocket API: - -- The [`logsSubscribe`](https://solana.com/docs/rpc/websocket/logssubscribe) method allows subscribing to live log updates for specified accounts or programs. This method provides real-time logs but does not provide historical data. - -In order to efficiently process both historical and real-time logs, we need a strategy that combines both the HTTP RPC and WebSocket APIs, minimizing the number of RPC calls while ensuring no data is missed. - -## Decision - -We have designed the Solana Listener component to process logs in a multi-step execution flow, incorporating strategies for catching up missed signatures: - -1. **Fetching Historical Signatures** - - - Upon component startup, using the provided configuration, we determine the catch-up strategy for missed signatures. The strategies include: - - **None:** Start from the latest available signature without fetching historical data. - - **UntilSignatureReached:** Fetch signatures until a specified target signature is reached. - - **UntilBeginning:** Fetch all missed signatures starting from the beginning. - - We fetch signatures using the HTTP RPC endpoint `getSignaturesForAddress` in batches. - - For each signature, we fetch the corresponding transaction logs using `getTransaction`. - - We keep track of the latest signature we have processed to avoid duplicate processing. - -2. **Establishing a WebSocket Connection** - - - We establish a new WebSocket connection to the Solana node using `logsSubscribe`, subscribing to logs involving the Gateway program ID. - - We await the first message from the WebSocket stream. - -3. **Fetching Signatures Missed During WebSocket Connection Establishment** - - - Establishing the WebSocket connection can take a few seconds, during which we might miss some signatures. - - To handle this, we use the HTTP RPC methods to fetch any signatures that might have been missed between the last processed signature and the first signature received via WebSocket. - - This ensures continuity in the event stream. - -4. **Ingesting New Signatures Using WebSocket Data** - - - After handling historical and potentially missed signatures, we process new incoming logs from the WebSocket connection in real-time. - - We monitor the WebSocket connection and handle reconnections if necessary to maintain real-time data ingestion. - -## Consequences - -Pros: - -- **Improved Reliability:** By implementing configurable catch-up strategies and combining HTTP RPC and WebSocket APIs, we ensure that no events are missed, even during startup or reconnection periods. -- **Flexibility:** The ability to configure the catch-up strategy allows us to balance between startup time and data completeness based on specific needs. - -Cons: - -- **Complexity:** The implementation involves coordinating between HTTP RPC calls and WebSocket subscriptions, handling potential overlaps. This can be hard to grasp and may seem as unnecessary complexity. -- **Resource Utilization:** Fetching historical data may increase the number of RPC calls, to evade rate limitations, the RPC uses a rate-limiting semaphore and internal sleeps. diff --git a/doc/adr/0004-solana-tx-sending.md b/doc/adr/0004-solana-tx-sending.md deleted file mode 100644 index 8b0cd99..0000000 --- a/doc/adr/0004-solana-tx-sending.md +++ /dev/null @@ -1,50 +0,0 @@ -# 4. solana tx sending - -Date: 2024-10-25 - -## Status - -Accepted - -## Context - -Our relayer system needs an efficient and reliable way to send transactions to the Solana blockchain based on tasks received from the Amplifier API. These tasks include various operations such as verifying data, executing gateway transactions, processing messages, rotating verifier sets, and handling refunds. - -Challenges influencing this decision: - -- Compute Budget Constraints: Solana imposes a compute budget limit per transaction, which can vary based on network conditions. -- Dynamic Compute Unit Pricing: The cost of compute units can fluctuate, affecting transaction prioritization and inclusion. -- Asynchronous Task Processing: The system must handle multiple tasks concurrently without blocking, ensuring scalability and responsiveness. -- Error Handling and Recovery: Transactions may fail due to simulation errors or network issues, requiring robust error handling mechanisms. - -## Decision - -We implemented a new `SolanaTxPusher` component within the relayer system to handle the submission of transactions to the Solana blockchain. Key decisions and features include: - -- Asynchronous Processing: The `SolanaTxPusher` uses a JoinSet to process incoming tasks concurrently, allowing the system to handle multiple tasks without blocking. -- Task Handling: It supports different task types from the Amplifier API, specifically focusing on GatewayTx tasks, which involve processing messages and updating verifier sets. -- Dynamic Compute Budget Adjustment: - - Introduced an `EffectiveTxSender` utility that simulates transactions to estimate the required compute units. - - Adjusts the compute budget and compute unit price based on simulation results and recent network fees to maximize the chances of transaction inclusion. -- Error Handling: - - Implements detailed error inspection after simulation to handle specific errors like insufficient compute units or invalid account data. - - Uses retries or alternative flows when acceptable simulation errors occur (e.g., already initialized PDAs). - -## Consequences - -Benefits: - -- Increased Transaction Success Rate: By simulating and adjusting compute budgets and unit prices, the system increases the likelihood of transactions being accepted by the Solana network. -- Scalability: Asynchronous task processing allows the system to scale and handle higher loads without significant performance degradation. -- Optimized Resource Usage: Dynamic adjustment of compute budgets helps in efficient utilization of resources, avoiding over-allocation or under-utilization. - -Drawbacks: - -- Increased Complexity: The introduction of transaction simulation and dynamic adjustments adds complexity to the system, which may lead to longer development and debugging times. -- Potential Latency: Additional steps like simulation and fee analysis may introduce latency in transaction processing. More HTTP round-trips. -- Error Handling Complexity: Robust error handling necessitates comprehensive testing to ensure all edge cases are covered, which can be resource-intensive. - -Risks and Mitigation: - -- Simulation Failures: If simulations fail or provide inaccurate estimates, transactions may fail. To mitigate this, the system includes error inspection and alternative handling paths. -- Security Concerns: Handling keypairs and signing transactions introduces security risks. Proper key management and secure coding practices are essential to mitigate potential vulnerabilities.