From 48b2e0aa62b5da4b8f1403e6d37ebfc458dc6005 Mon Sep 17 00:00:00 2001 From: Matthias Wright Date: Tue, 18 Aug 2026 21:09:07 +0800 Subject: [PATCH 1/3] feat: support dynamic Summit epochs and checkpoint chains --- Cargo.lock | 5531 ++++++------------------------------ Cargo.toml | 15 - config.example.toml | 29 +- config.toml | 13 +- src/checkpoint/executor.rs | 4 +- src/checkpoint/manager.rs | 517 +++- src/checkpoint/metadata.rs | 2 +- src/config.rs | 47 +- src/lib.rs | 1 + src/main.rs | 3 +- src/monitor.rs | 160 +- src/rpc/client.rs | 7 +- src/rpc/summit.rs | 281 +- src/schedule.rs | 53 + src/server/api.rs | 2 +- src/server/server.rs | 150 +- src/state.rs | 24 +- 17 files changed, 1715 insertions(+), 5124 deletions(-) create mode 100644 src/schedule.rs diff --git a/Cargo.lock b/Cargo.lock index f82556e..04025ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 4 -[[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 = "ahash" version = "0.8.12" @@ -40,4307 +30,1425 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] -name = "alloy-chains" -version = "0.2.34" +name = "android_system_properties" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84e0378e959aa6a885897522080a990e80eb317f1e9a222a604492ea50e13096" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" dependencies = [ - "alloy-primitives", - "num_enum", - "strum", -] - -[[package]] -name = "alloy-consensus" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f16daaf7e1f95f62c6c3bf8a3fc3d78b08ae9777810c0bb5e94966c7cd57ef0" -dependencies = [ - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-trie", - "alloy-tx-macros", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "k256", - "once_cell", - "rand 0.8.5", - "secp256k1", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.17", + "libc", ] [[package]] -name = "alloy-consensus-any" -version = "1.8.3" +name = "anstream" +version = "0.6.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "118998d9015332ab1b4720ae1f1e3009491966a0349938a1f43ff45a8a4c6299" +checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "serde", + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", ] [[package]] -name = "alloy-eip2124" -version = "0.2.0" +name = "anstyle" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "741bdd7499908b3aa0b159bba11e71c8cddd009a2c2eb7a06e825f1ec87900a5" -dependencies = [ - "alloy-primitives", - "alloy-rlp", - "crc", - "serde", - "thiserror 2.0.17", -] +checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" [[package]] -name = "alloy-eip2930" -version = "0.2.3" +name = "anstyle-parse" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" +checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", + "utf8parse", ] [[package]] -name = "alloy-eip7702" -version = "0.6.3" +name = "anstyle-query" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", - "thiserror 2.0.17", + "windows-sys 0.61.2", ] [[package]] -name = "alloy-eip7928" -version = "0.3.3" +name = "anstyle-wincon" +version = "3.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8222b1d88f9a6d03be84b0f5e76bb60cd83991b43ad8ab6477f0e4a7809b98d" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "borsh", - "serde", + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", ] [[package]] -name = "alloy-eips" -version = "1.8.3" +name = "anyhow" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6ef28c9fdad22d4eec52d894f5f2673a0895f1e5ef196734568e68c0f6caca8" -dependencies = [ - "alloy-eip2124", - "alloy-eip2930", - "alloy-eip7702", - "alloy-eip7928", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "auto_impl", - "borsh", - "c-kzg", - "derive_more", - "either", - "ethereum_ssz", - "ethereum_ssz_derive", - "serde", - "serde_with", - "sha2 0.10.9", -] +checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" [[package]] -name = "alloy-json-abi" -version = "1.5.7" +name = "arraydeque" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9dbe713da0c737d9e5e387b0ba790eb98b14dd207fe53eef50e19a5a8ec3dac" -dependencies = [ - "alloy-primitives", - "alloy-sol-type-parser", - "serde", - "serde_json", -] +checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" [[package]] -name = "alloy-json-rpc" -version = "1.8.3" +name = "async-trait" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "422d110f1c40f1f8d0e5562b0b649c35f345fccb7093d9f02729943dcd1eef71" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ - "alloy-primitives", - "alloy-sol-types", - "http", - "serde", - "serde_json", - "thiserror 2.0.17", - "tracing", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "alloy-network" -version = "1.8.3" +name = "atomic-waker" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7197a66d94c4de1591cdc16a9bcea5f8cccd0da81b865b49aef97b1b4016e0fa" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-json-rpc", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rpc-types-any", - "alloy-rpc-types-eth", - "alloy-serde", - "alloy-signer", - "alloy-sol-types", - "async-trait", - "auto_impl", - "derive_more", - "futures-utils-wasm", - "serde", - "serde_json", - "thiserror 2.0.17", -] +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] -name = "alloy-network-primitives" -version = "1.8.3" +name = "autocfg" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb82711d59a43fdfd79727c99f270b974c784ec4eb5728a0d0d22f26716c87ef" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-serde", - "serde", -] +checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] -name = "alloy-primitives" -version = "1.5.7" +name = "base64" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de3b431b4e72cd8bd0ec7a50b4be18e73dab74de0dba180eef171055e5d5926e" -dependencies = [ - "alloy-rlp", - "bytes", - "cfg-if", - "const-hex", - "derive_more", - "foldhash", - "hashbrown 0.16.1", - "indexmap 2.13.0", - "itoa", - "k256", - "keccak-asm", - "paste", - "proptest", - "rand 0.9.2", - "rapidhash", - "ruint", - "rustc-hash", - "serde", - "sha3", -] +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] -name = "alloy-provider" -version = "1.8.3" +name = "base64" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf6b18b929ef1d078b834c3631e9c925177f3b23ddc6fa08a722d13047205876" -dependencies = [ - "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-json-rpc", - "alloy-network", - "alloy-network-primitives", - "alloy-primitives", - "alloy-pubsub", - "alloy-rpc-client", - "alloy-rpc-types-engine", - "alloy-rpc-types-eth", - "alloy-signer", - "alloy-sol-types", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "async-stream", - "async-trait", - "auto_impl", - "dashmap", - "either", - "futures", - "futures-utils-wasm", - "lru", - "parking_lot", - "pin-project", - "reqwest 0.13.2", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tracing", - "url", - "wasmtimer", -] +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] -name = "alloy-pubsub" -version = "1.8.3" +name = "bitflags" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ad54073131e7292d4e03e1aa2287730f737280eb160d8b579fb31939f558c11" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-transport", - "auto_impl", - "bimap", - "futures", - "parking_lot", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "wasmtimer", + "serde_core", ] [[package]] -name = "alloy-rlp" -version = "0.3.15" +name = "block-buffer" +version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc90b1e703d3c03f4ff7f48e82dd0bc1c8211ab7d079cd836a06fcfeb06651cb" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" dependencies = [ - "alloy-rlp-derive", - "arrayvec", - "bytes", + "generic-array", ] [[package]] -name = "alloy-rlp-derive" -version = "0.3.15" +name = "bumpalo" +version = "3.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f36834a5c0a2fa56e171bf256c34d70fca07d0c0031583edea1c4946b7889c9e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] +checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" [[package]] -name = "alloy-rpc-client" -version = "1.8.3" +name = "bytes" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fcc9604042ca80bd37aa5e232ea1cd851f337e31e2babbbb345bc0b1c30de3" -dependencies = [ - "alloy-json-rpc", - "alloy-primitives", - "alloy-pubsub", - "alloy-transport", - "alloy-transport-http", - "alloy-transport-ipc", - "futures", - "pin-project", - "reqwest 0.13.2", - "serde", - "serde_json", - "tokio", - "tokio-stream", - "tower", - "tracing", - "url", - "wasmtimer", -] +checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" [[package]] -name = "alloy-rpc-types-any" -version = "1.8.3" +name = "cc" +version = "1.2.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3823026d1ed239a40f12364fac50726c8daf1b6ab8077a97212c5123910429ed" +checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" dependencies = [ - "alloy-consensus-any", - "alloy-rpc-types-eth", - "alloy-serde", + "find-msvc-tools", + "shlex", ] [[package]] -name = "alloy-rpc-types-engine" -version = "1.8.3" +name = "cesu8" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb9b97b6e7965679ad22df297dda809b11cebc13405c1b537e5cffecc95834fa" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "derive_more", - "ethereum_ssz", - "ethereum_ssz_derive", - "jsonwebtoken", - "rand 0.8.5", - "serde", - "strum", -] +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" [[package]] -name = "alloy-rpc-types-eth" -version = "1.8.3" +name = "cfg-if" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c095f92c4e1ff4981d89e9aa02d5f98c762a1980ab66bec49c44be11349da2" -dependencies = [ - "alloy-consensus", - "alloy-consensus-any", - "alloy-eips", - "alloy-network-primitives", - "alloy-primitives", - "alloy-rlp", - "alloy-serde", - "alloy-sol-types", - "itertools 0.14.0", - "serde", - "serde_json", - "serde_with", - "thiserror 2.0.17", -] +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] -name = "alloy-serde" -version = "1.8.3" +name = "chrono" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ece63b89294b8614ab3f483560c08d016930f842bf36da56bf0b764a15c11e" +checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" dependencies = [ - "alloy-primitives", + "iana-time-zone", + "js-sys", + "num-traits", "serde", - "serde_json", + "wasm-bindgen", + "windows-link", ] [[package]] -name = "alloy-signer" -version = "1.8.3" +name = "clap" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43f447aefab0f1c0649f71edc33f590992d4e122bc35fb9cdbbf67d4421ace85" +checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" dependencies = [ - "alloy-primitives", - "async-trait", - "auto_impl", - "either", - "elliptic-curve", - "k256", - "thiserror 2.0.17", + "clap_builder", + "clap_derive", ] [[package]] -name = "alloy-sol-macro" -version = "1.5.7" +name = "clap_builder" +version = "4.5.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab81bab693da9bb79f7a95b64b394718259fdd7e41dceeced4cad57cb71c4f6a" +checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" dependencies = [ - "alloy-sol-macro-expander", - "alloy-sol-macro-input", - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.114", + "anstream", + "anstyle", + "clap_lex", + "strsim", ] [[package]] -name = "alloy-sol-macro-expander" -version = "1.5.7" +name = "clap_derive" +version = "4.5.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "489f1620bb7e2483fb5819ed01ab6edc1d2f93939dce35a5695085a1afd1d699" +checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" dependencies = [ - "alloy-sol-macro-input", - "const-hex", "heck", - "indexmap 2.13.0", - "proc-macro-error2", "proc-macro2", "quote", - "sha3", - "syn 2.0.114", - "syn-solidity", + "syn", ] [[package]] -name = "alloy-sol-macro-input" -version = "1.5.7" +name = "clap_lex" +version = "0.7.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56cef806ad22d4392c5fc83cf8f2089f988eb99c7067b4e0c6f1971fc1cca318" -dependencies = [ - "const-hex", - "dunce", - "heck", - "macro-string", - "proc-macro2", - "quote", - "syn 2.0.114", - "syn-solidity", -] +checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" + +[[package]] +name = "colorchoice" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" [[package]] -name = "alloy-sol-type-parser" -version = "1.5.7" +name = "combine" +version = "4.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6df77fea9d6a2a75c0ef8d2acbdfd92286cc599983d3175ccdc170d3433d249" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "serde", - "winnow", + "bytes", + "memchr", ] [[package]] -name = "alloy-sol-types" -version = "1.5.7" +name = "config" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64612d29379782a5dde6f4b6570d9c756d734d760c0c94c254d361e678a6591f" +checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" dependencies = [ - "alloy-json-abi", - "alloy-primitives", - "alloy-sol-macro", + "async-trait", + "convert_case", + "json5", + "nom", + "pathdiff", + "ron", + "rust-ini", "serde", + "serde_json", + "toml", + "yaml-rust2", ] [[package]] -name = "alloy-transport" -version = "1.8.3" +name = "const-random" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8098f965442a9feb620965ba4b4be5e2b320f4ec5a3fff6bfa9e1ff7ef42bed1" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" dependencies = [ - "alloy-json-rpc", - "auto_impl", - "base64 0.22.1", - "derive_more", - "futures", - "futures-utils-wasm", - "parking_lot", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tower", - "tracing", - "url", - "wasmtimer", -] - -[[package]] -name = "alloy-transport-http" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8597d36d546e1dab822345ad563243ec3920e199322cb554ce56c8ef1a1e2e7" -dependencies = [ - "alloy-json-rpc", - "alloy-transport", - "http-body-util", - "hyper", - "hyper-tls", - "hyper-util", - "itertools 0.14.0", - "reqwest 0.13.2", - "serde_json", - "tower", - "tracing", - "url", + "const-random-macro", ] [[package]] -name = "alloy-transport-ipc" -version = "1.8.3" +name = "const-random-macro" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1bd98c3870b8a44b79091dde5216a81d58ffbc1fd8ed61b776f9fee0f3bdf20" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" dependencies = [ - "alloy-json-rpc", - "alloy-pubsub", - "alloy-transport", - "bytes", - "futures", - "interprocess", - "pin-project", - "serde", - "serde_json", - "tokio", - "tokio-util", - "tracing", + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", ] [[package]] -name = "alloy-trie" -version = "0.9.5" +name = "convert_case" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f14b5d9b2c2173980202c6ff470d96e7c5e202c65a9f67884ad565226df7fbb" +checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" dependencies = [ - "alloy-primitives", - "alloy-rlp", - "derive_more", - "nybbles", - "serde", - "smallvec", - "thiserror 2.0.17", - "tracing", + "unicode-segmentation", ] [[package]] -name = "alloy-tx-macros" -version = "1.8.3" +name = "core-foundation" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d69722eddcdf1ce096c3ab66cf8116999363f734eb36fe94a148f4f71c85da84" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "darling 0.23.0", - "proc-macro2", - "quote", - "syn 2.0.114", + "core-foundation-sys", + "libc", ] [[package]] -name = "android_system_properties" -version = "0.1.5" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ + "core-foundation-sys", "libc", ] [[package]] -name = "anes" -version = "0.1.6" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "anstream" -version = "0.6.21" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "is_terminal_polyfill", - "utf8parse", + "libc", ] [[package]] -name = "anstyle" -version = "1.0.13" +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "anstyle-parse" -version = "0.2.7" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "utf8parse", + "generic-array", + "typenum", ] [[package]] -name = "anstyle-query" -version = "1.1.5" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "windows-sys 0.61.2", + "block-buffer", + "crypto-common", ] [[package]] -name = "anstyle-wincon" -version = "3.0.11" +name = "dirs" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" dependencies = [ - "anstyle", - "once_cell_polyfill", - "windows-sys 0.61.2", + "dirs-sys", ] [[package]] -name = "anyhow" -version = "1.0.100" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23eb6b1614318a8071c9b2521f36b424b2c83db5eb3a0fead4a6c0809af6e61" - -[[package]] -name = "ark-ff" -version = "0.3.0" +name = "dirs-sys" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b3235cc41ee7a12aaaf2c575a2ad7b46713a8a50bda2fc3b003a04845c05dd6" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" dependencies = [ - "ark-ff-asm 0.3.0", - "ark-ff-macros 0.3.0", - "ark-serialize 0.3.0", - "ark-std 0.3.0", - "derivative", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.3.3", - "zeroize", + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", ] [[package]] -name = "ark-ff" -version = "0.4.2" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "ark-ff-asm 0.4.2", - "ark-ff-macros 0.4.2", - "ark-serialize 0.4.2", - "ark-std 0.4.0", - "derivative", - "digest 0.10.7", - "itertools 0.10.5", - "num-bigint", - "num-traits", - "paste", - "rustc_version 0.4.1", - "zeroize", -] - -[[package]] -name = "ark-ff" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" -dependencies = [ - "ark-ff-asm 0.5.0", - "ark-ff-macros 0.5.0", - "ark-serialize 0.5.0", - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "educe", - "itertools 0.13.0", - "num-bigint", - "num-traits", - "paste", - "zeroize", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "ark-ff-asm" -version = "0.3.0" +name = "dlv-list" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db02d390bf6643fb404d3d22d31aee1c4bc4459600aef9113833d17e786c6e44" +checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" dependencies = [ - "quote", - "syn 1.0.109", + "const-random", ] [[package]] -name = "ark-ff-asm" -version = "0.4.2" +name = "encoding_rs" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ - "quote", - "syn 1.0.109", + "cfg-if", ] [[package]] -name = "ark-ff-asm" -version = "0.5.0" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" -dependencies = [ - "quote", - "syn 2.0.114", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "ark-ff-macros" -version = "0.3.0" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fd794a08ccb318058009eefdf15bcaaaaf6f8161eb3345f907222bac38b20" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "num-bigint", - "num-traits", - "quote", - "syn 1.0.109", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "ark-ff-macros" -version = "0.4.2" +name = "fastrand" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] -name = "ark-ff-macros" -version = "0.5.0" +name = "find-msvc-tools" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" -dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.114", -] +checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" [[package]] -name = "ark-serialize" -version = "0.3.0" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6c2b318ee6e10f8c2853e73a83adc0ccb88995aa978d8a3408d492ab2ee671" -dependencies = [ - "ark-std 0.3.0", - "digest 0.9.0", -] +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "ark-serialize" -version = "0.4.2" +name = "foreign-types" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "ark-std 0.4.0", - "digest 0.10.7", - "num-bigint", + "foreign-types-shared", ] [[package]] -name = "ark-serialize" -version = "0.5.0" +name = "foreign-types-shared" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" -dependencies = [ - "ark-std 0.5.0", - "arrayvec", - "digest 0.10.7", - "num-bigint", -] +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] -name = "ark-std" -version = "0.3.0" +name = "form_urlencoded" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1df2c09229cbc5a028b1d70e00fdb2acee28b1055dfb5ca73eea49c5a25c4e7c" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "num-traits", - "rand 0.8.5", + "percent-encoding", ] [[package]] -name = "ark-std" -version = "0.4.0" +name = "futures" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ - "num-traits", - "rand 0.8.5", + "futures-channel", + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", ] [[package]] -name = "ark-std" -version = "0.5.0" +name = "futures-channel" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ - "num-traits", - "rand 0.8.5", + "futures-core", + "futures-sink", ] [[package]] -name = "arraydeque" -version = "0.5.1" +name = "futures-core" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d902e3d592a523def97af8f317b08ce16b7ab854c1985a0c671e6f15cebc236" +checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] -name = "arrayref" -version = "0.3.9" +name = "futures-io" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" +checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] -name = "arrayvec" -version = "0.7.6" +name = "futures-macro" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ - "zeroize", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "async-lock" -version = "3.4.2" +name = "futures-sink" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] +checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" [[package]] -name = "async-stream" -version = "0.3.6" +name = "futures-task" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b5a71a6f37880a80d1d7f19efd781e4b5de42c88f0722cc13bcb6cc2cfe8476" -dependencies = [ - "async-stream-impl", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-stream-impl" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "atomic-waker" -version = "1.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +checksum = "f90f7dce0722e95104fcb095585910c0977252f286e354b5e3bd38902cd99988" [[package]] -name = "auto_impl" -version = "1.3.0" +name = "futures-util" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" +checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", ] [[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "aws-lc-rs" -version = "1.16.2" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a054912289d18629dc78375ba2c3726a3afe3ff71b4edba9dedfca0e3446d1fc" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "aws-lc-sys", - "untrusted 0.7.1", - "zeroize", + "typenum", + "version_check", ] [[package]] -name = "aws-lc-sys" -version = "0.39.1" +name = "getrandom" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a25cf98105baa966497416dbd42565ce3a8cf8dbfd59803ec9ad46f3126399" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", + "cfg-if", + "libc", + "wasi", ] [[package]] -name = "axum" -version = "0.8.9" +name = "getrandom" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ - "axum-core", - "bytes", - "form_urlencoded", - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "serde_json", - "serde_path_to_error", - "serde_urlencoded", - "sync_wrapper", - "tokio", - "tower", - "tower-layer", - "tower-service", - "tracing", + "cfg-if", + "libc", + "r-efi", + "wasip2", ] [[package]] -name = "axum-core" -version = "0.5.6" +name = "h2" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ + "atomic-waker", "bytes", + "fnv", "futures-core", + "futures-sink", "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", + "indexmap", + "slab", + "tokio", + "tokio-util", "tracing", ] [[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - -[[package]] -name = "base64" -version = "0.21.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" - -[[package]] -name = "base64" -version = "0.22.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" - -[[package]] -name = "base64ct" +name = "half" version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - -[[package]] -name = "bimap" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "230c5f1ca6a325a32553f8640d31ac9b49f2411e901e427570154868b46da4f7" +checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" [[package]] -name = "bit-set" -version = "0.8.0" +name = "hashbrown" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ - "bit-vec", + "ahash", + "allocator-api2", ] [[package]] -name = "bit-vec" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" - -[[package]] -name = "bitcoin-io" -version = "0.1.4" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] -name = "bitcoin_hashes" -version = "0.14.1" +name = "hashlink" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26ec84b80c482df901772e931a9a681e26a1b9ee2302edeff23cb30328745c8b" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ - "bitcoin-io", - "hex-conservative", + "hashbrown 0.14.5", ] [[package]] -name = "bitflags" -version = "2.10.0" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" -dependencies = [ - "serde_core", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "bitvec" -version = "1.0.1" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "funty", - "radium", - "tap", - "wyz", + "bytes", + "itoa", ] [[package]] -name = "blake3" -version = "1.8.4" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d2d5991425dfd0785aed03aedcf0b321d61975c9b5b3689c774a2610ae0b51e" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "arrayref", - "arrayvec", - "cc", - "cfg-if", - "constant_time_eq", - "cpufeatures 0.3.0", - "zeroize", + "bytes", + "http", ] [[package]] -name = "block-buffer" -version = "0.9.0" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "generic-array", + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", ] [[package]] -name = "block-buffer" -version = "0.10.4" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" -dependencies = [ - "generic-array", -] +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "blst" -version = "0.3.16" +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" -dependencies = [ - "cc", - "glob", - "threadpool", - "zeroize", -] +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "borsh" -version = "1.6.1" +name = "hyper" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ - "borsh-derive", + "atomic-waker", "bytes", - "cfg_aliases", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", ] [[package]] -name = "borsh-derive" -version = "1.6.1" +name = "hyper-rustls" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfcfdc083699101d5a7965e49925975f2f55060f94f9a05e7187be95d530ca59" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "once_cell", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.114", + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", ] [[package]] -name = "bumpalo" -version = "3.19.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd9dc738b7a8311c7ade152424974d8115f2cdad61e8dab8dac9f2362298510" - -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - -[[package]] -name = "bytes" -version = "1.11.0" +name = "hyper-tls" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b35204fbdc0b3f4446b89fc1ac2cf84a8a68971995d0bf2e925ec7cd960f9cb3" +checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" dependencies = [ - "serde", + "bytes", + "http-body-util", + "hyper", + "hyper-util", + "native-tls", + "tokio", + "tokio-native-tls", + "tower-service", ] [[package]] -name = "c-kzg" -version = "2.1.7" +name = "hyper-util" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6648ed1e4ea8e8a1a4a2c78e1cda29a3fd500bc622899c340d8525ea9a76b24a" -dependencies = [ - "blst", - "cc", - "glob", - "hex", - "libc", - "once_cell", - "serde", -] - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - -[[package]] -name = "cc" -version = "1.2.52" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd4932aefd12402b36c60956a4fe0035421f544799057659ff86f923657aada3" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cesu8" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" - -[[package]] -name = "cfg-if" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" - -[[package]] -name = "cfg_aliases" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures 0.2.17", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "chrono" -version = "0.4.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" -dependencies = [ - "iana-time-zone", - "js-sys", - "num-traits", - "serde", - "wasm-bindgen", - "windows-link 0.2.1", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half 2.7.1", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clap" -version = "4.5.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.5.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.5.49" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "clap_lex" -version = "0.7.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32" - -[[package]] -name = "cmake" -version = "0.1.58" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0f78a02292a74a88ac736019ab962ece0bc380e3f977bf72e376c5d78ff0678" -dependencies = [ - "cc", -] - -[[package]] -name = "cmov" -version = "0.5.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5417da527aa9bf6a1e10a781231effd1edd3ee82f27d5f8529ac9b279babce96" - -[[package]] -name = "colorchoice" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75" - -[[package]] -name = "combine" -version = "4.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" -dependencies = [ - "bytes", - "memchr", -] - -[[package]] -name = "commonware-broadcast" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa29e885815ceb4e9ac4e1cb840aa96fb5493ad0c3ea5ac401212385137736" -dependencies = [ - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-p2p", - "commonware-runtime", - "commonware-utils", - "prometheus-client", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "commonware-codec" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f6cacfdaad565ab6565b7c896cdf9d6d58a528e162150c2697d4d925a9938e" -dependencies = [ - "bytes", - "cfg-if", - "commonware-macros", - "paste", - "rand 0.8.5", - "rand_chacha 0.3.1", - "thiserror 2.0.17", -] - -[[package]] -name = "commonware-consensus" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ec7c97f3cb71e54a24a12af393d063d4daacf17ffcb69d79b9b519e5d19bafe" -dependencies = [ - "bytes", - "cfg-if", - "commonware-broadcast", - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-p2p", - "commonware-parallel", - "commonware-resolver", - "commonware-runtime", - "commonware-storage", - "commonware-utils", - "futures", - "pin-project", - "prometheus-client", - "rand 0.8.5", - "rand_core 0.6.4", - "rand_distr", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "commonware-cryptography" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea20d380b73eb74eb977c40b0ef3df88ad7a428a582c38ada2d64fd7a1ef909b" -dependencies = [ - "anyhow", - "aws-lc-rs", - "blake3", - "blst", - "bytes", - "cfg-if", - "chacha20poly1305", - "commonware-codec", - "commonware-macros", - "commonware-math", - "commonware-parallel", - "commonware-utils", - "crc-fast", - "ctutils", - "ecdsa", - "ed25519-consensus", - "getrandom 0.2.17", - "num-rational", - "num-traits", - "p256", - "rand 0.8.5", - "rand_chacha 0.3.1", - "rand_core 0.6.4", - "sha2 0.10.9", - "thiserror 2.0.17", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "commonware-macros" -version = "2026.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c8da60f9fe8357927327729fa7838b44555f4c578e4b07c12a2964664230a98" -dependencies = [ - "commonware-macros-impl", - "tokio", -] - -[[package]] -name = "commonware-macros-impl" -version = "2026.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc385e646d91b5397c93816985421878d627839834f7cf85a8da2ac9f8b98b7" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.114", - "toml 0.9.11+spec-1.1.0", -] - -[[package]] -name = "commonware-math" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2c6de52eb60c386ad2376d44ff247c41e2e7b03a436041e7065a2054799e31e" -dependencies = [ - "bytes", - "commonware-codec", - "commonware-macros", - "commonware-parallel", - "commonware-utils", - "rand_core 0.6.4", -] - -[[package]] -name = "commonware-p2p" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b3035f95ed50d7c440f0fbab6593409226bb42dfe105235975f6751e44051bf" -dependencies = [ - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-runtime", - "commonware-stream", - "commonware-utils", - "either", - "futures", - "num-bigint", - "num-integer", - "num-rational", - "num-traits", - "prometheus-client", - "rand 0.8.5", - "rand_core 0.6.4", - "rand_distr", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "commonware-parallel" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "757b851e79eef082156ab7e33e354bda406ba9abbbc614fe3c92145d23a102fc" -dependencies = [ - "cfg-if", - "commonware-macros", - "rayon", -] - -[[package]] -name = "commonware-resolver" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "247e2bca77b21f598178b0194b519560616136222f8b10d4aa8cf801a6de91eb" -dependencies = [ - "bytes", - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-p2p", - "commonware-runtime", - "commonware-stream", - "commonware-utils", - "futures", - "prometheus-client", - "rand 0.8.5", - "thiserror 2.0.17", - "tracing", -] - -[[package]] -name = "commonware-runtime" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f3c41066ea741c799381b31df729c572705cd27925601db577cd44f9cf0358" -dependencies = [ - "async-lock", - "axum", - "bytes", - "cfg-if", - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-parallel", - "commonware-utils", - "criterion", - "crossbeam-queue", - "futures", - "getrandom 0.2.17", - "governor", - "libc", - "opentelemetry", - "opentelemetry-otlp", - "opentelemetry_sdk", - "prometheus-client", - "rand 0.8.5", - "rand_core 0.6.4", - "rayon", - "sha2 0.10.9", - "sysinfo", - "thiserror 2.0.17", - "tokio", - "tracing", - "tracing-opentelemetry", - "tracing-subscriber", -] - -[[package]] -name = "commonware-storage" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31db25d40fcdf233e93dfec1749e0d7ee7b1dcdd9507f31f9f445fa98972ab8c" -dependencies = [ - "anyhow", - "bytes", - "cfg-if", - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-parallel", - "commonware-runtime", - "commonware-utils", - "futures", - "futures-util", - "prometheus-client", - "rayon", - "thiserror 2.0.17", - "tracing", - "zstd", -] - -[[package]] -name = "commonware-stream" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30e6e61b311c4d65b16cfc70076e1d560fa1cf8975cc9afbe293501bf4814aad" -dependencies = [ - "chacha20poly1305", - "commonware-codec", - "commonware-cryptography", - "commonware-macros", - "commonware-runtime", - "commonware-utils", - "futures", - "rand 0.8.5", - "rand_core 0.6.4", - "thiserror 2.0.17", - "x25519-dalek", - "zeroize", -] - -[[package]] -name = "commonware-utils" -version = "2026.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d350ec4edcf243e8f746f8d6011956910c705325b295df3d686e77067b8b381b" -dependencies = [ - "bytes", - "cfg-if", - "commonware-codec", - "commonware-macros", - "futures", - "getrandom 0.2.17", - "hashbrown 0.16.1", - "num-bigint", - "num-integer", - "num-rational", - "num-traits", - "pin-project", - "rand 0.8.5", - "thiserror 2.0.17", - "tokio", - "zeroize", -] - -[[package]] -name = "concurrent-queue" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "config" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68578f196d2a33ff61b27fae256c3164f65e36382648e30666dde05b8cc9dfdf" -dependencies = [ - "async-trait", - "convert_case 0.6.0", - "json5", - "nom", - "pathdiff", - "ron", - "rust-ini", - "serde", - "serde_json", - "toml 0.8.23", - "yaml-rust2", -] - -[[package]] -name = "const-hex" -version = "1.18.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "531185e432bb31db1ecda541e9e7ab21468d4d844ad7505e0546a49b4945d49b" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "proptest", - "serde_core", -] - -[[package]] -name = "const-oid" -version = "0.9.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const-random" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" -dependencies = [ - "const-random-macro", -] - -[[package]] -name = "const-random-macro" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" -dependencies = [ - "getrandom 0.2.17", - "once_cell", - "tiny-keccak", -] - -[[package]] -name = "const_format" -version = "0.2.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" -dependencies = [ - "const_format_proc_macros", -] - -[[package]] -name = "const_format_proc_macros" -version = "0.2.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] - -[[package]] -name = "constant_time_eq" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" - -[[package]] -name = "convert_case" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "convert_case" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" -dependencies = [ - "unicode-segmentation", -] - -[[package]] -name = "core-foundation" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "cpufeatures" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" -dependencies = [ - "libc", -] - -[[package]] -name = "cpufeatures" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b2a41393f66f16b0823bb79094d54ac5fbd34ab292ddafb9a0456ac9f87d201" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5eb8a2a1cd12ab0d987a5d5e825195d372001a4094a0376319d5a0ad71c1ba0d" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5" - -[[package]] -name = "crc-fast" -version = "1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75b2483e97a5a7da73ac68a05b629f9c53cff58d8ed1c77866079e18b00dba5" -dependencies = [ - "digest 0.10.7", - "spin", -] - -[[package]] -name = "criterion" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1c047a62b0cc3e145fa84415a3191f628e980b194c2755aa12300a4e6cbd928" -dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "itertools 0.13.0", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_json", - "tinytemplate", - "walkdir", -] - -[[package]] -name = "criterion-plot" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" -dependencies = [ - "cast", - "itertools 0.13.0", -] - -[[package]] -name = "crossbeam-deque" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-epoch" -version = "0.9.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-queue" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" -dependencies = [ - "crossbeam-utils", -] - -[[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", -] - -[[package]] -name = "crypto-common" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "rand_core 0.6.4", - "typenum", -] - -[[package]] -name = "ctutils" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758e5ed90be3c8abff7f9a6f37ab7f6d8c59c2210d448b81f3f508134aec84e4" -dependencies = [ - "cmov", -] - -[[package]] -name = "curve25519-dalek" -version = "4.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures 0.2.17", - "curve25519-dalek-derive", - "fiat-crypto", - "rustc_version 0.4.1", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest 0.9.0", - "rand_core 0.6.4", - "subtle-ng", - "zeroize", -] - -[[package]] -name = "darling" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" -dependencies = [ - "darling_core 0.20.11", - "darling_macro 0.20.11", -] - -[[package]] -name = "darling" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" -dependencies = [ - "darling_core 0.23.0", - "darling_macro 0.23.0", -] - -[[package]] -name = "darling_core" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.114", -] - -[[package]] -name = "darling_core" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" -dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "serde", - "strsim", - "syn 2.0.114", -] - -[[package]] -name = "darling_macro" -version = "0.20.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" -dependencies = [ - "darling_core 0.20.11", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "darling_macro" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" -dependencies = [ - "darling_core 0.23.0", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "dashmap" -version = "6.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" -dependencies = [ - "cfg-if", - "crossbeam-utils", - "hashbrown 0.14.5", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "der" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "zeroize", -] - -[[package]] -name = "deranged" -version = "0.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "powerfmt", - "serde_core", -] - -[[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 = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] - -[[package]] -name = "derive_more-impl" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" -dependencies = [ - "convert_case 0.10.0", - "proc-macro2", - "quote", - "rustc_version 0.4.1", - "syn 2.0.114", - "unicode-xid", -] - -[[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 = "dirs" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] - -[[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.114", -] - -[[package]] -name = "dlv-list" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "442039f5147480ba31067cb00ada1adae6892028e40e45fc5de7b7df6dcc1b5f" -dependencies = [ - "const-random", -] - -[[package]] -name = "doctest-file" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2db04e74f0a9a93103b50e90b96024c9b2bdca8bce6a632ec71b88736d3d359" - -[[package]] -name = "dtoa" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c3cf4824e2d5f025c7b531afcb2325364084a16806f6d47fbc1f5fbd9960590" - -[[package]] -name = "dunce" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" - -[[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[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", - "serdect", - "signature", - "spki", -] - -[[package]] -name = "ed25519-consensus" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c8465edc8ee7436ffea81d21a019b16676ee3db267aa8d5a8d729581ecf998b" -dependencies = [ - "curve25519-dalek-ng", - "hex", - "rand_core 0.6.4", - "sha2 0.9.9", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "educe" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" -dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "either" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" -dependencies = [ - "serde", -] - -[[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", - "serdect", - "subtle", - "zeroize", -] - -[[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-ordinalize" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" -dependencies = [ - "enum-ordinalize-derive", -] - -[[package]] -name = "enum-ordinalize-derive" -version = "4.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "ethereum_hashing" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa93f58bb1eb3d1e556e4f408ef1dac130bad01ac37db4e7ade45de40d1c86a" -dependencies = [ - "cpufeatures 0.2.17", - "ring", - "sha2 0.10.9", -] - -[[package]] -name = "ethereum_serde_utils" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dc1355dbb41fbbd34ec28d4fb2a57d9a70c67ac3c19f6a5ca4d4a176b9e997a" -dependencies = [ - "alloy-primitives", - "hex", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "ethereum_ssz" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dcddb2554d19cde19b099fadddde576929d7a4d0c1cd3512d1fd95cf174375c" -dependencies = [ - "alloy-primitives", - "ethereum_serde_utils", - "itertools 0.13.0", - "serde", - "serde_derive", - "smallvec", - "typenum", -] - -[[package]] -name = "ethereum_ssz_derive" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a657b6b3b7e153637dc6bdc6566ad9279d9ee11a15b12cfb24a2e04360637e9f" -dependencies = [ - "darling 0.20.11", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - -[[package]] -name = "fastrand" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" - -[[package]] -name = "fastrlp" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139834ddba373bbdd213dffe02c8d110508dcf1726c2be27e8d1f7d7e1856418" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "fastrlp" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce8dba4714ef14b8274c371879b175aa55b16b30f269663f19d576f380018dc4" -dependencies = [ - "arrayvec", - "auto_impl", - "bytes", -] - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -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 = "find-msvc-tools" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f449e6c6c08c865631d4890cfacf252b3d396c9bcc83adb6623cdb02a8336c41" - -[[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 = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "foreign-types" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" -dependencies = [ - "foreign-types-shared", -] - -[[package]] -name = "foreign-types-shared" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fs_extra" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-channel" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" - -[[package]] -name = "futures-executor" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" - -[[package]] -name = "futures-macro" -version = "0.3.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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 = "futures-utils-wasm" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", - "zeroize", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "governor" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9efcab3c1958580ff1f25a2a41be1668f7603d849bb63af523b208a3cc1223b8" -dependencies = [ - "cfg-if", - "dashmap", - "futures-sink", - "futures-timer", - "futures-util", - "getrandom 0.3.4", - "hashbrown 0.16.1", - "nonzero_ext", - "parking_lot", - "portable-atomic", - "quanta", - "rand 0.9.2", - "smallvec", - "spinning_top", - "web-time", -] - -[[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.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "half" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403" - -[[package]] -name = "half" -version = "2.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" -dependencies = [ - "cfg-if", - "crunchy", - "zerocopy", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", - "serde_core", -] - -[[package]] -name = "hashlink" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" -dependencies = [ - "hashbrown 0.14.5", -] - -[[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.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hex-conservative" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda06d18ac606267c40c04e41b9947729bf8b9efe74bd4e82b61a5f26a510b9f" -dependencies = [ - "arrayvec", -] - -[[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 = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "log", - "rustls", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-tls" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70206fc6890eaca9fde8a0bf71caa2ddfc9fe045ac9e5c70df101a7dbde866e0" -dependencies = [ - "bytes", - "http-body-util", - "hyper", - "hyper-util", - "native-tls", - "tokio", - "tokio-native-tls", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-channel", - "futures-core", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "pin-project-lite", - "socket2", - "system-configuration", - "tokio", - "tower-layer", - "tower-service", - "tracing", - "windows-registry", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.64" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[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 = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[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", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "interprocess" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6be5e5c847dbdb44564bd85294740d031f4f8aeb3464e5375ef7141f7538db69" -dependencies = [ - "doctest-file", - "futures-core", - "libc", - "recvmsg", - "tokio", - "widestring", - "windows-sys 0.52.0", -] - -[[package]] -name = "ipnet" -version = "2.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" - -[[package]] -name = "iri-string" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[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.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "jni" -version = "0.21.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" -dependencies = [ - "cesu8", - "cfg-if", - "combine", - "jni-sys", - "log", - "thiserror 1.0.69", - "walkdir", - "windows-sys 0.45.0", -] - -[[package]] -name = "jni-sys" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json5" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" -dependencies = [ - "pest", - "pest_derive", - "serde", -] - -[[package]] -name = "jsonrpsee" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3f48dc3e6b8bd21e15436c1ddd0bc22a6a54e8ec46fedd6adf3425f396ec6a" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-http-client", - "jsonrpsee-proc-macros", - "jsonrpsee-server", - "jsonrpsee-types", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "316c96719901f05d1137f19ba598b5fe9c9bc39f4335f67f6be8613921946480" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "jsonrpsee-types", - "parking_lot", - "pin-project", - "rand 0.9.2", - "rustc-hash", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-http-client" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790bedefcec85321e007ff3af84b4e417540d5c87b3c9779b9e247d1bcc3dab8" +checksum = "727805d60e7938b76b826a6ef209eb70eaa1812794f9424d4a4e2d740662df5f" dependencies = [ "base64 0.22.1", - "http-body", - "hyper", - "hyper-rustls", - "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", - "rustls", - "rustls-platform-verifier 0.5.3", - "serde", - "serde_json", - "thiserror 2.0.17", - "tokio", - "tower", - "url", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2da3f8ab5ce1bb124b6d082e62dffe997578ceaf0aeb9f3174a214589dc00f07" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c51b7c290bb68ce3af2d029648148403863b982f138484a73f02a9dd52dbd7f" -dependencies = [ + "bytes", + "futures-channel", + "futures-core", "futures-util", "http", "http-body", - "http-body-util", "hyper", - "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", - "pin-project", - "route-recognizer", - "serde", - "serde_json", - "soketto", - "thiserror 2.0.17", - "tokio", - "tokio-stream", - "tokio-util", - "tower", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 2.0.17", -] - -[[package]] -name = "jsonwebtoken" -version = "9.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a87cc7a48537badeae96744432de36f4be2b4a34a05a5ef32e9dd8a1c169dde" -dependencies = [ - "base64 0.22.1", - "js-sys", - "pem", - "ring", - "serde", - "serde_json", - "simple_asn1", -] - -[[package]] -name = "k256" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6e3919bbaa2945715f0bb6d3934a173d1e9a59ac23767fbaaef277265a7411b" -dependencies = [ - "cfg-if", - "ecdsa", - "elliptic-curve", - "once_cell", - "serdect", - "sha2 0.10.9", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures 0.2.17", -] - -[[package]] -name = "keccak-asm" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa468878266ad91431012b3e5ef1bf9b170eab22883503a318d46857afa4579a" -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 = "libc" -version = "0.2.180" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags", - "libc", -] - -[[package]] -name = "linux-raw-sys" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" - -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - -[[package]] -name = "lru" -version = "0.16.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" -dependencies = [ - "hashbrown 0.16.1", -] - -[[package]] -name = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "macro-string" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "memchr" -version = "2.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "native-tls" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" -dependencies = [ + "ipnet", "libc", - "log", - "openssl", - "openssl-probe 0.1.6", - "openssl-sys", - "schannel", - "security-framework 2.11.1", - "security-framework-sys", - "tempfile", -] - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", + "percent-encoding", + "pin-project-lite", + "socket2", + "system-configuration", + "tokio", + "tower-service", + "tracing", + "windows-registry", ] [[package]] -name = "nonzero_ext" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38bf9645c8b145698bb0b18a4637dcacbc421ea49bef2317e4fd8065a387cf21" - -[[package]] -name = "ntapi" -version = "0.4.3" +name = "iana-time-zone" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ - "winapi", + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", ] [[package]] -name = "nu-ansi-term" -version = "0.50.3" +name = "iana-time-zone-haiku" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" dependencies = [ - "windows-sys 0.61.2", + "cc", ] [[package]] -name = "num-bigint" -version = "0.4.6" +name = "icu_collections" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" dependencies = [ - "num-integer", - "num-traits", + "displaydoc", + "potential_utf", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "num-conv" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" - -[[package]] -name = "num-integer" -version = "0.1.46" +name = "icu_locale_core" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" dependencies = [ - "num-traits", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "num-rational" -version = "0.4.2" +name = "icu_normalizer" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" dependencies = [ - "num-bigint", - "num-integer", - "num-traits", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] -name = "num-traits" -version = "0.2.19" +name = "icu_normalizer_data" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" [[package]] -name = "num_cpus" -version = "1.17.0" +name = "icu_properties" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" dependencies = [ - "hermit-abi", - "libc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", ] [[package]] -name = "num_enum" -version = "0.7.6" +name = "icu_properties_data" +version = "2.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d0bca838442ec211fa11de3a8b0e0e8f3a4522575b5c4c06ed722e005036f26" -dependencies = [ - "num_enum_derive", - "rustversion", -] +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" [[package]] -name = "num_enum_derive" -version = "0.7.6" +name = "icu_provider" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "680998035259dcfcafe653688bf2aa6d3e2dc05e98be6ab46afb089dc84f1df8" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", ] [[package]] -name = "nybbles" -version = "0.4.8" +name = "idna" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d49ff0c0d00d4a502b39df9af3a525e1efeb14b9dabb5bb83335284c1309210" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "alloy-rlp", - "cfg-if", - "proptest", - "ruint", - "serde", + "idna_adapter", "smallvec", + "utf8_iter", ] [[package]] -name = "objc2-core-foundation" -version = "0.3.2" +name = "idna_adapter" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" dependencies = [ - "bitflags", + "icu_normalizer", + "icu_properties", ] [[package]] -name = "objc2-io-kit" -version = "0.3.2" +name = "indexmap" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ - "libc", - "objc2-core-foundation", + "equivalent", + "hashbrown 0.16.1", ] [[package]] -name = "once_cell" -version = "1.21.3" +name = "ipnet" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" +checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" [[package]] -name = "once_cell_polyfill" -version = "1.70.2" +name = "iri-string" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" +checksum = "c91338f0783edbd6195decb37bae672fd3b165faffb89bf7b9e6942f8b1a731a" +dependencies = [ + "memchr", + "serde", +] [[package]] -name = "oorandom" -version = "11.1.5" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] -name = "opaque-debug" -version = "0.3.1" +name = "itoa" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" [[package]] -name = "openssl" -version = "0.10.75" +name = "jni" +version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" dependencies = [ - "bitflags", + "cesu8", "cfg-if", - "foreign-types", - "libc", - "once_cell", - "openssl-macros", - "openssl-sys", -] - -[[package]] -name = "openssl-macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "combine", + "jni-sys", + "log", + "thiserror 1.0.69", + "walkdir", + "windows-sys 0.45.0", ] [[package]] -name = "openssl-probe" -version = "0.1.6" +name = "jni-sys" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] -name = "openssl-probe" -version = "0.2.0" +name = "js-sys" +version = "0.3.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" +checksum = "464a3709c7f55f1f721e5389aa6ea4e3bc6aba669353300af094b29ffbdde1d8" +dependencies = [ + "once_cell", + "wasm-bindgen", +] [[package]] -name = "openssl-sys" -version = "0.9.111" +name = "json5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" +checksum = "96b0db21af676c1ce64250b5f40f3ce2cf27e4e47cb91ed91eb6fe9350b430c1" dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", + "pest", + "pest_derive", + "serde", ] [[package]] -name = "opentelemetry" -version = "0.31.0" +name = "jsonrpsee" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bcd6ae87133e903af7ef497404dda70c60d0ea14895fc8a5e6722754fc2a0" +checksum = "3f3f48dc3e6b8bd21e15436c1ddd0bc22a6a54e8ec46fedd6adf3425f396ec6a" dependencies = [ - "futures-core", - "futures-sink", - "js-sys", - "pin-project-lite", - "thiserror 2.0.17", + "jsonrpsee-core", + "jsonrpsee-http-client", + "jsonrpsee-proc-macros", + "jsonrpsee-server", + "jsonrpsee-types", + "tokio", "tracing", ] [[package]] -name = "opentelemetry-http" -version = "0.31.0" +name = "jsonrpsee-core" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a6d09a73194e6b66df7c8f1b680f156d916a1a942abf2de06823dd02b7855d" +checksum = "316c96719901f05d1137f19ba598b5fe9c9bc39f4335f67f6be8613921946480" dependencies = [ "async-trait", "bytes", + "futures-util", "http", - "opentelemetry", - "reqwest 0.12.28", + "http-body", + "http-body-util", + "jsonrpsee-types", + "parking_lot", + "pin-project", + "rand 0.9.2", + "rustc-hash", + "serde", + "serde_json", + "thiserror 2.0.17", + "tokio", + "tower", + "tracing", ] [[package]] -name = "opentelemetry-otlp" -version = "0.31.1" +name = "jsonrpsee-http-client" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f69cd6acbb9af919df949cd1ec9e5e7fdc2ef15d234b6b795aaa525cc02f71f" +checksum = "790bedefcec85321e007ff3af84b4e417540d5c87b3c9779b9e247d1bcc3dab8" dependencies = [ - "http", - "opentelemetry", - "opentelemetry-http", - "opentelemetry-proto", - "opentelemetry_sdk", - "prost", - "reqwest 0.12.28", + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", "thiserror 2.0.17", - "tracing", + "tokio", + "tower", + "url", ] [[package]] -name = "opentelemetry-proto" -version = "0.31.0" +name = "jsonrpsee-proc-macros" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7175df06de5eaee9909d4805a3d07e28bb752c34cab57fa9cff549da596b30f" +checksum = "2da3f8ab5ce1bb124b6d082e62dffe997578ceaf0aeb9f3174a214589dc00f07" dependencies = [ - "opentelemetry", - "opentelemetry_sdk", - "prost", - "tonic", - "tonic-prost", + "heck", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "opentelemetry_sdk" -version = "0.31.0" +name = "jsonrpsee-server" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e14ae4f5991976fd48df6d843de219ca6d31b01daaab2dad5af2badeded372bd" +checksum = "4c51b7c290bb68ce3af2d029648148403863b982f138484a73f02a9dd52dbd7f" dependencies = [ - "futures-channel", - "futures-executor", "futures-util", - "opentelemetry", - "percent-encoding", - "rand 0.9.2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "jsonrpsee-core", + "jsonrpsee-types", + "pin-project", + "route-recognizer", + "serde", + "serde_json", + "soketto", "thiserror 2.0.17", "tokio", "tokio-stream", + "tokio-util", + "tower", + "tracing", ] [[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "ordered-multimap" -version = "0.7.3" +name = "jsonrpsee-types" +version = "0.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" +checksum = "bc88ff4688e43cc3fa9883a8a95c6fa27aa2e76c96e610b737b6554d650d7fd5" dependencies = [ - "dlv-list", - "hashbrown 0.14.5", + "http", + "serde", + "serde_json", + "thiserror 2.0.17", ] [[package]] -name = "p256" -version = "0.13.2" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2 0.10.9", -] +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "parity-scale-codec" -version = "3.7.5" +name = "libc" +version = "0.2.180" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] +checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc" [[package]] -name = "parity-scale-codec-derive" -version = "3.7.5" +name = "libredox" +version = "0.1.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" +checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.114", + "bitflags", + "libc", ] [[package]] -name = "parking" -version = "2.2.1" +name = "linux-raw-sys" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] -name = "parking_lot" -version = "0.12.5" +name = "litemap" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] +checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" [[package]] -name = "parking_lot_core" -version = "0.9.12" +name = "lock_api" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-link 0.2.1", + "scopeguard", ] [[package]] -name = "paste" -version = "1.0.15" +name = "log" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "pathdiff" -version = "0.2.3" +name = "matchers" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" +checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" +dependencies = [ + "regex-automata", +] [[package]] -name = "pem" -version = "3.0.6" +name = "memchr" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d30c53c26bc5b31a98cd02d20f25a7c8567146caf63ed593a9d87b2775291be" -dependencies = [ - "base64 0.22.1", - "serde_core", -] +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] -name = "percent-encoding" -version = "2.3.2" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "pest" -version = "2.8.5" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" -dependencies = [ - "memchr", - "ucd-trie", -] +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "pest_derive" -version = "2.8.5" +name = "mio" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ - "pest", - "pest_generator", + "libc", + "wasi", + "windows-sys 0.61.2", ] [[package]] -name = "pest_generator" -version = "2.8.5" +name = "native-tls" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" +checksum = "87de3442987e9dbec73158d5c715e7ad9072fda936bb03d19d7fa10e00520f0e" dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn 2.0.114", + "libc", + "log", + "openssl", + "openssl-probe 0.1.6", + "openssl-sys", + "schannel", + "security-framework 2.11.1", + "security-framework-sys", + "tempfile", ] [[package]] -name = "pest_meta" -version = "2.8.5" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "pest", - "sha2 0.10.9", + "memchr", + "minimal-lexical", ] [[package]] -name = "pin-project" -version = "1.1.10" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "pin-project-internal", + "windows-sys 0.61.2", ] [[package]] -name = "pin-project-internal" -version = "1.1.10" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", + "autocfg", ] [[package]] -name = "pin-project-lite" -version = "0.2.16" +name = "once_cell" +version = "1.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] -name = "pin-utils" -version = "0.1.0" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] -name = "pkcs8" -version = "0.10.2" +name = "openssl" +version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" +checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "der", - "spki", + "bitflags", + "cfg-if", + "foreign-types", + "libc", + "once_cell", + "openssl-macros", + "openssl-sys", ] [[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plotters" -version = "0.3.7" +name = "openssl-macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" +checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "plotters-backend" -version = "0.3.7" +name = "openssl-probe" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" +checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] -name = "plotters-svg" -version = "0.3.7" +name = "openssl-probe" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -dependencies = [ - "plotters-backend", -] +checksum = "9f50d9b3dabb09ecd771ad0aa242ca6894994c130308ca3d7684634df8037391" [[package]] -name = "poly1305" -version = "0.8.0" +name = "openssl-sys" +version = "0.9.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +checksum = "82cab2d520aa75e3c58898289429321eb788c3106963d0dc886ec7a5f4adc321" dependencies = [ - "cpufeatures 0.2.17", - "opaque-debug", - "universal-hash", + "cc", + "libc", + "pkg-config", + "vcpkg", ] [[package]] -name = "portable-atomic" -version = "1.13.1" +name = "option-ext" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] -name = "potential_utf" -version = "0.1.4" +name = "ordered-multimap" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" +checksum = "49203cdcae0030493bad186b28da2fa25645fa276a51b6fec8010d281e02ef79" dependencies = [ - "zerovec", + "dlv-list", + "hashbrown 0.14.5", ] [[package]] -name = "powerfmt" -version = "0.2.0" +name = "parking_lot" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] [[package]] -name = "ppv-lite86" -version = "0.2.21" +name = "parking_lot_core" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ - "zerocopy", + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-link", ] [[package]] -name = "primeorder" -version = "0.13.6" +name = "pathdiff" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" [[package]] -name = "primitive-types" -version = "0.12.2" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "proc-macro-crate" -version = "3.4.0" +name = "pest" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "2c9eb05c21a464ea704b53158d358a31e6425db2f63a1a7312268b05fe2b75f7" dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "memchr", + "ucd-trie", ] [[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" +name = "pest_derive" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +checksum = "68f9dbced329c441fa79d80472764b1a2c7e57123553b8519b36663a2fb234ed" dependencies = [ - "proc-macro2", - "quote", + "pest", + "pest_generator", ] [[package]] -name = "proc-macro-error2" -version = "2.0.1" +name = "pest_generator" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "3bb96d5051a78f44f43c8f712d8e810adb0ebf923fc9ed2655a7f66f63ba8ee5" dependencies = [ - "proc-macro-error-attr2", + "pest", + "pest_meta", "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] -name = "proc-macro2" -version = "1.0.105" +name = "pest_meta" +version = "2.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" +checksum = "602113b5b5e8621770cfd490cfd90b9f84ab29bd2b0e49ad83eb6d186cef2365" dependencies = [ - "unicode-ident", + "pest", + "sha2", ] [[package]] -name = "prometheus-client" -version = "0.24.1" +name = "pin-project" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cca3d75b4566b9a29fe1ed623587fb058e826eb329a0be4b7c4da1ebb2d7a6ca" +checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" dependencies = [ - "dtoa", - "itoa", - "parking_lot", - "prometheus-client-derive-encode", + "pin-project-internal", ] [[package]] -name = "prometheus-client-derive-encode" -version = "0.5.0" +name = "pin-project-internal" +version = "1.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9adf1691c04c0a5ff46ff8f262b58beb07b0dbb61f96f9f54f6cbd82106ed87f" +checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] -name = "proptest" -version = "1.11.0" +name = "pin-project-lite" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b45fcc2344c680f5025fe57779faef368840d0bd1f42f216291f0dc4ace4744" -dependencies = [ - "bit-set", - "bit-vec", - "bitflags", - "num-traits", - "rand 0.9.2", - "rand_chacha 0.9.0", - "rand_xorshift", - "regex-syntax", - "rusty-fork", - "tempfile", - "unarray", -] +checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] -name = "prost" -version = "0.14.3" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" -dependencies = [ - "bytes", - "prost-derive", -] +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "prost-derive" -version = "0.14.3" +name = "pkg-config" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.114", -] +checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] -name = "quanta" -version = "0.12.6" +name = "potential_utf" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3ab5a9d756f0d97bdc89019bd2e4ea098cf9cde50ee7564dde6b81ccc8f06c7" +checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" dependencies = [ - "crossbeam-utils", - "libc", - "once_cell", - "raw-cpuid", - "wasi", - "web-sys", - "winapi", + "zerovec", ] [[package]] -name = "quick-error" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" - -[[package]] -name = "quinn" -version = "0.11.9" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash", - "rustls", - "socket2", - "thiserror 2.0.17", - "tokio", - "tracing", - "web-time", + "zerocopy", ] [[package]] -name = "quinn-proto" -version = "0.11.14" +name = "proc-macro-crate" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "aws-lc-rs", - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.2", - "ring", - "rustc-hash", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.17", - "tinyvec", - "tracing", - "web-time", + "toml_edit 0.23.10+spec-1.0.0", ] [[package]] -name = "quinn-udp" -version = "0.5.14" +name = "proc-macro2" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "535d180e0ecab6268a3e718bb9fd44db66bbbc256257165fc699dadf70d16fe7" dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", + "unicode-ident", ] [[package]] @@ -4358,12 +1466,6 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - [[package]] name = "rand" version = "0.8.5" @@ -4373,7 +1475,6 @@ dependencies = [ "libc", "rand_chacha 0.3.1", "rand_core 0.6.4", - "serde", ] [[package]] @@ -4384,7 +1485,6 @@ checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.5", - "serde", ] [[package]] @@ -4423,72 +1523,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" dependencies = [ "getrandom 0.3.4", - "serde", -] - -[[package]] -name = "rand_distr" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32cb0b9bc82b0a0876c2dd994a7e7a2683d3e7390ca40e6886785ef0c7e3ee31" -dependencies = [ - "num-traits", - "rand 0.8.5", -] - -[[package]] -name = "rand_xorshift" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "513962919efc330f829edb2535844d1b912b0fbe2ca165d613e4e8788bb05a5a" -dependencies = [ - "rand_core 0.9.5", -] - -[[package]] -name = "rapidhash" -version = "4.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" -dependencies = [ - "rustversion", -] - -[[package]] -name = "raw-cpuid" -version = "11.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" -dependencies = [ - "bitflags", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", ] -[[package]] -name = "recvmsg" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3edd4d5d42c92f0a659926464d4cce56b562761267ecf0f469d85b7de384175" - [[package]] name = "redox_syscall" version = "0.5.18" @@ -4509,38 +1545,6 @@ dependencies = [ "thiserror 2.0.17", ] -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - [[package]] name = "regex-automata" version = "0.4.13" @@ -4567,9 +1571,7 @@ dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", - "futures-channel", "futures-core", - "futures-util", "h2", "http", "http-body", @@ -4600,53 +1602,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "reqwest" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f43e3283ab1488b624b44b0e988d0acea0b3214e694730a055cb6b2efa801" -dependencies = [ - "base64 0.22.1", - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-rustls", - "hyper-util", - "js-sys", - "log", - "percent-encoding", - "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", - "rustls-platform-verifier 0.6.2", - "serde", - "serde_json", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tower", - "tower-http", - "tower-service", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", -] - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac", - "subtle", -] - [[package]] name = "ring" version = "0.17.14" @@ -4657,20 +1612,10 @@ dependencies = [ "cfg-if", "getrandom 0.2.17", "libc", - "untrusted 0.9.0", + "untrusted", "windows-sys 0.52.0", ] -[[package]] -name = "rlp" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" -dependencies = [ - "bytes", - "rustc-hex", -] - [[package]] name = "ron" version = "0.8.1" @@ -4678,50 +1623,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" dependencies = [ "base64 0.21.7", - "bitflags", - "serde", - "serde_derive", -] - -[[package]] -name = "route-recognizer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" - -[[package]] -name = "ruint" -version = "1.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c141e807189ad38a07276942c6623032d3753c8859c146104ac2e4d68865945a" -dependencies = [ - "alloy-rlp", - "ark-ff 0.3.0", - "ark-ff 0.4.2", - "ark-ff 0.5.0", - "bytes", - "fastrlp 0.3.1", - "fastrlp 0.4.0", - "num-bigint", - "num-integer", - "num-traits", - "parity-scale-codec", - "primitive-types", - "proptest", - "rand 0.8.5", - "rand 0.9.2", - "rlp", - "ruint-macro", - "serde_core", - "valuable", - "zeroize", + "bitflags", + "serde", + "serde_derive", ] [[package]] -name = "ruint-macro" -version = "1.2.1" +name = "route-recognizer" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48fd7bd8a6377e15ad9d42a8ec25371b94ddc67abe7c8b9127bec79bebaaae18" +checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" [[package]] name = "rust-ini" @@ -4739,30 +1650,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0dfe2087c51c460008730de8b57e6a320782fbfb312e1f4d520e6c6fae155ee" -dependencies = [ - "semver 0.11.0", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver 1.0.28", -] - [[package]] name = "rustix" version = "1.1.3" @@ -4782,7 +1669,6 @@ version = "0.23.36" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" dependencies = [ - "aws-lc-rs", "log", "once_cell", "ring", @@ -4810,7 +1696,6 @@ version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e6f2ab2928ca4291b86736a8bd920a277a399bba1589409d72154ff87c1282" dependencies = [ - "web-time", "zeroize", ] @@ -4835,27 +1720,6 @@ dependencies = [ "windows-sys 0.59.0", ] -[[package]] -name = "rustls-platform-verifier" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d99feebc72bae7ab76ba994bb5e121b8d83d910ca40b36e0921f53becc41784" -dependencies = [ - "core-foundation 0.10.1", - "core-foundation-sys", - "jni", - "log", - "once_cell", - "rustls", - "rustls-native-certs", - "rustls-platform-verifier-android", - "rustls-webpki", - "security-framework 3.5.1", - "security-framework-sys", - "webpki-root-certs 1.0.5", - "windows-sys 0.61.2", -] - [[package]] name = "rustls-platform-verifier-android" version = "0.1.1" @@ -4868,10 +1732,9 @@ version = "0.103.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2ffdfa2f5286e2247234e03f680868ac2815974dc39e00ea15adc445d0aafe52" dependencies = [ - "aws-lc-rs", "ring", "rustls-pki-types", - "untrusted 0.9.0", + "untrusted", ] [[package]] @@ -4880,18 +1743,6 @@ version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" -[[package]] -name = "rusty-fork" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" -dependencies = [ - "fnv", - "quick-error", - "tempfile", - "wait-timeout", -] - [[package]] name = "ryu" version = "1.0.22" @@ -4916,72 +1767,12 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - [[package]] name = "scopeguard" version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" -[[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", - "serdect", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" -dependencies = [ - "bitcoin_hashes", - "rand 0.8.5", - "secp256k1-sys", - "serde", -] - -[[package]] -name = "secp256k1-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" -dependencies = [ - "cc", -] - [[package]] name = "security-framework" version = "2.11.1" @@ -5018,30 +1809,6 @@ dependencies = [ "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.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "semver-parser" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" -dependencies = [ - "pest", -] - [[package]] name = "serde" version = "1.0.228" @@ -5058,7 +1825,7 @@ version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5" dependencies = [ - "half 1.8.3", + "half", "serde", ] @@ -5079,7 +1846,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -5095,17 +1862,6 @@ dependencies = [ "zmij", ] -[[package]] -name = "serde_path_to_error" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" -dependencies = [ - "itoa", - "serde", - "serde_core", -] - [[package]] name = "serde_spanned" version = "0.6.9" @@ -5115,15 +1871,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_spanned" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" -dependencies = [ - "serde_core", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -5136,47 +1883,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5414fad8e6907dbdd5bc441a50ae8d6e26151a03b1de04d89a5576de61d01f" -dependencies = [ - "base64 0.22.1", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3db8978e608f1fe7357e211969fd9abdcae80bac1ba7a3369bb7eb6b404eb65" -dependencies = [ - "darling 0.23.0", - "proc-macro2", - "quote", - "syn 2.0.114", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - [[package]] name = "sha1" version = "0.10.6" @@ -5184,21 +1890,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "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 0.2.17", - "digest 0.9.0", - "opaque-debug", + "cpufeatures", + "digest", ] [[package]] @@ -5208,28 +1901,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", - "digest 0.10.7", -] - -[[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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59cbb88c189d6352cc8ae96a39d19c7ecad8f7330b29461187f2587fdc2988d5" -dependencies = [ - "cc", - "cfg-if", + "cpufeatures", + "digest", ] [[package]] @@ -5266,28 +1939,6 @@ dependencies = [ "libc", ] -[[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 = "simple_asn1" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d585997b0ac10be3c5ee635f1bab02d512760d14b7c468801ac8a01d9ae5f1d" -dependencies = [ - "num-bigint", - "num-traits", - "thiserror 2.0.17", - "time", -] - [[package]] name = "slab" version = "0.4.11" @@ -5299,9 +1950,6 @@ name = "smallvec" version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" -dependencies = [ - "serde", -] [[package]] name = "socket2" @@ -5329,82 +1977,24 @@ dependencies = [ "sha1", ] -[[package]] -name = "spin" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" - -[[package]] -name = "spinning_top" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96d2d1d716fb500937168cc09353ffdc7a012be8475ac7308e1bdf0e3923300" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - [[package]] name = "stable_deref_trait" version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" -[[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.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "subtle" version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - [[package]] name = "summit-checkpointer" version = "0.1.0" @@ -5413,29 +2003,18 @@ dependencies = [ "bytes", "chrono", "clap", - "commonware-codec", - "commonware-consensus", - "commonware-cryptography", - "commonware-math", - "commonware-p2p", - "commonware-parallel", - "commonware-resolver", - "commonware-runtime", - "commonware-utils", "config", - "ethereum_ssz", "futures-util", "http", "http-body", "http-body-util", "hyper", "jsonrpsee", - "reqwest 0.12.28", + "reqwest", "serde", "serde_cbor", "serde_json", "shellexpand", - "summit-types", "thiserror 1.0.69", "tokio", "tokio-util", @@ -5444,50 +2023,6 @@ dependencies = [ "tracing-subscriber", ] -[[package]] -name = "summit-types" -version = "0.0.0" -source = "git+https://github.com/SeismicSystems/summit.git?rev=bd13c7e80176fd9efaad6e92e80b67a7cd54423e#bd13c7e80176fd9efaad6e92e80b67a7cd54423e" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-primitives", - "alloy-provider", - "alloy-rpc-types-engine", - "alloy-transport-ipc", - "anyhow", - "bytes", - "commonware-codec", - "commonware-consensus", - "commonware-cryptography", - "commonware-math", - "commonware-p2p", - "commonware-parallel", - "commonware-resolver", - "commonware-runtime", - "commonware-utils", - "dirs", - "ethereum_hashing", - "ethereum_ssz", - "futures", - "rand 0.8.5", - "serde", - "tokio", - "toml 0.9.11+spec-1.1.0", - "tracing", -] - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - [[package]] name = "syn" version = "2.0.114" @@ -5499,18 +2034,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "syn-solidity" -version = "1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53f425ae0b12e2f5ae65542e00898d500d4d318b4baf09f40fd0d410454e9947" -dependencies = [ - "paste", - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "sync_wrapper" version = "1.0.2" @@ -5528,21 +2051,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", -] - -[[package]] -name = "sysinfo" -version = "0.37.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16607d5caffd1c07ce073528f9ed972d88db15dd44023fa57142963be3feb11f" -dependencies = [ - "libc", - "memchr", - "ntapi", - "objc2-core-foundation", - "objc2-io-kit", - "windows", + "syn", ] [[package]] @@ -5566,12 +2075,6 @@ dependencies = [ "libc", ] -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - [[package]] name = "tempfile" version = "3.24.0" @@ -5611,7 +2114,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -5622,7 +2125,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -5634,46 +2137,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "threadpool" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d050e60b33d41c19108b32cea32164033a9013fe3b46cbd4457559bfbf77afaa" -dependencies = [ - "num_cpus", -] - -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -5693,31 +2156,6 @@ dependencies = [ "zerovec", ] -[[package]] -name = "tinytemplate" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" -dependencies = [ - "serde", - "serde_json", -] - -[[package]] -name = "tinyvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - [[package]] name = "tokio" version = "1.49.0" @@ -5743,7 +2181,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -5800,26 +2238,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" dependencies = [ "serde", - "serde_spanned 0.6.9", + "serde_spanned", "toml_datetime 0.6.11", "toml_edit 0.22.27", ] -[[package]] -name = "toml" -version = "0.9.11+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46" -dependencies = [ - "indexmap 2.13.0", - "serde_core", - "serde_spanned 1.1.1", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow", -] - [[package]] name = "toml_datetime" version = "0.6.11" @@ -5844,9 +2267,9 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.13.0", + "indexmap", "serde", - "serde_spanned 0.6.9", + "serde_spanned", "toml_datetime 0.6.11", "toml_write", "winnow", @@ -5858,7 +2281,7 @@ version = "0.23.10+spec-1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" dependencies = [ - "indexmap 2.13.0", + "indexmap", "toml_datetime 0.7.5+spec-1.1.0", "toml_parser", "winnow", @@ -5879,44 +2302,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" -[[package]] -name = "toml_writer" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "756daf9b1013ebe47a8776667b466417e2d4c5679d441c26230efd9ef78692db" - -[[package]] -name = "tonic" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" -dependencies = [ - "async-trait", - "base64 0.22.1", - "bytes", - "http", - "http-body", - "http-body-util", - "percent-encoding", - "pin-project", - "sync_wrapper", - "tokio-stream", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-prost" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" -dependencies = [ - "bytes", - "prost", - "tonic", -] - [[package]] name = "tower" version = "0.5.3" @@ -5930,7 +2315,6 @@ dependencies = [ "tokio", "tower-layer", "tower-service", - "tracing", ] [[package]] @@ -5969,7 +2353,6 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -5983,7 +2366,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -6007,22 +2390,6 @@ dependencies = [ "tracing-core", ] -[[package]] -name = "tracing-opentelemetry" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ac28f2d093c6c477eaa76b23525478f38de514fa9aeb1285738d4b97a9552fc" -dependencies = [ - "js-sys", - "opentelemetry", - "smallvec", - "tracing", - "tracing-core", - "tracing-log", - "tracing-subscriber", - "web-time", -] - [[package]] name = "tracing-serde" version = "0.2.0" @@ -6072,24 +2439,6 @@ 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", -] - -[[package]] -name = "unarray" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" - [[package]] name = "unicode-ident" version = "1.0.22" @@ -6102,28 +2451,6 @@ version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" -[[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 = "untrusted" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" - [[package]] name = "untrusted" version = "0.9.0" @@ -6140,7 +2467,6 @@ dependencies = [ "idna", "percent-encoding", "serde", - "serde_derive", ] [[package]] @@ -6173,15 +2499,6 @@ version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "wait-timeout" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" -dependencies = [ - "libc", -] - [[package]] name = "walkdir" version = "2.5.0" @@ -6261,7 +2578,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.114", + "syn", "wasm-bindgen-shared", ] @@ -6274,20 +2591,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wasmtimer" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c598d6b99ea013e35844697fc4670d08339d5cda15588f193c6beedd12f644b" -dependencies = [ - "futures", - "js-sys", - "parking_lot", - "pin-utils", - "slab", - "wasm-bindgen", -] - [[package]] name = "web-sys" version = "0.3.83" @@ -6298,16 +2601,6 @@ dependencies = [ "wasm-bindgen", ] -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-root-certs" version = "0.26.11" @@ -6326,28 +2619,6 @@ dependencies = [ "rustls-pki-types", ] -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - [[package]] name = "winapi-util" version = "0.1.11" @@ -6357,47 +2628,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - [[package]] name = "windows-core" version = "0.62.2" @@ -6406,20 +2636,9 @@ checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -6430,7 +2649,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -6441,49 +2660,24 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - [[package]] name = "windows-registry" version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "02752bf7fbdcce7f2a27a742f798510f3e5ad88dbe84871e5168e2120c3d5720" dependencies = [ - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", + "windows-link", + "windows-result", + "windows-strings", ] [[package]] @@ -6492,16 +2686,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", + "windows-link", ] [[package]] @@ -6510,7 +2695,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -6555,7 +2740,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -6595,7 +2780,7 @@ version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.2.1", + "windows-link", "windows_aarch64_gnullvm 0.53.1", "windows_aarch64_msvc 0.53.1", "windows_i686_gnu 0.53.1", @@ -6606,15 +2791,6 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] -[[package]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", -] - [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -6774,27 +2950,6 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core 0.6.4", - "serde", - "zeroize", -] - [[package]] name = "yaml-rust2" version = "0.8.1" @@ -6825,7 +2980,7 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", "synstructure", ] @@ -6846,7 +3001,7 @@ checksum = "2c7962b26b0a8685668b671ee4b54d007a67d4eaf05fda79ac0ecf41e32270f1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -6866,7 +3021,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", "synstructure", ] @@ -6875,20 +3030,6 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] [[package]] name = "zerotrie" @@ -6920,7 +3061,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.114", + "syn", ] [[package]] @@ -6928,31 +3069,3 @@ name = "zmij" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd8f3f50b848df28f887acb68e41201b5aea6bc8a8dacc00fb40635ff9a72fea" - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/Cargo.toml b/Cargo.toml index dc014a9..bee98fb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,27 +4,12 @@ version = "0.1.0" edition = "2021" [dependencies] -summit-types = {git = "https://github.com/SeismicSystems/summit.git", rev = "bd13c7e80176fd9efaad6e92e80b67a7cd54423e"} - -# summit-types at rev bd13c7e was written against commonware-* 2026.2.0. Cargo otherwise -# resolves these to 2026.3.0 (trait API incompatible), so pin them explicitly. -commonware-consensus = "=2026.2.0" -commonware-cryptography = "=2026.2.0" -commonware-codec = "=2026.2.0" -commonware-math = "=2026.2.0" -commonware-utils = "=2026.2.0" -commonware-resolver = "=2026.2.0" -commonware-p2p = "=2026.2.0" -commonware-runtime = "=2026.2.0" -commonware-parallel = "=2026.2.0" # Async runtime tokio = { version = "1.42", features = ["full"] } # HTTP client for RPC reqwest = { version = "0.12", features = ["json"] } -ethereum_ssz = "0.9.0" - # JSON-RPC client jsonrpsee = { version = "0.26.0", features = ["http-client", "client-core", "server", "macros"] } diff --git a/config.example.toml b/config.example.toml index 7066bba..1e96652 100644 --- a/config.example.toml +++ b/config.example.toml @@ -21,23 +21,26 @@ db_path = "/var/lib/reth/db" # Checkpointing Configuration # ============================================================================ [checkpoint] -# Number of blocks per epoch (checkpoint created at each epoch boundary) -# Example: 1000 means checkpoints at blocks 1000, 2000, 3000, etc. -# For testing, you can use a smaller value like 10 or 100 +# Fixed checkpoint interval used only when [summit].enabled = false. +# When Summit integration is enabled, the checkpointer discovers completed +# checkpoint epochs and their exact historical height bounds through Summit RPC, +# so on-chain epoch-length changes are handled automatically. epoch_blocks = 1000 -# Number of blocks to wait after epoch boundary before creating checkpoint -# This gives reth time to flush all data to disk -# Example: If epoch_blocks=1000 and checkpoint_delay_blocks=3, -# the checkpoint will be created when we reach block 1003 (for epoch at block 1000) -# Recommended: 2-5 blocks depending on your setup +# Number of blocks to wait after the epoch boundary before creating a checkpoint. +# This gives Reth time to flush data. With Summit enabled, the exact boundary is +# obtained from getEpochBounds rather than calculated from epoch_blocks. +# Recommended: 2-5 blocks depending on your setup. checkpoint_delay_blocks = 3 -# Directory where checkpoints will be saved -# Each checkpoint creates a subdirectory like: epoch_5_block_1000/ -# Make sure this location has enough disk space (each checkpoint can be large) +# Directory where checkpoints will be saved. +# Each checkpoint creates epoch_N/epoch_N.tar.gz with metadata.json alongside it. +# Make sure this location has enough disk space (each checkpoint can be large). output_dir = "/var/lib/reth/checkpoints" +# Maximum number of snapshots to retain. Optional; when set, must be at least 1. +# max_snapshots = 50 + # Use compact mode when copying the MDBX database # This reduces the checkpoint size by compacting the database during copy # Recommended: true (unless you need to preserve exact database layout) @@ -65,6 +68,10 @@ enabled = true # This is used to fetch checkpoint data for each epoch rpc_url = "http://localhost:5052" +# Maximum duration for an individual Summit RPC request. +# This is separate from monitor.retry_interval_secs, which controls retry backoff. +rpc_timeout_secs = 100 + # ============================================================================ # Monitoring Configuration # ============================================================================ diff --git a/config.toml b/config.toml index 7b5c2bf..99b9f19 100644 --- a/config.toml +++ b/config.toml @@ -10,11 +10,11 @@ db_path = "/var/lib/reth/db" # Checkpointing Configuration [checkpoint] -# Number of blocks per epoch (checkpoint created at each epoch boundary) +# Fixed checkpoint interval used only when Summit integration is disabled. +# Summit-enabled mode discovers exact epoch bounds through Summit RPC. epoch_blocks = 1000 -# Number of blocks to wait after epoch boundary before creating checkpoint -# This gives reth time to flush all data to disk +# Number of blocks to wait after the exact epoch boundary before checkpointing. checkpoint_delay_blocks = 3 # Directory where checkpoints will be saved @@ -26,8 +26,8 @@ compact = true # Path to mdbx_copy binary (can be absolute path or just "mdbx_copy" if in PATH) mdbx_copy_path = "mdbx_copy" -# Maximum amount of snapshots we will hold in output_dir. Optional -#max_snapshots = 50 +# Maximum number of snapshots to retain. Optional; when set, must be at least 1. +# max_snapshots = 50 # Path to reth binary (can be absolute path or just "reth" if in PATH) reth_path = "reth" @@ -40,6 +40,9 @@ enabled = false # Summit RPC endpoint rpc_url = "http://localhost:5052" +# Maximum duration for an individual Summit RPC request. +rpc_timeout_secs = 100 + # Monitoring Configuration [monitor] # How often to check block number (in seconds) diff --git a/src/checkpoint/executor.rs b/src/checkpoint/executor.rs index 91eb57c..b780a03 100644 --- a/src/checkpoint/executor.rs +++ b/src/checkpoint/executor.rs @@ -229,9 +229,9 @@ impl CheckpointExecutor { tracing::info!("Compressing checkpoint to {:?}", archive_name); - // Build tar command to compress db, static_files, and summit_checkpoint + // Build tar command to compress the execution snapshot and metadata. let mut cmd = Command::new("tar"); - cmd.arg("-czf").arg(&archive_name).arg("db").arg("static_files"); + cmd.arg("-czf").arg(&archive_name).arg("db").arg("static_files").arg("metadata.json"); // Only include summit_checkpoint if it exists let summit_checkpoint_dir = checkpoint_dir.join("summit_checkpoint"); diff --git a/src/checkpoint/manager.rs b/src/checkpoint/manager.rs index c92ab71..050ff85 100644 --- a/src/checkpoint/manager.rs +++ b/src/checkpoint/manager.rs @@ -1,14 +1,20 @@ -use std::{path::PathBuf, sync::Arc}; +use std::{ + path::{Path, PathBuf}, + sync::Arc, +}; use crate::{ checkpoint::{CheckpointExecutor, CheckpointMetadata}, config::{CheckpointConfig, Config}, - error::Result, - rpc::RpcClient, + error::{CheckpointerError, Result}, + rpc::{RpcClient, SummitRpcClient}, + schedule::{fixed_interval_schedule, summit_checkpoint_schedule}, state::StateTracker, }; -/// Checkpoint manager orchestrates checkpoint creation +const FINALIZED_HEADER_CACHE_DIR: &str = ".summit-finalized-headers"; + +/// Checkpoint manager orchestrates checkpoint creation. pub struct CheckpointManager { config: CheckpointConfig, db_path: PathBuf, @@ -18,7 +24,7 @@ pub struct CheckpointManager { } impl CheckpointManager { - /// Create a new checkpoint manager + /// Create a new checkpoint manager. pub fn new(config: &Config, state_tracker: Arc, rpc_client: RpcClient) -> Self { let executor = CheckpointExecutor::new( config.checkpoint.mdbx_copy_path.clone(), @@ -35,143 +41,305 @@ impl CheckpointManager { } } - /// Create a checkpoint for the given epoch. - /// - /// `block_number` is the height of the last block included in the finalized epoch - /// (i.e. `summit_types::Block::from_ssz_bytes(checkpoint.last_block)?.header.height`). - /// The reth db copy is unwound to `block_number - 1`, matching summit's finalized tip. - pub async fn create_checkpoint(&self, epoch: u64, block_number: u64) -> Result<()> { - let start = std::time::Instant::now(); + /// Create a checkpoint for the given epoch, unwound to `checkpoint_block`. + pub async fn create_checkpoint(&self, epoch: u64, checkpoint_block: u64) -> Result<()> { + self.create_checkpoint_with_expected_digest(epoch, checkpoint_block, None).await + } - // Generate checkpoint directory name + pub(crate) async fn create_checkpoint_with_expected_digest( + &self, + epoch: u64, + checkpoint_block: u64, + expected_checkpoint_digest: Option<[u8; 32]>, + ) -> Result<()> { + let start = std::time::Instant::now(); let checkpoint_name = format!("epoch_{}", epoch); - let checkpoint_path = self.config.output_dir.join(&checkpoint_name); + let final_path = self.config.output_dir.join(&checkpoint_name); + let working_path = self.config.output_dir.join(format!(".{checkpoint_name}.partial")); + + if final_path.exists() { + if self.checkpoint_exists(epoch) { + tracing::info!( + epoch, + path = ?final_path, + "Checkpoint archive already exists; syncing state tracker" + ); + self.state_tracker.update_last_checkpoint(epoch, checkpoint_block).await?; + return Ok(()); + } + + tracing::warn!( + epoch, + path = ?final_path, + "Removing checkpoint output without a non-empty archive" + ); + if final_path.is_dir() { + tokio::fs::remove_dir_all(&final_path).await?; + } else { + tokio::fs::remove_file(&final_path).await?; + } + } + if working_path.exists() { + tracing::warn!(path = ?working_path, "Removing incomplete checkpoint attempt"); + tokio::fs::remove_dir_all(&working_path).await?; + } + + tracing::info!(checkpoint_name, epoch, checkpoint_block, "Starting checkpoint"); + let result = self + .create_checkpoint_at( + &working_path, + epoch, + checkpoint_block, + expected_checkpoint_digest, + ) + .await; + if let Err(error) = result { + if let Err(cleanup_error) = tokio::fs::remove_dir_all(&working_path).await { + tracing::warn!( + path = ?working_path, + %cleanup_error, + "Failed to remove incomplete checkpoint attempt" + ); + } + return Err(error); + } + + tokio::fs::rename(&working_path, &final_path).await?; + self.state_tracker.update_last_checkpoint(epoch, checkpoint_block).await?; + + // Cleanup old snapshots if retention limit is set + if let Err(e) = self.cleanup_old_snapshots().await { + tracing::warn!("Failed to cleanup old snapshots: {}", e); + } tracing::info!( - "Starting checkpoint: {} (epoch={}, block={})", checkpoint_name, - epoch, - block_number + duration = ?start.elapsed(), + output = ?final_path, + "Checkpoint completed successfully" ); + Ok(()) + } - // Create checkpoint directory - tokio::fs::create_dir_all(&checkpoint_path).await?; - tracing::debug!("Created checkpoint directory: {:?}", checkpoint_path); + async fn create_checkpoint_at( + &self, + checkpoint_path: &Path, + epoch: u64, + checkpoint_block: u64, + expected_checkpoint_digest: Option<[u8; 32]>, + ) -> Result<()> { + tokio::fs::create_dir_all(checkpoint_path).await?; + tracing::debug!(path = ?checkpoint_path, "Created checkpoint working directory"); - // Step 1: Copy MDBX database tracing::info!("Step 1/7: Copying MDBX database"); let db_dest = checkpoint_path.join("db").join("mdbx.dat"); self.executor.copy_mdbx_database(&self.db_path, &db_dest).await?; - // Step 2: Copy static_files directory tracing::info!("Step 2/7: Copying static_files"); let source_db_dir = self.db_path.parent().ok_or_else(|| { - crate::error::CheckpointerError::InvalidPath( + CheckpointerError::InvalidPath( "Could not determine parent directory of db_path".to_string(), ) })?; - self.executor.copy_static_files(source_db_dir, &checkpoint_path).await?; + self.executor.copy_static_files(source_db_dir, checkpoint_path).await?; - // Step 3: Delete lock file tracing::info!("Step 3/7: Deleting lock file"); - self.executor.delete_lock_file(&checkpoint_path).await?; + self.executor.delete_lock_file(checkpoint_path).await?; - // Step 4: Unwind database to one block before the summit-finalized tip of this epoch. - let unwind_target = block_number.saturating_sub(1); - tracing::info!("Step 4/7: Unwinding database to block {}", unwind_target); - self.executor.unwind_database(&checkpoint_path, unwind_target).await?; + tracing::info!(checkpoint_block, "Step 4/7: Unwinding copied database"); + self.executor.unwind_database(checkpoint_path, checkpoint_block).await?; - // Step 5: Fetch and write Summit checkpoint data - tracing::info!("Step 5/7: Fetching Summit checkpoint data"); + tracing::info!("Step 5/7: Fetching Summit checkpoint and verification headers"); if let Some(summit_client) = &self.rpc_client.summit { - // The `epoch` parameter is now the summit-authoritative epoch number (passed in - // from the monitor / ensure_latest_checkpoint, which read it from - // summit.getLatestEpoch). Fetch checkpoint data for that exact epoch. - let summit_epoch = epoch; - - tracing::debug!("Fetching Summit checkpoint data for epoch {}", summit_epoch); - - match summit_client.get_checkpoint(summit_epoch).await { - Ok(checkpoint_data) => { - tracing::info!( - "Received Summit checkpoint for epoch {}: digest={:?}, {} checkpoint bytes, {} last_block bytes, {} finalized_header bytes", - checkpoint_data.epoch, - &checkpoint_data.digest[..8], - checkpoint_data.checkpoint.len(), - checkpoint_data.last_block.len(), - checkpoint_data.finalized_header.len() - ); - - // Create summit_checkpoint directory - let summit_dir = checkpoint_path.join("summit_checkpoint"); - tokio::fs::create_dir_all(&summit_dir).await?; - tracing::debug!("Created summit_checkpoint directory: {:?}", summit_dir); - - // Write checkpoint bytes - let checkpoint_file = summit_dir.join("checkpoint"); - tokio::fs::write(&checkpoint_file, &checkpoint_data.checkpoint).await?; - tracing::debug!( - "Wrote {} bytes to checkpoint file", - checkpoint_data.checkpoint.len() - ); - - // Write last_block bytes - let last_block_file = summit_dir.join("last_block"); - tokio::fs::write(&last_block_file, &checkpoint_data.last_block).await?; - tracing::debug!( - "Wrote {} bytes to last_block file", - checkpoint_data.last_block.len() - ); - - // Write finalized_header bytes - let finalized_header_file = summit_dir.join("finalized_header"); - tokio::fs::write(&finalized_header_file, &checkpoint_data.finalized_header) - .await?; - tracing::debug!( - "Wrote {} bytes to finalized_header file", - checkpoint_data.finalized_header.len() - ); - - tracing::info!("Summit checkpoint data written successfully"); - } - Err(e) => { - tracing::warn!("Failed to fetch Summit checkpoint data: {}", e); - tracing::warn!("Continuing without Summit checkpoint data"); - } - } + self.write_summit_checkpoint( + summit_client, + checkpoint_path, + epoch, + expected_checkpoint_digest, + ) + .await?; } else { tracing::debug!("Summit integration disabled, skipping Summit checkpoint data"); } - // Step 6: Write metadata tracing::info!("Step 6/7: Writing metadata"); - let metadata = CheckpointMetadata::new(epoch, block_number); + let metadata = CheckpointMetadata::new(epoch, checkpoint_block); let metadata_path = checkpoint_path.join("metadata.json"); let metadata_json = serde_json::to_string_pretty(&metadata)?; tokio::fs::write(metadata_path, metadata_json).await?; - // Step 7: Compress and cleanup tracing::info!("Step 7/7: Compressing checkpoint and cleaning up"); - self.executor.compress_and_cleanup(&checkpoint_path, epoch).await?; + self.executor.compress_and_cleanup(checkpoint_path, epoch).await + } + + async fn write_summit_checkpoint( + &self, + summit_client: &SummitRpcClient, + checkpoint_path: &Path, + epoch: u64, + expected_checkpoint_digest: Option<[u8; 32]>, + ) -> Result<()> { + let checkpoint_data = summit_client.get_checkpoint(epoch).await?; + validate_checkpoint_digest(epoch, expected_checkpoint_digest, checkpoint_data.digest)?; + if checkpoint_data.checkpoint.is_empty() + || checkpoint_data.last_block.is_empty() + || checkpoint_data.finalized_header.is_empty() + { + return Err(CheckpointerError::CheckpointExecution(format!( + "Summit returned incomplete checkpoint artifacts for epoch {}", + epoch + ))); + } - // Update state tracker - self.state_tracker.update_last_checkpoint(epoch, block_number).await?; + tracing::info!( + epoch, + digest = ?checkpoint_data.digest, + checkpoint_bytes = checkpoint_data.checkpoint.len(), + last_block_bytes = checkpoint_data.last_block.len(), + finalized_header_bytes = checkpoint_data.finalized_header.len(), + "Received Summit checkpoint" + ); - // Cleanup old snapshots if retention limit is set - if let Err(e) = self.cleanup_old_snapshots().await { - tracing::warn!("Failed to cleanup old snapshots: {}", e); + let cache_dir = self.config.output_dir.join(FINALIZED_HEADER_CACHE_DIR); + let genesis_header = self.prepare_finalized_header_cache(summit_client, &cache_dir).await?; + + let summit_dir = checkpoint_path.join("summit_checkpoint"); + let finalized_headers_dir = summit_dir.join("finalized_headers"); + tokio::fs::create_dir_all(&finalized_headers_dir).await?; + + let mut fetched_headers = 1_usize; + let mut reused_headers = 0_usize; + + for header_epoch in 0..=epoch { + let finalized_header = if header_epoch == 0 { + genesis_header.clone() + } else if header_epoch == epoch { + let response = summit_client.get_finalized_header(header_epoch).await?; + fetched_headers += 1; + response.finalized_header + } else { + let (finalized_header, cache_hit) = self + .get_or_fetch_finalized_header(summit_client, &cache_dir, header_epoch) + .await?; + if cache_hit { + reused_headers += 1; + } else { + fetched_headers += 1; + } + finalized_header + }; + + if header_epoch == epoch { + if finalized_header != checkpoint_data.finalized_header { + return Err(CheckpointerError::CheckpointExecution(format!( + "Finalized header chain terminal for epoch {} does not match getCheckpoint", + epoch + ))); + } + if header_epoch != 0 { + self.write_cached_finalized_header(&cache_dir, header_epoch, &finalized_header) + .await?; + } + } + + tokio::fs::write( + finalized_headers_dir.join(header_epoch.to_string()), + finalized_header, + ) + .await?; } - let duration = start.elapsed(); + tokio::fs::write(summit_dir.join("checkpoint"), &checkpoint_data.checkpoint).await?; + tokio::fs::write(summit_dir.join("last_block"), &checkpoint_data.last_block).await?; + tokio::fs::write(summit_dir.join("finalized_header"), &checkpoint_data.finalized_header) + .await?; + tracing::info!( - "Checkpoint completed successfully: {} (took {:?})", - checkpoint_name, - duration + epoch, + finalized_headers = epoch.saturating_add(1), + fetched_headers, + reused_headers, + cache = ?cache_dir, + "Summit checkpoint verification bundle written successfully" ); + Ok(()) + } + + async fn prepare_finalized_header_cache( + &self, + summit_client: &SummitRpcClient, + cache_dir: &Path, + ) -> Result> { + // Always refresh epoch 0 so a cache created for another chain cannot be reused. + let live_genesis_header = summit_client.get_finalized_header(0).await?.finalized_header; + let cached_genesis_path = cache_dir.join("0"); + let cached_genesis = match tokio::fs::read(&cached_genesis_path).await { + Ok(header) if !header.is_empty() => Some(header), + Ok(_) => None, + Err(error) if error.kind() == std::io::ErrorKind::NotFound => None, + Err(error) => return Err(error.into()), + }; + + if cached_genesis.as_deref() != Some(live_genesis_header.as_slice()) { + if tokio::fs::try_exists(cache_dir).await? { + tracing::warn!( + cache = ?cache_dir, + "Resetting finalized-header cache because epoch 0 does not match Summit" + ); + tokio::fs::remove_dir_all(cache_dir).await?; + } + tokio::fs::create_dir_all(cache_dir).await?; + self.write_cached_finalized_header(cache_dir, 0, &live_genesis_header).await?; + } + + Ok(live_genesis_header) + } + + async fn get_or_fetch_finalized_header( + &self, + summit_client: &SummitRpcClient, + cache_dir: &Path, + epoch: u64, + ) -> Result<(Vec, bool)> { + let cache_path = cache_dir.join(epoch.to_string()); + match tokio::fs::read(&cache_path).await { + Ok(header) if !header.is_empty() => return Ok((header, true)), + Ok(_) => { + tracing::warn!(epoch, path = ?cache_path, "Ignoring empty cached finalized header"); + } + Err(error) if error.kind() == std::io::ErrorKind::NotFound => {} + Err(error) => return Err(error.into()), + } + + let response = summit_client.get_finalized_header(epoch).await?; + self.write_cached_finalized_header(cache_dir, epoch, &response.finalized_header).await?; + Ok((response.finalized_header, false)) + } + + async fn write_cached_finalized_header( + &self, + cache_dir: &Path, + epoch: u64, + finalized_header: &[u8], + ) -> Result<()> { + tokio::fs::create_dir_all(cache_dir).await?; + let cache_path = cache_dir.join(epoch.to_string()); + let partial_path = cache_dir.join(format!(".{epoch}.partial")); + + tokio::fs::write(&partial_path, finalized_header).await?; + if let Err(error) = tokio::fs::rename(&partial_path, &cache_path).await { + let _ = tokio::fs::remove_file(&partial_path).await; + return Err(error.into()); + } Ok(()) } + /// Verify that the checkpoint tools are available. + pub async fn verify_checkpoint_tools(&self) -> Result<()> { + self.executor.verify_available().await + } + /// Remove oldest snapshot directories when count exceeds the configured max_snapshots limit. async fn cleanup_old_snapshots(&self) -> Result<()> { let max = match self.config.max_snapshots { @@ -207,32 +375,48 @@ impl CheckpointManager { Ok(()) } - /// Verify that the checkpoint tools are available - pub async fn verify_checkpoint_tools(&self) -> Result<()> { - self.executor.verify_available().await - } - - /// Check whether a compressed checkpoint archive already exists on disk for the given epoch. + /// Check whether a non-empty compressed checkpoint archive exists for the given epoch. pub fn checkpoint_exists(&self, epoch: u64) -> bool { - self.config + let archive_path = self + .config .output_dir .join(format!("epoch_{}", epoch)) - .join(format!("epoch_{}.tar.gz", epoch)) - .exists() + .join(format!("epoch_{}.tar.gz", epoch)); + + std::fs::metadata(archive_path) + .is_ok_and(|metadata| metadata.is_file() && metadata.len() > 0) + } + + /// Whether state and disk agree that a candidate epoch has already been handled. + pub(crate) fn checkpoint_is_satisfied( + &self, + epoch: u64, + last_checkpointed_epoch: Option, + ) -> bool { + state_and_archive_allow_skip(epoch, last_checkpointed_epoch, self.checkpoint_exists(epoch)) } /// Ensure a checkpoint exists for the latest finalized epoch. Intended to be called once /// at startup so we don't have to wait for the next epoch boundary to take a checkpoint. /// - /// When summit is enabled (the authoritative path), we call `getLatestCheckpoint` and - /// SSZ-decode the returned `last_block` to learn the exact tip of the finalized epoch. - /// The unwind inside `create_checkpoint` then lands at `height - 1`. - /// - /// If summit is disabled, we fall back to block-math (which is incorrect after an - /// epoch-length change but preserves legacy behavior for fixed-length chains). + /// When summit is enabled, we read the latest checkpoint info and its historical epoch + /// bounds via `getLatestCheckpointInfo` / `getEpochBounds`. When summit is disabled, we + /// fall back to fixed-interval block math. pub async fn ensure_latest_checkpoint(&self) -> Result<()> { - let (latest_epoch, last_block_height) = match &self.rpc_client.summit { - Some(summit) => summit.get_latest_epoch_last_block().await?, + let (latest_epoch, checkpoint_block, ready_block, expected_checkpoint_digest) = match &self + .rpc_client + .summit + { + Some(summit) => { + let Some(info) = summit.get_latest_checkpoint_info().await? else { + tracing::info!("Startup check: Summit has not produced a checkpoint yet"); + return Ok(()); + }; + let bounds = summit.get_epoch_bounds(info.epoch).await?; + let schedule = + summit_checkpoint_schedule(bounds, self.config.checkpoint_delay_blocks); + (info.epoch, schedule.checkpoint_block, schedule.ready_block, Some(info.digest)) + } None => { let current_block = self.rpc_client.reth.get_block_number().await?; let current_epoch = current_block / self.config.epoch_blocks; @@ -243,52 +427,119 @@ impl CheckpointManager { ); return Ok(()); } - // Previous epoch is the most recently finalized; its last block is the - // block immediately before the current epoch's first block. - (current_epoch - 1, current_epoch * self.config.epoch_blocks - 1) + let schedule = fixed_interval_schedule( + current_epoch, + self.config.epoch_blocks, + self.config.checkpoint_delay_blocks, + ); + // The previous epoch is the most recently finalized one. + (current_epoch - 1, schedule.checkpoint_block, schedule.ready_block, None) } }; let last_checkpointed_epoch = self.state_tracker.last_epoch().await; - if latest_epoch <= last_checkpointed_epoch { + if self.checkpoint_is_satisfied(latest_epoch, last_checkpointed_epoch) { tracing::info!( - "Startup check: latest epoch {} already checkpointed (last_epoch={}), skipping", latest_epoch, - last_checkpointed_epoch + ?last_checkpointed_epoch, + "Startup check: latest epoch already checkpointed, skipping" ); return Ok(()); } + if last_checkpointed_epoch == Some(latest_epoch) { + tracing::warn!( + latest_epoch, + "State records latest epoch, but its archive is missing; recreating it" + ); + } + if self.checkpoint_exists(latest_epoch) { tracing::info!( "Startup check: checkpoint archive for epoch {} already exists on disk, syncing state tracker", latest_epoch ); - self.state_tracker.update_last_checkpoint(latest_epoch, last_block_height).await?; + self.state_tracker.update_last_checkpoint(latest_epoch, checkpoint_block).await?; return Ok(()); } - // Make sure reth has caught up at least to the epoch's final block — otherwise - // we can't unwind to it. + // Make sure reth has caught up at least to the ready block — otherwise we can't + // safely snapshot yet. let current_reth_block = self.rpc_client.reth.get_block_number().await?; - if current_reth_block < last_block_height { + if current_reth_block < ready_block { tracing::info!( - "Startup check: reth at block {} is behind summit epoch {} tip (block {}); deferring to monitor", + "Startup check: reth at block {} is behind ready block {} for epoch {}; deferring to monitor", current_reth_block, - latest_epoch, - last_block_height + ready_block, + latest_epoch ); return Ok(()); } tracing::info!( - "Startup check: creating checkpoint for epoch {} at finalized block {} (reth at {})", + "Startup check: creating checkpoint for epoch {} unwound to block {} (reth at {})", latest_epoch, - last_block_height, + checkpoint_block, current_reth_block ); - self.create_checkpoint(latest_epoch, last_block_height).await?; + self.create_checkpoint_with_expected_digest( + latest_epoch, + checkpoint_block, + expected_checkpoint_digest, + ) + .await?; Ok(()) } } + +fn validate_checkpoint_digest( + epoch: u64, + expected_digest: Option<[u8; 32]>, + actual_digest: [u8; 32], +) -> Result<()> { + if let Some(expected_digest) = expected_digest { + if actual_digest != expected_digest { + return Err(CheckpointerError::CheckpointExecution(format!( + "Summit checkpoint digest changed for epoch {epoch}: expected {expected_digest:?}, received {actual_digest:?}" + ))); + } + } + + Ok(()) +} + +fn state_and_archive_allow_skip( + epoch: u64, + last_checkpointed_epoch: Option, + archive_exists: bool, +) -> bool { + last_checkpointed_epoch.is_some_and(|last| last > epoch || (last == epoch && archive_exists)) +} + +#[cfg(test)] +mod tests { + use super::{state_and_archive_allow_skip, validate_checkpoint_digest}; + + #[test] + fn checkpoint_skip_requires_archive_when_state_matches_epoch() { + assert!(!state_and_archive_allow_skip(42, Some(42), false)); + assert!(state_and_archive_allow_skip(42, Some(42), true)); + } + + #[test] + fn checkpoint_skip_preserves_state_that_is_ahead() { + assert!(state_and_archive_allow_skip(42, Some(43), false)); + assert!(!state_and_archive_allow_skip(42, Some(41), true)); + assert!(!state_and_archive_allow_skip(42, None, true)); + } + + #[test] + fn checkpoint_digest_must_match_discovery_response() { + let digest = [42; 32]; + + assert!(validate_checkpoint_digest(7, None, digest).is_ok()); + assert!(validate_checkpoint_digest(7, Some(digest), digest).is_ok()); + assert!(validate_checkpoint_digest(7, Some([41; 32]), digest).is_err()); + } +} diff --git a/src/checkpoint/metadata.rs b/src/checkpoint/metadata.rs index 344f269..8b9e24f 100644 --- a/src/checkpoint/metadata.rs +++ b/src/checkpoint/metadata.rs @@ -6,7 +6,7 @@ pub struct CheckpointMetadata { /// Epoch number for this checkpoint pub epoch: u64, - /// Block number at checkpoint time + /// Block to which the copied Reth database was unwound. pub block_number: u64, /// Timestamp when checkpoint was created diff --git a/src/config.rs b/src/config.rs index 0d91427..17a5974 100644 --- a/src/config.rs +++ b/src/config.rs @@ -23,7 +23,9 @@ pub struct RethConfig { #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CheckpointConfig { + /// Fixed block interval used only when Summit integration is disabled. pub epoch_blocks: u64, + /// Blocks to wait after the exact epoch boundary before snapshotting. pub checkpoint_delay_blocks: u64, pub output_dir: PathBuf, pub compact: bool, @@ -36,6 +38,7 @@ pub struct CheckpointConfig { pub struct SummitConfig { pub enabled: bool, pub rpc_url: String, + pub rpc_timeout_secs: u64, } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -72,7 +75,7 @@ pub struct Cli { #[arg(long)] pub reth_db_path: Option, - /// Override epoch block count + /// Override the fixed block interval used when Summit integration is disabled. #[arg(long)] pub epoch_blocks: Option, @@ -124,6 +127,7 @@ impl Config { .set_default("checkpoint.max_snapshots", None::)? .set_default("summit.enabled", false)? .set_default("summit.rpc_url", "http://localhost:5052")? + .set_default("summit.rpc_timeout_secs", 100)? .set_default("monitor.poll_interval_secs", 12)? .set_default("monitor.retry_interval_secs", 60)? .set_default("state.state_file", "./checkpointer_state.cbor")? @@ -195,6 +199,9 @@ impl Config { )); } + validate_max_snapshots(self.checkpoint.max_snapshots)?; + validate_summit_rpc_timeout(self.summit.rpc_timeout_secs)?; + // Validate poll_interval_secs if self.monitor.poll_interval_secs == 0 { return Err(CheckpointerError::Config( @@ -243,3 +250,41 @@ fn expand_path(path: &PathBuf) -> Result { Ok(PathBuf::from(expanded.as_ref())) } + +fn validate_max_snapshots(max_snapshots: Option) -> Result<()> { + if max_snapshots == Some(0) { + return Err(CheckpointerError::Config( + "checkpoint.max_snapshots must be greater than 0 when set".to_string(), + )); + } + + Ok(()) +} + +fn validate_summit_rpc_timeout(rpc_timeout_secs: u64) -> Result<()> { + if rpc_timeout_secs == 0 { + return Err(CheckpointerError::Config( + "summit.rpc_timeout_secs must be greater than 0".to_string(), + )); + } + + Ok(()) +} + +#[cfg(test)] +mod tests { + use super::{validate_max_snapshots, validate_summit_rpc_timeout}; + + #[test] + fn max_snapshots_must_be_positive_when_set() { + assert!(validate_max_snapshots(None).is_ok()); + assert!(validate_max_snapshots(Some(1)).is_ok()); + assert!(validate_max_snapshots(Some(0)).is_err()); + } + + #[test] + fn summit_rpc_timeout_must_be_positive() { + assert!(validate_summit_rpc_timeout(100).is_ok()); + assert!(validate_summit_rpc_timeout(0).is_err()); + } +} diff --git a/src/lib.rs b/src/lib.rs index 7d0e1f8..a3ae9ad 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ pub mod config; pub mod error; pub mod monitor; pub mod rpc; +mod schedule; pub mod server; pub mod state; diff --git a/src/main.rs b/src/main.rs index 9db6a37..830b687 100644 --- a/src/main.rs +++ b/src/main.rs @@ -77,7 +77,8 @@ async fn main() -> Result<()> { tracing::info!("Block monitor initialized, starting main loop"); let addr: SocketAddr = format!("0.0.0.0:{}", cli.port).parse().unwrap(); - let server_handle = RpcServer::new().start_server(addr).await; + let server_handle = + RpcServer::new(config.checkpoint.output_dir.clone()).start_server(addr).await; // Run until cancelled monitor.run_until_cancelled(shutdown_token).await?; diff --git a/src/monitor.rs b/src/monitor.rs index ea7de6b..c80fc79 100644 --- a/src/monitor.rs +++ b/src/monitor.rs @@ -5,10 +5,11 @@ use crate::{ checkpoint::CheckpointManager, config::MonitorConfig, error::{CheckpointerError, Result}, - rpc::RpcClient, + rpc::{RpcClient, SummitRpcClient}, + schedule::{fixed_interval_schedule, summit_checkpoint_schedule}, }; -/// Block monitor that watches for epoch boundaries and triggers checkpoints +/// Block monitor that watches for completed Summit checkpoints or fixed Reth intervals. pub struct BlockMonitor { rpc_client: RpcClient, checkpoint_manager: Arc, @@ -18,7 +19,7 @@ pub struct BlockMonitor { } impl BlockMonitor { - /// Create a new block monitor + /// Create a new block monitor. pub fn new( rpc_client: RpcClient, checkpoint_manager: Arc, @@ -29,14 +30,22 @@ impl BlockMonitor { Self { rpc_client, checkpoint_manager, config, epoch_blocks, checkpoint_delay_blocks } } - /// Run the monitoring loop until cancelled + /// Run the monitoring loop until cancelled. pub async fn run_until_cancelled(&mut self, cancel_token: CancellationToken) -> Result<()> { - tracing::info!( - "Starting block monitor (epoch_blocks={}, checkpoint_delay_blocks={}, poll_interval={}s)", - self.epoch_blocks, - self.checkpoint_delay_blocks, - self.config.poll_interval_secs - ); + if self.rpc_client.summit.is_some() { + tracing::info!( + checkpoint_delay_blocks = self.checkpoint_delay_blocks, + poll_interval_secs = self.config.poll_interval_secs, + "Starting Summit-driven checkpoint monitor" + ); + } else { + tracing::info!( + epoch_blocks = self.epoch_blocks, + checkpoint_delay_blocks = self.checkpoint_delay_blocks, + poll_interval_secs = self.config.poll_interval_secs, + "Starting fixed-interval Reth checkpoint monitor" + ); + } loop { tokio::select! { @@ -49,7 +58,10 @@ impl BlockMonitor { match e { CheckpointerError::Rpc(ref rpc_err) => { tracing::warn!("RPC connection error: {}. Will retry...", rpc_err); - // Backoff on RPC errors + tokio::time::sleep(Duration::from_secs(self.config.retry_interval_secs)).await; + } + CheckpointerError::Http(ref http_err) => { + tracing::warn!("HTTP connection error: {}. Will retry...", http_err); tokio::time::sleep(Duration::from_secs(self.config.retry_interval_secs)).await; } CheckpointerError::CheckpointExecution(ref msg) => { @@ -57,7 +69,6 @@ impl BlockMonitor { } _ => { tracing::error!("Unexpected error in monitoring loop: {}", e); - // Backoff on unexpected errors tokio::time::sleep(Duration::from_secs(self.config.retry_interval_secs)).await; } } @@ -69,62 +80,107 @@ impl BlockMonitor { Ok(()) } - /// Check current block and create checkpoint if conditions are met + /// Check current state and create a checkpoint if one is ready. async fn check_and_checkpoint(&self) -> Result<()> { - // Summit is authoritative for both the epoch number and the finalized tip block. - // Fall back to block-math only when summit is disabled (broken after an - // epoch-length change, but preserves legacy behavior for fixed-length chains). - let (latest_epoch, last_block_height) = match &self.rpc_client.summit { - Some(summit) => summit.get_latest_epoch_last_block().await?, - None => { - let current_block = self.rpc_client.reth.get_block_number().await?; - let current_epoch = current_block / self.epoch_blocks; - if current_epoch == 0 { - return Ok(()); - } - let last_block_of_finalized = current_epoch * self.epoch_blocks - 1; - // Keep the configured delay in the fallback path only — summit-based - // gating already implies finality. - if current_block < last_block_of_finalized + 1 + self.checkpoint_delay_blocks { - return Ok(()); - } - (current_epoch - 1, last_block_of_finalized) - } - }; - + let current_block = self.rpc_client.reth.get_block_number().await?; let last_checkpointed_epoch = self.checkpoint_manager.state_tracker.last_epoch().await; - if latest_epoch <= last_checkpointed_epoch { + if let Some(summit) = &self.rpc_client.summit { + self.check_summit_checkpoint(summit, current_block, last_checkpointed_epoch).await + } else { + self.check_fixed_interval_checkpoint(current_block, last_checkpointed_epoch).await + } + } + + async fn check_summit_checkpoint( + &self, + summit: &SummitRpcClient, + current_block: u64, + last_checkpointed_epoch: Option, + ) -> Result<()> { + let Some(checkpoint_info) = summit.get_latest_checkpoint_info().await? else { + tracing::debug!("Summit has not produced a checkpoint yet"); + return Ok(()); + }; + if self + .checkpoint_manager + .checkpoint_is_satisfied(checkpoint_info.epoch, last_checkpointed_epoch) + { tracing::debug!( - "No new epoch: latest={}, last_checkpointed={}", - latest_epoch, - last_checkpointed_epoch + latest_summit_epoch = checkpoint_info.epoch, + last_checkpointed_epoch, + "No new Summit checkpoint" ); return Ok(()); } - // Reth must be caught up to the epoch's final block before we can unwind to it. - let current_reth_block = self.rpc_client.reth.get_block_number().await?; - if current_reth_block < last_block_height { + let bounds = summit.get_epoch_bounds(checkpoint_info.epoch).await?; + let schedule = summit_checkpoint_schedule(bounds, self.checkpoint_delay_blocks); + if current_block < schedule.ready_block { tracing::debug!( - "Reth at block {} is behind summit epoch {} tip ({}); waiting", - current_reth_block, - latest_epoch, - last_block_height + epoch = checkpoint_info.epoch, + current_block, + epoch_last_height = bounds.last_height, + ready_block = schedule.ready_block, + "Summit checkpoint exists; waiting for Reth checkpoint delay" ); return Ok(()); } tracing::info!( - "New epoch detected (epoch={}, prev_checkpointed={}); creating checkpoint at finalized block {} (reth at {})", - latest_epoch, - last_checkpointed_epoch, - last_block_height, - current_reth_block + epoch = checkpoint_info.epoch, + checkpoint_digest = ?checkpoint_info.digest, + epoch_first_height = bounds.first_height, + epoch_last_height = bounds.last_height, + checkpoint_block = schedule.checkpoint_block, + current_block, + "New Summit checkpoint is ready for snapshotting" ); + self.checkpoint_manager + .create_checkpoint_with_expected_digest( + checkpoint_info.epoch, + schedule.checkpoint_block, + Some(checkpoint_info.digest), + ) + .await + } + + async fn check_fixed_interval_checkpoint( + &self, + current_block: u64, + last_checkpointed_epoch: Option, + ) -> Result<()> { + let current_epoch = current_block / self.epoch_blocks; + if current_epoch == 0 { + return Ok(()); + } - self.checkpoint_manager.create_checkpoint(latest_epoch, last_block_height).await?; + // We are currently in epoch N, so epoch N - 1 is the one that just completed. + let completed_epoch = current_epoch - 1; + if self.checkpoint_manager.checkpoint_is_satisfied(completed_epoch, last_checkpointed_epoch) + { + return Ok(()); + } - Ok(()) + // current_epoch identifies the boundary that ended completed_epoch. + let schedule = + fixed_interval_schedule(current_epoch, self.epoch_blocks, self.checkpoint_delay_blocks); + if current_block < schedule.ready_block { + tracing::debug!( + completed_epoch, + current_block, + ready_block = schedule.ready_block, + "Waiting for fixed-interval checkpoint delay" + ); + return Ok(()); + } + + tracing::info!( + epoch = completed_epoch, + checkpoint_block = schedule.checkpoint_block, + current_block, + "Fixed-interval Reth checkpoint is ready" + ); + self.checkpoint_manager.create_checkpoint(completed_epoch, schedule.checkpoint_block).await } } diff --git a/src/rpc/client.rs b/src/rpc/client.rs index 697446f..e87aad3 100644 --- a/src/rpc/client.rs +++ b/src/rpc/client.rs @@ -1,4 +1,4 @@ -use std::sync::Arc; +use std::{sync::Arc, time::Duration}; use crate::{ config::Config, @@ -19,7 +19,10 @@ impl RpcClient { let reth = Arc::new(RethRpcClient::new(&config.reth.rpc_url)?); let summit = if config.summit.enabled { - Some(Arc::new(SummitRpcClient::new(&config.summit.rpc_url)?)) + Some(Arc::new(SummitRpcClient::new( + &config.summit.rpc_url, + Duration::from_secs(config.summit.rpc_timeout_secs), + )?)) } else { tracing::info!("Summit integration disabled"); None diff --git a/src/rpc/summit.rs b/src/rpc/summit.rs index 1cd2849..806a7eb 100644 --- a/src/rpc/summit.rs +++ b/src/rpc/summit.rs @@ -1,177 +1,101 @@ -use crate::error::{CheckpointerError, Result}; +use std::time::Duration; + use reqwest::Client; -use serde::{Deserialize, Serialize}; -use serde_json::json; -use ssz::Decode; -use summit_types::Block; +use serde::{de::DeserializeOwned, Deserialize}; +use serde_json::{json, Value}; + +use crate::error::{CheckpointerError, Result}; -/// Summit consensus client RPC client +const CHECKPOINT_NOT_FOUND_CODE: i32 = 2000; + +/// Summit consensus client RPC client. pub struct SummitRpcClient { client: Client, base_url: String, } impl SummitRpcClient { - /// Create a new Summit RPC client - pub fn new(url: &str) -> Result { - tracing::info!("Summit RPC client initialized: {}", url); - Ok(Self { client: Client::new(), base_url: url.to_string() }) - } - - /// Get the latest finalized epoch number from Summit - pub async fn get_latest_epoch(&self) -> Result { - tracing::debug!("Fetching latest Summit epoch"); - - let request = json!({ - "jsonrpc": "2.0", - "method": "getLatestEpoch", - "params": [], - "id": 1 - }); - - let response = self.client.post(&self.base_url).json(&request).send().await?; - - if !response.status().is_success() { - return Err(CheckpointerError::Http(response.error_for_status().unwrap_err())); + /// Create a new Summit RPC client. + pub fn new(url: &str, timeout: Duration) -> Result { + if timeout.is_zero() { + return Err(CheckpointerError::Config( + "Summit RPC timeout must be greater than 0".to_string(), + )); } - let rpc_response: JsonRpcResponse = response.json().await?; + let client = Client::builder().timeout(timeout).build()?; + tracing::info!(url, timeout_secs = timeout.as_secs(), "Summit RPC client initialized"); + Ok(Self { client, base_url: url.to_string() }) + } - if let Some(error) = rpc_response.error { + /// Get checkpoint data from Summit for a specific epoch. + pub async fn get_checkpoint(&self, epoch: u64) -> Result { + tracing::debug!("Fetching Summit checkpoint for epoch {}", epoch); + let response: CheckpointRes = self.call("getCheckpoint", json!([epoch])).await?; + if response.epoch != epoch { return Err(CheckpointerError::CheckpointExecution(format!( - "Summit RPC error: {} (code: {})", - error.message, error.code + "Summit returned checkpoint epoch {} for requested epoch {}", + response.epoch, epoch ))); } - - rpc_response.result.ok_or_else(|| { - CheckpointerError::CheckpointExecution( - "Summit RPC returned no result or error".to_string(), - ) - }) + Ok(response) } - /// Get the current epoch length (in blocks) from Summit - pub async fn get_epoch_length(&self) -> Result { - tracing::debug!("Fetching Summit epoch length"); - - let request = json!({ - "jsonrpc": "2.0", - "method": "getEpochLength", - "params": [], - "id": 1 - }); - - let response = self.client.post(&self.base_url).json(&request).send().await?; - - if !response.status().is_success() { - return Err(CheckpointerError::Http(response.error_for_status().unwrap_err())); - } + /// Get the latest completed Summit checkpoint epoch and digest, if one exists. + pub async fn get_latest_checkpoint_info(&self) -> Result> { + let response = self.send("getLatestCheckpointInfo", json!([])).await?; + response.into_optional_result("getLatestCheckpointInfo", CHECKPOINT_NOT_FOUND_CODE) + } - let rpc_response: JsonRpcResponse = response.json().await?; + /// Get the exact historical height bounds for a Summit epoch. + pub async fn get_epoch_bounds(&self, epoch: u64) -> Result { + self.call("getEpochBounds", json!([epoch])).await + } - if let Some(error) = rpc_response.error { + /// Get the SSZ-encoded finalized header for a specific epoch. + pub async fn get_finalized_header(&self, epoch: u64) -> Result { + let response: FinalizedHeaderRes = self.call("getFinalizedHeader", json!([epoch])).await?; + if response.epoch != epoch { return Err(CheckpointerError::CheckpointExecution(format!( - "Summit RPC error: {} (code: {})", - error.message, error.code + "Summit returned finalized header epoch {} for requested epoch {}", + response.epoch, epoch ))); } - - rpc_response.result.ok_or_else(|| { - CheckpointerError::CheckpointExecution( - "Summit RPC returned no result or error".to_string(), - ) - }) - } - - /// Get the most recent finalized checkpoint from Summit. The returned payload's - /// `last_block` field is SSZ-encoded and can be decoded with - /// `summit_types::Block::from_ssz_bytes`. - pub async fn get_latest_checkpoint(&self) -> Result { - tracing::debug!("Fetching latest Summit checkpoint"); - - let request = json!({ - "jsonrpc": "2.0", - "method": "getLatestCheckpoint", - "params": [], - "id": 1 - }); - - let response = self.client.post(&self.base_url).json(&request).send().await?; - - if !response.status().is_success() { - return Err(CheckpointerError::Http(response.error_for_status().unwrap_err())); - } - - let rpc_response: JsonRpcResponse = response.json().await?; - - if let Some(error) = rpc_response.error { + if response.finalized_header.is_empty() { return Err(CheckpointerError::CheckpointExecution(format!( - "Summit RPC error: {} (code: {})", - error.message, error.code + "Summit returned an empty finalized header for epoch {}", + epoch ))); } - - rpc_response.result.ok_or_else(|| { - CheckpointerError::CheckpointExecution( - "Summit RPC returned no result or error".to_string(), - ) - }) + Ok(response) } - /// Get the latest finalized checkpoint and decode its `last_block` to return - /// `(epoch, last_block_height)` — the authoritative epoch number and the height of - /// the last block included in that epoch's finalized checkpoint. - pub async fn get_latest_epoch_last_block(&self) -> Result<(u64, u64)> { - let res = self.get_latest_checkpoint().await?; - let block = Block::from_ssz_bytes(&res.last_block).map_err(|e| { - CheckpointerError::CheckpointExecution(format!( - "Failed to SSZ-decode summit last_block: {:?}", - e - )) - })?; - Ok((res.epoch, block.header.height)) + async fn call(&self, method: &str, params: Value) -> Result { + self.send(method, params).await?.into_result(method) } - /// Get checkpoint data from Summit for a specific epoch - pub async fn get_checkpoint(&self, epoch: u64) -> Result { - tracing::debug!("Fetching Summit checkpoint for epoch {}", epoch); - - // Create JSON-RPC request + async fn send( + &self, + method: &str, + params: Value, + ) -> Result> { let request = json!({ "jsonrpc": "2.0", - "method": "getCheckpoint", - "params": [epoch], + "method": method, + "params": params, "id": 1 }); - - // Send request let response = self.client.post(&self.base_url).json(&request).send().await?; - if !response.status().is_success() { return Err(CheckpointerError::Http(response.error_for_status().unwrap_err())); } - // Parse JSON-RPC response - let rpc_response: JsonRpcResponse = response.json().await?; - - if let Some(error) = rpc_response.error { - return Err(CheckpointerError::CheckpointExecution(format!( - "Summit RPC error: {} (code: {})", - error.message, error.code - ))); - } - - rpc_response.result.ok_or_else(|| { - CheckpointerError::CheckpointExecution( - "Summit RPC returned no result or error".to_string(), - ) - }) + Ok(response.json().await?) } } -/// Summit checkpoint response structure -#[derive(Debug, Serialize, Deserialize, Clone)] +/// Summit checkpoint response structure. +#[derive(Debug, Deserialize, Clone)] pub struct CheckpointRes { pub digest: [u8; 32], pub epoch: u64, @@ -180,18 +104,99 @@ pub struct CheckpointRes { pub finalized_header: Vec, } -/// JSON-RPC response wrapper +/// Latest Summit checkpoint information. +#[derive(Debug, Deserialize, Clone)] +pub struct CheckpointInfoRes { + pub epoch: u64, + pub digest: [u8; 32], +} + +/// Exact historical bounds for a Summit epoch. +#[derive(Debug, Deserialize, Clone, Copy)] +pub struct EpochBoundsResponse { + pub first_height: u64, + pub last_height: u64, +} + +/// SSZ-encoded finalized header for one epoch. +#[derive(Debug, Deserialize, Clone)] +pub struct FinalizedHeaderRes { + pub epoch: u64, + pub finalized_header: Vec, +} + +/// JSON-RPC response wrapper. #[derive(Debug, Deserialize)] struct JsonRpcResponse { - #[serde(skip_serializing_if = "Option::is_none")] result: Option, - #[serde(skip_serializing_if = "Option::is_none")] error: Option, } -/// JSON-RPC error structure #[derive(Debug, Deserialize)] struct JsonRpcError { code: i32, message: String, } + +impl JsonRpcResponse { + fn into_result(self, method: &str) -> Result { + if let Some(error) = self.error { + return Err(CheckpointerError::CheckpointExecution(format!( + "Summit RPC {method} failed: {} (code: {})", + error.message, error.code + ))); + } + + self.result.ok_or_else(|| { + CheckpointerError::CheckpointExecution(format!( + "Summit RPC {method} returned no result or error" + )) + }) + } + + fn into_optional_result(self, method: &str, not_found_code: i32) -> Result> { + if self.error.as_ref().is_some_and(|error| error.code == not_found_code) { + return Ok(None); + } + + self.into_result(method).map(Some) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn summit_rpc_timeout_must_be_positive() { + assert!(SummitRpcClient::new("http://localhost:5052", Duration::ZERO).is_err()); + } + + #[test] + fn checkpoint_not_found_is_an_empty_optional_result() { + let response: JsonRpcResponse = JsonRpcResponse { + result: None, + error: Some(JsonRpcError { + code: CHECKPOINT_NOT_FOUND_CODE, + message: "Checkpoint not found".to_string(), + }), + }; + + assert!(response + .into_optional_result("getLatestCheckpointInfo", CHECKPOINT_NOT_FOUND_CODE) + .unwrap() + .is_none()); + } + + #[test] + fn unexpected_rpc_errors_remain_errors() { + let response: JsonRpcResponse = JsonRpcResponse { + result: None, + error: Some(JsonRpcError { code: -32603, message: "Internal error".to_string() }), + }; + + assert!(response + .into_optional_result("getLatestCheckpointInfo", CHECKPOINT_NOT_FOUND_CODE) + .is_err()); + } +} diff --git a/src/schedule.rs b/src/schedule.rs new file mode 100644 index 0000000..9d0ac79 --- /dev/null +++ b/src/schedule.rs @@ -0,0 +1,53 @@ +use crate::rpc::summit::EpochBoundsResponse; + +pub(crate) struct CheckpointSchedule { + pub ready_block: u64, + pub checkpoint_block: u64, +} + +pub(crate) fn summit_checkpoint_schedule( + bounds: EpochBoundsResponse, + checkpoint_delay_blocks: u64, +) -> CheckpointSchedule { + // The next epoch starts one block after last_height. Summit captures the + // checkpoint state at the penultimate block of the completed epoch. + CheckpointSchedule { + ready_block: bounds.last_height.saturating_add(1).saturating_add(checkpoint_delay_blocks), + checkpoint_block: bounds.last_height.saturating_sub(1), + } +} + +pub(crate) fn fixed_interval_schedule( + current_epoch: u64, + epoch_blocks: u64, + checkpoint_delay_blocks: u64, +) -> CheckpointSchedule { + let epoch_boundary = current_epoch.saturating_mul(epoch_blocks); + + CheckpointSchedule { + ready_block: epoch_boundary.saturating_add(checkpoint_delay_blocks), + checkpoint_block: epoch_boundary.saturating_sub(2), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn summit_schedule_uses_historical_epoch_bounds() { + let bounds = EpochBoundsResponse { first_height: 30_000, last_height: 37_654 }; + let schedule = summit_checkpoint_schedule(bounds, 3); + + assert_eq!(schedule.checkpoint_block, 37_653); + assert_eq!(schedule.ready_block, 37_658); + } + + #[test] + fn fixed_interval_schedule_preserves_reth_only_behavior() { + let schedule = fixed_interval_schedule(4, 5_000, 3); + + assert_eq!(schedule.checkpoint_block, 19_998); + assert_eq!(schedule.ready_block, 20_003); + } +} diff --git a/src/server/api.rs b/src/server/api.rs index b4fed45..4c163f1 100644 --- a/src/server/api.rs +++ b/src/server/api.rs @@ -6,7 +6,7 @@ pub trait CheckpointerRpc { #[method(name = "healthCheck")] async fn health_check(&self) -> RpcResult; - /// Prepares an encrypted snapshot + /// Downloads a `.tar.gz` snapshot archive into the configured per-epoch directory. #[method(name = "snapshot.download_encrypted_snapshot")] async fn download_encrypted_snapshot(&self, epoch: u64, url: String) -> RpcResult<()>; diff --git a/src/server/server.rs b/src/server/server.rs index 4968a4a..1bbfb8d 100644 --- a/src/server/server.rs +++ b/src/server/server.rs @@ -1,4 +1,9 @@ -use std::{convert::Infallible, fs, net::SocketAddr, path::Path}; +use std::{ + convert::Infallible, + fs, + net::SocketAddr, + path::{Path, PathBuf}, +}; use futures_util::StreamExt; use http_body::Frame; @@ -17,20 +22,21 @@ use tracing::info; use crate::server::api::CheckpointerRpcServer; pub const SNAPSHOT_FILE_PREFIX: &str = "epoch_"; -pub const DATA_DISK_DIR: &str = "/persistent/checkpoints"; -pub struct RpcServer; +pub struct RpcServer { + snapshot_dir: PathBuf, +} impl RpcServer { - #[allow(clippy::new_without_default)] - pub fn new() -> Self { - Self + pub fn new(snapshot_dir: PathBuf) -> Self { + Self { snapshot_dir } } pub async fn start_server(self, addr: SocketAddr) -> ServerHandle { let listener = TcpListener::bind(addr).await.expect("Failed to bind RPC server"); let (stop_handle, server_handle) = stop_channel(); + let snapshot_dir = self.snapshot_dir.clone(); let rpc_module = self.into_rpc(); let svc_builder = ServerBuilder::default().to_service_builder(); @@ -53,16 +59,20 @@ impl RpcServer { let svc_builder = svc_builder.clone(); let conn_stop = stop_handle.clone(); let shutdown_stop = stop_handle.clone(); + let snapshot_dir = snapshot_dir.clone(); let svc = tower::service_fn(move |req: http::Request| { let rpc_module = rpc_module.clone(); let stop_handle = conn_stop.clone(); let svc_builder = svc_builder.clone(); + let snapshot_dir = snapshot_dir.clone(); async move { if req.method() == http::Method::GET { if let Some(epoch) = parse_snapshot_path(req.uri().path()) { - return Ok::<_, Infallible>(handle_snapshot_stream(epoch).await); + return Ok::<_, Infallible>( + handle_snapshot_stream(&snapshot_dir, epoch).await, + ); } } @@ -99,10 +109,14 @@ fn parse_snapshot_path(path: &str) -> Option { path.strip_prefix("/snapshots/").and_then(|rest| rest.trim_end_matches('/').parse::().ok()) } -async fn handle_snapshot_stream(epoch: u64) -> http::Response { - let snapshot_path = format!( - "{DATA_DISK_DIR}/{SNAPSHOT_FILE_PREFIX}{epoch}/{SNAPSHOT_FILE_PREFIX}{epoch}.tar.gz", - ); +fn snapshot_archive_path(snapshot_dir: &Path, epoch: u64) -> PathBuf { + snapshot_dir + .join(format!("{SNAPSHOT_FILE_PREFIX}{epoch}")) + .join(format!("{SNAPSHOT_FILE_PREFIX}{epoch}.tar.gz")) +} + +async fn handle_snapshot_stream(snapshot_dir: &Path, epoch: u64) -> http::Response { + let snapshot_path = snapshot_archive_path(snapshot_dir, epoch); let file = match tokio::fs::File::open(&snapshot_path).await { Ok(f) => f, @@ -154,7 +168,7 @@ impl CheckpointerRpcServer for RpcServer { Ok("OK".to_string()) } - /// Prepares an encrypted snapshot + /// Downloads a `.tar.gz` snapshot archive into the configured per-epoch directory. async fn download_encrypted_snapshot(&self, epoch: u64, url: String) -> RpcResult<()> { // Download the file let response = reqwest::get(&url) @@ -170,17 +184,55 @@ impl CheckpointerRpcServer for RpcServer { .await .map_err(|e| string_to_rpc_error(format!("Failed to read response body: {}", e)))?; - // Create the filename - let filename = format!("{SNAPSHOT_FILE_PREFIX}{epoch}.tar.lz4"); + let output_path = snapshot_archive_path(&self.snapshot_dir, epoch); + let epoch_dir = output_path.parent().ok_or_else(|| { + string_to_rpc_error(format!( + "Could not determine snapshot directory for {}", + output_path.display() + )) + })?; + let partial_path = epoch_dir.join(format!(".{SNAPSHOT_FILE_PREFIX}{epoch}.tar.gz.partial")); + + tokio::fs::create_dir_all(epoch_dir).await.map_err(|e| { + string_to_rpc_error(format!( + "Failed to create snapshot directory {}: {}", + epoch_dir.display(), + e + )) + })?; - // Write to file - let mut file = - tokio::fs::File::create(format!("{DATA_DISK_DIR}/{filename}")).await.map_err(|e| { - string_to_rpc_error(format!("Failed to create file {}: {}", filename, e)) + if partial_path.exists() { + tokio::fs::remove_file(&partial_path).await.map_err(|e| { + string_to_rpc_error(format!( + "Failed to remove incomplete snapshot {}: {}", + partial_path.display(), + e + )) })?; + } - file.write_all(&bytes).await.map_err(|e| { - string_to_rpc_error(format!("Failed to write to file {}: {}", filename, e)) + let write_result = async { + let mut file = tokio::fs::File::create(&partial_path).await?; + file.write_all(&bytes).await?; + file.flush().await + } + .await; + + if let Err(e) = write_result { + let _ = tokio::fs::remove_file(&partial_path).await; + return Err(string_to_rpc_error(format!( + "Failed to write snapshot {}: {}", + partial_path.display(), + e + ))); + } + + tokio::fs::rename(&partial_path, &output_path).await.map_err(|e| { + string_to_rpc_error(format!( + "Failed to publish snapshot {}: {}", + output_path.display(), + e + )) })?; Ok(()) @@ -188,7 +240,7 @@ impl CheckpointerRpcServer for RpcServer { /// Restores from an encrypted snapshot async fn restore_from_encrypted_snapshot(&self, _epoch: u64) -> RpcResult<()> { - todo!() + Err(string_to_rpc_error("Snapshot restore is not implemented".to_string())) } /// Get an encrypted snapshot from this servers database @@ -198,9 +250,7 @@ impl CheckpointerRpcServer for RpcServer { "get_encrypted_snapshot is deprecated; use GET /snapshots/{{epoch}} for streaming" ); - let snapshot_path = format!( - "{DATA_DISK_DIR}/{SNAPSHOT_FILE_PREFIX}{epoch}/{SNAPSHOT_FILE_PREFIX}{epoch}.tar.gz", - ); + let snapshot_path = snapshot_archive_path(&self.snapshot_dir, epoch); if !fs::exists(&snapshot_path).unwrap_or_default() { return Err(string_to_rpc_error(format!("No snapshot for epoch {epoch} stored"))); @@ -213,32 +263,28 @@ impl CheckpointerRpcServer for RpcServer { /// List all encrypted snapshots stored in this enclave async fn list_all_encrypted_snapshots(&self) -> RpcResult> { - let dir_path = Path::new(DATA_DISK_DIR); - - let entries = fs::read_dir(dir_path).map_err(|e| { + let entries = fs::read_dir(&self.snapshot_dir).map_err(|e| { string_to_rpc_error(format!("Failed to read snapshots directory: {}", e)) })?; let mut epochs = Vec::new(); - #[allow(clippy::useless_format)] - let prefix = format!("{SNAPSHOT_FILE_PREFIX}"); for entry in entries { let entry = entry.map_err(|e| { string_to_rpc_error(format!("Failed to read directory entry: {}", e)) })?; - - if let Some(filename) = entry.file_name().to_str() { - if filename.starts_with(&prefix) { - // Extract epoch from filename - let epoch_str = filename.strip_prefix(&prefix); - - if let Some(epoch_str) = epoch_str { - if let Ok(epoch) = epoch_str.parse::() { - epochs.push(epoch); - } - } - } + let filename = entry.file_name(); + let Some(epoch_str) = + filename.to_str().and_then(|name| name.strip_prefix(SNAPSHOT_FILE_PREFIX)) + else { + continue; + }; + let Ok(epoch) = epoch_str.parse::() else { + continue; + }; + + if snapshot_archive_path(&self.snapshot_dir, epoch).is_file() { + epochs.push(epoch); } } @@ -260,3 +306,25 @@ impl CheckpointerRpcServer for RpcServer { pub fn string_to_rpc_error(e: String) -> ErrorObjectOwned { ErrorObjectOwned::owned(ErrorCode::InternalError.code(), e, None::<()>) } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn snapshot_archive_path_uses_configured_directory() { + let snapshot_dir = Path::new("/custom/checkpoints"); + + assert_eq!( + snapshot_archive_path(snapshot_dir, 42), + snapshot_dir.join("epoch_42").join("epoch_42.tar.gz") + ); + } + + #[tokio::test] + async fn unimplemented_snapshot_restore_returns_an_error() { + let server = RpcServer::new(PathBuf::from("/custom/checkpoints")); + + assert!(server.restore_from_encrypted_snapshot(42).await.is_err()); + } +} diff --git a/src/state.rs b/src/state.rs index aa28a61..788d8fa 100644 --- a/src/state.rs +++ b/src/state.rs @@ -7,16 +7,16 @@ use crate::error::Result; /// State structure for tracking checkpoint progress #[derive(Debug, Clone, Serialize, Deserialize)] pub struct CheckpointerState { - pub last_checkpointed_epoch: u64, - pub last_checkpoint_block: u64, + pub last_checkpointed_epoch: Option, + pub last_checkpoint_block: Option, pub last_update: chrono::DateTime, } impl Default for CheckpointerState { fn default() -> Self { Self { - last_checkpointed_epoch: 0, - last_checkpoint_block: 0, + last_checkpointed_epoch: None, + last_checkpoint_block: None, last_update: chrono::Utc::now(), } } @@ -41,29 +41,29 @@ impl StateTracker { }; tracing::info!( - "State loaded: last_epoch={}, last_block={}", - state.last_checkpointed_epoch, - state.last_checkpoint_block + last_epoch = ?state.last_checkpointed_epoch, + last_block = ?state.last_checkpoint_block, + "State loaded" ); Ok(Self { state: Arc::new(RwLock::new(state)), path: path.to_path_buf() }) } /// Get last checkpointed epoch - pub async fn last_epoch(&self) -> u64 { + pub async fn last_epoch(&self) -> Option { self.state.read().await.last_checkpointed_epoch } - /// Get last checkpointed block - pub async fn last_block(&self) -> u64 { + /// Get last checkpointed block. + pub async fn last_block(&self) -> Option { self.state.read().await.last_checkpoint_block } /// Update last checkpointed epoch and block pub async fn update_last_checkpoint(&self, epoch: u64, block: u64) -> Result<()> { let mut state = self.state.write().await; - state.last_checkpointed_epoch = epoch; - state.last_checkpoint_block = block; + state.last_checkpointed_epoch = Some(epoch); + state.last_checkpoint_block = Some(block); state.last_update = chrono::Utc::now(); // Persist to disk immediately From 78b2d018ac74d3589ce978a9723056f6e9e3d8bb Mon Sep 17 00:00:00 2001 From: Matthias Wright Date: Wed, 19 Aug 2026 01:43:31 +0800 Subject: [PATCH 2/3] fix: use built-in purpose keys for checkpoint unwind --- config.example.toml | 6 ++--- config.toml | 4 +-- src/checkpoint/executor.rs | 51 ++++++++++++++++++++++++++++++++------ src/config.rs | 11 ++++++-- 4 files changed, 58 insertions(+), 14 deletions(-) diff --git a/config.example.toml b/config.example.toml index 1e96652..066f25b 100644 --- a/config.example.toml +++ b/config.example.toml @@ -77,9 +77,9 @@ rpc_timeout_secs = 100 # ============================================================================ [monitor] # How often to poll reth for the current block number (in seconds) -# Default: 12 seconds (approximately one Ethereum block time) +# Default: 30 seconds # For faster networks or testing, you can reduce this -poll_interval_secs = 12 +poll_interval_secs = 30 # How long to wait after an RPC failure before retrying (in seconds) # This prevents spamming the RPC endpoint if reth is down @@ -123,7 +123,7 @@ format = "pretty" # compact = true # # [monitor] -# poll_interval_secs = 12 +# poll_interval_secs = 30 # # [logging] # level = "info" diff --git a/config.toml b/config.toml index 99b9f19..d2abfba 100644 --- a/config.toml +++ b/config.toml @@ -46,8 +46,8 @@ rpc_timeout_secs = 100 # Monitoring Configuration [monitor] # How often to check block number (in seconds) -# Default: 12 seconds (approximately one Ethereum block) -poll_interval_secs = 12 +# Default: 30 seconds +poll_interval_secs = 30 # How long to wait after RPC failure before retrying (in seconds) retry_interval_secs = 60 diff --git a/src/checkpoint/executor.rs b/src/checkpoint/executor.rs index b780a03..5345869 100644 --- a/src/checkpoint/executor.rs +++ b/src/checkpoint/executor.rs @@ -188,13 +188,7 @@ impl CheckpointExecutor { pub async fn unwind_database(&self, checkpoint_dir: &Path, target_block: u64) -> Result<()> { tracing::info!("Unwinding database at {:?} to block {}", checkpoint_dir, target_block); - let mut cmd = Command::new(&self.reth_path); - cmd.arg("stage") - .arg("unwind") - .arg("--datadir") - .arg(checkpoint_dir) - .arg("to-block") - .arg(target_block.to_string()); + let mut cmd = reth_unwind_command(&self.reth_path, checkpoint_dir, target_block); // Capture stdout/stderr cmd.stdout(Stdio::piped()); @@ -295,6 +289,22 @@ impl CheckpointExecutor { } } +fn reth_unwind_command(reth_path: &Path, checkpoint_dir: &Path, target_block: u64) -> Command { + let mut cmd = Command::new(reth_path); + // Offline maintenance commands do not need a live custodian. Explicitly use + // the built-in purpose keys because newer Seismic Reth versions default to + // fetching purpose keys from the custodian socket before every stage command. + cmd.arg("--seismic.purpose-keys-source") + .arg("built-in") + .arg("stage") + .arg("unwind") + .arg("--datadir") + .arg(checkpoint_dir) + .arg("to-block") + .arg(target_block.to_string()); + cmd +} + /// Recursively copy a directory and its contents fn copy_dir_recursive(source: &Path, destination: &Path) -> Result<()> { if !destination.exists() { @@ -315,3 +325,30 @@ fn copy_dir_recursive(source: &Path, destination: &Path) -> Result<()> { Ok(()) } + +#[cfg(test)] +mod tests { + use super::reth_unwind_command; + use std::{ffi::OsStr, path::Path}; + + #[test] + fn reth_unwind_uses_built_in_purpose_keys() { + let command = reth_unwind_command(Path::new("reth"), Path::new("/tmp/checkpoint"), 9998); + let args = command.as_std().get_args().collect::>(); + + assert_eq!( + args, + [ + "--seismic.purpose-keys-source", + "built-in", + "stage", + "unwind", + "--datadir", + "/tmp/checkpoint", + "to-block", + "9998", + ] + .map(OsStr::new) + ); + } +} diff --git a/src/config.rs b/src/config.rs index 17a5974..6d12d85 100644 --- a/src/config.rs +++ b/src/config.rs @@ -4,6 +4,8 @@ use std::path::PathBuf; use crate::error::{CheckpointerError, Result}; +const DEFAULT_POLL_INTERVAL_SECS: u64 = 30; + /// Main configuration structure #[derive(Debug, Clone, Serialize, Deserialize)] pub struct Config { @@ -128,7 +130,7 @@ impl Config { .set_default("summit.enabled", false)? .set_default("summit.rpc_url", "http://localhost:5052")? .set_default("summit.rpc_timeout_secs", 100)? - .set_default("monitor.poll_interval_secs", 12)? + .set_default("monitor.poll_interval_secs", DEFAULT_POLL_INTERVAL_SECS)? .set_default("monitor.retry_interval_secs", 60)? .set_default("state.state_file", "./checkpointer_state.cbor")? .set_default("logging.level", "info")? @@ -273,7 +275,12 @@ fn validate_summit_rpc_timeout(rpc_timeout_secs: u64) -> Result<()> { #[cfg(test)] mod tests { - use super::{validate_max_snapshots, validate_summit_rpc_timeout}; + use super::{validate_max_snapshots, validate_summit_rpc_timeout, DEFAULT_POLL_INTERVAL_SECS}; + + #[test] + fn default_poll_interval_is_thirty_seconds() { + assert_eq!(DEFAULT_POLL_INTERVAL_SECS, 30); + } #[test] fn max_snapshots_must_be_positive_when_set() { From 3d47675f8be40bd6e2a77a86d5b8150bad60995f Mon Sep 17 00:00:00 2001 From: Matthias Wright Date: Thu, 27 Aug 2026 00:35:07 +0800 Subject: [PATCH 3/3] chore: configurable RPC binding support --- config.example.toml | 6 +++- src/config.rs | 76 +++++++++++++++++++++++++++++++++++++++++++-- src/main.rs | 6 ++-- 3 files changed, 82 insertions(+), 6 deletions(-) diff --git a/config.example.toml b/config.example.toml index 066f25b..092aeb8 100644 --- a/config.example.toml +++ b/config.example.toml @@ -1,5 +1,9 @@ # Summit-Checkpointer Example Configuration -# Copy this file to config.toml and adjust for your setup +# Copy this file to config.toml and adjust for your setup. +# +# The RPC server bind address and port are CLI options rather than TOML values: +# --bind-address 0.0.0.0 # Existing default; use 127.0.0.1 for local-only RPC +# --port 42069 # ============================================================================ # Reth Configuration diff --git a/src/config.rs b/src/config.rs index 6d12d85..c990c22 100644 --- a/src/config.rs +++ b/src/config.rs @@ -1,6 +1,9 @@ use clap::Parser; use serde::{Deserialize, Serialize}; -use std::path::PathBuf; +use std::{ + net::{IpAddr, SocketAddr}, + path::PathBuf, +}; use crate::error::{CheckpointerError, Result}; @@ -109,10 +112,21 @@ pub struct Cli { #[arg(long)] pub log_format: Option, + /// IP address on which the checkpointer RPC server listens. + #[arg(long, default_value = "0.0.0.0")] + pub bind_address: IpAddr, + + /// Port on which the checkpointer RPC server listens. #[arg(short = 'p', long, default_value = "42069")] pub port: u16, } +impl Cli { + pub fn rpc_socket_address(&self) -> SocketAddr { + SocketAddr::new(self.bind_address, self.port) + } +} + impl Config { /// Load configuration from file, environment variables, and CLI arguments pub fn load(cli: &Cli) -> Result { @@ -275,7 +289,13 @@ fn validate_summit_rpc_timeout(rpc_timeout_secs: u64) -> Result<()> { #[cfg(test)] mod tests { - use super::{validate_max_snapshots, validate_summit_rpc_timeout, DEFAULT_POLL_INTERVAL_SECS}; + use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}; + + use clap::Parser; + + use super::{ + validate_max_snapshots, validate_summit_rpc_timeout, Cli, DEFAULT_POLL_INTERVAL_SECS, + }; #[test] fn default_poll_interval_is_thirty_seconds() { @@ -294,4 +314,56 @@ mod tests { assert!(validate_summit_rpc_timeout(100).is_ok()); assert!(validate_summit_rpc_timeout(0).is_err()); } + + #[test] + fn rpc_server_preserves_existing_default_socket_address() { + let cli = Cli::try_parse_from(["summit-checkpointer"]).unwrap(); + + assert_eq!( + cli.rpc_socket_address(), + SocketAddr::new(IpAddr::V4(Ipv4Addr::UNSPECIFIED), 42069) + ); + } + + #[test] + fn rpc_server_accepts_custom_ipv4_socket_address() { + let cli = Cli::try_parse_from([ + "summit-checkpointer", + "--bind-address", + "127.0.0.1", + "--port", + "43000", + ]) + .unwrap(); + + assert_eq!( + cli.rpc_socket_address(), + SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 43000) + ); + } + + #[test] + fn rpc_server_accepts_custom_ipv6_socket_address() { + let cli = Cli::try_parse_from([ + "summit-checkpointer", + "--bind-address", + "::1", + "--port", + "43001", + ]) + .unwrap(); + + assert_eq!( + cli.rpc_socket_address(), + SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 43001) + ); + } + + #[test] + fn rpc_server_rejects_invalid_bind_address() { + let result = + Cli::try_parse_from(["summit-checkpointer", "--bind-address", "not-an-ip-address"]); + + assert!(result.is_err()); + } } diff --git a/src/main.rs b/src/main.rs index 830b687..19c0bb2 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,5 @@ use clap::Parser; -use std::{net::SocketAddr, sync::Arc}; +use std::sync::Arc; use tokio_util::sync::CancellationToken; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -75,10 +75,10 @@ async fn main() -> Result<()> { ); tracing::info!("Block monitor initialized, starting main loop"); - let addr: SocketAddr = format!("0.0.0.0:{}", cli.port).parse().unwrap(); + let rpc_socket_address = cli.rpc_socket_address(); let server_handle = - RpcServer::new(config.checkpoint.output_dir.clone()).start_server(addr).await; + RpcServer::new(config.checkpoint.output_dir.clone()).start_server(rpc_socket_address).await; // Run until cancelled monitor.run_until_cancelled(shutdown_token).await?;