From 537c9c8a981a1c82724576e5fe4e80b60dd156a5 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 26 Nov 2024 10:38:16 +0800 Subject: [PATCH 01/61] Exit validator --- Cargo.lock | 1144 ++++++++-------------- validator_manager/Cargo.toml | 3 + validator_manager/src/exit_validators.rs | 400 ++++++++ validator_manager/src/lib.rs | 5 + 4 files changed, 822 insertions(+), 730 deletions(-) create mode 100644 validator_manager/src/exit_validators.rs diff --git a/Cargo.lock b/Cargo.lock index d7ce7b9f6c3..07422252780 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,9 +59,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" dependencies = [ "gimli", ] @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.20" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy-consensus" @@ -177,9 +177,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.1" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" +checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -204,9 +204,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.12" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fce5dbd6a4f118eecc4719eaa9c7ffc31c315e6c5ccde3642db927802312425" +checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" dependencies = [ "alloy-rlp", "arbitrary", @@ -215,22 +215,16 @@ dependencies = [ "const-hex", "derive_arbitrary", "derive_more 1.0.0", - "foldhash", "getrandom", - "hashbrown 0.15.1", "hex-literal", - "indexmap 2.6.0", "itoa", "k256 0.13.4", "keccak-asm", - "paste", "proptest", "proptest-derive", "rand", "ruint", - "rustc-hash 2.0.0", "serde", - "sha3 0.10.8", "tiny-keccak", ] @@ -253,7 +247,7 @@ checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -279,9 +273,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.18" +version = "0.6.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" dependencies = [ "anstyle", "anstyle-parse", @@ -294,49 +288,49 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.10" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" [[package]] name = "anstyle-parse" -version = "0.2.6" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.2" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.6" +version = "3.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" dependencies = [ "anstyle", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.93" +version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" +checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] name = "arbitrary" -version = "1.4.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" dependencies = [ "derive_arbitrary", ] @@ -510,7 +504,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror 1.0.69", + "thiserror", "time", ] @@ -522,7 +516,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", "synstructure", ] @@ -534,7 +528,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -556,9 +550,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.4.0" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" dependencies = [ "async-lock", "cfg-if", @@ -567,7 +561,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.41", + "rustix 0.38.37", "slab", "tracing", "windows-sys 0.59.0", @@ -586,13 +580,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.83" +version = "0.1.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -649,20 +643,20 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] name = "autocfg" -version = "1.4.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" [[package]] name = "axum" -version = "0.7.9" +version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" +checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" dependencies = [ "async-trait", "axum-core", @@ -671,7 +665,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.1", "http-body-util", - "hyper 1.5.1", + "hyper 1.4.1", "hyper-util", "itoa", "matchit", @@ -684,9 +678,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.2", + "sync_wrapper 1.0.1", "tokio", - "tower", + "tower 0.5.1", "tower-layer", "tower-service", "tracing", @@ -694,9 +688,9 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.5" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" +checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" dependencies = [ "async-trait", "bytes", @@ -707,7 +701,7 @@ dependencies = [ "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.2", + "sync_wrapper 1.0.1", "tower-layer", "tower-service", "tracing", @@ -848,7 +842,7 @@ dependencies = [ "genesis", "hex", "http_api", - "hyper 1.5.1", + "hyper 1.4.1", "lighthouse_network", "monitoring_api", "node_test_rig", @@ -913,9 +907,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.5" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -930,7 +924,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.89", + "syn 2.0.77", "which", ] @@ -1145,9 +1139,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.8.0" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" +checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" dependencies = [ "serde", ] @@ -1217,7 +1211,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -1228,9 +1222,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.1" +version = "1.1.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" +checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" dependencies = [ "jobserver", "libc", @@ -1354,9 +1348,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.21" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" +checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" dependencies = [ "clap_builder", "clap_derive", @@ -1364,9 +1358,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.21" +version = "4.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" +checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" dependencies = [ "anstream", "anstyle", @@ -1384,14 +1378,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] name = "clap_lex" -version = "0.7.3" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" [[package]] name = "clap_utils" @@ -1462,9 +1456,9 @@ dependencies = [ [[package]] name = "colorchoice" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" [[package]] name = "compare_fields" @@ -1493,9 +1487,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.13.2" +version = "1.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "487981fa1af147182687064d0a2c336586d337a606595ced9ffb0c685c250c73" +checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" dependencies = [ "cfg-if", "cpufeatures", @@ -1549,9 +1543,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.16" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" +checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" dependencies = [ "libc", ] @@ -1800,7 +1794,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -1848,7 +1842,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -1870,7 +1864,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -1895,9 +1889,9 @@ dependencies = [ [[package]] name = "dary_heap" -version = "0.3.7" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728" +checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" [[package]] name = "data-encoding" @@ -2030,13 +2024,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.4.1" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2049,7 +2043,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2069,15 +2063,15 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", "unicode-xid", ] [[package]] name = "diesel" -version = "2.2.5" +version = "2.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf9649c05e0a9dbd6d0b0b8301db5182b972d0fd02f0a7c6736cf632d7c0fd5" +checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e" dependencies = [ "bitflags 2.6.0", "byteorder", @@ -2097,7 +2091,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2117,7 +2111,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2232,7 +2226,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2263,7 +2257,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2408,9 +2402,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.35" +version = "0.8.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" dependencies = [ "cfg-if", ] @@ -2443,7 +2437,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2714,7 +2708,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.9.1", - "thiserror 1.0.69", + "thiserror", "uint 0.9.5", ] @@ -2731,7 +2725,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.10.8", - "thiserror 1.0.69", + "thiserror", "uint 0.9.5", ] @@ -2837,7 +2831,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -2856,7 +2850,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -2923,7 +2917,7 @@ dependencies = [ "serde_json", "strum", "syn 1.0.109", - "thiserror 1.0.69", + "thiserror", "tiny-keccak", "unicode-xid", ] @@ -2951,7 +2945,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 1.0.69", + "thiserror", "tokio", "tracing", "tracing-futures", @@ -3090,9 +3084,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.2.0" +version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" +checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" [[package]] name = "fastrlp" @@ -3112,7 +3106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" dependencies = [ "libc", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -3200,9 +3194,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.35" +version = "1.0.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" +checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" dependencies = [ "crc32fast", "libz-sys", @@ -3215,12 +3209,6 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" -[[package]] -name = "foldhash" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" - [[package]] name = "foreign-types" version = "0.3.2" @@ -3285,9 +3273,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -3326,9 +3314,9 @@ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -3344,9 +3332,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.5.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" dependencies = [ "futures-core", "pin-project-lite", @@ -3360,7 +3348,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -3370,7 +3358,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.18", + "rustls 0.23.13", "rustls-pki-types", ] @@ -3487,9 +3475,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.1" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" [[package]] name = "git-version" @@ -3508,7 +3496,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -3596,7 +3584,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.6.0", + "indexmap 2.5.0", "slab", "tokio", "tokio-util", @@ -3644,18 +3632,6 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "hashbrown" -version = "0.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash", - "serde", -] - [[package]] name = "hashers" version = "1.0.1" @@ -3779,7 +3755,7 @@ dependencies = [ "once_cell", "rand", "socket2", - "thiserror 1.0.69", + "thiserror", "tinyvec", "tokio", "tracing", @@ -3802,7 +3778,7 @@ dependencies = [ "rand", "resolv-conf", "smallvec", - "thiserror 1.0.69", + "thiserror", "tokio", "tracing", ] @@ -4001,9 +3977,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.5" +version = "1.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" +checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" [[package]] name = "httpdate" @@ -4019,9 +3995,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.31" +version = "0.14.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" +checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" dependencies = [ "bytes", "futures-channel", @@ -4043,9 +4019,9 @@ dependencies = [ [[package]] name = "hyper" -version = "1.5.1" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" +checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" dependencies = [ "bytes", "futures-channel", @@ -4068,7 +4044,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.30", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -4081,7 +4057,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.31", + "hyper 0.14.30", "native-tls", "tokio", "tokio-native-tls", @@ -4089,17 +4065,18 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.10" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" +checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" dependencies = [ "bytes", "futures-util", "http 1.1.0", "http-body 1.0.1", - "hyper 1.5.1", + "hyper 1.4.1", "pin-project-lite", "tokio", + "tower 0.4.13", "tower-service", ] @@ -4126,124 +4103,6 @@ dependencies = [ "cc", ] -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", -] - [[package]] name = "ident_case" version = "1.0.1" @@ -4262,23 +4121,12 @@ dependencies = [ [[package]] name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ - "icu_normalizer", - "icu_properties", + "unicode-bidi", + "unicode-normalization", ] [[package]] @@ -4293,9 +4141,9 @@ dependencies = [ [[package]] name = "if-watch" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" +checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" dependencies = [ "async-io", "core-foundation", @@ -4304,12 +4152,8 @@ dependencies = [ "if-addrs", "ipnet", "log", - "netlink-packet-core", - "netlink-packet-route", - "netlink-proto", - "netlink-sys", "rtnetlink", - "system-configuration 0.6.1", + "system-configuration", "tokio", "windows", ] @@ -4325,7 +4169,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.30", "log", "rand", "tokio", @@ -4348,7 +4192,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.7.0", + "parity-scale-codec 3.6.12", ] [[package]] @@ -4380,13 +4224,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.3" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 1.0.109", ] [[package]] @@ -4407,14 +4251,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.6.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" +checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ - "arbitrary", "equivalent", - "hashbrown 0.15.1", - "serde", + "hashbrown 0.14.5", ] [[package]] @@ -4506,9 +4348,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.1" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" +checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" [[package]] name = "is-terminal" @@ -4556,9 +4398,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.13" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] name = "jobserver" @@ -4571,9 +4413,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.72" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" +checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" dependencies = [ "wasm-bindgen", ] @@ -4744,9 +4586,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.164" +version = "0.2.158" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" +checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" [[package]] name = "libflate" @@ -4784,9 +4626,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.11" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" [[package]] name = "libmdbx" @@ -4800,7 +4642,7 @@ dependencies = [ "libc", "mdbx-sys", "parking_lot 0.12.3", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -4832,7 +4674,7 @@ dependencies = [ "multiaddr", "pin-project", "rw-stream-sink", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -4880,7 +4722,7 @@ dependencies = [ "rand", "rw-stream-sink", "smallvec", - "thiserror 1.0.69", + "thiserror", "tracing", "unsigned-varint 0.8.0", "void", @@ -4921,16 +4763,16 @@ dependencies = [ "quick-protobuf", "quick-protobuf-codec", "smallvec", - "thiserror 1.0.69", + "thiserror", "tracing", "void", ] [[package]] name = "libp2p-identity" -version = "0.2.10" +version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "257b5621d159b32282eac446bed6670c39c7dc68a200a992d8f056afa0066f6d" +checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8" dependencies = [ "asn1_der", "bs58 0.5.1", @@ -4943,8 +4785,9 @@ dependencies = [ "rand", "sec1 0.7.3", "sha2 0.10.8", - "thiserror 1.0.69", + "thiserror", "tracing", + "void", "zeroize", ] @@ -5024,7 +4867,7 @@ dependencies = [ "sha2 0.10.8", "snow", "static_assertions", - "thiserror 1.0.69", + "thiserror", "tracing", "x25519-dalek", "zeroize", @@ -5063,9 +4906,9 @@ dependencies = [ "quinn", "rand", "ring 0.17.8", - "rustls 0.23.18", + "rustls 0.23.13", "socket2", - "thiserror 1.0.69", + "thiserror", "tokio", "tracing", ] @@ -5103,7 +4946,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -5135,9 +4978,9 @@ dependencies = [ "libp2p-identity", "rcgen", "ring 0.17.8", - "rustls 0.23.18", + "rustls 0.23.13", "rustls-webpki 0.101.7", - "thiserror 1.0.69", + "thiserror", "x509-parser", "yasna", ] @@ -5167,10 +5010,10 @@ dependencies = [ "either", "futures", "libp2p-core", - "thiserror 1.0.69", + "thiserror", "tracing", "yamux 0.12.1", - "yamux 0.13.4", + "yamux 0.13.3", ] [[package]] @@ -5379,12 +5222,6 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - [[package]] name = "lmdb-rkv" version = "0.14.0" @@ -5453,11 +5290,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.5" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" +checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" dependencies = [ - "hashbrown 0.15.1", + "hashbrown 0.14.5", ] [[package]] @@ -5586,18 +5423,18 @@ dependencies = [ [[package]] name = "metastruct" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d74f54f231f9a18d77393ecc5cc7ab96709b2a61ee326c2b2b291009b0cc5a07" +checksum = "f00a5ba4a0f3453c31c397b214e1675d95b697c33763aa58add57ea833424384" dependencies = [ "metastruct_macro", ] [[package]] name = "metastruct_macro" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "985e7225f3a4dfbec47a0c6a730a874185fda840d365d7bbd6ba199dd81796d5" +checksum = "7c3a991d4536c933306e52f0e8ab303757185ec13a09d1f3e1cbde5a0d8410bf" dependencies = [ "darling 0.13.4", "itertools 0.10.5", @@ -5733,9 +5570,9 @@ checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" [[package]] name = "multiaddr" -version = "0.18.2" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" +checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" dependencies = [ "arrayref", "byteorder", @@ -5746,7 +5583,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.8.0", + "unsigned-varint 0.7.2", "url", ] @@ -5763,12 +5600,12 @@ dependencies = [ [[package]] name = "multihash" -version = "0.19.2" +version = "0.19.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc41f430805af9d1cf4adae4ed2149c759b877b01d909a1f40256188d09345d2" +checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" dependencies = [ "core2", - "unsigned-varint 0.8.0", + "unsigned-varint 0.7.2", ] [[package]] @@ -5804,20 +5641,21 @@ dependencies = [ [[package]] name = "netlink-packet-core" -version = "0.7.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" dependencies = [ "anyhow", "byteorder", + "libc", "netlink-packet-utils", ] [[package]] name = "netlink-packet-route" -version = "0.17.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" dependencies = [ "anyhow", "bitflags 1.3.2", @@ -5836,21 +5674,21 @@ dependencies = [ "anyhow", "byteorder", "paste", - "thiserror 1.0.69", + "thiserror", ] [[package]] name = "netlink-proto" -version = "0.11.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b33524dc0968bfad349684447bfce6db937a9ac3332a1fe60c0c5a5ce63f21" +checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" dependencies = [ "bytes", "futures", "log", "netlink-packet-core", "netlink-sys", - "thiserror 1.0.69", + "thiserror", "tokio", ] @@ -5928,17 +5766,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nix" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" -dependencies = [ - "bitflags 1.3.2", - "cfg-if", - "libc", -] - [[package]] name = "nix" version = "0.29.0" @@ -6079,9 +5906,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.5" +version = "0.36.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" +checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" dependencies = [ "memchr", ] @@ -6097,9 +5924,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.20.2" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oneshot_broadcast" @@ -6147,9 +5974,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.68" +version = "0.10.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" +checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -6168,7 +5995,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -6179,18 +6006,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.4.1+3.4.0" +version = "300.3.2+3.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" +checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.104" +version = "0.9.103" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" +checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" dependencies = [ "cc", "libc", @@ -6264,16 +6091,15 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.7.0" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be4817d39f3272f69c59fe05d0535ae6456c2dc2fa1ba02910296c7e0a5c590" +checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" dependencies = [ "arrayvec", "bitvec 1.0.1", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.7.0", - "rustversion", + "parity-scale-codec-derive 3.6.12", "serde", ] @@ -6291,14 +6117,14 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.7.0" +version = "3.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8781a75c6205af67215f382092b6e0a4ff3734798523e69073d4bcd294ec767b" +checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 1.0.109", ] [[package]] @@ -6350,7 +6176,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.7", + "redox_syscall 0.5.4", "smallvec", "windows-targets 0.52.6", ] @@ -6420,12 +6246,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.14" +version = "2.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" +checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", - "thiserror 1.0.69", + "thiserror", "ucd-trie", ] @@ -6459,29 +6285,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.7" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.7" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] name = "pin-project-lite" -version = "0.2.15" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" [[package]] name = "pin-utils" @@ -6511,9 +6337,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.31" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "platforms" @@ -6551,15 +6377,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.41", + "rustix 0.38.37", "tracing", "windows-sys 0.59.0", ] @@ -6650,12 +6476,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.25" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" +checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" dependencies = [ "proc-macro2", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -6710,14 +6536,14 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.22", + "toml_edit 0.22.21", ] [[package]] name = "proc-macro2" -version = "1.0.92" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" dependencies = [ "unicode-ident", ] @@ -6749,7 +6575,7 @@ dependencies = [ "memchr", "parking_lot 0.12.3", "protobuf", - "thiserror 1.0.69", + "thiserror", ] [[package]] @@ -6772,7 +6598,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -6789,7 +6615,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.5", + "regex-syntax 0.8.4", "rusty-fork", "tempfile", "unarray", @@ -6803,7 +6629,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -6840,7 +6666,7 @@ dependencies = [ "num_cpus", "once_cell", "platforms", - "thiserror 1.0.69", + "thiserror", "unescape", ] @@ -6867,7 +6693,7 @@ dependencies = [ "asynchronous-codec", "bytes", "quick-protobuf", - "thiserror 1.0.69", + "thiserror", "unsigned-varint 0.8.0", ] @@ -6895,9 +6721,9 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.6" +version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" +checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" dependencies = [ "bytes", "futures-io", @@ -6905,40 +6731,36 @@ dependencies = [ "quinn-proto", "quinn-udp", "rustc-hash 2.0.0", - "rustls 0.23.18", + "rustls 0.23.13", "socket2", - "thiserror 2.0.3", + "thiserror", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.9" +version = "0.11.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" +checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" dependencies = [ "bytes", - "getrandom", "rand", "ring 0.17.8", "rustc-hash 2.0.0", - "rustls 0.23.18", - "rustls-pki-types", + "rustls 0.23.13", "slab", - "thiserror 2.0.3", + "thiserror", "tinyvec", "tracing", - "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.7" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" +checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" dependencies = [ - "cfg_aliases", "libc", "once_cell", "socket2", @@ -6997,7 +6819,6 @@ dependencies = [ "libc", "rand_chacha", "rand_core", - "serde", ] [[package]] @@ -7062,9 +6883,9 @@ dependencies = [ [[package]] name = "redb" -version = "2.2.0" +version = "2.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84b1de48a7cf7ba193e81e078d17ee2b786236eed1d3f7c60f8a09545efc4925" +checksum = "074373f3e7e5d27d8741d19512232adb47be8622d3daef3a45bcae72050c3d2a" dependencies = [ "libc", ] @@ -7080,9 +6901,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.7" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" +checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" dependencies = [ "bitflags 2.6.0", ] @@ -7095,19 +6916,19 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror 1.0.69", + "thiserror", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.9", - "regex-syntax 0.8.5", + "regex-automata 0.4.7", + "regex-syntax 0.8.4", ] [[package]] @@ -7121,13 +6942,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.5", + "regex-syntax 0.8.4", ] [[package]] @@ -7138,9 +6959,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" [[package]] name = "reqwest" @@ -7156,7 +6977,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.31", + "hyper 0.14.30", "hyper-rustls", "hyper-tls", "ipnet", @@ -7173,7 +6994,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration 0.5.1", + "system-configuration", "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", @@ -7297,19 +7118,16 @@ dependencies = [ [[package]] name = "rtnetlink" -version = "0.13.1" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" dependencies = [ "futures", "log", - "netlink-packet-core", "netlink-packet-route", - "netlink-packet-utils", "netlink-proto", - "netlink-sys", - "nix 0.26.4", - "thiserror 1.0.69", + "nix 0.24.3", + "thiserror", "tokio", ] @@ -7327,7 +7145,7 @@ dependencies = [ "fastrlp", "num-bigint", "num-traits", - "parity-scale-codec 3.7.0", + "parity-scale-codec 3.6.12", "primitive-types 0.12.2", "proptest", "rand", @@ -7439,9 +7257,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.41" +version = "0.38.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" +checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" dependencies = [ "bitflags 2.6.0", "errno", @@ -7478,9 +7296,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.18" +version = "0.23.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" +checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" dependencies = [ "once_cell", "ring 0.17.8", @@ -7501,21 +7319,19 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.2.0" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" dependencies = [ + "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.10.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" -dependencies = [ - "web-time", -] +checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" [[package]] name = "rustls-webpki" @@ -7540,9 +7356,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.18" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" [[package]] name = "rusty-fork" @@ -7597,33 +7413,33 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.6" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" +checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" dependencies = [ "cfg-if", - "derive_more 1.0.0", - "parity-scale-codec 3.7.0", + "derive_more 0.99.18", + "parity-scale-codec 3.6.12", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.6" +version = "2.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" +checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.89", + "syn 1.0.109", ] [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" dependencies = [ "windows-sys 0.59.0", ] @@ -7714,9 +7530,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.1" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" +checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" dependencies = [ "core-foundation-sys", "libc", @@ -7742,9 +7558,9 @@ dependencies = [ [[package]] name = "semver-parser" -version = "0.10.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ "pest", ] @@ -7765,9 +7581,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.215" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" +checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" dependencies = [ "serde_derive", ] @@ -7784,20 +7600,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.215" +version = "1.0.210" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" +checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] name = "serde_json" -version = "1.0.133" +version = "1.0.128" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" +checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" dependencies = [ "itoa", "memchr", @@ -7823,14 +7639,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] name = "serde_spanned" -version = "0.6.8" +version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" dependencies = [ "serde", ] @@ -7875,7 +7691,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.5.0", "itoa", "ryu", "serde", @@ -8017,7 +7833,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror 1.0.69", + "thiserror", "time", ] @@ -8405,7 +8221,7 @@ dependencies = [ "tempfile", "types", "xdelta3", - "zstd 0.13.2", + "zstd 0.13.1", ] [[package]] @@ -8496,9 +8312,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.89" +version = "2.0.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" +checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" dependencies = [ "proc-macro2", "quote", @@ -8513,9 +8329,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.2" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" [[package]] name = "synstructure" @@ -8525,7 +8341,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -8551,18 +8367,7 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys 0.5.0", -] - -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.6.0", - "core-foundation", - "system-configuration-sys 0.6.0", + "system-configuration-sys", ] [[package]] @@ -8575,16 +8380,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-configuration-sys" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "system_health" version = "0.1.0" @@ -8637,14 +8432,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.14.0" +version = "3.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" +checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" dependencies = [ "cfg-if", "fastrand", "once_cell", - "rustix 0.38.41", + "rustix 0.38.37", "windows-sys 0.59.0", ] @@ -8670,12 +8465,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef" +checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" dependencies = [ - "rustix 0.38.41", - "windows-sys 0.59.0", + "rustix 0.38.37", + "windows-sys 0.48.0", ] [[package]] @@ -8713,42 +8508,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" -dependencies = [ - "thiserror-impl 2.0.3", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", + "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "2.0.3" +version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" +checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -8856,7 +8631,7 @@ dependencies = [ "rand", "rustc-hash 1.1.0", "sha2 0.10.8", - "thiserror 1.0.69", + "thiserror", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -8871,16 +8646,6 @@ dependencies = [ "crunchy", ] -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tinytemplate" version = "1.2.1" @@ -8908,9 +8673,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.41.1" +version = "1.40.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" +checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" dependencies = [ "backtrace", "bytes", @@ -8941,7 +8706,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -9046,7 +8811,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.22", + "toml_edit 0.22.21", ] [[package]] @@ -9064,22 +8829,37 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.5.0", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.22" +version = "0.22.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" dependencies = [ - "indexmap 2.6.0", + "indexmap 2.5.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.20", + "winnow 0.6.18", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "pin-project", + "pin-project-lite", + "tokio", + "tower-layer", + "tower-service", ] [[package]] @@ -9129,7 +8909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror 1.0.69", + "thiserror", "time", "tracing-subscriber", ] @@ -9142,7 +8922,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -9233,7 +9013,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -9248,9 +9028,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.14" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" dependencies = [ "serde", "stable_deref_trait", @@ -9323,9 +9103,9 @@ dependencies = [ [[package]] name = "ucd-trie" -version = "0.1.7" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" +checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" [[package]] name = "uint" @@ -9365,21 +9145,24 @@ checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" [[package]] name = "unicase" -version = "2.8.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] [[package]] name = "unicode-bidi" -version = "0.3.17" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" [[package]] name = "unicode-normalization" @@ -9392,9 +9175,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.3" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" [[package]] name = "unicode-xid" @@ -9457,27 +9240,15 @@ dependencies = [ [[package]] name = "url" -version = "2.5.4" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", - "idna 1.0.3", + "idna 0.5.0", "percent-encoding", ] -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "utf8parse" version = "0.2.2" @@ -9509,7 +9280,7 @@ dependencies = [ "eth2", "fdlimit", "graffiti_file", - "hyper 1.5.1", + "hyper 1.4.1", "initialized_validators", "metrics", "monitoring_api", @@ -9613,6 +9384,7 @@ name = "validator_manager" version = "0.1.0" dependencies = [ "account_utils", + "beacon_chain", "clap", "clap_utils", "derivative", @@ -9622,6 +9394,7 @@ dependencies = [ "eth2_wallet", "ethereum_serde_utils", "hex", + "http_api", "regex", "serde", "serde_json", @@ -9748,13 +9521,13 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper 0.14.31", + "hyper 0.14.30", "log", "mime", "mime_guess", "percent-encoding", "pin-project", - "rustls-pemfile 2.2.0", + "rustls-pemfile 2.1.3", "scoped-tls", "serde", "serde_json", @@ -9799,9 +9572,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" +checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" dependencies = [ "cfg-if", "once_cell", @@ -9810,24 +9583,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" +checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.45" +version = "0.4.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" +checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" dependencies = [ "cfg-if", "js-sys", @@ -9837,9 +9610,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" +checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9847,28 +9620,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" +checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", + "syn 2.0.77", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.95" +version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" +checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" [[package]] name = "wasm-streams" -version = "0.4.2" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -9907,7 +9680,7 @@ dependencies = [ "env_logger 0.9.3", "eth2", "http_api", - "hyper 1.5.1", + "hyper 1.4.1", "log", "logging", "network", @@ -9928,9 +9701,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.72" +version = "0.3.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" +checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" dependencies = [ "js-sys", "wasm-bindgen", @@ -9989,7 +9762,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.41", + "rustix 0.38.37", ] [[package]] @@ -9998,7 +9771,7 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.5.7", + "redox_syscall 0.5.4", "wasite", "web-sys", ] @@ -10048,12 +9821,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.53.0" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-core 0.53.0", - "windows-targets 0.52.6", + "windows-core 0.51.1", + "windows-targets 0.48.5", ] [[package]] @@ -10070,28 +9843,18 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.52.0" +version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" dependencies = [ - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] name = "windows-core" -version = "0.53.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" -dependencies = [ - "windows-result", - "windows-targets 0.52.6", -] - -[[package]] -name = "windows-result" -version = "0.1.2" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ "windows-targets 0.52.6", ] @@ -10321,9 +10084,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.20" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" dependencies = [ "memchr", ] @@ -10338,18 +10101,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -10363,7 +10114,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper", - "thiserror 1.0.69", + "thiserror", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -10409,7 +10160,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror 1.0.69", + "thiserror", "time", ] @@ -10429,9 +10180,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.23" +version = "0.8.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" +checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" [[package]] name = "xmltree" @@ -10470,9 +10221,9 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.4" +version = "0.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17610762a1207ee816c6fadc29220904753648aba0a9ed61c7b8336e80a559c4" +checksum = "a31b5e376a8b012bee9c423acdbb835fc34d45001cfa3106236a624e4b738028" dependencies = [ "futures", "log", @@ -10493,30 +10244,6 @@ dependencies = [ "time", ] -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.7.35" @@ -10535,28 +10262,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", -] - -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", - "synstructure", + "syn 2.0.77", ] [[package]] @@ -10576,29 +10282,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.89", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.89", + "syn 2.0.77", ] [[package]] @@ -10632,11 +10316,11 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.2" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" +checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" dependencies = [ - "zstd-safe 7.2.1", + "zstd-safe 7.1.0", ] [[package]] @@ -10651,9 +10335,9 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.2.1" +version = "7.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" +checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" dependencies = [ "zstd-sys", ] diff --git a/validator_manager/Cargo.toml b/validator_manager/Cargo.toml index 4f367b8f5b1..1e5620cf9b4 100644 --- a/validator_manager/Cargo.toml +++ b/validator_manager/Cargo.toml @@ -26,3 +26,6 @@ derivative = { workspace = true } tempfile = { workspace = true } regex = { workspace = true } validator_http_api = { workspace = true } +http_api = { workspace = true } +beacon_chain = { workspace = true } + diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs new file mode 100644 index 00000000000..1abc469bcd9 --- /dev/null +++ b/validator_manager/src/exit_validators.rs @@ -0,0 +1,400 @@ +use crate::{common::vc_http_client, DumpConfig}; + +use clap::{Arg, ArgAction, ArgMatches, Command}; +use eth2::types::Epoch; +use eth2::{BeaconNodeHttpClient, SensitiveUrl, Timeouts}; +use serde::{Deserialize, Serialize}; +use serde_json; +use std::path::PathBuf; +use std::time::Duration; +use types::PublicKeyBytes; + +pub const CMD: &str = "exit"; +pub const BEACON_URL_FLAG: &str = "beacon-node"; +pub const VALIDATORS_FILE_FLAG: &str = "validators-file"; +pub const VC_URL_FLAG: &str = "vc-url"; +pub const VC_TOKEN_FLAG: &str = "vc-token"; +pub const VALIDATOR_FLAG: &str = "validators"; +pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; + +pub fn cli_app() -> Command { + Command::new(CMD) + .about("Exit validator using the HTTP API for a given validator keystore.") + .arg( + Arg::new(BEACON_URL_FLAG) + .long(BEACON_URL_FLAG) + .value_name("NETWORK_ADDRESS") + .help("Address to a beacon node HTTP API") + .action(ArgAction::Set) + .display_order(0), + ) + .arg( + Arg::new(VC_URL_FLAG) + .long(VC_URL_FLAG) + .value_name("HTTP_ADDRESS") + .help("A HTTP(S) address of a validator client using the keymanager-API.") + .default_value("http://localhost:5062") + .requires(VC_TOKEN_FLAG) + .action(ArgAction::Set) + .display_order(0), + ) + .arg( + Arg::new(VC_TOKEN_FLAG) + .long(VC_TOKEN_FLAG) + .value_name("PATH") + .help("The file containing a token required by the validator client.") + .action(ArgAction::Set) + .display_order(0), + ) + .arg( + Arg::new(VALIDATOR_FLAG) + .long(VALIDATOR_FLAG) + .value_name("STRING") + .help("List of validators (pubkey) to exit.") + .action(ArgAction::Set) + .display_order(0), + ) + .arg( + Arg::new(EXIT_EPOCH_FLAG) + .long(EXIT_EPOCH_FLAG) + .value_name("EPOCH") + .help("Provide the minimum epoch for processing voluntary exit.") + .action(ArgAction::Set) + .display_order(0), + ) +} + +#[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] +pub struct ExitConfig { + pub vc_url: SensitiveUrl, + pub vc_token_path: PathBuf, + pub validators_to_exit: PublicKeyBytes, + pub beacon_url: Option, + pub exit_epoch: Option, +} + +impl ExitConfig { + fn from_cli(matches: &ArgMatches) -> Result { + // let validator_to_exit_str = clap_utils::parse_required::(matches, VALIDATOR_FLAG)?; + + // let validators_to_exit = validators_to_exit_str + // .split(',') + // .map(|s| s.trim().parse()) + // .collect::, _>>()?; + + Ok(Self { + vc_url: clap_utils::parse_required(matches, VC_URL_FLAG)?, + vc_token_path: clap_utils::parse_required(matches, VC_TOKEN_FLAG)?, + validators_to_exit: clap_utils::parse_required(matches, VALIDATOR_FLAG)?, + beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, + exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, + }) + } +} + +pub async fn cli_run(matches: &ArgMatches, dump_config: DumpConfig) -> Result<(), String> { + let config = ExitConfig::from_cli(matches)?; + + if dump_config.should_exit_early(&config)? { + Ok(()) + } else { + run(config).await + } +} + +async fn run(config: ExitConfig) -> Result<(), String> { + let ExitConfig { + vc_url, + vc_token_path, + validators_to_exit, + beacon_url, + exit_epoch, + } = config; + + let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; + + // Check that the validators_to_exit is in the validator client + if !validators + .iter() + .any(|validator| validator.validating_pubkey == validators_to_exit) + { + return Err(format!("Validator {} doesn't exist", validators_to_exit)); + } + + let exit_message = http_client + .post_validator_voluntary_exit(&validators_to_exit, exit_epoch) + .await + .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; + + let exit_message_json = serde_json::to_string(&exit_message.data); + + match exit_message_json { + Ok(json) => println!("{}", json), + Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), + } + + if beacon_url.is_some() { + let beacon_node = if let Some(beacon_url) = beacon_url { + BeaconNodeHttpClient::new( + SensitiveUrl::parse(beacon_url.as_ref()) + .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, + Timeouts::set_all(Duration::from_secs(12)), + ) + } else { + return Err("Beacon URL is not provided".into()); + }; + + beacon_node + .post_beacon_pool_voluntary_exits(&exit_message.data) + .await + .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; + // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. + eprintln!( + "Successfully validated and published voluntary exit for validator {}", + validators_to_exit + ); + } + + Ok(()) +} + +#[cfg(not(debug_assertions))] +#[cfg(test)] +mod test { + use super::*; + use crate::{ + common::ValidatorSpecification, import_validators::tests::TestBuilder as ImportTestBuilder, + }; + use account_utils::eth2_keystore::KeystoreBuilder; + use account_utils::ZeroizeString; + use beacon_chain::test_utils::{ + AttestationStrategy, BeaconChainHarness, BlockStrategy, EphemeralHarnessType, + }; + use beacon_chain::ChainConfig; + use eth2::lighthouse_vc::types::KeystoreJsonStr; + use http_api::test_utils::InteractiveTester; + use std::{ + fs::{self, File}, + io::Write, + str::FromStr, + sync::Arc, + }; + use types::{ChainSpec, MainnetEthSpec}; + use validator_http_api::{test_utils::ApiTester, Config as HttpConfig}; + type E = MainnetEthSpec; + + struct TestBuilder { + exit_config: Option, + src_import_builder: Option, + http_config: HttpConfig, + vc_token: Option, + validators: Vec, + beacon_node: InteractiveTester, + index_of_validators_to_exit: usize, + } + + impl TestBuilder { + async fn new() -> Self { + let mut spec = ChainSpec::mainnet(); + spec.shard_committee_period = 1; + spec.altair_fork_epoch = Some(Epoch::new(0)); + spec.bellatrix_fork_epoch = Some(Epoch::new(1)); + spec.capella_fork_epoch = Some(Epoch::new(2)); + spec.deneb_fork_epoch = Some(Epoch::new(3)); + + // let harness = BeaconChainHarness::>::builder(E::default()) + // .spec(Arc::new(spec.clone())) + // .keypairs(vec![]) + // .fresh_ephemeral_store() + // .mock_execution_layer() + // .recalculate_fork_times_with_genesis(0) + // .mock_execution_layer_all_payloads_valid() + // .build(); + + let beacon_node = InteractiveTester::new(Some(spec), 64).await; + + Self { + exit_config: None, + src_import_builder: None, + http_config: ApiTester::default_http_config(), + vc_token: None, + validators: vec![], + beacon_node, + index_of_validators_to_exit: 0, + } + } + + async fn with_validators(mut self, index_of_validators_to_exit: usize) -> Self { + let mut builder = + ImportTestBuilder::new_with_http_config(self.http_config.clone()).await; + + self.vc_token = + Some(fs::read_to_string(builder.get_import_config().vc_token_path).unwrap()); + + let keystore = KeystoreBuilder::new( + &self.beacon_node.harness.validator_keypairs[index_of_validators_to_exit], + "password".as_bytes(), + "".into(), + ) + .unwrap() + .build() + .unwrap(); + + let local_validators: Vec = vec![ValidatorSpecification { + voting_keystore: KeystoreJsonStr(keystore), + voting_keystore_password: ZeroizeString::from_str("password").unwrap(), + slashing_protection: None, + fee_recipient: None, + gas_limit: None, + builder_proposals: None, + builder_boost_factor: None, + prefer_builder_proposals: None, + enabled: Some(true), + }]; + + let beacon_url = SensitiveUrl::parse(self.beacon_node.client.as_ref()).unwrap(); + + println!( + "Validator pubkey on beacon chain = {:?}", + self.beacon_node.harness.validator_keypairs[index_of_validators_to_exit].pk + ); + + let validators_to_exit = self.beacon_node.harness.validator_keypairs + [index_of_validators_to_exit] + .pk + .clone() + .into(); + + let import_config = builder.get_import_config(); + + let validators_dir = import_config.vc_token_path.parent().unwrap(); + let validators_file = validators_dir.join("validators.json"); + + builder = builder.mutate_import_config(|config| { + config.validators_file_path = Some(validators_file.clone()); + }); + + fs::write( + &validators_file, + serde_json::to_string(&local_validators).unwrap(), + ) + .unwrap(); + + //println!("{:?}", builder.get_import_config()); + + self.exit_config = Some(ExitConfig { + vc_url: import_config.vc_url, + vc_token_path: import_config.vc_token_path, + validators_to_exit, + beacon_url: Some(beacon_url), + exit_epoch: None, + }); + + self.validators = local_validators.clone(); + self.src_import_builder = Some(builder); + self.index_of_validators_to_exit = index_of_validators_to_exit; + self + } + + pub async fn run_test(self) -> TestResult { + let import_builder = self.src_import_builder.unwrap(); + let initialized_validators = import_builder.vc.initialized_validators.clone(); + let import_test_result = import_builder.run_test().await; + assert!(import_test_result.result.is_ok()); + + // only assign the validator index after validator is imported to the VC + initialized_validators.write().set_index( + &self.beacon_node.harness.validator_keypairs[self.index_of_validators_to_exit] + .pk + .compress(), + self.index_of_validators_to_exit as u64, + ); + + let path = self.exit_config.clone().unwrap().vc_token_path; + let url = self.exit_config.clone().unwrap().vc_url; + let parent = path.parent().unwrap(); + + fs::create_dir_all(parent).expect("Was not able to create parent directory"); + + File::options() + .write(true) + .read(true) + .create(true) + .truncate(true) + .open(path.clone()) + .unwrap() + .write_all(self.vc_token.clone().unwrap().as_bytes()) + .unwrap(); + + let (_, validators) = vc_http_client(url, path).await.unwrap(); + println!("Validators pubkey on VC = {:?}", validators); + + // Advance beacon chain + self.beacon_node.harness.advance_slot(); + + self.beacon_node + .harness + .extend_chain( + 100, + BlockStrategy::OnCanonicalHead, + AttestationStrategy::AllValidators, + ) + .await; + + self.beacon_node.harness.advance_slot(); + + println!( + "current slot: {:?}", + self.beacon_node.harness.get_current_slot() + ); + + let validator_to_exit = self.exit_config.as_ref().unwrap().validators_to_exit; + println!("Attempting to exit validator {:?}", validator_to_exit); + + let mut current_state = self.beacon_node.harness.get_current_state(); + let validator_index = current_state + .get_validator_index(&validator_to_exit) + .expect("should find validator"); + let validator = ¤t_state + .validators() + .get(validator_index.unwrap()) + .expect("validator should exist"); + + println!( + "validator status: activation_epoch={},exit_epoch{}", + validator.activation_epoch, validator.exit_epoch + ); + + let result = run(self.exit_config.clone().unwrap()).await; + + if result.is_ok() { + return TestResult { result: Ok(()) }; + } + + TestResult { + result: Err(result.unwrap_err()), + } + } + } + + #[must_use] + struct TestResult { + result: Result<(), String>, + } + + impl TestResult { + fn assert_ok(self) { + assert_eq!(self.result, Ok(())) + } + } + #[tokio::test] + async fn exit_single_validator() { + TestBuilder::new() + .await + .with_validators(0) + .await + .run_test() + .await + .assert_ok(); + } +} diff --git a/validator_manager/src/lib.rs b/validator_manager/src/lib.rs index 8e43cd59772..6f873bed3fe 100644 --- a/validator_manager/src/lib.rs +++ b/validator_manager/src/lib.rs @@ -9,6 +9,7 @@ use types::EthSpec; pub mod common; pub mod create_validators; pub mod delete_validators; +pub mod exit_validators; pub mod import_validators; pub mod list_validators; pub mod move_validators; @@ -61,6 +62,7 @@ pub fn cli_app() -> Command { .subcommand(move_validators::cli_app()) .subcommand(list_validators::cli_app()) .subcommand(delete_validators::cli_app()) + .subcommand(exit_validators::cli_app()) } /// Run the account manager, returning an error if the operation did not succeed. @@ -94,6 +96,9 @@ pub fn run(matches: &ArgMatches, env: Environment) -> Result<(), Some((delete_validators::CMD, matches)) => { delete_validators::cli_run(matches, dump_config).await } + Some((exit_validators::CMD, matches)) => { + exit_validators::cli_run(matches, dump_config).await + } Some(("", _)) => Err("No command supplied. See --help.".to_string()), Some((unknown, _)) => Err(format!( "{} is not a valid {} command. See --help.", From f6d6663cb2f3093af4cbcd03f01223f10f7d3e9c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 28 Nov 2024 14:18:25 +0800 Subject: [PATCH 02/61] minor fix --- book/src/advanced_database.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/src/advanced_database.md b/book/src/advanced_database.md index d8d6ea61a18..c275d0ed96f 100644 --- a/book/src/advanced_database.md +++ b/book/src/advanced_database.md @@ -14,7 +14,7 @@ more detail below). The full states upon which blocks are replayed are referred to as _snapshots_ in the case of the freezer DB, and _epoch boundary states_ in the case of the hot DB. -The frequency at which the hot database stores full `BeaconState`s is fixed to one-state-per-epoch +The frequency at which the hot database stores full `BeaconState` is fixed to one-state-per-epoch in order to keep loads of recent states performant. For the freezer DB, the frequency is configurable via the `--hierarchy-exponents` CLI flag, which is the topic of the next section. @@ -56,7 +56,7 @@ that we have observed are: _a lot_ of space. It's even possible to push beyond that with `--hierarchy-exponents 0` which would store a full state every single slot (NOT RECOMMENDED). - **Less diff layers are not necessarily faster**. One might expect that the fewer diff layers there - are, the less work Lighthouse would have to do to reconstruct any particular state. In practise + are, the less work Lighthouse would have to do to reconstruct any particular state. In practice this seems to be offset by the increased size of diffs in each layer making the diffs take longer to apply. We observed no significant performance benefit from `--hierarchy-exponents 5,7,11`, and a substantial increase in space consumed. From 30c9c8ec8dba3b050262a4e5a98078575a40e469 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 28 Nov 2024 14:19:13 +0800 Subject: [PATCH 03/61] Revert "minor fix" This reverts commit f6d6663cb2f3093af4cbcd03f01223f10f7d3e9c. --- book/src/advanced_database.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/src/advanced_database.md b/book/src/advanced_database.md index c275d0ed96f..d8d6ea61a18 100644 --- a/book/src/advanced_database.md +++ b/book/src/advanced_database.md @@ -14,7 +14,7 @@ more detail below). The full states upon which blocks are replayed are referred to as _snapshots_ in the case of the freezer DB, and _epoch boundary states_ in the case of the hot DB. -The frequency at which the hot database stores full `BeaconState` is fixed to one-state-per-epoch +The frequency at which the hot database stores full `BeaconState`s is fixed to one-state-per-epoch in order to keep loads of recent states performant. For the freezer DB, the frequency is configurable via the `--hierarchy-exponents` CLI flag, which is the topic of the next section. @@ -56,7 +56,7 @@ that we have observed are: _a lot_ of space. It's even possible to push beyond that with `--hierarchy-exponents 0` which would store a full state every single slot (NOT RECOMMENDED). - **Less diff layers are not necessarily faster**. One might expect that the fewer diff layers there - are, the less work Lighthouse would have to do to reconstruct any particular state. In practice + are, the less work Lighthouse would have to do to reconstruct any particular state. In practise this seems to be offset by the increased size of diffs in each layer making the diffs take longer to apply. We observed no significant performance benefit from `--hierarchy-exponents 5,7,11`, and a substantial increase in space consumed. From 36a85e0c97b81292d002b3ce790b774574aea81b Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 29 Nov 2024 09:57:14 +0800 Subject: [PATCH 04/61] Test --- Cargo.lock | 1 + validator_client/http_api/src/test_utils.rs | 11 +++++++++-- validator_manager/Cargo.toml | 1 + validator_manager/src/exit_validators.rs | 19 ++++++++++++++++--- validator_manager/src/import_validators.rs | 13 ++++++++++++- 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 07422252780..cfb51b680eb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9395,6 +9395,7 @@ dependencies = [ "ethereum_serde_utils", "hex", "http_api", + "logging", "regex", "serde", "serde_json", diff --git a/validator_client/http_api/src/test_utils.rs b/validator_client/http_api/src/test_utils.rs index 931c4ea08ed..17a9ba99aef 100644 --- a/validator_client/http_api/src/test_utils.rs +++ b/validator_client/http_api/src/test_utils.rs @@ -27,6 +27,7 @@ use std::time::Duration; use task_executor::test_utils::TestRuntime; use tempfile::{tempdir, TempDir}; use tokio::sync::oneshot; +use types::ChainSpec; use validator_store::{Config as ValidatorStoreConfig, ValidatorStore}; pub const PASSWORD_BYTES: &[u8] = &[42, 50, 37]; @@ -69,6 +70,14 @@ impl ApiTester { } pub async fn new_with_http_config(http_config: HttpConfig) -> Self { + let spec = Arc::new(E::default_spec()); + Self::new_with_http_config_and_spec(http_config, spec).await + } + + pub async fn new_with_http_config_and_spec( + http_config: HttpConfig, + spec: Arc, + ) -> Self { let log = test_logger(); let validator_dir = tempdir().unwrap(); @@ -93,8 +102,6 @@ impl ApiTester { ..Default::default() }; - let spec = Arc::new(E::default_spec()); - let slashing_db_path = validator_dir.path().join(SLASHING_PROTECTION_FILENAME); let slashing_protection = SlashingDatabase::open_or_create(&slashing_db_path).unwrap(); diff --git a/validator_manager/Cargo.toml b/validator_manager/Cargo.toml index 1e5620cf9b4..3ddf30fd12e 100644 --- a/validator_manager/Cargo.toml +++ b/validator_manager/Cargo.toml @@ -21,6 +21,7 @@ eth2 = { workspace = true } hex = { workspace = true } tokio = { workspace = true } derivative = { workspace = true } +logging = { workspace = true } [dev-dependencies] tempfile = { workspace = true } diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 1abc469bcd9..80a35fbee50 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -198,9 +198,9 @@ mod test { let mut spec = ChainSpec::mainnet(); spec.shard_committee_period = 1; spec.altair_fork_epoch = Some(Epoch::new(0)); - spec.bellatrix_fork_epoch = Some(Epoch::new(1)); - spec.capella_fork_epoch = Some(Epoch::new(2)); - spec.deneb_fork_epoch = Some(Epoch::new(3)); + spec.bellatrix_fork_epoch = Some(Epoch::new(0)); + spec.capella_fork_epoch = Some(Epoch::new(0)); + spec.deneb_fork_epoch = Some(Epoch::new(0)); // let harness = BeaconChainHarness::>::builder(E::default()) // .spec(Arc::new(spec.clone())) @@ -213,6 +213,19 @@ mod test { let beacon_node = InteractiveTester::new(Some(spec), 64).await; + let harness = &beacon_node.harness; + let mock_el = harness.mock_execution_layer.as_ref().unwrap(); + let execution_ctx = mock_el.server.ctx.clone(); + let slot_clock = &harness.chain.slot_clock; + + // Move to terminal block. + mock_el.server.all_payloads_valid(); + execution_ctx + .execution_block_generator + .write() + .move_to_terminal_block() + .unwrap(); + Self { exit_config: None, src_import_builder: None, diff --git a/validator_manager/src/import_validators.rs b/validator_manager/src/import_validators.rs index 2a819a2a645..5e5bf536081 100644 --- a/validator_manager/src/import_validators.rs +++ b/validator_manager/src/import_validators.rs @@ -5,11 +5,11 @@ use clap::{Arg, ArgAction, ArgMatches, Command}; use clap_utils::FLAG_HEADER; use derivative::Derivative; use eth2::lighthouse_vc::types::KeystoreJsonStr; +use eth2::types::Address; use eth2::{lighthouse_vc::std_types::ImportKeystoreStatus, SensitiveUrl}; use serde::{Deserialize, Serialize}; use std::fs; use std::path::PathBuf; -use types::Address; pub const CMD: &str = "import"; pub const VALIDATORS_FILE_FLAG: &str = "validators-file"; @@ -385,10 +385,14 @@ pub mod tests { use std::{ fs::{self, File}, str::FromStr, + sync::Arc, }; use tempfile::{tempdir, TempDir}; + use types::*; use validator_http_api::{test_utils::ApiTester, Config as HttpConfig}; + type E = MainnetEthSpec; + const VC_TOKEN_FILE_NAME: &str = "vc_token.json"; pub struct TestBuilder { @@ -406,6 +410,13 @@ pub mod tests { } pub async fn new_with_http_config(http_config: HttpConfig) -> Self { + Self::new_with_http_config_and_spec(http_config, Arc::new(E::default_spec())).await + } + + pub async fn new_with_http_config_and_spec( + http_config: HttpConfig, + spec: Arc, + ) -> Self { let dir = tempdir().unwrap(); let vc = ApiTester::new_with_http_config(http_config).await; let vc_token_path = dir.path().join(VC_TOKEN_FILE_NAME); From 3c7548caf59bd0a672b81eae5d11b252597673d5 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 29 Nov 2024 11:26:03 +0800 Subject: [PATCH 05/61] Spec for vc --- validator_client/http_api/src/test_utils.rs | 4 +- validator_manager/src/exit_validators.rs | 48 ++++++++++++--------- validator_manager/src/import_validators.rs | 4 +- 3 files changed, 32 insertions(+), 24 deletions(-) diff --git a/validator_client/http_api/src/test_utils.rs b/validator_client/http_api/src/test_utils.rs index 17a9ba99aef..4757a0b7032 100644 --- a/validator_client/http_api/src/test_utils.rs +++ b/validator_client/http_api/src/test_utils.rs @@ -62,6 +62,7 @@ pub struct ApiTester { pub _server_shutdown: oneshot::Sender<()>, pub validator_dir: TempDir, pub secrets_dir: TempDir, + pub spec: Arc, } impl ApiTester { @@ -137,7 +138,7 @@ impl ApiTester { validator_store: Some(validator_store.clone()), graffiti_file: None, graffiti_flag: Some(Graffiti::default()), - spec, + spec: spec.clone(), config: http_config, log, sse_logging_components: None, @@ -173,6 +174,7 @@ impl ApiTester { _server_shutdown: shutdown_tx, validator_dir, secrets_dir, + spec, } } diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 80a35fbee50..93b685a9519 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -167,10 +167,7 @@ mod test { }; use account_utils::eth2_keystore::KeystoreBuilder; use account_utils::ZeroizeString; - use beacon_chain::test_utils::{ - AttestationStrategy, BeaconChainHarness, BlockStrategy, EphemeralHarnessType, - }; - use beacon_chain::ChainConfig; + use beacon_chain::test_utils::{AttestationStrategy, BlockStrategy}; use eth2::lighthouse_vc::types::KeystoreJsonStr; use http_api::test_utils::InteractiveTester; use std::{ @@ -191,6 +188,7 @@ mod test { validators: Vec, beacon_node: InteractiveTester, index_of_validators_to_exit: usize, + spec: Arc, } impl TestBuilder { @@ -198,25 +196,15 @@ mod test { let mut spec = ChainSpec::mainnet(); spec.shard_committee_period = 1; spec.altair_fork_epoch = Some(Epoch::new(0)); - spec.bellatrix_fork_epoch = Some(Epoch::new(0)); - spec.capella_fork_epoch = Some(Epoch::new(0)); - spec.deneb_fork_epoch = Some(Epoch::new(0)); - - // let harness = BeaconChainHarness::>::builder(E::default()) - // .spec(Arc::new(spec.clone())) - // .keypairs(vec![]) - // .fresh_ephemeral_store() - // .mock_execution_layer() - // .recalculate_fork_times_with_genesis(0) - // .mock_execution_layer_all_payloads_valid() - // .build(); + spec.bellatrix_fork_epoch = Some(Epoch::new(1)); + spec.capella_fork_epoch = Some(Epoch::new(2)); + spec.deneb_fork_epoch = Some(Epoch::new(3)); - let beacon_node = InteractiveTester::new(Some(spec), 64).await; + let beacon_node = InteractiveTester::new(Some(spec.clone()), 64).await; let harness = &beacon_node.harness; let mock_el = harness.mock_execution_layer.as_ref().unwrap(); let execution_ctx = mock_el.server.ctx.clone(); - let slot_clock = &harness.chain.slot_clock; // Move to terminal block. mock_el.server.all_payloads_valid(); @@ -226,6 +214,8 @@ mod test { .move_to_terminal_block() .unwrap(); + println!("Beacon node spec: {:?}", beacon_node.harness.chain.spec); + Self { exit_config: None, src_import_builder: None, @@ -234,12 +224,18 @@ mod test { validators: vec![], beacon_node, index_of_validators_to_exit: 0, + spec: spec.into(), } } async fn with_validators(mut self, index_of_validators_to_exit: usize) -> Self { - let mut builder = - ImportTestBuilder::new_with_http_config(self.http_config.clone()).await; + let mut builder = ImportTestBuilder::new_with_http_config_and_spec( + self.http_config.clone(), + self.spec.clone(), + ) + .await; + + println!("Validator client spec: {:?}", builder.vc.spec); self.vc_token = Some(fs::read_to_string(builder.get_import_config().vc_token_path).unwrap()); @@ -345,6 +341,11 @@ mod test { // Advance beacon chain self.beacon_node.harness.advance_slot(); + println!( + "current slot_first_advance_slot: {:?}", + self.beacon_node.harness.get_current_slot() + ); + self.beacon_node .harness .extend_chain( @@ -354,10 +355,15 @@ mod test { ) .await; + println!( + "current slot_extend_chain: {:?}", + self.beacon_node.harness.get_current_slot() + ); + self.beacon_node.harness.advance_slot(); println!( - "current slot: {:?}", + "current slot_second_advance_slot: {:?}", self.beacon_node.harness.get_current_slot() ); diff --git a/validator_manager/src/import_validators.rs b/validator_manager/src/import_validators.rs index 5e5bf536081..1cfdfc6b88d 100644 --- a/validator_manager/src/import_validators.rs +++ b/validator_manager/src/import_validators.rs @@ -5,11 +5,11 @@ use clap::{Arg, ArgAction, ArgMatches, Command}; use clap_utils::FLAG_HEADER; use derivative::Derivative; use eth2::lighthouse_vc::types::KeystoreJsonStr; -use eth2::types::Address; use eth2::{lighthouse_vc::std_types::ImportKeystoreStatus, SensitiveUrl}; use serde::{Deserialize, Serialize}; use std::fs; use std::path::PathBuf; +use types::Address; pub const CMD: &str = "import"; pub const VALIDATORS_FILE_FLAG: &str = "validators-file"; @@ -418,7 +418,7 @@ pub mod tests { spec: Arc, ) -> Self { let dir = tempdir().unwrap(); - let vc = ApiTester::new_with_http_config(http_config).await; + let vc = ApiTester::new_with_http_config_and_spec(http_config, spec).await; let vc_token_path = dir.path().join(VC_TOKEN_FILE_NAME); fs::write(&vc_token_path, &vc.api_token).unwrap(); From b40b1b11e11196953502db680b153a92d8eff222 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Tue, 3 Dec 2024 15:18:12 +1100 Subject: [PATCH 06/61] Ensure time and genesis validators root match --- validator_client/http_api/src/test_utils.rs | 14 ++++++++------ validator_client/signing_method/src/lib.rs | 1 + validator_manager/src/exit_validators.rs | 13 ++++++++++++- validator_manager/src/import_validators.rs | 12 +++--------- 4 files changed, 24 insertions(+), 16 deletions(-) diff --git a/validator_client/http_api/src/test_utils.rs b/validator_client/http_api/src/test_utils.rs index 4757a0b7032..117891832db 100644 --- a/validator_client/http_api/src/test_utils.rs +++ b/validator_client/http_api/src/test_utils.rs @@ -71,12 +71,17 @@ impl ApiTester { } pub async fn new_with_http_config(http_config: HttpConfig) -> Self { + let slot_clock = + TestingSlotClock::new(Slot::new(0), Duration::from_secs(0), Duration::from_secs(1)); + let genesis_validators_root = Hash256::repeat_byte(42); let spec = Arc::new(E::default_spec()); - Self::new_with_http_config_and_spec(http_config, spec).await + Self::new_with_options(http_config, slot_clock, genesis_validators_root, spec).await } - pub async fn new_with_http_config_and_spec( + pub async fn new_with_options( http_config: HttpConfig, + slot_clock: TestingSlotClock, + genesis_validators_root: Hash256, spec: Arc, ) -> Self { let log = test_logger(); @@ -106,15 +111,12 @@ impl ApiTester { let slashing_db_path = validator_dir.path().join(SLASHING_PROTECTION_FILENAME); let slashing_protection = SlashingDatabase::open_or_create(&slashing_db_path).unwrap(); - let slot_clock = - TestingSlotClock::new(Slot::new(0), Duration::from_secs(0), Duration::from_secs(1)); - let test_runtime = TestRuntime::default(); let validator_store = Arc::new(ValidatorStore::<_, E>::new( initialized_validators, slashing_protection, - Hash256::repeat_byte(42), + genesis_validators_root, spec.clone(), Some(Arc::new(DoppelgangerService::new(log.clone()))), slot_clock.clone(), diff --git a/validator_client/signing_method/src/lib.rs b/validator_client/signing_method/src/lib.rs index 2fe4af39d3a..3af2694cb28 100644 --- a/validator_client/signing_method/src/lib.rs +++ b/validator_client/signing_method/src/lib.rs @@ -96,6 +96,7 @@ pub enum SigningMethod { /// The additional information used to construct a signature. Mostly used for protection from replay /// attacks. +#[derive(Debug)] pub struct SigningContext { pub domain: Domain, pub epoch: Epoch, diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 93b685a9519..6b02f70581e 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -229,11 +229,22 @@ mod test { } async fn with_validators(mut self, index_of_validators_to_exit: usize) -> Self { - let mut builder = ImportTestBuilder::new_with_http_config_and_spec( + // Ensure genesis validators root matches the beacon node. + let genesis_validators_root = self + .beacon_node + .harness + .get_current_state() + .genesis_validators_root(); + // And use a single slot clock for BN and VC to keep things simple. + let slot_clock = self.beacon_node.harness.chain.slot_clock.clone(); + let vc = ApiTester::new_with_options( self.http_config.clone(), + slot_clock, + genesis_validators_root, self.spec.clone(), ) .await; + let mut builder = ImportTestBuilder::new_with_vc(vc).await; println!("Validator client spec: {:?}", builder.vc.spec); diff --git a/validator_manager/src/import_validators.rs b/validator_manager/src/import_validators.rs index 1cfdfc6b88d..2c49422cdb2 100644 --- a/validator_manager/src/import_validators.rs +++ b/validator_manager/src/import_validators.rs @@ -385,14 +385,11 @@ pub mod tests { use std::{ fs::{self, File}, str::FromStr, - sync::Arc, }; use tempfile::{tempdir, TempDir}; use types::*; use validator_http_api::{test_utils::ApiTester, Config as HttpConfig}; - type E = MainnetEthSpec; - const VC_TOKEN_FILE_NAME: &str = "vc_token.json"; pub struct TestBuilder { @@ -410,15 +407,12 @@ pub mod tests { } pub async fn new_with_http_config(http_config: HttpConfig) -> Self { - Self::new_with_http_config_and_spec(http_config, Arc::new(E::default_spec())).await + let vc = ApiTester::new_with_http_config(http_config).await; + Self::new_with_vc(vc).await } - pub async fn new_with_http_config_and_spec( - http_config: HttpConfig, - spec: Arc, - ) -> Self { + pub async fn new_with_vc(vc: ApiTester) -> Self { let dir = tempdir().unwrap(); - let vc = ApiTester::new_with_http_config_and_spec(http_config, spec).await; let vc_token_path = dir.path().join(VC_TOKEN_FILE_NAME); fs::write(&vc_token_path, &vc.api_token).unwrap(); From 6f117816466ab733fdc4b8d20306f93a143832fe Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 11 Dec 2024 10:39:04 +0800 Subject: [PATCH 07/61] Remove types --- Cargo.lock | 2 +- common/filesystem/src/lib.rs | 2 ++ validator_manager/src/import_validators.rs | 1 - 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 71b4a757344..9e2eab5b3e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10112,7 +10112,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror 1.0.69", + "thiserror", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", diff --git a/common/filesystem/src/lib.rs b/common/filesystem/src/lib.rs index d73b7a355b1..39efc2c4664 100644 --- a/common/filesystem/src/lib.rs +++ b/common/filesystem/src/lib.rs @@ -15,8 +15,10 @@ const OWNER_SID_STR: &str = "S-1-3-4"; const OWNER_ACL_ENTRY_FLAGS: u8 = 0; /// Generic Rights: /// - https://docs.microsoft.com/en-us/windows/win32/fileio/file-security-and-access-rights +/// /// Individual Read/Write/Execute Permissions (referenced in generic rights link): /// - https://docs.microsoft.com/en-us/windows/win32/wmisdk/file-and-directory-access-rights-constants +/// /// STANDARD_RIGHTS_ALL /// - https://docs.microsoft.com/en-us/windows/win32/secauthz/access-mask #[cfg(windows)] diff --git a/validator_manager/src/import_validators.rs b/validator_manager/src/import_validators.rs index 2c49422cdb2..416c206bca6 100644 --- a/validator_manager/src/import_validators.rs +++ b/validator_manager/src/import_validators.rs @@ -387,7 +387,6 @@ pub mod tests { str::FromStr, }; use tempfile::{tempdir, TempDir}; - use types::*; use validator_http_api::{test_utils::ApiTester, Config as HttpConfig}; const VC_TOKEN_FILE_NAME: &str = "vc_token.json"; From 585498d9564e1720baf2ea8a16bc3ed1b25cac95 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 11 Dec 2024 11:12:50 +0800 Subject: [PATCH 08/61] make cli --- book/src/help_vm.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/book/src/help_vm.md b/book/src/help_vm.md index 50c204f371c..d4c130c1bd3 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -28,6 +28,8 @@ Commands: delete Deletes one or more validators from a validator client using the HTTP API. + exit + Exit validator using the HTTP API for a given validator keystore. help Print this message or the help of the given subcommand(s) From 4f6426fee6ed2929c9c3d9b1419f6cce493700c0 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 11 Dec 2024 14:09:56 +0800 Subject: [PATCH 09/61] Cargo.lock --- Cargo.lock | 1261 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 784 insertions(+), 477 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 9e2eab5b3e3..1d8edc77cbb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -59,9 +59,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5fb1d8e4442bd405fdfd1dacb42792696b0cf9cb15882e5d097b742a676d375" +checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" dependencies = [ "gimli", ] @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.18" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy-consensus" @@ -177,9 +177,9 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.0" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +checksum = "ea59dc42102bc9a1905dc57901edc6dd48b9f38115df86c7d252acba70d71d04" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -204,9 +204,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.3" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "411aff151f2a73124ee473708e82ed51b2535f68928b6a1caa8bc1246ae6f7cd" +checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" dependencies = [ "alloy-rlp", "arbitrary", @@ -215,24 +215,30 @@ dependencies = [ "const-hex", "derive_arbitrary", "derive_more 1.0.0", + "foldhash", "getrandom", + "hashbrown 0.15.2", "hex-literal", + "indexmap 2.7.0", "itoa", "k256 0.13.4", "keccak-asm", + "paste", "proptest", "proptest-derive", "rand", "ruint", + "rustc-hash 2.1.0", "serde", + "sha3 0.10.8", "tiny-keccak", ] [[package]] name = "alloy-rlp" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" +checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -241,13 +247,13 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" +checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -273,9 +279,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.15" +version = "0.6.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +checksum = "8acc5369981196006228e28809f761875c0327210a891e941f4c683b3a99529b" dependencies = [ "anstyle", "anstyle-parse", @@ -288,49 +294,49 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.8" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" +checksum = "55cc3b69f167a1ef2e161439aa98aed94e6028e5f9a59be9a6ffb47aef1651f9" [[package]] name = "anstyle-parse" -version = "0.2.5" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +checksum = "3b2d16507662817a6a20a9ea92df6652ee4f94f914589377d69f3b21bc5798a9" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.1.1" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +checksum = "79947af37f4177cfead1110013d678905c37501914fba0efea834c3fe9a8d60c" dependencies = [ - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.4" +version = "3.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +checksum = "2109dbce0e72be3ec00bed26e6a7479ca384ad226efdd66db8fa2e3a38c83125" dependencies = [ "anstyle", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] name = "anyhow" -version = "1.0.89" +version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" [[package]] name = "arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +checksum = "dde20b3d026af13f561bdd0f15edf01fc734f0dafcedbaf42bba506a9517f223" dependencies = [ "derive_arbitrary", ] @@ -504,7 +510,7 @@ dependencies = [ "nom", "num-traits", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -516,7 +522,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "synstructure", ] @@ -528,7 +534,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -550,9 +556,9 @@ dependencies = [ [[package]] name = "async-io" -version = "2.3.4" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "444b0228950ee6501b3568d3c93bf1176a1fdbc3b758dcd9475046d30f4dc7e8" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" dependencies = [ "async-lock", "cfg-if", @@ -561,7 +567,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.37", + "rustix 0.38.42", "slab", "tracing", "windows-sys 0.59.0", @@ -580,13 +586,13 @@ dependencies = [ [[package]] name = "async-trait" -version = "0.1.82" +version = "0.1.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27b8a3a6e1a44fa4c8baf1f653e4172e81486d4941f2237e20dc2d0cf4ddff1" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -643,29 +649,29 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "autocfg" -version = "1.3.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" [[package]] name = "axum" -version = "0.7.6" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f43644eed690f5374f1af436ecd6aea01cd201f6fbdf0178adaf6907afb2cec" +checksum = "edca88bc138befd0323b20752846e6587272d3b03b0343c8ea28a6f819e6e71f" dependencies = [ "async-trait", "axum-core", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", - "hyper 1.4.1", + "hyper 1.5.1", "hyper-util", "itoa", "matchit", @@ -678,9 +684,9 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_urlencoded", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tokio", - "tower 0.5.1", + "tower", "tower-layer", "tower-service", "tracing", @@ -688,20 +694,20 @@ dependencies = [ [[package]] name = "axum-core" -version = "0.4.4" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6b8ba012a258d63c9adfa28b9ddcf66149da6f986c5b5452e629d5ee64bf00" +checksum = "09f2bd6146b97ae3359fa0cc6d6b376d9539582c7b4220f041a33ec24c226199" dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "http-body-util", "mime", "pin-project-lite", "rustversion", - "sync_wrapper 1.0.1", + "sync_wrapper 1.0.2", "tower-layer", "tower-service", "tracing", @@ -842,7 +848,7 @@ dependencies = [ "genesis", "hex", "http_api", - "hyper 1.4.1", + "hyper 1.5.1", "lighthouse_network", "monitoring_api", "node_test_rig", @@ -907,9 +913,9 @@ dependencies = [ [[package]] name = "bindgen" -version = "0.69.4" +version = "0.69.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" +checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" dependencies = [ "bitflags 2.6.0", "cexpr", @@ -924,7 +930,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.77", + "syn 2.0.90", "which", ] @@ -1139,9 +1145,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.7.2" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "428d9aa8fbc0670b7b8d6030a7fadd0f86151cae55e4dbbece15f3780a3dfaf3" +checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" dependencies = [ "serde", ] @@ -1193,9 +1199,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" dependencies = [ "serde", ] @@ -1211,7 +1217,7 @@ dependencies = [ "semver 1.0.23", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -1222,9 +1228,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.1.21" +version = "1.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07b1695e2c7e8fc85310cde85aeaab7e3097f593c91d209d3f9df76c928100f0" +checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" dependencies = [ "jobserver", "libc", @@ -1278,9 +1284,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.38" +version = "0.4.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1348,9 +1354,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.18" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0956a43b323ac1afaffc053ed5c4b7c1f1800bacd1683c353aabbb752515dd3" +checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" dependencies = [ "clap_builder", "clap_derive", @@ -1358,9 +1364,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.18" +version = "4.5.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d72166dd41634086d5803a47eb71ae740e61d84709c36f3c34110173db3961b" +checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" dependencies = [ "anstream", "anstyle", @@ -1378,14 +1384,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "clap_utils" @@ -1446,18 +1452,18 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.51" +version = "0.1.52" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" +checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" dependencies = [ "cc", ] [[package]] name = "colorchoice" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +checksum = "5b63caa9aa9397e2d9480a9b13673856c78d8ac123288526c37d7839f2a86990" [[package]] name = "compare_fields" @@ -1486,9 +1492,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if", "cpufeatures", @@ -1542,18 +1548,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.14" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608697df725056feaccfa42cffdaeeec3fccc4ffc38358ecd19b243e716a78e0" +checksum = "16b80225097f2e5ae4e7179dd2266824648f3e2f49d9134d584b76389d31c4c3" dependencies = [ "libc", ] [[package]] name = "crate_crypto_internal_eth_kzg_bls12_381" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a23be5253f1bd7fd411721a58712308c4747d0a41d040bbf8ebb78d52909a480" +checksum = "319cb241b1ad37f8c376b2ebcd7233f53e033a50de6f0a9cf38e6cc545554de4" dependencies = [ "blst", "blstrs", @@ -1565,9 +1571,9 @@ dependencies = [ [[package]] name = "crate_crypto_internal_eth_kzg_erasure_codes" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2067ce20ef380ff33a93ce0af62bea22d35531b7f3586224d8d5176ec6cf578" +checksum = "abedcc3eb4d04655c53704a66880945f5a39c6d96b337f0ab4a086dda795c954" dependencies = [ "crate_crypto_internal_eth_kzg_bls12_381", "crate_crypto_internal_eth_kzg_polynomial", @@ -1575,24 +1581,24 @@ dependencies = [ [[package]] name = "crate_crypto_internal_eth_kzg_maybe_rayon" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "558f50324ff016e5fe93113c78a72776d790d52f244ae9602a8013a67a189b66" +checksum = "3db089718921ca28d137ed8b1a7406f10e6bfbc61794a2339bcd9c99d5ddefc6" [[package]] name = "crate_crypto_internal_eth_kzg_polynomial" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e051c4f5aa5696bd7c504930485436ec62bf14f30a4c2d78504f3f8ec6a3daf" +checksum = "750e6dbe493d337d98502975137f055a52767021bcdb69aa8926ed8ee28c7980" dependencies = [ "crate_crypto_internal_eth_kzg_bls12_381", ] [[package]] name = "crate_crypto_kzg_multi_open_fk20" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66ed6bf8993d9f3b361da4ed38f067503e08c0b948af0d6f4bb941dd647c0f2c" +checksum = "c3337262f48c7fee2999cf23bb9cb693299211671fe46b593ac81fcb218de68b" dependencies = [ "crate_crypto_internal_eth_kzg_bls12_381", "crate_crypto_internal_eth_kzg_maybe_rayon", @@ -1793,7 +1799,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1841,7 +1847,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1863,7 +1869,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -1888,9 +1894,9 @@ dependencies = [ [[package]] name = "dary_heap" -version = "0.3.6" +version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7762d17f1241643615821a8455a0b2c3e803784b058693d990b11f2dce25a0ca" +checksum = "04d2cd9c18b9f454ed67da600630b021a8a80bf33f8c95896ab33aaf1c26b728" [[package]] name = "data-encoding" @@ -2023,13 +2029,13 @@ dependencies = [ [[package]] name = "derive_arbitrary" -version = "1.3.2" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2042,7 +2048,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2062,15 +2068,15 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "unicode-xid", ] [[package]] name = "diesel" -version = "2.2.4" +version = "2.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "158fe8e2e68695bd615d7e4f3227c0727b151330d3e253b525086c348d055d5e" +checksum = "ccf1bedf64cdb9643204a36dd15b19a6ce8e7aa7f7b105868e9f1fad5ffa7d12" dependencies = [ "bitflags 2.6.0", "byteorder", @@ -2090,7 +2096,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2110,7 +2116,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2225,7 +2231,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2256,7 +2262,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2401,9 +2407,9 @@ dependencies = [ [[package]] name = "encoding_rs" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "75030f3c4f45dafd7586dd6780965a8c7e8e285a5ecb86713e63a79c5b2766f3" dependencies = [ "cfg-if", ] @@ -2436,7 +2442,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2500,12 +2506,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.9" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" dependencies = [ "libc", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2697,7 +2703,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.9.1", - "thiserror", + "thiserror 1.0.69", "uint 0.9.5", ] @@ -2714,7 +2720,7 @@ dependencies = [ "serde", "serde_json", "sha3 0.10.8", - "thiserror", + "thiserror 1.0.69", "uint 0.9.5", ] @@ -2820,7 +2826,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -2839,7 +2845,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -2906,7 +2912,7 @@ dependencies = [ "serde_json", "strum", "syn 1.0.109", - "thiserror", + "thiserror 1.0.69", "tiny-keccak", "unicode-xid", ] @@ -2934,7 +2940,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", "tracing-futures", @@ -2965,9 +2971,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.2" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" dependencies = [ "event-listener 5.3.1", "pin-project-lite", @@ -3073,9 +3079,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.1.1" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8c02a5121d4ea3eb16a80748c74f5549a5665e4c21333c6098f283870fbdea6" +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] name = "fastrlp" @@ -3095,7 +3101,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e182f7dbc2ef73d9ef67351c5fbbea084729c48362d3ce9dd44c28e32e277fe5" dependencies = [ "libc", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -3183,9 +3189,9 @@ dependencies = [ [[package]] name = "flate2" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253" +checksum = "c936bfdafb507ebbf50b8074c54fa31c5be9a1e7e5f467dd659697041407d07c" dependencies = [ "crc32fast", "libz-sys", @@ -3198,6 +3204,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2" + [[package]] name = "foreign-types" version = "0.3.2" @@ -3262,9 +3274,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" +checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" dependencies = [ "futures-channel", "futures-core", @@ -3303,9 +3315,9 @@ checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" [[package]] name = "futures-executor" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" dependencies = [ "futures-core", "futures-task", @@ -3321,9 +3333,9 @@ checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" [[package]] name = "futures-lite" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52527eb5074e35e9339c6b4e8d12600c7128b68fb25dcb9fa9dec18f7c25f3a5" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" dependencies = [ "futures-core", "pin-project-lite", @@ -3337,7 +3349,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3347,7 +3359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.13", + "rustls 0.23.19", "rustls-pki-types", ] @@ -3457,9 +3469,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.31.0" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32085ea23f3234fc7846555e85283ba4de91e21016dc0455a16286d87a292d64" +checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" [[package]] name = "git-version" @@ -3478,7 +3490,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -3577,7 +3589,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.5.0", + "indexmap 2.7.0", "slab", "tokio", "tokio-util", @@ -3625,6 +3637,18 @@ dependencies = [ "allocator-api2", ] +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "allocator-api2", + "equivalent", + "foldhash", + "serde", +] + [[package]] name = "hashers" version = "1.0.1" @@ -3732,9 +3756,9 @@ checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" [[package]] name = "hickory-proto" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" +checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" dependencies = [ "async-trait", "cfg-if", @@ -3743,12 +3767,12 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna 0.4.0", + "idna", "ipnet", "once_cell", "rand", "socket2", - "thiserror", + "thiserror 1.0.69", "tinyvec", "tokio", "tracing", @@ -3757,9 +3781,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.1" +version = "0.24.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" +checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" dependencies = [ "cfg-if", "futures-util", @@ -3771,7 +3795,7 @@ dependencies = [ "rand", "resolv-conf", "smallvec", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -3858,9 +3882,9 @@ dependencies = [ [[package]] name = "http" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" +checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" dependencies = [ "bytes", "fnv", @@ -3885,7 +3909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.1.0", + "http 1.2.0", ] [[package]] @@ -3896,7 +3920,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "pin-project-lite", ] @@ -3970,9 +3994,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.4" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcc0b4a115bf80b728eb8ea024ad5bd707b615bfed49e0665b6e0f86fd082d9" +checksum = "7d71d3574edd2771538b901e6549113b4006ece66150fb69c0fb6d9a2adae946" [[package]] name = "httpdate" @@ -3988,9 +4012,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.30" +version = "0.14.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a152ddd61dfaec7273fe8419ab357f33aee0d914c5f4efbf0d96fa749eea5ec9" +checksum = "8c08302e8fa335b151b788c775ff56e7a03ae64ff85c548ee820fecb70356e85" dependencies = [ "bytes", "futures-channel", @@ -4012,14 +4036,14 @@ dependencies = [ [[package]] name = "hyper" -version = "1.4.1" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05" +checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f" dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", "httparse", "httpdate", @@ -4037,7 +4061,7 @@ checksum = "ec3efd23720e2049821a693cbc7e65ea87c72f1c58ff2f9522ff332b1491e590" dependencies = [ "futures-util", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "rustls 0.21.12", "tokio", "tokio-rustls 0.24.1", @@ -4050,7 +4074,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes", - "hyper 0.14.30", + "hyper 0.14.31", "native-tls", "tokio", "tokio-native-tls", @@ -4058,18 +4082,17 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.8" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da62f120a8a37763efb0cf8fdf264b884c7b8b9ac8660b900c8661030c00e6ba" +checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-util", - "http 1.1.0", + "http 1.2.0", "http-body 1.0.1", - "hyper 1.4.1", + "hyper 1.5.1", "pin-project-lite", "tokio", - "tower 0.4.13", "tower-service", ] @@ -4096,6 +4119,124 @@ dependencies = [ "cc", ] +[[package]] +name = "icu_collections" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locid" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_locid_transform" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_locid_transform_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_locid_transform_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" + +[[package]] +name = "icu_normalizer" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "utf16_iter", + "utf8_iter", + "write16", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" + +[[package]] +name = "icu_properties" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locid_transform", + "icu_properties_data", + "icu_provider", + "tinystr", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" + +[[package]] +name = "icu_provider" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" +dependencies = [ + "displaydoc", + "icu_locid", + "icu_provider_macros", + "stable_deref_trait", + "tinystr", + "writeable", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_provider_macros" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "ident_case" version = "1.0.1" @@ -4104,22 +4245,23 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "idna" -version = "0.5.0" +name = "idna_adapter" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "unicode-bidi", - "unicode-normalization", + "icu_normalizer", + "icu_properties", ] [[package]] @@ -4134,9 +4276,9 @@ dependencies = [ [[package]] name = "if-watch" -version = "3.2.0" +version = "3.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6b0422c86d7ce0e97169cc42e04ae643caf278874a7a3c87b8150a220dc7e1e" +checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" dependencies = [ "async-io", "core-foundation", @@ -4145,8 +4287,12 @@ dependencies = [ "if-addrs", "ipnet", "log", + "netlink-packet-core", + "netlink-packet-route", + "netlink-proto", + "netlink-sys", "rtnetlink", - "system-configuration", + "system-configuration 0.6.1", "tokio", "windows", ] @@ -4162,7 +4308,7 @@ dependencies = [ "bytes", "futures", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "rand", "tokio", @@ -4217,13 +4363,13 @@ dependencies = [ [[package]] name = "impl-trait-for-tuples" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] @@ -4244,12 +4390,14 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.5.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" +checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" dependencies = [ + "arbitrary", "equivalent", - "hashbrown 0.14.5", + "hashbrown 0.15.2", + "serde", ] [[package]] @@ -4341,9 +4489,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.10.0" +version = "2.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "187674a687eed5fe42285b40c6291f9a01517d415fad1c3cbc6a9f778af7fcd4" +checksum = "ddc24109865250148c2e0f3d25d4f0f479571723792d3802153c60922a4fb708" [[package]] name = "is-terminal" @@ -4391,9 +4539,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.11" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" +checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" [[package]] name = "jobserver" @@ -4406,10 +4554,11 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.70" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1868808506b929d7b0cfa8f75951347aa71bb21144b7791bae35d9bccfcfe37a" +checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" dependencies = [ + "once_cell", "wasm-bindgen", ] @@ -4579,9 +4728,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.158" +version = "0.2.168" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8adc4bb1803a324070e64a98ae98f38934d91957a99cfb3a43dcbc01bc56439" +checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" [[package]] name = "libflate" @@ -4609,9 +4758,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" +checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -4619,9 +4768,9 @@ dependencies = [ [[package]] name = "libm" -version = "0.2.8" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libmdbx" @@ -4635,7 +4784,7 @@ dependencies = [ "libc", "mdbx-sys", "parking_lot 0.12.3", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4667,7 +4816,7 @@ dependencies = [ "multiaddr", "pin-project", "rw-stream-sink", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -4715,7 +4864,7 @@ dependencies = [ "rand", "rw-stream-sink", "smallvec", - "thiserror", + "thiserror 1.0.69", "tracing", "unsigned-varint 0.8.0", "void", @@ -4756,16 +4905,16 @@ dependencies = [ "quick-protobuf", "quick-protobuf-codec", "smallvec", - "thiserror", + "thiserror 1.0.69", "tracing", "void", ] [[package]] name = "libp2p-identity" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55cca1eb2bc1fd29f099f3daaab7effd01e1a54b7c577d0ed082521034d912e8" +checksum = "257b5621d159b32282eac446bed6670c39c7dc68a200a992d8f056afa0066f6d" dependencies = [ "asn1_der", "bs58 0.5.1", @@ -4778,9 +4927,8 @@ dependencies = [ "rand", "sec1 0.7.3", "sha2 0.10.8", - "thiserror", + "thiserror 1.0.69", "tracing", - "void", "zeroize", ] @@ -4860,7 +5008,7 @@ dependencies = [ "sha2 0.10.8", "snow", "static_assertions", - "thiserror", + "thiserror 1.0.69", "tracing", "x25519-dalek", "zeroize", @@ -4899,9 +5047,9 @@ dependencies = [ "quinn", "rand", "ring 0.17.8", - "rustls 0.23.13", + "rustls 0.23.19", "socket2", - "thiserror", + "thiserror 1.0.69", "tokio", "tracing", ] @@ -4939,7 +5087,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -4971,9 +5119,9 @@ dependencies = [ "libp2p-identity", "rcgen", "ring 0.17.8", - "rustls 0.23.13", + "rustls 0.23.19", "rustls-webpki 0.101.7", - "thiserror", + "thiserror 1.0.69", "x509-parser", "yasna", ] @@ -5003,10 +5151,10 @@ dependencies = [ "either", "futures", "libp2p-core", - "thiserror", + "thiserror 1.0.69", "tracing", "yamux 0.12.1", - "yamux 0.13.3", + "yamux 0.13.4", ] [[package]] @@ -5214,6 +5362,12 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +[[package]] +name = "litemap" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" + [[package]] name = "lmdb-rkv" version = "0.14.0" @@ -5282,11 +5436,11 @@ dependencies = [ [[package]] name = "lru" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" +checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.14.5", + "hashbrown 0.15.2", ] [[package]] @@ -5415,18 +5569,18 @@ dependencies = [ [[package]] name = "metastruct" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f00a5ba4a0f3453c31c397b214e1675d95b697c33763aa58add57ea833424384" +checksum = "d74f54f231f9a18d77393ecc5cc7ab96709b2a61ee326c2b2b291009b0cc5a07" dependencies = [ "metastruct_macro", ] [[package]] name = "metastruct_macro" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a991d4536c933306e52f0e8ab303757185ec13a09d1f3e1cbde5a0d8410bf" +checksum = "985e7225f3a4dfbec47a0c6a730a874185fda840d365d7bbd6ba199dd81796d5" dependencies = [ "darling 0.13.4", "itertools 0.10.5", @@ -5520,11 +5674,10 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" +checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" dependencies = [ - "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -5562,9 +5715,9 @@ checksum = "1fafa6961cabd9c63bcd77a45d7e3b7f3b552b70417831fb0f56db717e72407e" [[package]] name = "multiaddr" -version = "0.18.1" +version = "0.18.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b852bc02a2da5feed68cd14fa50d0774b92790a5bdbfa932a813926c8472070" +checksum = "fe6351f60b488e04c1d21bc69e56b89cb3f5e8f5d22557d6e8031bdfd79b6961" dependencies = [ "arrayref", "byteorder", @@ -5575,7 +5728,7 @@ dependencies = [ "percent-encoding", "serde", "static_assertions", - "unsigned-varint 0.7.2", + "unsigned-varint 0.8.0", "url", ] @@ -5592,12 +5745,12 @@ dependencies = [ [[package]] name = "multihash" -version = "0.19.1" +version = "0.19.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "076d548d76a0e2a0d4ab471d0b1c36c577786dfc4471242035d97a12a735c492" +checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" dependencies = [ "core2", - "unsigned-varint 0.7.2", + "unsigned-varint 0.8.0", ] [[package]] @@ -5633,21 +5786,20 @@ dependencies = [ [[package]] name = "netlink-packet-core" -version = "0.4.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "345b8ab5bd4e71a2986663e88c56856699d060e78e152e6e9d7966fcd5491297" +checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" dependencies = [ "anyhow", "byteorder", - "libc", "netlink-packet-utils", ] [[package]] name = "netlink-packet-route" -version = "0.12.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9ea4302b9759a7a88242299225ea3688e63c85ea136371bb6cf94fd674efaab" +checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" dependencies = [ "anyhow", "bitflags 1.3.2", @@ -5666,29 +5818,29 @@ dependencies = [ "anyhow", "byteorder", "paste", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "netlink-proto" -version = "0.10.0" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65b4b14489ab424703c092062176d52ba55485a89c076b4f9db05092b7223aa6" +checksum = "86b33524dc0968bfad349684447bfce6db937a9ac3332a1fe60c0c5a5ce63f21" dependencies = [ "bytes", "futures", "log", "netlink-packet-core", "netlink-sys", - "thiserror", + "thiserror 1.0.69", "tokio", ] [[package]] name = "netlink-sys" -version = "0.8.6" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" +checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" dependencies = [ "bytes", "futures", @@ -5757,6 +5909,17 @@ dependencies = [ "libc", ] +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", +] + [[package]] name = "nix" version = "0.29.0" @@ -5897,9 +6060,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.4" +version = "0.36.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "084f1a5821ac4c651660a94a7153d27ac9d8a53736203f58b31945ded098070a" +checksum = "aedf0a2d09c573ed1d8d85b30c119153926a2b36dce0ab28322c09a117a4683e" dependencies = [ "memchr", ] @@ -5915,9 +6078,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.19.0" +version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" +checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "oneshot_broadcast" @@ -5965,9 +6128,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.66" +version = "0.10.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9529f4786b70a3e8c61e11179af17ab6188ad8d0ded78c5529441ed39d4bd9c1" +checksum = "6174bc48f102d208783c2c84bf931bb75927a617866870de8a4ea85597f871f5" dependencies = [ "bitflags 2.6.0", "cfg-if", @@ -5986,7 +6149,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -5997,18 +6160,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.3.2+3.3.2" +version = "300.4.1+3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a211a18d945ef7e648cc6e0058f4c548ee46aab922ea203e0d30e966ea23647b" +checksum = "faa4eac4138c62414b5622d1b31c5c304f34b406b013c079c2bbc652fdd6678c" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.103" +version = "0.9.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f9e8deee91df40a943c71b917e5874b951d32a802526c85721ce3b776c929d6" +checksum = "45abf306cbf99debc8195b66b7346498d7b10c210de50418b5ccd7ceba08c741" dependencies = [ "cc", "libc", @@ -6167,7 +6330,7 @@ checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.4", + "redox_syscall 0.5.7", "smallvec", "windows-targets 0.52.6", ] @@ -6237,12 +6400,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.13" +version = "2.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" +checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" dependencies = [ "memchr", - "thiserror", + "thiserror 2.0.6", "ucd-trie", ] @@ -6276,29 +6439,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +checksum = "be57f64e946e500c8ee36ef6331845d40a93055567ec57e8fae13efd33759b95" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.5" +version = "1.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "pin-project-lite" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" +checksum = "915a1e146535de9163f3987b8944ed8cf49a18bb0056bcebcdcece385cece4ff" [[package]] name = "pin-utils" @@ -6328,9 +6491,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.30" +version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +checksum = "953ec861398dccce10c670dfeaf3ec4911ca479e9c02154b3a215178c5f566f2" [[package]] name = "platforms" @@ -6368,15 +6531,15 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.3" +version = "3.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2790cd301dec6cd3b7a025e4815cf825724a51c98dccfe6a3e55f05ffb6511" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" dependencies = [ "cfg-if", "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.37", + "rustix 0.38.42", "tracing", "windows-sys 0.59.0", ] @@ -6467,12 +6630,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.20" +version = "0.2.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" +checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -6527,14 +6690,14 @@ version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" dependencies = [ - "toml_edit 0.22.21", + "toml_edit 0.22.22", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -6566,7 +6729,7 @@ dependencies = [ "memchr", "parking_lot 0.12.3", "protobuf", - "thiserror", + "thiserror 1.0.69", ] [[package]] @@ -6589,7 +6752,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -6606,7 +6769,7 @@ dependencies = [ "rand", "rand_chacha", "rand_xorshift", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", "rusty-fork", "tempfile", "unarray", @@ -6620,7 +6783,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -6657,7 +6820,7 @@ dependencies = [ "num_cpus", "once_cell", "platforms", - "thiserror", + "thiserror 1.0.69", "unescape", ] @@ -6684,7 +6847,7 @@ dependencies = [ "asynchronous-codec", "bytes", "quick-protobuf", - "thiserror", + "thiserror 1.0.69", "unsigned-varint 0.8.0", ] @@ -6712,46 +6875,50 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.5" +version = "0.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c7c5fdde3cdae7203427dc4f0a68fe0ed09833edc525a03456b153b79828684" +checksum = "62e96808277ec6f97351a2380e6c25114bc9e67037775464979f3037c92d05ef" dependencies = [ "bytes", "futures-io", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.0.0", - "rustls 0.23.13", + "rustc-hash 2.1.0", + "rustls 0.23.19", "socket2", - "thiserror", + "thiserror 2.0.6", "tokio", "tracing", ] [[package]] name = "quinn-proto" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fadfaed2cd7f389d0161bb73eeb07b7b78f8691047a6f3e73caaeae55310a4a6" +checksum = "a2fe5ef3495d7d2e377ff17b1a8ce2ee2ec2a18cde8b6ad6619d65d0701c135d" dependencies = [ "bytes", + "getrandom", "rand", "ring 0.17.8", - "rustc-hash 2.0.0", - "rustls 0.23.13", + "rustc-hash 2.1.0", + "rustls 0.23.19", + "rustls-pki-types", "slab", - "thiserror", + "thiserror 2.0.6", "tinyvec", "tracing", + "web-time", ] [[package]] name = "quinn-udp" -version = "0.5.5" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fe68c2e9e1a1234e218683dbdf9f9dfcb094113c5ac2b938dfcb9bab4c4140b" +checksum = "52cd4b1eff68bf27940dd39811292c49e007f4d0b4c357358dc9b0197be6b527" dependencies = [ + "cfg_aliases", "libc", "once_cell", "socket2", @@ -6810,6 +6977,7 @@ dependencies = [ "libc", "rand_chacha", "rand_core", + "serde", ] [[package]] @@ -6874,9 +7042,9 @@ dependencies = [ [[package]] name = "redb" -version = "2.1.4" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "074373f3e7e5d27d8741d19512232adb47be8622d3daef3a45bcae72050c3d2a" +checksum = "a7c2a94325f9c5826b17c42af11067230f503747f870117a28180e85696e21ba" dependencies = [ "libc", ] @@ -6892,9 +7060,9 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.4" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0884ad60e090bf1345b93da0a5de8923c93884cd03f40dfcfddd3b4bee661853" +checksum = "9b6dfecf2c74bce2466cabf93f6664d6998a69eb21e39f4207930065b27b771f" dependencies = [ "bitflags 2.6.0", ] @@ -6907,19 +7075,19 @@ checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" dependencies = [ "getrandom", "libredox", - "thiserror", + "thiserror 1.0.69", ] [[package]] name = "regex" -version = "1.10.6" +version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4219d74c6b67a3654a9fbebc4b419e22126d13d2f3c4a07ee0cb61ff79a79619" +checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.7", - "regex-syntax 0.8.4", + "regex-automata 0.4.9", + "regex-syntax 0.8.5", ] [[package]] @@ -6933,13 +7101,13 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.7" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38caf58cc5ef2fed281f89292ef23f6365465ed9a41b7a7754eb4e26496c92df" +checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.8.4", + "regex-syntax 0.8.5", ] [[package]] @@ -6950,9 +7118,9 @@ checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" [[package]] name = "regex-syntax" -version = "0.8.4" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a66a03ae7c801facd77a29370b4faec201768915ac14a721ba36f20bc9c209b" +checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" [[package]] name = "reqwest" @@ -6968,7 +7136,7 @@ dependencies = [ "h2", "http 0.2.12", "http-body 0.4.6", - "hyper 0.14.30", + "hyper 0.14.31", "hyper-rustls", "hyper-tls", "ipnet", @@ -6985,7 +7153,7 @@ dependencies = [ "serde_json", "serde_urlencoded", "sync_wrapper 0.1.2", - "system-configuration", + "system-configuration 0.5.1", "tokio", "tokio-native-tls", "tokio-rustls 0.24.1", @@ -7109,16 +7277,19 @@ dependencies = [ [[package]] name = "rtnetlink" -version = "0.10.1" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "322c53fd76a18698f1c27381d58091de3a043d356aa5bd0d510608b565f469a0" +checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" dependencies = [ "futures", "log", + "netlink-packet-core", "netlink-packet-route", + "netlink-packet-utils", "netlink-proto", - "nix 0.24.3", - "thiserror", + "netlink-sys", + "nix 0.26.4", + "thiserror 1.0.69", "tokio", ] @@ -7195,9 +7366,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.0.0" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" +checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" [[package]] name = "rustc-hex" @@ -7248,15 +7419,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.37" +version = "0.38.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8acb788b847c24f28525660c4d7758620a7210875711f79e7f663cc152726811" +checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.4.14", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -7287,9 +7458,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.13" +version = "0.23.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2dabaac7466917e566adb06783a81ca48944c6898a1b08b9374106dd671f4c8" +checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" dependencies = [ "once_cell", "ring 0.17.8", @@ -7310,19 +7481,21 @@ dependencies = [ [[package]] name = "rustls-pemfile" -version = "2.1.3" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "196fe16b00e106300d3e45ecfcb764fa292a535d7326a29a5875c579c7417425" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "base64 0.22.1", "rustls-pki-types", ] [[package]] name = "rustls-pki-types" -version = "1.8.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0a2ce646f8655401bb81e7927b812614bd5d91dbc968696be50603510fcaf0" +checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b" +dependencies = [ + "web-time", +] [[package]] name = "rustls-webpki" @@ -7347,9 +7520,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.17" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" +checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248" [[package]] name = "rusty-fork" @@ -7404,33 +7577,33 @@ dependencies = [ [[package]] name = "scale-info" -version = "2.11.3" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca070c12893629e2cc820a9761bedf6ce1dcddc9852984d1dc734b8bd9bd024" +checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if", - "derive_more 0.99.18", + "derive_more 1.0.0", "parity-scale-codec 3.6.12", "scale-info-derive", ] [[package]] name = "scale-info-derive" -version = "2.11.3" +version = "2.11.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d35494501194174bda522a32605929eefc9ecf7e0a326c26db1fdd85881eb62" +checksum = "c6630024bf739e2179b91fb424b28898baf819414262c5d376677dbff1fe7ebf" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.90", ] [[package]] name = "schannel" -version = "0.1.24" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9aaafd5a2b6e3d657ff009d82fbd630b6bd54dd4eb06f21693925cdf80f9b8b" +checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" dependencies = [ "windows-sys 0.59.0", ] @@ -7521,9 +7694,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.12.0" +version = "2.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea4a292869320c0272d7bc55a5a6aafaff59b4f63404a003887b679a2e05b4b6" +checksum = "fa39c7303dc58b5543c94d22c1766b0d31f2ee58306363ea622b10bbc075eaa2" dependencies = [ "core-foundation-sys", "libc", @@ -7549,9 +7722,9 @@ dependencies = [ [[package]] name = "semver-parser" -version = "0.10.2" +version = "0.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" +checksum = "9900206b54a3527fdc7b8a938bffd94a568bac4f4aa8113b209df75a09c0dec2" dependencies = [ "pest", ] @@ -7578,9 +7751,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.210" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" dependencies = [ "serde_derive", ] @@ -7597,20 +7770,20 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.216" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.133" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "c7fceb2473b9166b2294ef05efcb65a3db80803f0b03ef86a5fc88a2b85ee377" dependencies = [ "itoa", "memchr", @@ -7636,14 +7809,14 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "serde_spanned" -version = "0.6.7" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +checksum = "87607cb1398ed59d48732e575a4c28a7a8ebf2454b964fe3f224f2afc07909e1" dependencies = [ "serde", ] @@ -7688,7 +7861,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.7.0", "itoa", "ryu", "serde", @@ -7830,7 +8003,7 @@ checksum = "adc4e5204eb1910f40f9cfa375f6f05b68c3abac4b6fd879c8ff5e7ae8a0a085" dependencies = [ "num-bigint", "num-traits", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -8080,9 +8253,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.7" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" dependencies = [ "libc", "windows-sys 0.52.0", @@ -8218,7 +8391,7 @@ dependencies = [ "tempfile", "types", "xdelta3", - "zstd 0.13.1", + "zstd 0.13.2", ] [[package]] @@ -8309,9 +8482,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.77" +version = "2.0.90" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f35bcdf61fd8e7be6caf75f429fdca8beb3ed76584befb503b1569faee373ed" +checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" dependencies = [ "proc-macro2", "quote", @@ -8326,9 +8499,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" [[package]] name = "sync_wrapper" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" [[package]] name = "synstructure" @@ -8338,7 +8511,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -8364,7 +8537,18 @@ checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", "core-foundation", - "system-configuration-sys", + "system-configuration-sys 0.5.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.6.0", + "core-foundation", + "system-configuration-sys 0.6.0", ] [[package]] @@ -8377,6 +8561,16 @@ dependencies = [ "libc", ] +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "system_health" version = "0.1.0" @@ -8429,14 +8623,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.12.0" +version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04cbcdd0c794ebb0d4cf35e88edd2f7d2c4c3e9a5a6dab322839b321c6a87a64" +checksum = "28cce251fcbc87fac86a866eeb0d6c2d536fc16d06f184bb61aeae11aa4cee0c" dependencies = [ "cfg-if", "fastrand", "once_cell", - "rustix 0.38.37", + "rustix 0.38.42", "windows-sys 0.59.0", ] @@ -8462,12 +8656,12 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21bebf2b7c9e0a515f6e0f8c51dc0f8e4696391e6f1ff30379559f8365fb0df7" +checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" dependencies = [ - "rustix 0.38.37", - "windows-sys 0.48.0", + "rustix 0.38.42", + "windows-sys 0.59.0", ] [[package]] @@ -8505,22 +8699,42 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.64" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +dependencies = [ + "thiserror-impl 2.0.6", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "thiserror-impl", + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] name = "thiserror-impl" -version = "1.0.64" +version = "2.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" +checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -8575,9 +8789,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.36" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ "deranged", "itoa", @@ -8596,9 +8810,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.18" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ "num-conv", "time-core", @@ -8628,7 +8842,7 @@ dependencies = [ "rand", "rustc-hash 1.1.0", "sha2 0.10.8", - "thiserror", + "thiserror 1.0.69", "unicode-normalization", "wasm-bindgen", "zeroize", @@ -8643,6 +8857,16 @@ dependencies = [ "crunchy", ] +[[package]] +name = "tinystr" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" +dependencies = [ + "displaydoc", + "zerovec", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -8670,9 +8894,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.40.0" +version = "1.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2b070231665d27ad9ec9b8df639893f46727666c6767db40317fbe920a5d998" +checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" dependencies = [ "backtrace", "bytes", @@ -8703,7 +8927,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -8765,9 +8989,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" +checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" dependencies = [ "futures-core", "pin-project-lite", @@ -8777,9 +9001,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" +checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" dependencies = [ "bytes", "futures-core", @@ -8808,7 +9032,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.22.21", + "toml_edit 0.22.22", ] [[package]] @@ -8826,37 +9050,22 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.7.0", "toml_datetime", "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.22.21" +version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b072cee73c449a636ffd6f32bd8de3a9f7119139aff882f44943ce2986dc5cf" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.5.0", + "indexmap 2.7.0", "serde", "serde_spanned", "toml_datetime", - "winnow 0.6.18", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tower-layer", - "tower-service", + "winnow 0.6.20", ] [[package]] @@ -8889,9 +9098,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.40" +version = "0.1.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" dependencies = [ "log", "pin-project-lite", @@ -8906,27 +9115,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf" dependencies = [ "crossbeam-channel", - "thiserror", + "thiserror 1.0.69", "time", "tracing-subscriber", ] [[package]] name = "tracing-attributes" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] name = "tracing-core" -version = "0.1.32" +version = "0.1.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" dependencies = [ "once_cell", "valuable", @@ -8955,9 +9164,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.18" +version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" dependencies = [ "matchers", "nu-ansi-term", @@ -9010,7 +9219,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", ] [[package]] @@ -9025,9 +9234,9 @@ dependencies = [ [[package]] name = "triomphe" -version = "0.1.13" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6631e42e10b40c0690bf92f404ebcfe6e1fdb480391d15f17cc8e96eeed5369" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" dependencies = [ "serde", "stable_deref_trait", @@ -9100,9 +9309,9 @@ dependencies = [ [[package]] name = "ucd-trie" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9" +checksum = "2896d95c02a80c6d6a5d6e953d479f5ddf2dfdb6a244441010e373ac0fb88971" [[package]] name = "uint" @@ -9142,24 +9351,21 @@ checksum = "ccb97dac3243214f8d8507998906ca3e2e0b900bf9bf4870477f125b82e68f6e" [[package]] name = "unicase" -version = "2.7.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" -dependencies = [ - "version_check", -] +checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df" [[package]] name = "unicode-bidi" -version = "0.3.15" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893" [[package]] name = "unicode-ident" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83" [[package]] name = "unicode-normalization" @@ -9172,9 +9378,9 @@ dependencies = [ [[package]] name = "unicode-properties" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ea75f83c0137a9b98608359a5f1af8144876eb67bcb1ce837368e906a9f524" +checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" [[package]] name = "unicode-xid" @@ -9237,15 +9443,27 @@ dependencies = [ [[package]] name = "url" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" +checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna 0.5.0", + "idna", "percent-encoding", ] +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + [[package]] name = "utf8parse" version = "0.2.2" @@ -9277,7 +9495,7 @@ dependencies = [ "eth2", "fdlimit", "graffiti_file", - "hyper 1.4.1", + "hyper 1.5.1", "initialized_validators", "metrics", "monitoring_api", @@ -9519,13 +9737,13 @@ dependencies = [ "futures-util", "headers", "http 0.2.12", - "hyper 0.14.30", + "hyper 0.14.31", "log", "mime", "mime_guess", "percent-encoding", "pin-project", - "rustls-pemfile 2.1.3", + "rustls-pemfile 2.2.0", "scoped-tls", "serde", "serde_json", @@ -9570,9 +9788,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a82edfc16a6c469f5f44dc7b571814045d60404b55a0ee849f9bcfa2e63dd9b5" +checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" dependencies = [ "cfg-if", "once_cell", @@ -9581,36 +9799,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9de396da306523044d3302746f1208fa71d7532227f15e347e2d93e4145dd77b" +checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" dependencies = [ "bumpalo", "log", - "once_cell", "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.43" +version = "0.4.49" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e9300f63a621e96ed275155c108eb6f843b6a26d053f122ab69724559dc8ed" +checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" dependencies = [ "cfg-if", "js-sys", + "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "585c4c91a46b072c92e908d99cb1dcdf95c5218eeb6f3bf1efa991ee7a68cccf" +checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9618,28 +9836,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" +checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.93" +version = "0.2.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -9678,7 +9896,7 @@ dependencies = [ "env_logger 0.9.3", "eth2", "http_api", - "hyper 1.4.1", + "hyper 1.5.1", "log", "logging", "network", @@ -9699,9 +9917,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.70" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26fdeaafd9bd129f65e7c031593c24d62186301e0c72c8978fa1678be7d532c0" +checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" dependencies = [ "js-sys", "wasm-bindgen", @@ -9760,7 +9978,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.37", + "rustix 0.38.42", ] [[package]] @@ -9769,7 +9987,7 @@ version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "372d5b87f58ec45c384ba03563b03544dc5fadc3983e434b286913f5b4a9bb6d" dependencies = [ - "redox_syscall 0.5.4", + "redox_syscall 0.5.7", "wasite", "web-sys", ] @@ -9819,12 +10037,12 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.51.1" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" dependencies = [ - "windows-core 0.51.1", - "windows-targets 0.48.5", + "windows-core 0.53.0", + "windows-targets 0.52.6", ] [[package]] @@ -9841,18 +10059,28 @@ dependencies = [ [[package]] name = "windows-core" -version = "0.51.1" +version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.52.6", ] [[package]] name = "windows-core" -version = "0.52.0" +version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" +dependencies = [ + "windows-result", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" dependencies = [ "windows-targets 0.52.6", ] @@ -10082,9 +10310,9 @@ dependencies = [ [[package]] name = "winnow" -version = "0.6.18" +version = "0.6.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68a9bda4691f099d435ad181000724da8e5899daa10713c2d432552b9ccd3a6f" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" dependencies = [ "memchr", ] @@ -10099,6 +10327,18 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + +[[package]] +name = "writeable" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" + [[package]] name = "ws_stream_wasm" version = "0.7.4" @@ -10112,7 +10352,7 @@ dependencies = [ "pharos", "rustc_version 0.4.1", "send_wrapper 0.6.0", - "thiserror", + "thiserror 1.0.69", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -10158,7 +10398,7 @@ dependencies = [ "nom", "oid-registry", "rusticata-macros", - "thiserror", + "thiserror 1.0.69", "time", ] @@ -10178,9 +10418,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.22" +version = "0.8.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af4e2e2f7cba5a093896c1e150fbfe177d1883e7448200efb81d40b9d339ef26" +checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" [[package]] name = "xmltree" @@ -10219,9 +10459,9 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a31b5e376a8b012bee9c423acdbb835fc34d45001cfa3106236a624e4b738028" +checksum = "17610762a1207ee816c6fadc29220904753648aba0a9ed61c7b8336e80a559c4" dependencies = [ "futures", "log", @@ -10242,6 +10482,30 @@ dependencies = [ "time", ] +[[package]] +name = "yoke" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" +dependencies = [ + "serde", + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -10260,7 +10524,28 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", +] + +[[package]] +name = "zerofrom" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", + "synstructure", ] [[package]] @@ -10280,7 +10565,29 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.77", + "syn 2.0.90", +] + +[[package]] +name = "zerovec" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", ] [[package]] @@ -10314,11 +10621,11 @@ dependencies = [ [[package]] name = "zstd" -version = "0.13.1" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a" +checksum = "fcf2b778a664581e31e389454a7072dab1647606d44f7feea22cd5abb9c9f3f9" dependencies = [ - "zstd-safe 7.1.0", + "zstd-safe 7.2.1", ] [[package]] @@ -10333,9 +10640,9 @@ dependencies = [ [[package]] name = "zstd-safe" -version = "7.1.0" +version = "7.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a" +checksum = "54a3ab4db68cea366acc5c897c7b4d4d1b8994a9cd6e6f841f8964566a419059" dependencies = [ "zstd-sys", ] From d9c423d2de6c161490e5a4d6b49de3c75df2ba8b Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 11 Dec 2024 21:41:43 +0800 Subject: [PATCH 10/61] Add exit multiple validators --- validator_manager/src/exit_validators.rs | 87 ++++++++++++------------ 1 file changed, 45 insertions(+), 42 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 6b02f70581e..9ee79d941df 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -68,24 +68,24 @@ pub fn cli_app() -> Command { pub struct ExitConfig { pub vc_url: SensitiveUrl, pub vc_token_path: PathBuf, - pub validators_to_exit: PublicKeyBytes, + pub validators_to_exit: Vec, pub beacon_url: Option, pub exit_epoch: Option, } impl ExitConfig { fn from_cli(matches: &ArgMatches) -> Result { - // let validator_to_exit_str = clap_utils::parse_required::(matches, VALIDATOR_FLAG)?; + let validators_to_exit_str = clap_utils::parse_required::(matches, VALIDATOR_FLAG)?; - // let validators_to_exit = validators_to_exit_str - // .split(',') - // .map(|s| s.trim().parse()) - // .collect::, _>>()?; + let validators_to_exit = validators_to_exit_str + .split(',') + .map(|s| s.trim().parse()) + .collect::, _>>()?; Ok(Self { vc_url: clap_utils::parse_required(matches, VC_URL_FLAG)?, vc_token_path: clap_utils::parse_required(matches, VC_TOKEN_FLAG)?, - validators_to_exit: clap_utils::parse_required(matches, VALIDATOR_FLAG)?, + validators_to_exit, beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, }) @@ -114,47 +114,50 @@ async fn run(config: ExitConfig) -> Result<(), String> { let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; // Check that the validators_to_exit is in the validator client - if !validators - .iter() - .any(|validator| validator.validating_pubkey == validators_to_exit) - { - return Err(format!("Validator {} doesn't exist", validators_to_exit)); + for validator_to_exit in &validators_to_exit { + if !validators + .iter() + .any(|validator| &validator.validating_pubkey == validator_to_exit) + { + return Err(format!("Validator {} doesn't exist", validator_to_exit)); + } } - let exit_message = http_client - .post_validator_voluntary_exit(&validators_to_exit, exit_epoch) - .await - .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; - - let exit_message_json = serde_json::to_string(&exit_message.data); + for validator_to_exit in &validators_to_exit { + let exit_message = http_client + .post_validator_voluntary_exit(validator_to_exit, exit_epoch) + .await + .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; - match exit_message_json { - Ok(json) => println!("{}", json), - Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), - } + let exit_message_json = serde_json::to_string(&exit_message.data); - if beacon_url.is_some() { - let beacon_node = if let Some(beacon_url) = beacon_url { - BeaconNodeHttpClient::new( - SensitiveUrl::parse(beacon_url.as_ref()) - .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, - Timeouts::set_all(Duration::from_secs(12)), - ) - } else { - return Err("Beacon URL is not provided".into()); - }; + match exit_message_json { + Ok(json) => println!("{}", json), + Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), + } - beacon_node - .post_beacon_pool_voluntary_exits(&exit_message.data) - .await - .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; - // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. - eprintln!( - "Successfully validated and published voluntary exit for validator {}", - validators_to_exit - ); + if beacon_url.is_some() { + let beacon_node = if let Some(ref beacon_url) = beacon_url { + BeaconNodeHttpClient::new( + SensitiveUrl::parse(beacon_url.as_ref()) + .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, + Timeouts::set_all(Duration::from_secs(12)), + ) + } else { + return Err("Beacon URL is not provided".into()); + }; + + beacon_node + .post_beacon_pool_voluntary_exits(&exit_message.data) + .await + .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; + // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. + eprintln!( + "Successfully validated and published voluntary exit for validator {}", + validator_to_exit + ); + } } - Ok(()) } From 0301d5522fadec4604a3d26282f42013b5e97f09 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 12 Dec 2024 10:39:43 +0800 Subject: [PATCH 11/61] Add "all" to exit all validators --- validator_manager/src/exit_validators.rs | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 9ee79d941df..9709fcd58d3 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -77,10 +77,14 @@ impl ExitConfig { fn from_cli(matches: &ArgMatches) -> Result { let validators_to_exit_str = clap_utils::parse_required::(matches, VALIDATOR_FLAG)?; - let validators_to_exit = validators_to_exit_str - .split(',') - .map(|s| s.trim().parse()) - .collect::, _>>()?; + let validators_to_exit = if validators_to_exit_str.trim() == "all" { + Vec::new() + } else { + validators_to_exit_str + .split(',') + .map(|s| s.trim().parse()) + .collect::, _>>()? + }; Ok(Self { vc_url: clap_utils::parse_required(matches, VC_URL_FLAG)?, @@ -106,13 +110,16 @@ async fn run(config: ExitConfig) -> Result<(), String> { let ExitConfig { vc_url, vc_token_path, - validators_to_exit, + mut validators_to_exit, beacon_url, exit_epoch, } = config; let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; + if validators_to_exit.is_empty() { + validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); + } // Check that the validators_to_exit is in the validator client for validator_to_exit in &validators_to_exit { if !validators From 63b9a0858f374b80f4c8ca9664f51d363105641f Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 13 Dec 2024 10:39:23 +0800 Subject: [PATCH 12/61] check if beacon node is syncing --- validator_manager/src/exit_validators.rs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 9709fcd58d3..9b26e9034b6 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -154,6 +154,19 @@ async fn run(config: ExitConfig) -> Result<(), String> { return Err("Beacon URL is not provided".into()); }; + if beacon_node + .get_node_syncing() + .await + .map_err(|e| format!("Failed to get sync status: {:?}", e))? + .data + .is_syncing + { + return Err( + "Beacon node is syncing, submit the voluntary exit later when beacon node is synced" + .to_string(), + ); + } + beacon_node .post_beacon_pool_voluntary_exits(&exit_message.data) .await From b2b64424069d40999f8634e47b6a7c259f69950c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 16 Dec 2024 14:32:55 +0800 Subject: [PATCH 13/61] Add validator status after exit --- Cargo.lock | 1 + validator_manager/Cargo.toml | 7 +- validator_manager/src/exit_validators.rs | 113 +++++++++++++++++++++-- validator_manager/src/lib.rs | 2 +- 4 files changed, 111 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 1d8edc77cbb..78ebda28564 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9614,6 +9614,7 @@ dependencies = [ "regex", "serde", "serde_json", + "slot_clock", "tempfile", "tokio", "tree_hash", diff --git a/validator_manager/Cargo.toml b/validator_manager/Cargo.toml index 3ddf30fd12e..c37898107bc 100644 --- a/validator_manager/Cargo.toml +++ b/validator_manager/Cargo.toml @@ -15,6 +15,7 @@ eth2_wallet = { workspace = true } account_utils = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +slot_clock = { workspace = true } ethereum_serde_utils = { workspace = true } tree_hash = { workspace = true } eth2 = { workspace = true } @@ -24,9 +25,9 @@ derivative = { workspace = true } logging = { workspace = true } [dev-dependencies] -tempfile = { workspace = true } +beacon_chain = { workspace = true } +http_api = { workspace = true } regex = { workspace = true } +tempfile = { workspace = true } validator_http_api = { workspace = true } -http_api = { workspace = true } -beacon_chain = { workspace = true } diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 9b26e9034b6..c9d9c092c4d 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -1,13 +1,15 @@ use crate::{common::vc_http_client, DumpConfig}; use clap::{Arg, ArgAction, ArgMatches, Command}; -use eth2::types::Epoch; +use eth2::types::{ConfigAndPreset, Epoch, StateId, ValidatorId, ValidatorStatus}; use eth2::{BeaconNodeHttpClient, SensitiveUrl, Timeouts}; use serde::{Deserialize, Serialize}; use serde_json; +use slot_clock::{SlotClock, SystemTimeSlotClock}; use std::path::PathBuf; use std::time::Duration; -use types::PublicKeyBytes; +use types::{ChainSpec, EthSpec, PublicKeyBytes}; +// use validator_http_api::create_signed_voluntary_exit::get_current_epoch; pub const CMD: &str = "exit"; pub const BEACON_URL_FLAG: &str = "beacon-node"; @@ -96,17 +98,20 @@ impl ExitConfig { } } -pub async fn cli_run(matches: &ArgMatches, dump_config: DumpConfig) -> Result<(), String> { +pub async fn cli_run( + matches: &ArgMatches, + dump_config: DumpConfig, +) -> Result<(), String> { let config = ExitConfig::from_cli(matches)?; if dump_config.should_exit_early(&config)? { Ok(()) } else { - run(config).await + run::(config).await } } -async fn run(config: ExitConfig) -> Result<(), String> { +async fn run(config: ExitConfig) -> Result<(), String> { let ExitConfig { vc_url, vc_token_path, @@ -130,9 +135,9 @@ async fn run(config: ExitConfig) -> Result<(), String> { } } - for validator_to_exit in &validators_to_exit { + for validator_to_exit in validators_to_exit { let exit_message = http_client - .post_validator_voluntary_exit(validator_to_exit, exit_epoch) + .post_validator_voluntary_exit(&validator_to_exit, exit_epoch) .await .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; @@ -143,6 +148,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), } + // only publish the voluntary exit if the --beacon-node flag is present if beacon_url.is_some() { let beacon_node = if let Some(ref beacon_url) = beacon_url { BeaconNodeHttpClient::new( @@ -157,7 +163,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { if beacon_node .get_node_syncing() .await - .map_err(|e| format!("Failed to get sync status: {:?}", e))? + .map_err(|e| format!("Failed to get beacon node sync status: {:?}", e))? .data .is_syncing { @@ -176,6 +182,97 @@ async fn run(config: ExitConfig) -> Result<(), String> { "Successfully validated and published voluntary exit for validator {}", validator_to_exit ); + + // check validator status + let validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), + ) + .await + .map_err(|e| format!("Failed to get validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state. \ + Please ensure that your beacon node is synced and the validator has been deposited.", + validator_to_exit)})? + .data; + + match validator_data.status { + ValidatorStatus::ActiveExiting => { + let exit_epoch = validator_data.validator.exit_epoch; + let withdrawal_epoch = validator_data.validator.withdrawable_epoch; + + let genesis_data = beacon_node + .get_beacon_genesis() + .await + .map_err(|e| format!("Failed to get genesis data: {}", e))? + .data; + + let spec = beacon_node + .get_config_spec::() + .await + .map_err(|e| format!("Failed to get config spec: {}", e))? + .data; + + let chain_spec = ChainSpec::from_config::(spec.config()) + .ok_or_else(|| "Failed to create chain spec".to_string())?; + + // let slot_clock = SystemTimeSlotClock::new( + // spec.genesis_slot, + // Duration::from_secs(genesis_data.genesis_time), + // Duration::from_secs(spec.config().seconds_per_slot), + // ); + + // let current_epoch = get_current_epoch::(slot_clock) + // .ok_or_else(|| "Unable to determine current epoch".to_string())?; + + fn get_current_epoch( + genesis_time: u64, + spec: &ChainSpec, + ) -> Option { + let slot_clock = SystemTimeSlotClock::new( + spec.genesis_slot, + Duration::from_secs(genesis_time), + Duration::from_secs(spec.seconds_per_slot), + ); + slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) + } + + let current_epoch = + get_current_epoch::(genesis_data.genesis_time, &chain_spec) + .ok_or("Failed to get current epoch. Please check your system time")?; + eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + Finalization may take several minutes or longer. Before finalization there is a low \ + probability that the exit may be reverted."); + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) + * chain_spec.seconds_per_slot + * E::slots_per_epoch() + ); + } + + _ => { + eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") + } + // fn get_current_epoch( + // slot_clock: T, + // ) -> Option { + // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) + // } + + // let spec = ChainSpec::mainnet(); + + // let current_epoch = + // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; + //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); + } } } Ok(()) diff --git a/validator_manager/src/lib.rs b/validator_manager/src/lib.rs index 6f873bed3fe..150c0ecc5c8 100644 --- a/validator_manager/src/lib.rs +++ b/validator_manager/src/lib.rs @@ -97,7 +97,7 @@ pub fn run(matches: &ArgMatches, env: Environment) -> Result<(), delete_validators::cli_run(matches, dump_config).await } Some((exit_validators::CMD, matches)) => { - exit_validators::cli_run(matches, dump_config).await + exit_validators::cli_run::(matches, dump_config).await } Some(("", _)) => Err("No command supplied. See --help.".to_string()), Some((unknown, _)) => Err(format!( From 28fec0a488843123823d056574eb69b9bf064ab7 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 16 Dec 2024 15:33:43 +0800 Subject: [PATCH 14/61] For testing --- Cargo.lock | 453 +++++++++++----------- scripts/local_testnet/network_params.yaml | 2 + 2 files changed, 234 insertions(+), 221 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 78ebda28564..e2ac42d8404 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -149,9 +149,9 @@ dependencies = [ [[package]] name = "allocator-api2" -version = "0.2.21" +version = "0.2.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" +checksum = "45862d1c77f2228b9e10bc609d5bc203d86ebc9b87ad8d5d5167a6c9abf739d9" [[package]] name = "alloy-consensus" @@ -204,9 +204,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.15" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" +checksum = "9fce5dbd6a4f118eecc4719eaa9c7ffc31c315e6c5ccde3642db927802312425" dependencies = [ "alloy-rlp", "arbitrary", @@ -217,9 +217,9 @@ dependencies = [ "derive_more 1.0.0", "foldhash", "getrandom", - "hashbrown 0.15.2", + "hashbrown 0.15.1", "hex-literal", - "indexmap 2.7.0", + "indexmap 2.6.0", "itoa", "k256 0.13.4", "keccak-asm", @@ -228,7 +228,7 @@ dependencies = [ "proptest-derive", "rand", "ruint", - "rustc-hash 2.1.0", + "rustc-hash 2.0.0", "serde", "sha3 0.10.8", "tiny-keccak", @@ -236,9 +236,9 @@ dependencies = [ [[package]] name = "alloy-rlp" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" +checksum = "da0822426598f95e45dd1ea32a738dac057529a709ee645fcc516ffa4cbde08f" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -247,13 +247,13 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" +checksum = "2b09cae092c27b6f1bde952653a22708691802e57bfef4a2973b80bea21efd3f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -328,9 +328,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.94" +version = "1.0.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +checksum = "4c95c10ba0b00a02636238b814946408b1322d5ac4760326e6fb8ec956d85775" [[package]] name = "arbitrary" @@ -522,7 +522,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", "synstructure", ] @@ -534,7 +534,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -567,7 +567,7 @@ dependencies = [ "futures-lite", "parking", "polling", - "rustix 0.38.42", + "rustix 0.38.41", "slab", "tracing", "windows-sys 0.59.0", @@ -592,7 +592,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -649,7 +649,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -668,7 +668,7 @@ dependencies = [ "axum-core", "bytes", "futures-util", - "http 1.2.0", + "http 1.1.0", "http-body 1.0.1", "http-body-util", "hyper 1.5.1", @@ -701,7 +701,7 @@ dependencies = [ "async-trait", "bytes", "futures-util", - "http 1.2.0", + "http 1.1.0", "http-body 1.0.1", "http-body-util", "mime", @@ -930,7 +930,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.90", + "syn 2.0.89", "which", ] @@ -1145,9 +1145,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" [[package]] name = "bytes" -version = "1.9.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "325918d6fe32f23b19878fe4b34794ae41fc19ddbe53b10571a4874d44ffd39b" +checksum = "9ac0150caa2ae65ca5bd83f25c7de183dea78d4d366469f148435e2acfbad0da" dependencies = [ "serde", ] @@ -1199,9 +1199,9 @@ dependencies = [ [[package]] name = "cargo-platform" -version = "0.1.9" +version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +checksum = "24b1f0365a6c6bb4020cd05806fd0d33c44d38046b8bd7f0e40814b9763cabfc" dependencies = [ "serde", ] @@ -1228,9 +1228,9 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.2.3" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27f657647bcff5394bf56c7317665bbf790a137a50eaaa5c6bfbb9e27a518f2d" +checksum = "fd9de9f2205d5ef3fd67e685b0df337994ddd4495e2a28d185500d0e1edfea47" dependencies = [ "jobserver", "libc", @@ -1284,9 +1284,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.39" +version = "0.4.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e36cc9d416881d2e24f9a963be5fb1cd90966419ac844274161d10488b3e825" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" dependencies = [ "android-tzdata", "iana-time-zone", @@ -1354,9 +1354,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.23" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3135e7ec2ef7b10c6ed8950f0f792ed96ee093fa088608f1c76e569722700c84" +checksum = "fb3b4b9e5a7c7514dfa52869339ee98b3156b0bfb4e8a77c4ff4babb64b1604f" dependencies = [ "clap_builder", "clap_derive", @@ -1364,9 +1364,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.23" +version = "4.5.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30582fc632330df2bd26877bde0c1f4470d57c582bbc070376afcd04d8cb4838" +checksum = "b17a95aa67cc7b5ebd32aa5370189aa0d79069ef1c64ce893bd30fb24bff20ec" dependencies = [ "anstream", "anstyle", @@ -1384,14 +1384,14 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] name = "clap_lex" -version = "0.7.4" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" +checksum = "afb84c814227b90d6895e01398aee0d8033c00e7466aca416fb6a8e0eb19d8a7" [[package]] name = "clap_utils" @@ -1452,9 +1452,9 @@ dependencies = [ [[package]] name = "cmake" -version = "0.1.52" +version = "0.1.51" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c682c223677e0e5b6b7f63a64b9351844c3f1b1678a68b7ee617e30fb082620e" +checksum = "fb1e43aa7fd152b1f968787f7dbcdeb306d1867ff373c69955211876c053f91a" dependencies = [ "cc", ] @@ -1492,9 +1492,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.14.0" +version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" +checksum = "487981fa1af147182687064d0a2c336586d337a606595ced9ffb0c685c250c73" dependencies = [ "cfg-if", "cpufeatures", @@ -1557,9 +1557,9 @@ dependencies = [ [[package]] name = "crate_crypto_internal_eth_kzg_bls12_381" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "319cb241b1ad37f8c376b2ebcd7233f53e033a50de6f0a9cf38e6cc545554de4" +checksum = "a23be5253f1bd7fd411721a58712308c4747d0a41d040bbf8ebb78d52909a480" dependencies = [ "blst", "blstrs", @@ -1571,9 +1571,9 @@ dependencies = [ [[package]] name = "crate_crypto_internal_eth_kzg_erasure_codes" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abedcc3eb4d04655c53704a66880945f5a39c6d96b337f0ab4a086dda795c954" +checksum = "f2067ce20ef380ff33a93ce0af62bea22d35531b7f3586224d8d5176ec6cf578" dependencies = [ "crate_crypto_internal_eth_kzg_bls12_381", "crate_crypto_internal_eth_kzg_polynomial", @@ -1581,24 +1581,24 @@ dependencies = [ [[package]] name = "crate_crypto_internal_eth_kzg_maybe_rayon" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3db089718921ca28d137ed8b1a7406f10e6bfbc61794a2339bcd9c99d5ddefc6" +checksum = "558f50324ff016e5fe93113c78a72776d790d52f244ae9602a8013a67a189b66" [[package]] name = "crate_crypto_internal_eth_kzg_polynomial" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "750e6dbe493d337d98502975137f055a52767021bcdb69aa8926ed8ee28c7980" +checksum = "9e051c4f5aa5696bd7c504930485436ec62bf14f30a4c2d78504f3f8ec6a3daf" dependencies = [ "crate_crypto_internal_eth_kzg_bls12_381", ] [[package]] name = "crate_crypto_kzg_multi_open_fk20" -version = "0.5.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3337262f48c7fee2999cf23bb9cb693299211671fe46b593ac81fcb218de68b" +checksum = "66ed6bf8993d9f3b361da4ed38f067503e08c0b948af0d6f4bb941dd647c0f2c" dependencies = [ "crate_crypto_internal_eth_kzg_bls12_381", "crate_crypto_internal_eth_kzg_maybe_rayon", @@ -1799,7 +1799,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -1847,7 +1847,7 @@ dependencies = [ "proc-macro2", "quote", "strsim 0.11.1", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -1869,7 +1869,7 @@ checksum = "d336a2a514f6ccccaa3e09b02d41d35330c07ddf03a62165fcec10bb561c7806" dependencies = [ "darling_core 0.20.10", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2035,7 +2035,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2048,7 +2048,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2068,15 +2068,15 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", "unicode-xid", ] [[package]] name = "diesel" -version = "2.2.6" +version = "2.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf1bedf64cdb9643204a36dd15b19a6ce8e7aa7f7b105868e9f1fad5ffa7d12" +checksum = "cbf9649c05e0a9dbd6d0b0b8301db5182b972d0fd02f0a7c6736cf632d7c0fd5" dependencies = [ "bitflags 2.6.0", "byteorder", @@ -2096,7 +2096,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2116,7 +2116,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25" dependencies = [ - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2231,7 +2231,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2262,7 +2262,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2442,7 +2442,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2506,12 +2506,12 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -2826,7 +2826,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -2971,9 +2971,9 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.5.3" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +checksum = "0f214dc438f977e6d4e3500aaa277f5ad94ca83fbbd9b1a15713ce2344ccc5a1" dependencies = [ "event-listener 5.3.1", "pin-project-lite", @@ -3079,9 +3079,9 @@ checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" [[package]] name = "fastrand" -version = "2.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "486f806e73c5707928240ddc295403b1b93c96a02038563881c4a2fd84b81ac4" [[package]] name = "fastrlp" @@ -3349,7 +3349,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -3359,7 +3359,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" dependencies = [ "futures-io", - "rustls 0.23.19", + "rustls 0.23.18", "rustls-pki-types", ] @@ -3490,7 +3490,7 @@ checksum = "53010ccb100b96a67bc32c0175f0ed1426b31b655d562898e57325f81c023ac0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -3589,7 +3589,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.7.0", + "indexmap 2.6.0", "slab", "tokio", "tokio-util", @@ -3639,9 +3639,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3" dependencies = [ "allocator-api2", "equivalent", @@ -3756,9 +3756,9 @@ checksum = "b07f60793ff0a4d9cef0f18e63b5357e06209987153a64648c972c1e5aff336f" [[package]] name = "hickory-proto" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "447afdcdb8afb9d0a852af6dc65d9b285ce720ed7a59e42a8bf2e931c67bc1b5" +checksum = "07698b8420e2f0d6447a436ba999ec85d8fbf2a398bbd737b82cac4a2e96e512" dependencies = [ "async-trait", "cfg-if", @@ -3767,7 +3767,7 @@ dependencies = [ "futures-channel", "futures-io", "futures-util", - "idna", + "idna 0.4.0", "ipnet", "once_cell", "rand", @@ -3781,9 +3781,9 @@ dependencies = [ [[package]] name = "hickory-resolver" -version = "0.24.2" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a2e2aba9c389ce5267d31cf1e4dace82390ae276b0b364ea55630b1fa1b44b4" +checksum = "28757f23aa75c98f254cf0405e6d8c25b831b32921b050a66692427679b1f243" dependencies = [ "cfg-if", "futures-util", @@ -3882,9 +3882,9 @@ dependencies = [ [[package]] name = "http" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f16ca2af56261c99fba8bac40a10251ce8188205a4c448fbb745a2e4daa76fea" +checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", @@ -3909,7 +3909,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ "bytes", - "http 1.2.0", + "http 1.1.0", ] [[package]] @@ -3920,7 +3920,7 @@ checksum = "793429d76616a256bcb62c2a2ec2bed781c8307e797e2598c50010f2bee2544f" dependencies = [ "bytes", "futures-util", - "http 1.2.0", + "http 1.1.0", "http-body 1.0.1", "pin-project-lite", ] @@ -4043,7 +4043,7 @@ dependencies = [ "bytes", "futures-channel", "futures-util", - "http 1.2.0", + "http 1.1.0", "http-body 1.0.1", "httparse", "httpdate", @@ -4088,7 +4088,7 @@ checksum = "df2dcfbe0677734ab2f3ffa7fa7bfd4706bfdc1ef393f2ee30184aed67e631b4" dependencies = [ "bytes", "futures-util", - "http 1.2.0", + "http 1.1.0", "http-body 1.0.1", "hyper 1.5.1", "pin-project-lite", @@ -4234,7 +4234,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -4243,6 +4243,16 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "1.0.3" @@ -4331,7 +4341,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.6.12", + "parity-scale-codec 3.7.0", ] [[package]] @@ -4369,7 +4379,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -4390,13 +4400,13 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f822373a4fe84d4bb149bf54e584a7f4abec90e072ed49cda0edea5b95471f" +checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.15.2", + "hashbrown 0.15.1", "serde", ] @@ -4539,9 +4549,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" +checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2" [[package]] name = "jobserver" @@ -4554,11 +4564,10 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.76" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717b6b5b077764fb5966237269cb3c64edddde4b14ce42647430a78ced9e7b7" +checksum = "6a88f1bda2bd75b0452a14784937d796722fdebfe50df998aeb3f0b7603019a9" dependencies = [ - "once_cell", "wasm-bindgen", ] @@ -4728,9 +4737,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.168" +version = "0.2.164" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aaeb2981e0606ca11d79718f8bb01164f1d6ed75080182d3abf017e6d244b6d" +checksum = "433bfe06b8c75da9b2e3fbea6e5329ff87748f0b144ef75306e674c3f6f7c13f" [[package]] name = "libflate" @@ -4758,9 +4767,9 @@ dependencies = [ [[package]] name = "libloading" -version = "0.8.6" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34" +checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", "windows-targets 0.52.6", @@ -5047,7 +5056,7 @@ dependencies = [ "quinn", "rand", "ring 0.17.8", - "rustls 0.23.19", + "rustls 0.23.18", "socket2", "thiserror 1.0.69", "tokio", @@ -5087,7 +5096,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -5119,7 +5128,7 @@ dependencies = [ "libp2p-identity", "rcgen", "ring 0.17.8", - "rustls 0.23.19", + "rustls 0.23.18", "rustls-webpki 0.101.7", "thiserror 1.0.69", "x509-parser", @@ -5440,7 +5449,7 @@ version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38" dependencies = [ - "hashbrown 0.15.2", + "hashbrown 0.15.1", ] [[package]] @@ -5674,10 +5683,11 @@ dependencies = [ [[package]] name = "mio" -version = "1.0.3" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" +checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ + "hermit-abi 0.3.9", "libc", "wasi", "windows-sys 0.52.0", @@ -5745,9 +5755,9 @@ dependencies = [ [[package]] name = "multihash" -version = "0.19.3" +version = "0.19.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b430e7953c29dd6a09afc29ff0bb69c6e306329ee6794700aee27b76a1aea8d" +checksum = "cc41f430805af9d1cf4adae4ed2149c759b877b01d909a1f40256188d09345d2" dependencies = [ "core2", "unsigned-varint 0.8.0", @@ -5838,9 +5848,9 @@ dependencies = [ [[package]] name = "netlink-sys" -version = "0.8.7" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16c903aa70590cb93691bf97a767c8d1d6122d2cc9070433deb3bbf36ce8bd23" +checksum = "416060d346fbaf1f23f9512963e3e878f1a78e707cb699ba9215761754244307" dependencies = [ "bytes", "futures", @@ -6149,7 +6159,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -6245,15 +6255,16 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.12" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee" +checksum = "8be4817d39f3272f69c59fe05d0535ae6456c2dc2fa1ba02910296c7e0a5c590" dependencies = [ "arrayvec", "bitvec 1.0.1", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.6.12", + "parity-scale-codec-derive 3.7.0", + "rustversion", "serde", ] @@ -6271,14 +6282,14 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.12" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c" +checksum = "8781a75c6205af67215f382092b6e0a4ff3734798523e69073d4bcd294ec767b" dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.89", ] [[package]] @@ -6400,12 +6411,12 @@ checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "pest" -version = "2.7.15" +version = "2.7.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7cafe60d6cf8e62e1b9b2ea516a089c008945bb5a275416789e7db0bc199dc" +checksum = "879952a81a83930934cbf1786752d6dedc3b1f29e8f8fb2ad1d0a36f377cf442" dependencies = [ "memchr", - "thiserror 2.0.6", + "thiserror 1.0.69", "ucd-trie", ] @@ -6454,7 +6465,7 @@ checksum = "3c0f5fad0874fc7abcd4d750e76917eaebbecaa2c20bde22e1dbeeba8beb758c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -6539,7 +6550,7 @@ dependencies = [ "concurrent-queue", "hermit-abi 0.4.0", "pin-project-lite", - "rustix 0.38.42", + "rustix 0.38.41", "tracing", "windows-sys 0.59.0", ] @@ -6635,7 +6646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "64d1ec885c64d0457d564db4ec299b2dae3f9c02808b8ad9c3a089c591b18033" dependencies = [ "proc-macro2", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -6752,7 +6763,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -6783,7 +6794,7 @@ checksum = "6ff7ff745a347b87471d859a377a9a404361e7efc2a971d73424a6d183c0fc77" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -6884,10 +6895,10 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.0", - "rustls 0.23.19", + "rustc-hash 2.0.0", + "rustls 0.23.18", "socket2", - "thiserror 2.0.6", + "thiserror 2.0.3", "tokio", "tracing", ] @@ -6902,11 +6913,11 @@ dependencies = [ "getrandom", "rand", "ring 0.17.8", - "rustc-hash 2.1.0", - "rustls 0.23.19", + "rustc-hash 2.0.0", + "rustls 0.23.18", "rustls-pki-types", "slab", - "thiserror 2.0.6", + "thiserror 2.0.3", "tinyvec", "tracing", "web-time", @@ -6914,9 +6925,9 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.8" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52cd4b1eff68bf27940dd39811292c49e007f4d0b4c357358dc9b0197be6b527" +checksum = "7d5a626c6807713b15cac82a6acaccd6043c9a5408c24baae07611fec3f243da" dependencies = [ "cfg_aliases", "libc", @@ -7042,9 +7053,9 @@ dependencies = [ [[package]] name = "redb" -version = "2.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c2a94325f9c5826b17c42af11067230f503747f870117a28180e85696e21ba" +checksum = "84b1de48a7cf7ba193e81e078d17ee2b786236eed1d3f7c60f8a09545efc4925" dependencies = [ "libc", ] @@ -7307,7 +7318,7 @@ dependencies = [ "fastrlp", "num-bigint", "num-traits", - "parity-scale-codec 3.6.12", + "parity-scale-codec 3.7.0", "primitive-types 0.12.2", "proptest", "rand", @@ -7366,9 +7377,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7fb8039b3032c191086b10f11f319a6e99e1e82889c5cc6046f515c9db1d497" +checksum = "583034fd73374156e66797ed8e5b0d5690409c9226b22d87cb7f19821c05d152" [[package]] name = "rustc-hex" @@ -7419,15 +7430,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.42" +version = "0.38.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93dc38ecbab2eb790ff964bb77fa94faf256fd3e73285fd7ba0903b76bedb85" +checksum = "d7f649912bc1495e167a6edee79151c84b1bad49748cb4f1f1167f459f6224f6" dependencies = [ "bitflags 2.6.0", "errno", "libc", "linux-raw-sys 0.4.14", - "windows-sys 0.59.0", + "windows-sys 0.52.0", ] [[package]] @@ -7458,9 +7469,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.19" +version = "0.23.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "934b404430bb06b3fae2cba809eb45a1ab1aecd64491213d7c3301b88393f8d1" +checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f" dependencies = [ "once_cell", "ring 0.17.8", @@ -7583,7 +7594,7 @@ checksum = "346a3b32eba2640d17a9cb5927056b08f3de90f65b72fe09402c2ad07d684d0b" dependencies = [ "cfg-if", "derive_more 1.0.0", - "parity-scale-codec 3.6.12", + "parity-scale-codec 3.7.0", "scale-info-derive", ] @@ -7596,7 +7607,7 @@ dependencies = [ "proc-macro-crate 3.2.0", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -7751,9 +7762,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.216" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b9781016e935a97e8beecf0c933758c97a5520d32930e460142b4cd80c6338e" +checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f" dependencies = [ "serde_derive", ] @@ -7770,13 +7781,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.216" +version = "1.0.215" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f859dbbf73865c6627ed570e78961cd3ac92407a2d117204c49232485da55e" +checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -7809,7 +7820,7 @@ checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -7861,7 +7872,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.6.0", "itoa", "ryu", "serde", @@ -8253,9 +8264,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.8" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c970269d99b64e60ec3bd6ad27270092a5394c4e309314b18ae3fe575695fbe8" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" dependencies = [ "libc", "windows-sys 0.52.0", @@ -8482,9 +8493,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.90" +version = "2.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31" +checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e" dependencies = [ "proc-macro2", "quote", @@ -8511,7 +8522,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -8630,7 +8641,7 @@ dependencies = [ "cfg-if", "fastrand", "once_cell", - "rustix 0.38.42", + "rustix 0.38.41", "windows-sys 0.59.0", ] @@ -8656,11 +8667,11 @@ dependencies = [ [[package]] name = "terminal_size" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5352447f921fda68cf61b4101566c0bdb5104eff6804d0678e5227580ab6a4e9" +checksum = "4f599bd7ca042cfdf8f4512b277c02ba102247820f9d9d4a9f521f496751a6ef" dependencies = [ - "rustix 0.38.42", + "rustix 0.38.41", "windows-sys 0.59.0", ] @@ -8708,11 +8719,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.6" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fec2a1820ebd077e2b90c4df007bebf344cd394098a13c563957d0afc83ea47" +checksum = "c006c85c7651b3cf2ada4584faa36773bd07bac24acfb39f3c431b36d7e667aa" dependencies = [ - "thiserror-impl 2.0.6", + "thiserror-impl 2.0.3", ] [[package]] @@ -8723,18 +8734,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] name = "thiserror-impl" -version = "2.0.6" +version = "2.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d65750cab40f4ff1929fb1ba509e9914eb756131cef4210da8d5d700d26f6312" +checksum = "f077553d607adc1caf65430528a576c757a71ed73944b66ebb58ef2bbd243568" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -8789,9 +8800,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.37" +version = "0.3.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", "itoa", @@ -8810,9 +8821,9 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.19" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" dependencies = [ "num-conv", "time-core", @@ -8894,9 +8905,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.42.0" +version = "1.41.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5cec9b21b0450273377fc97bd4c33a8acffc8c996c987a7c5b319a0083707551" +checksum = "22cfb5bee7a6a52939ca9224d6ac897bb669134078daa8735560897f69de4d33" dependencies = [ "backtrace", "bytes", @@ -8927,7 +8938,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -8989,9 +9000,9 @@ dependencies = [ [[package]] name = "tokio-stream" -version = "0.1.17" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca58d7bba4a75707817a2c44174253f9236b2d5fbd055602e9d5c07c139a047" +checksum = "4f4e6ce100d0eb49a2734f8c0812bcd324cf357d21810932c5df6b96ef2b86f1" dependencies = [ "futures-core", "pin-project-lite", @@ -9001,9 +9012,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.13" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7fcaa8d55a2bdd6b83ace262b016eca0d79ee02818c5c1bcdf0305114081078" +checksum = "61e7c3654c13bcd040d4a03abee2c75b1d14a37b423cf5a813ceae1cc903ec6a" dependencies = [ "bytes", "futures-core", @@ -9050,7 +9061,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.6.0", "toml_datetime", "winnow 0.5.40", ] @@ -9061,7 +9072,7 @@ version = "0.22.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" dependencies = [ - "indexmap 2.7.0", + "indexmap 2.6.0", "serde", "serde_spanned", "toml_datetime", @@ -9098,9 +9109,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" dependencies = [ "log", "pin-project-lite", @@ -9122,20 +9133,20 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" dependencies = [ "once_cell", "valuable", @@ -9164,9 +9175,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -9219,7 +9230,7 @@ dependencies = [ "darling 0.20.10", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -9448,7 +9459,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" dependencies = [ "form_urlencoded", - "idna", + "idna 1.0.3", "percent-encoding", ] @@ -9789,9 +9800,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.99" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a474f6281d1d70c17ae7aa6a613c87fce69a127e2624002df63dcb39d6cf6396" +checksum = "128d1e363af62632b8eb57219c8fd7877144af57558fb2ef0368d0087bddeb2e" dependencies = [ "cfg-if", "once_cell", @@ -9800,36 +9811,36 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.99" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f89bb38646b4f81674e8f5c3fb81b562be1fd936d84320f3264486418519c79" +checksum = "cb6dd4d3ca0ddffd1dd1c9c04f94b868c37ff5fac97c30b97cff2d74fce3a358" dependencies = [ "bumpalo", "log", + "once_cell", "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.49" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38176d9b44ea84e9184eff0bc34cc167ed044f816accfe5922e54d84cf48eca2" +checksum = "cc7ec4f8827a71586374db3e87abdb5a2bb3a15afed140221307c3ec06b1f63b" dependencies = [ "cfg-if", "js-sys", - "once_cell", "wasm-bindgen", "web-sys", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.99" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc6181fd9a7492eef6fef1f33961e3695e4579b9872a6f7c83aee556666d4fe" +checksum = "e79384be7f8f5a9dd5d7167216f022090cf1f9ec128e6e6a482a2cb5c5422c56" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -9837,22 +9848,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.99" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d7a95b763d3c45903ed6c81f156801839e5ee968bb07e534c44df0fcd330c2" +checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.99" +version = "0.2.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "943aab3fdaaa029a6e0271b35ea10b72b943135afe9bffca82384098ad0e06a6" +checksum = "65fc09f10666a9f147042251e0dda9c18f166ff7de300607007e96bdebc1068d" [[package]] name = "wasm-streams" @@ -9918,9 +9929,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.76" +version = "0.3.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dd7223427d52553d3702c004d3b2fe07c148165faa56313cb00211e31c12bc" +checksum = "f6488b90108c040df0fe62fa815cbdee25124641df01814dd7282749234c6112" dependencies = [ "js-sys", "wasm-bindgen", @@ -9979,7 +9990,7 @@ dependencies = [ "either", "home", "once_cell", - "rustix 0.38.42", + "rustix 0.38.41", ] [[package]] @@ -10419,9 +10430,9 @@ dependencies = [ [[package]] name = "xml-rs" -version = "0.8.24" +version = "0.8.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea8b391c9a790b496184c29f7f93b9ed5b16abb306c05415b68bcc16e4d06432" +checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f" [[package]] name = "xmltree" @@ -10503,7 +10514,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", "synstructure", ] @@ -10525,7 +10536,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -10545,7 +10556,7 @@ checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", "synstructure", ] @@ -10566,7 +10577,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] @@ -10588,7 +10599,7 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.90", + "syn 2.0.89", ] [[package]] diff --git a/scripts/local_testnet/network_params.yaml b/scripts/local_testnet/network_params.yaml index b53d88e52c5..6faa2b6e7c4 100644 --- a/scripts/local_testnet/network_params.yaml +++ b/scripts/local_testnet/network_params.yaml @@ -10,8 +10,10 @@ participants: network_params: deneb_fork_epoch: 0 seconds_per_slot: 3 + shard_committee_period: 5 global_log_level: debug snooper_enabled: false +keymanager_enabled: true additional_services: - dora - prometheus_grafana From 04f85e275cb16d1d9387f08748a9b50286167501 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 16 Dec 2024 17:59:52 +0800 Subject: [PATCH 15/61] Display signature only when the flag is used --- validator_manager/src/exit_validators.rs | 154 +++++++++++++---------- 1 file changed, 90 insertions(+), 64 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index c9d9c092c4d..4e640b51128 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -1,6 +1,7 @@ use crate::{common::vc_http_client, DumpConfig}; use clap::{Arg, ArgAction, ArgMatches, Command}; +use clap_utils::FLAG_HEADER; use eth2::types::{ConfigAndPreset, Epoch, StateId, ValidatorId, ValidatorStatus}; use eth2::{BeaconNodeHttpClient, SensitiveUrl, Timeouts}; use serde::{Deserialize, Serialize}; @@ -13,11 +14,11 @@ use types::{ChainSpec, EthSpec, PublicKeyBytes}; pub const CMD: &str = "exit"; pub const BEACON_URL_FLAG: &str = "beacon-node"; -pub const VALIDATORS_FILE_FLAG: &str = "validators-file"; pub const VC_URL_FLAG: &str = "vc-url"; pub const VC_TOKEN_FLAG: &str = "vc-token"; pub const VALIDATOR_FLAG: &str = "validators"; pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; +pub const SIGNATURE_FLAG: &str = "signature"; pub fn cli_app() -> Command { Command::new(CMD) @@ -64,6 +65,14 @@ pub fn cli_app() -> Command { .action(ArgAction::Set) .display_order(0), ) + .arg( + Arg::new(SIGNATURE_FLAG) + .long(SIGNATURE_FLAG) + .help("Display the signature of the voluntary exit.") + .help_heading(FLAG_HEADER) + .action(ArgAction::Set) + .display_order(0), + ) } #[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] @@ -73,6 +82,7 @@ pub struct ExitConfig { pub validators_to_exit: Vec, pub beacon_url: Option, pub exit_epoch: Option, + pub signature: Option, } impl ExitConfig { @@ -94,6 +104,7 @@ impl ExitConfig { validators_to_exit, beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, + signature: clap_utils::parse_optional(matches, SIGNATURE_FLAG)?, }) } } @@ -118,13 +129,16 @@ async fn run(config: ExitConfig) -> Result<(), String> { mut validators_to_exit, beacon_url, exit_epoch, + signature, } = config; let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; + // Exit all validators on the VC if validators_to_exit.is_empty() { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } + // Check that the validators_to_exit is in the validator client for validator_to_exit in &validators_to_exit { if !validators @@ -141,11 +155,12 @@ async fn run(config: ExitConfig) -> Result<(), String> { .await .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; - let exit_message_json = serde_json::to_string(&exit_message.data); - - match exit_message_json { - Ok(json) => println!("{}", json), - Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), + if signature.is_some() { + let exit_message_json = serde_json::to_string(&exit_message.data); + match exit_message_json { + Ok(json) => println!("{}", json), + Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), + } } // only publish the voluntary exit if the --beacon-node flag is present @@ -160,6 +175,22 @@ async fn run(config: ExitConfig) -> Result<(), String> { return Err("Beacon URL is not provided".into()); }; + // Get beacon node spec to be used later + let genesis_data = beacon_node + .get_beacon_genesis() + .await + .map_err(|e| format!("Failed to get genesis data: {}", e))? + .data; + + let config_and_preset = beacon_node + .get_config_spec::() + .await + .map_err(|e| format!("Failed to get config spec: {}", e))? + .data; + + let spec = ChainSpec::from_config::(config_and_preset.config()) + .ok_or_else(|| "Failed to create chain spec".to_string())?; + if beacon_node .get_node_syncing() .await @@ -173,6 +204,40 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } + let validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), + ) + .await + .map_err(|e| format!("Failed to get validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state. \ + Please ensure that your beacon node is synced and the validator has been deposited.", + validator_to_exit)})? + .data; + + let activation_epoch = validator_data.validator.activation_epoch; + let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) + .ok_or("Failed to get current epoch. Please check your system time")?; + + // Check if validator is eligible for exit + if validator_data.status == ValidatorStatus::ActiveOngoing + && current_epoch < activation_epoch + spec.shard_committee_period + { + eprintln!( + "Validator {} is not eligible for exit. It will become eligible on epoch {}", + validator_to_exit, + activation_epoch + spec.shard_committee_period + ) + } else if validator_data.status != ValidatorStatus::ActiveOngoing { + eprintln!( + "Validator {} is not eligible for exit. Validator status is: {:?}", + validator_to_exit, validator_data.status + ) + }; + beacon_node .post_beacon_pool_voluntary_exits(&exit_message.data) .await @@ -183,41 +248,12 @@ async fn run(config: ExitConfig) -> Result<(), String> { validator_to_exit ); - // check validator status - let validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), - ) - .await - .map_err(|e| format!("Failed to get validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state. \ - Please ensure that your beacon node is synced and the validator has been deposited.", - validator_to_exit)})? - .data; - + // Check validator status after publishing voluntary exit match validator_data.status { ValidatorStatus::ActiveExiting => { let exit_epoch = validator_data.validator.exit_epoch; let withdrawal_epoch = validator_data.validator.withdrawable_epoch; - let genesis_data = beacon_node - .get_beacon_genesis() - .await - .map_err(|e| format!("Failed to get genesis data: {}", e))? - .data; - - let spec = beacon_node - .get_config_spec::() - .await - .map_err(|e| format!("Failed to get config spec: {}", e))? - .data; - - let chain_spec = ChainSpec::from_config::(spec.config()) - .ok_or_else(|| "Failed to create chain spec".to_string())?; - // let slot_clock = SystemTimeSlotClock::new( // spec.genesis_slot, // Duration::from_secs(genesis_data.genesis_time), @@ -227,21 +263,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { // let current_epoch = get_current_epoch::(slot_clock) // .ok_or_else(|| "Unable to determine current epoch".to_string())?; - fn get_current_epoch( - genesis_time: u64, - spec: &ChainSpec, - ) -> Option { - let slot_clock = SystemTimeSlotClock::new( - spec.genesis_slot, - Duration::from_secs(genesis_time), - Duration::from_secs(spec.seconds_per_slot), - ); - slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) - } - - let current_epoch = - get_current_epoch::(genesis_data.genesis_time, &chain_spec) - .ok_or("Failed to get current epoch. Please check your system time")?; eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); @@ -252,32 +273,37 @@ async fn run(config: ExitConfig) -> Result<(), String> { eprintln!("Please keep your validator running till exit epoch"); eprintln!( "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) - * chain_spec.seconds_per_slot - * E::slots_per_epoch() + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() ); } _ => { eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") - } - // fn get_current_epoch( - // slot_clock: T, - // ) -> Option { - // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) - // } + } // fn get_current_epoch( + // slot_clock: T, + // ) -> Option { + // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) + // } - // let spec = ChainSpec::mainnet(); + // let spec = ChainSpec::mainnet(); - // let current_epoch = - // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; - //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); + // let current_epoch = + // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; + //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); } } } Ok(()) } +fn get_current_epoch(genesis_time: u64, spec: &ChainSpec) -> Option { + let slot_clock = SystemTimeSlotClock::new( + spec.genesis_slot, + Duration::from_secs(genesis_time), + Duration::from_secs(spec.seconds_per_slot), + ); + slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) +} #[cfg(not(debug_assertions))] #[cfg(test)] mod test { From e5d16ecda06dd3b7d897f2caade694359266656d Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 16 Dec 2024 20:58:00 +0800 Subject: [PATCH 16/61] Fix signature flag --- validator_manager/src/exit_validators.rs | 28 ++++++++++++++---------- 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 4e640b51128..9b65c2ac27d 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -9,6 +9,7 @@ use serde_json; use slot_clock::{SlotClock, SystemTimeSlotClock}; use std::path::PathBuf; use std::time::Duration; +use tokio::time::sleep; use types::{ChainSpec, EthSpec, PublicKeyBytes}; // use validator_http_api::create_signed_voluntary_exit::get_current_epoch; @@ -70,7 +71,7 @@ pub fn cli_app() -> Command { .long(SIGNATURE_FLAG) .help("Display the signature of the voluntary exit.") .help_heading(FLAG_HEADER) - .action(ArgAction::Set) + .action(ArgAction::SetTrue) .display_order(0), ) } @@ -227,7 +228,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { && current_epoch < activation_epoch + spec.shard_committee_period { eprintln!( - "Validator {} is not eligible for exit. It will become eligible on epoch {}", + "Validator {} is not eligible for exit. It will become eligible at epoch {}", validator_to_exit, activation_epoch + spec.shard_committee_period ) @@ -236,17 +237,20 @@ async fn run(config: ExitConfig) -> Result<(), String> { "Validator {} is not eligible for exit. Validator status is: {:?}", validator_to_exit, validator_data.status ) - }; + } else { + // Only publish voluntary exit if validator is ActiveOngoing + beacon_node + .post_beacon_pool_voluntary_exits(&exit_message.data) + .await + .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; + // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. + eprintln!( + "Successfully validated and published voluntary exit for validator {}", + validator_to_exit + ); + } - beacon_node - .post_beacon_pool_voluntary_exits(&exit_message.data) - .await - .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; - // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. - eprintln!( - "Successfully validated and published voluntary exit for validator {}", - validator_to_exit - ); + sleep(Duration::from_secs(spec.seconds_per_slot)).await; // Check validator status after publishing voluntary exit match validator_data.status { From 93e47b2c11f078e6aebc53303299fe89aba7870c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 16 Dec 2024 22:27:26 +0800 Subject: [PATCH 17/61] Fix signature flag --- validator_manager/src/exit_validators.rs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 9b65c2ac27d..b3be475c5dd 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -71,7 +71,8 @@ pub fn cli_app() -> Command { .long(SIGNATURE_FLAG) .help("Display the signature of the voluntary exit.") .help_heading(FLAG_HEADER) - .action(ArgAction::SetTrue) + .value_parser(["true", "false"]) + .action(ArgAction::Set) .display_order(0), ) } From 375f8a206bbc68f7b19dd16bc9aee52fe91cde72 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 08:30:13 +0800 Subject: [PATCH 18/61] signature flag --- validator_manager/src/exit_validators.rs | 117 ++++++++++++----------- 1 file changed, 60 insertions(+), 57 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index b3be475c5dd..8dba02bd2d8 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -9,7 +9,7 @@ use serde_json; use slot_clock::{SlotClock, SystemTimeSlotClock}; use std::path::PathBuf; use std::time::Duration; -use tokio::time::sleep; +// use tokio::time::sleep; use types::{ChainSpec, EthSpec, PublicKeyBytes}; // use validator_http_api::create_signed_voluntary_exit::get_current_epoch; @@ -71,8 +71,7 @@ pub fn cli_app() -> Command { .long(SIGNATURE_FLAG) .help("Display the signature of the voluntary exit.") .help_heading(FLAG_HEADER) - .value_parser(["true", "false"]) - .action(ArgAction::Set) + .action(ArgAction::SetTrue) .display_order(0), ) } @@ -84,7 +83,7 @@ pub struct ExitConfig { pub validators_to_exit: Vec, pub beacon_url: Option, pub exit_epoch: Option, - pub signature: Option, + pub signature: bool, } impl ExitConfig { @@ -106,7 +105,7 @@ impl ExitConfig { validators_to_exit, beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, - signature: clap_utils::parse_optional(matches, SIGNATURE_FLAG)?, + signature: matches.get_flag(SIGNATURE_FLAG), }) } } @@ -157,7 +156,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { .await .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; - if signature.is_some() { + if signature { let exit_message_json = serde_json::to_string(&exit_message.data); match exit_message_json { Ok(json) => println!("{}", json), @@ -177,6 +176,19 @@ async fn run(config: ExitConfig) -> Result<(), String> { return Err("Beacon URL is not provided".into()); }; + if beacon_node + .get_node_syncing() + .await + .map_err(|e| format!("Failed to get beacon node sync status: {:?}", e))? + .data + .is_syncing + { + return Err( + "Beacon node is syncing, submit the voluntary exit later when beacon node is synced" + .to_string(), + ); + } + // Get beacon node spec to be used later let genesis_data = beacon_node .get_beacon_genesis() @@ -193,19 +205,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { let spec = ChainSpec::from_config::(config_and_preset.config()) .ok_or_else(|| "Failed to create chain spec".to_string())?; - if beacon_node - .get_node_syncing() - .await - .map_err(|e| format!("Failed to get beacon node sync status: {:?}", e))? - .data - .is_syncing - { - return Err( - "Beacon node is syncing, submit the voluntary exit later when beacon node is synced" - .to_string(), - ); - } - let validator_data = beacon_node .get_beacon_states_validator_id( StateId::Head, @@ -249,52 +248,56 @@ async fn run(config: ExitConfig) -> Result<(), String> { "Successfully validated and published voluntary exit for validator {}", validator_to_exit ); - } - sleep(Duration::from_secs(spec.seconds_per_slot)).await; + // sleep(Duration::from_secs(spec.seconds_per_slot)).await; - // Check validator status after publishing voluntary exit - match validator_data.status { - ValidatorStatus::ActiveExiting => { - let exit_epoch = validator_data.validator.exit_epoch; - let withdrawal_epoch = validator_data.validator.withdrawable_epoch; + // Check validator status after publishing voluntary exit + match validator_data.status { + ValidatorStatus::ActiveExiting => { + let exit_epoch = validator_data.validator.exit_epoch; + let withdrawal_epoch = validator_data.validator.withdrawable_epoch; - // let slot_clock = SystemTimeSlotClock::new( - // spec.genesis_slot, - // Duration::from_secs(genesis_data.genesis_time), - // Duration::from_secs(spec.config().seconds_per_slot), - // ); + // let slot_clock = SystemTimeSlotClock::new( + // spec.genesis_slot, + // Duration::from_secs(genesis_data.genesis_time), + // Duration::from_secs(spec.config().seconds_per_slot), + // ); - // let current_epoch = get_current_epoch::(slot_clock) - // .ok_or_else(|| "Unable to determine current epoch".to_string())?; + // let current_epoch = get_current_epoch::(slot_clock) + // .ok_or_else(|| "Unable to determine current epoch".to_string())?; - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); - eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() - ); + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) + * spec.seconds_per_slot + * E::slots_per_epoch() + ); + } + + _ => { + eprintln!( + "Waiting for voluntary exit to be accepted into the beacon chain..." + ) + } // fn get_current_epoch( + // slot_clock: T, + // ) -> Option { + // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) + // } + + // let spec = ChainSpec::mainnet(); + + // let current_epoch = + // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; + //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); } - - _ => { - eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") - } // fn get_current_epoch( - // slot_clock: T, - // ) -> Option { - // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) - // } - - // let spec = ChainSpec::mainnet(); - - // let current_epoch = - // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; - //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); } } } From d7421b05bd5548273c8637d1cc7225cca6437431 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 10:37:31 +0800 Subject: [PATCH 19/61] Add test to lighthouse/tests --- lighthouse/tests/validator_manager.rs | 45 +++++++++++++ validator_manager/src/exit_validators.rs | 84 +++++++++++------------- 2 files changed, 85 insertions(+), 44 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index 999f3c31415..ac536c7536a 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -10,6 +10,7 @@ use types::*; use validator_manager::{ create_validators::CreateConfig, delete_validators::DeleteConfig, + exit_validators::ExitConfig, import_validators::ImportConfig, list_validators::ListConfig, move_validators::{MoveConfig, PasswordSource, Validators}, @@ -119,6 +120,12 @@ impl CommandLineTest { } } +impl CommandLineTest { + fn validators_exit() -> Self { + Self::default().flag("exit", None) + } +} + #[test] pub fn validator_create_without_output_path() { CommandLineTest::validators_create().assert_failed(); @@ -468,3 +475,41 @@ pub fn validator_delete_defaults() { assert_eq!(expected, config); }); } + +#[test] +pub fn validator_delete_missing_validator_flag() { + CommandLineTest::validators_delete() + .flag("--vc-token", Some("./token.json")) + .assert_failed(); +} + +#[test] +pub fn validator_exit_defaults() { + CommandLineTest::validators_exit() + .flag( + "--validators", + Some(&format!("{},{}", EXAMPLE_PUBKEY_0, EXAMPLE_PUBKEY_1)), + ) + .flag("--vc-token", Some("./token.json")) + .assert_success(|config| { + let expected = ExitConfig { + vc_url: SensitiveUrl::parse("http://localhost:5062").unwrap(), + vc_token_path: PathBuf::from("./token.json"), + validators_to_exit: vec![ + PublicKeyBytes::from_str(EXAMPLE_PUBKEY_0).unwrap(), + PublicKeyBytes::from_str(EXAMPLE_PUBKEY_1).unwrap(), + ], + beacon_url: None, + exit_epoch: None, + signature: false, + }; + assert_eq!(expected, config); + }); +} + +#[test] +pub fn validator_exit_missing_validator_flag() { + CommandLineTest::validators_exit() + .flag("--vc-token", Some("./token.json")) + .assert_failed(); +} diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 8dba02bd2d8..baf5f3f3a1f 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -56,6 +56,7 @@ pub fn cli_app() -> Command { .value_name("STRING") .help("List of validators (pubkey) to exit.") .action(ArgAction::Set) + .required(true) .display_order(0), ) .arg( @@ -159,7 +160,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { if signature { let exit_message_json = serde_json::to_string(&exit_message.data); match exit_message_json { - Ok(json) => println!("{}", json), + Ok(json) => println!("Validator {}: {}", validator_to_exit, json), Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), } } @@ -248,56 +249,51 @@ async fn run(config: ExitConfig) -> Result<(), String> { "Successfully validated and published voluntary exit for validator {}", validator_to_exit ); + } + // sleep(Duration::from_secs(spec.seconds_per_slot)).await; - // sleep(Duration::from_secs(spec.seconds_per_slot)).await; - - // Check validator status after publishing voluntary exit - match validator_data.status { - ValidatorStatus::ActiveExiting => { - let exit_epoch = validator_data.validator.exit_epoch; - let withdrawal_epoch = validator_data.validator.withdrawable_epoch; + // Check validator status after publishing voluntary exit + match validator_data.status { + ValidatorStatus::ActiveExiting => { + let exit_epoch = validator_data.validator.exit_epoch; + let withdrawal_epoch = validator_data.validator.withdrawable_epoch; - // let slot_clock = SystemTimeSlotClock::new( - // spec.genesis_slot, - // Duration::from_secs(genesis_data.genesis_time), - // Duration::from_secs(spec.config().seconds_per_slot), - // ); + // let slot_clock = SystemTimeSlotClock::new( + // spec.genesis_slot, + // Duration::from_secs(genesis_data.genesis_time), + // Duration::from_secs(spec.config().seconds_per_slot), + // ); - // let current_epoch = get_current_epoch::(slot_clock) - // .ok_or_else(|| "Unable to determine current epoch".to_string())?; + // let current_epoch = get_current_epoch::(slot_clock) + // .ok_or_else(|| "Unable to determine current epoch".to_string())?; - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); - eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) - * spec.seconds_per_slot - * E::slots_per_epoch() - ); - } - - _ => { - eprintln!( - "Waiting for voluntary exit to be accepted into the beacon chain..." - ) - } // fn get_current_epoch( - // slot_clock: T, - // ) -> Option { - // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) - // } - - // let spec = ChainSpec::mainnet(); - - // let current_epoch = - // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; - //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() + ); } + + _ => { + eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") + } // fn get_current_epoch( + // slot_clock: T, + // ) -> Option { + // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) + // } + + // let spec = ChainSpec::mainnet(); + + // let current_epoch = + // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; + //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); } } } From 6bf8d583044843297addae96593b515dfa05f6b9 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 11:18:21 +0800 Subject: [PATCH 20/61] Update test to compile --- Cargo.lock | 1 - validator_manager/src/exit_validators.rs | 14 +++++++------- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cb527fb7e70..a3ef841a6aa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -9624,7 +9624,6 @@ dependencies = [ "ethereum_serde_utils", "hex", "http_api", - "logging", "regex", "serde", "serde_json", diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index baf5f3f3a1f..aece3ea0add 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -316,18 +316,17 @@ mod test { common::ValidatorSpecification, import_validators::tests::TestBuilder as ImportTestBuilder, }; use account_utils::eth2_keystore::KeystoreBuilder; - use account_utils::ZeroizeString; use beacon_chain::test_utils::{AttestationStrategy, BlockStrategy}; use eth2::lighthouse_vc::types::KeystoreJsonStr; use http_api::test_utils::InteractiveTester; use std::{ fs::{self, File}, io::Write, - str::FromStr, sync::Arc, }; use types::{ChainSpec, MainnetEthSpec}; use validator_http_api::{test_utils::ApiTester, Config as HttpConfig}; + use zeroize::Zeroizing; type E = MainnetEthSpec; struct TestBuilder { @@ -412,7 +411,7 @@ mod test { let local_validators: Vec = vec![ValidatorSpecification { voting_keystore: KeystoreJsonStr(keystore), - voting_keystore_password: ZeroizeString::from_str("password").unwrap(), + voting_keystore_password: Zeroizing::new("password".into()), slashing_protection: None, fee_recipient: None, gas_limit: None, @@ -429,11 +428,11 @@ mod test { self.beacon_node.harness.validator_keypairs[index_of_validators_to_exit].pk ); - let validators_to_exit = self.beacon_node.harness.validator_keypairs + let validators_to_exit = vec![self.beacon_node.harness.validator_keypairs [index_of_validators_to_exit] .pk .clone() - .into(); + .into()]; let import_config = builder.get_import_config(); @@ -458,6 +457,7 @@ mod test { validators_to_exit, beacon_url: Some(beacon_url), exit_epoch: None, + signature: false, }); self.validators = local_validators.clone(); @@ -528,7 +528,7 @@ mod test { self.beacon_node.harness.get_current_slot() ); - let validator_to_exit = self.exit_config.as_ref().unwrap().validators_to_exit; + let validator_to_exit = self.exit_config.as_ref().unwrap().validators_to_exit[0]; println!("Attempting to exit validator {:?}", validator_to_exit); let mut current_state = self.beacon_node.harness.get_current_state(); @@ -545,7 +545,7 @@ mod test { validator.activation_epoch, validator.exit_epoch ); - let result = run(self.exit_config.clone().unwrap()).await; + let result = run::(self.exit_config.clone().unwrap()).await; if result.is_ok() { return TestResult { result: Ok(()) }; From e4a99d8e4c607f4486292a086b59153042932bd2 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 11:36:26 +0800 Subject: [PATCH 21/61] simplify --- validator_manager/src/exit_validators.rs | 39 ++++++------------------ 1 file changed, 9 insertions(+), 30 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index aece3ea0add..81d5fafd1e9 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -9,9 +9,8 @@ use serde_json; use slot_clock::{SlotClock, SystemTimeSlotClock}; use std::path::PathBuf; use std::time::Duration; -// use tokio::time::sleep; +use tokio::time::sleep; use types::{ChainSpec, EthSpec, PublicKeyBytes}; -// use validator_http_api::create_signed_voluntary_exit::get_current_epoch; pub const CMD: &str = "exit"; pub const BEACON_URL_FLAG: &str = "beacon-node"; @@ -141,17 +140,15 @@ async fn run(config: ExitConfig) -> Result<(), String> { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } - // Check that the validators_to_exit is in the validator client - for validator_to_exit in &validators_to_exit { + for validator_to_exit in validators_to_exit { + // Check that the validators_to_exit is in the validator client if !validators .iter() - .any(|validator| &validator.validating_pubkey == validator_to_exit) + .any(|validator| validator.validating_pubkey == validator_to_exit) { return Err(format!("Validator {} doesn't exist", validator_to_exit)); } - } - for validator_to_exit in validators_to_exit { let exit_message = http_client .post_validator_voluntary_exit(&validator_to_exit, exit_epoch) .await @@ -190,7 +187,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } - // Get beacon node spec to be used later let genesis_data = beacon_node .get_beacon_genesis() .await @@ -239,7 +235,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { validator_to_exit, validator_data.status ) } else { - // Only publish voluntary exit if validator is ActiveOngoing + // Only publish voluntary exit if validator status is ActiveOngoing beacon_node .post_beacon_pool_voluntary_exits(&exit_message.data) .await @@ -250,7 +246,9 @@ async fn run(config: ExitConfig) -> Result<(), String> { validator_to_exit ); } - // sleep(Duration::from_secs(spec.seconds_per_slot)).await; + + // Sleep a constant 12s as in testnet 3s would be too short for validator status to update + sleep(Duration::from_secs(12)).await; // Check validator status after publishing voluntary exit match validator_data.status { @@ -258,15 +256,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { let exit_epoch = validator_data.validator.exit_epoch; let withdrawal_epoch = validator_data.validator.withdrawable_epoch; - // let slot_clock = SystemTimeSlotClock::new( - // spec.genesis_slot, - // Duration::from_secs(genesis_data.genesis_time), - // Duration::from_secs(spec.config().seconds_per_slot), - // ); - - // let current_epoch = get_current_epoch::(slot_clock) - // .ok_or_else(|| "Unable to determine current epoch".to_string())?; - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); @@ -283,17 +272,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { _ => { eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") - } // fn get_current_epoch( - // slot_clock: T, - // ) -> Option { - // slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) - // } - - // let spec = ChainSpec::mainnet(); - - // let current_epoch = - // get_current_epoch::(genesis_time, &spec).ok_or("Failed to get current epoch")?; - //let current_epoch = get_current_epoch::(genesis_data.genesis_time, spec); + } } } } From 48d1a023abaf555cc6b6d3a0ebdcd1101666338d Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 14:03:31 +0800 Subject: [PATCH 22/61] Add exit multiple validators --- validator_manager/src/exit_validators.rs | 103 ++++++++++++++--------- 1 file changed, 64 insertions(+), 39 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 81d5fafd1e9..c86a75ee41e 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -315,7 +315,7 @@ mod test { vc_token: Option, validators: Vec, beacon_node: InteractiveTester, - index_of_validators_to_exit: usize, + index_of_validators_to_exit: Vec, spec: Arc, } @@ -342,7 +342,7 @@ mod test { .move_to_terminal_block() .unwrap(); - println!("Beacon node spec: {:?}", beacon_node.harness.chain.spec); + // println!("Beacon node spec: {:?}", beacon_node.harness.chain.spec); Self { exit_config: None, @@ -351,19 +351,19 @@ mod test { vc_token: None, validators: vec![], beacon_node, - index_of_validators_to_exit: 0, + index_of_validators_to_exit: vec![], spec: spec.into(), } } - async fn with_validators(mut self, index_of_validators_to_exit: usize) -> Self { + async fn with_validators(mut self, index_of_validators_to_exit: Vec) -> Self { // Ensure genesis validators root matches the beacon node. let genesis_validators_root = self .beacon_node .harness .get_current_state() .genesis_validators_root(); - // And use a single slot clock for BN and VC to keep things simple. + // And use a single slot clock and same spec for BN and VC to keep things simple. let slot_clock = self.beacon_node.harness.chain.slot_clock.clone(); let vc = ApiTester::new_with_options( self.http_config.clone(), @@ -374,44 +374,56 @@ mod test { .await; let mut builder = ImportTestBuilder::new_with_vc(vc).await; - println!("Validator client spec: {:?}", builder.vc.spec); + // println!("Validator client spec: {:?}", builder.vc.spec); self.vc_token = Some(fs::read_to_string(builder.get_import_config().vc_token_path).unwrap()); - let keystore = KeystoreBuilder::new( - &self.beacon_node.harness.validator_keypairs[index_of_validators_to_exit], - "password".as_bytes(), - "".into(), - ) - .unwrap() - .build() - .unwrap(); - - let local_validators: Vec = vec![ValidatorSpecification { - voting_keystore: KeystoreJsonStr(keystore), - voting_keystore_password: Zeroizing::new("password".into()), - slashing_protection: None, - fee_recipient: None, - gas_limit: None, - builder_proposals: None, - builder_boost_factor: None, - prefer_builder_proposals: None, - enabled: Some(true), - }]; + let local_validators: Vec = index_of_validators_to_exit + .iter() + .map(|&index| { + let keystore = KeystoreBuilder::new( + &self.beacon_node.harness.validator_keypairs[index], + "password".as_bytes(), + "".into(), + ) + .unwrap() + .build() + .unwrap(); + + ValidatorSpecification { + voting_keystore: KeystoreJsonStr(keystore), + voting_keystore_password: Zeroizing::new("password".into()), + slashing_protection: None, + fee_recipient: None, + gas_limit: None, + builder_proposals: None, + builder_boost_factor: None, + prefer_builder_proposals: None, + enabled: Some(true), + } + }) + .collect(); let beacon_url = SensitiveUrl::parse(self.beacon_node.client.as_ref()).unwrap(); println!( "Validator pubkey on beacon chain = {:?}", - self.beacon_node.harness.validator_keypairs[index_of_validators_to_exit].pk + index_of_validators_to_exit + .iter() + .map(|&index| &self.beacon_node.harness.validator_keypairs[index].pk) + .collect::>() ); - let validators_to_exit = vec![self.beacon_node.harness.validator_keypairs - [index_of_validators_to_exit] - .pk - .clone() - .into()]; + let validators_to_exit = index_of_validators_to_exit + .iter() + .map(|&index| { + self.beacon_node.harness.validator_keypairs[index] + .pk + .clone() + .into() + }) + .collect(); let import_config = builder.get_import_config(); @@ -452,12 +464,14 @@ mod test { assert!(import_test_result.result.is_ok()); // only assign the validator index after validator is imported to the VC - initialized_validators.write().set_index( - &self.beacon_node.harness.validator_keypairs[self.index_of_validators_to_exit] - .pk - .compress(), - self.index_of_validators_to_exit as u64, - ); + for &index in &self.index_of_validators_to_exit { + initialized_validators.write().set_index( + &self.beacon_node.harness.validator_keypairs[index] + .pk + .compress(), + index as u64, + ); + } let path = self.exit_config.clone().unwrap().vc_token_path; let url = self.exit_config.clone().unwrap().vc_url; @@ -550,7 +564,18 @@ mod test { async fn exit_single_validator() { TestBuilder::new() .await - .with_validators(0) + .with_validators(vec![0]) + .await + .run_test() + .await + .assert_ok(); + } + + #[tokio::test] + async fn exit_multiple_validators() { + TestBuilder::new() + .await + .with_validators(vec![10, 20, 30]) .await .run_test() .await From 8556f8590ced38ea021949b0876ea36e58c5811a Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 14:56:49 +0800 Subject: [PATCH 23/61] reduce diff --- common/filesystem/src/lib.rs | 2 -- scripts/local_testnet/network_params.yaml | 2 -- 2 files changed, 4 deletions(-) diff --git a/common/filesystem/src/lib.rs b/common/filesystem/src/lib.rs index 39efc2c4664..d73b7a355b1 100644 --- a/common/filesystem/src/lib.rs +++ b/common/filesystem/src/lib.rs @@ -15,10 +15,8 @@ const OWNER_SID_STR: &str = "S-1-3-4"; const OWNER_ACL_ENTRY_FLAGS: u8 = 0; /// Generic Rights: /// - https://docs.microsoft.com/en-us/windows/win32/fileio/file-security-and-access-rights -/// /// Individual Read/Write/Execute Permissions (referenced in generic rights link): /// - https://docs.microsoft.com/en-us/windows/win32/wmisdk/file-and-directory-access-rights-constants -/// /// STANDARD_RIGHTS_ALL /// - https://docs.microsoft.com/en-us/windows/win32/secauthz/access-mask #[cfg(windows)] diff --git a/scripts/local_testnet/network_params.yaml b/scripts/local_testnet/network_params.yaml index 6faa2b6e7c4..b53d88e52c5 100644 --- a/scripts/local_testnet/network_params.yaml +++ b/scripts/local_testnet/network_params.yaml @@ -10,10 +10,8 @@ participants: network_params: deneb_fork_epoch: 0 seconds_per_slot: 3 - shard_committee_period: 5 global_log_level: debug snooper_enabled: false -keymanager_enabled: true additional_services: - dora - prometheus_grafana From ba45cc56cf74ba8ef70889b3a3c7db8dd115572f Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 15:58:43 +0800 Subject: [PATCH 24/61] Add delete all validators --- validator_manager/src/delete_validators.rs | 24 ++++++++++++++++------ validator_manager/src/exit_validators.rs | 5 ++++- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/validator_manager/src/delete_validators.rs b/validator_manager/src/delete_validators.rs index a2d6c062fa2..98765f27ea0 100644 --- a/validator_manager/src/delete_validators.rs +++ b/validator_manager/src/delete_validators.rs @@ -45,7 +45,10 @@ pub fn cli_app() -> Command { Arg::new(VALIDATOR_FLAG) .long(VALIDATOR_FLAG) .value_name("STRING") - .help("Comma-separated list of validators (pubkey) that will be deleted.") + .help( + "Comma-separated list of validators (pubkey) that will be deleted. \ + To delete all validators, use the keyword \"all\".", + ) .action(ArgAction::Set) .required(true) .display_order(0), @@ -64,10 +67,14 @@ impl DeleteConfig { let validators_to_delete_str = clap_utils::parse_required::(matches, VALIDATOR_FLAG)?; - let validators_to_delete = validators_to_delete_str - .split(',') - .map(|s| s.trim().parse()) - .collect::, _>>()?; + let validators_to_delete = if validators_to_delete_str.trim() == "all" { + Vec::new() + } else { + validators_to_delete_str + .split(',') + .map(|s| s.trim().parse()) + .collect::, _>>()? + }; Ok(Self { vc_token_path: clap_utils::parse_required(matches, VC_TOKEN_FLAG)?, @@ -90,11 +97,16 @@ async fn run<'a>(config: DeleteConfig) -> Result<(), String> { let DeleteConfig { vc_url, vc_token_path, - validators_to_delete, + mut validators_to_delete, } = config; let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; + // Delete all validators on the VC + if validators_to_delete.is_empty() { + validators_to_delete = validators.iter().map(|v| v.validating_pubkey).collect(); + } + for validator_to_delete in &validators_to_delete { if !validators .iter() diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index c86a75ee41e..099db676a9f 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -53,7 +53,10 @@ pub fn cli_app() -> Command { Arg::new(VALIDATOR_FLAG) .long(VALIDATOR_FLAG) .value_name("STRING") - .help("List of validators (pubkey) to exit.") + .help( + "Comma-separated list of validators (pubkey) to exit. \ + To exit all validators, use the keyword \"all\".", + ) .action(ArgAction::Set) .required(true) .display_order(0), From 97bddf891ec9af388c3bb1d48246bb04d00ea81c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 18:14:58 +0800 Subject: [PATCH 25/61] update validator data --- validator_manager/src/exit_validators.rs | 25 +++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 099db676a9f..8adb33212e6 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -67,6 +67,7 @@ pub fn cli_app() -> Command { .value_name("EPOCH") .help("Provide the minimum epoch for processing voluntary exit.") .action(ArgAction::Set) + .requires(SIGNATURE_FLAG) .display_order(0), ) .arg( @@ -250,14 +251,28 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } - // Sleep a constant 12s as in testnet 3s would be too short for validator status to update - sleep(Duration::from_secs(12)).await; + sleep(Duration::from_secs(spec.seconds_per_slot)).await; // Check validator status after publishing voluntary exit - match validator_data.status { + let updated_validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), + ) + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state", + validator_to_exit + ) + })? + .data; + + match updated_validator_data.status { ValidatorStatus::ActiveExiting => { - let exit_epoch = validator_data.validator.exit_epoch; - let withdrawal_epoch = validator_data.validator.withdrawable_epoch; + let exit_epoch = updated_validator_data.validator.exit_epoch; + let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ From 84a70a97d11031c43ec0cb7313db6707328f7f68 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Tue, 17 Dec 2024 21:07:04 +0800 Subject: [PATCH 26/61] Improve UX --- validator_manager/src/exit_validators.rs | 143 ++++++++++++----------- 1 file changed, 73 insertions(+), 70 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 8adb33212e6..fe696989094 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -144,17 +144,46 @@ async fn run(config: ExitConfig) -> Result<(), String> { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } - for validator_to_exit in validators_to_exit { + // Beacon node data to be used later + let beacon_node = if let Some(ref beacon_url) = beacon_url { + BeaconNodeHttpClient::new( + SensitiveUrl::parse(beacon_url.as_ref()) + .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, + Timeouts::set_all(Duration::from_secs(12)), + ) + } else { + return Err("Beacon URL is not provided".into()); + }; + + let genesis_data = beacon_node + .get_beacon_genesis() + .await + .map_err(|e| format!("Failed to get genesis data: {}", e))? + .data; + + let config_and_preset = beacon_node + .get_config_spec::() + .await + .map_err(|e| format!("Failed to get config spec: {}", e))? + .data; + + let spec = ChainSpec::from_config::(config_and_preset.config()) + .ok_or("Failed to create chain spec")?; + + let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) + .ok_or("Failed to get current epoch. Please check your system time")?; + + for validator_to_exit in &validators_to_exit { // Check that the validators_to_exit is in the validator client if !validators .iter() - .any(|validator| validator.validating_pubkey == validator_to_exit) + .any(|validator| &validator.validating_pubkey == validator_to_exit) { return Err(format!("Validator {} doesn't exist", validator_to_exit)); } let exit_message = http_client - .post_validator_voluntary_exit(&validator_to_exit, exit_epoch) + .post_validator_voluntary_exit(validator_to_exit, exit_epoch) .await .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; @@ -168,16 +197,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { // only publish the voluntary exit if the --beacon-node flag is present if beacon_url.is_some() { - let beacon_node = if let Some(ref beacon_url) = beacon_url { - BeaconNodeHttpClient::new( - SensitiveUrl::parse(beacon_url.as_ref()) - .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, - Timeouts::set_all(Duration::from_secs(12)), - ) - } else { - return Err("Beacon URL is not provided".into()); - }; - if beacon_node .get_node_syncing() .await @@ -191,38 +210,20 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } - let genesis_data = beacon_node - .get_beacon_genesis() - .await - .map_err(|e| format!("Failed to get genesis data: {}", e))? - .data; - - let config_and_preset = beacon_node - .get_config_spec::() - .await - .map_err(|e| format!("Failed to get config spec: {}", e))? - .data; - - let spec = ChainSpec::from_config::(config_and_preset.config()) - .ok_or_else(|| "Failed to create chain spec".to_string())?; - let validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), - ) + .get_beacon_states_validator_id(StateId::Head, &ValidatorId::PublicKey(*validator_to_exit)) .await .map_err(|e| format!("Failed to get validator details: {:?}", e))? .ok_or_else(|| { format!( "Validator {} is not present in the beacon state. \ - Please ensure that your beacon node is synced and the validator has been deposited.", - validator_to_exit)})? + Please ensure that your beacon node is synced and the validator has been deposited.", + validator_to_exit + ) + })? .data; let activation_epoch = validator_data.validator.activation_epoch; - let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) - .ok_or("Failed to get current epoch. Please check your system time")?; // Check if validator is eligible for exit if validator_data.status == ValidatorStatus::ActiveOngoing @@ -250,47 +251,49 @@ async fn run(config: ExitConfig) -> Result<(), String> { validator_to_exit ); } + } + } - sleep(Duration::from_secs(spec.seconds_per_slot)).await; + sleep(Duration::from_secs(spec.seconds_per_slot)).await; - // Check validator status after publishing voluntary exit - let updated_validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), + // Check validator status after publishing voluntary exit + for validator_to_exit in validators_to_exit { + let updated_validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), + ) + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state", + validator_to_exit ) - .await - .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state", - validator_to_exit - ) - })? - .data; + })? + .data; - match updated_validator_data.status { - ValidatorStatus::ActiveExiting => { - let exit_epoch = updated_validator_data.validator.exit_epoch; - let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; + match updated_validator_data.status { + ValidatorStatus::ActiveExiting => { + let exit_epoch = updated_validator_data.validator.exit_epoch; + let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); - eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() - ); - } - - _ => { - eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") - } + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() + ); + } + + _ => { + eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") } } } From b417e925f7a5cc5d931c536283ba38505fb4fe4a Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 08:28:59 +0800 Subject: [PATCH 27/61] Improve UX sleep only once --- validator_manager/src/exit_validators.rs | 151 ++++++++++++----------- 1 file changed, 81 insertions(+), 70 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index fe696989094..f4880a6731b 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -22,7 +22,10 @@ pub const SIGNATURE_FLAG: &str = "signature"; pub fn cli_app() -> Command { Command::new(CMD) - .about("Exit validator using the HTTP API for a given validator keystore.") + .about( + "Exits one or more validators using the HTTP API. It can \ + also be used to generate voluntary exit message for a particular future epoch.", + ) .arg( Arg::new(BEACON_URL_FLAG) .long(BEACON_URL_FLAG) @@ -144,46 +147,19 @@ async fn run(config: ExitConfig) -> Result<(), String> { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } - // Beacon node data to be used later - let beacon_node = if let Some(ref beacon_url) = beacon_url { - BeaconNodeHttpClient::new( - SensitiveUrl::parse(beacon_url.as_ref()) - .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, - Timeouts::set_all(Duration::from_secs(12)), - ) - } else { - return Err("Beacon URL is not provided".into()); - }; - - let genesis_data = beacon_node - .get_beacon_genesis() - .await - .map_err(|e| format!("Failed to get genesis data: {}", e))? - .data; + let mut first_sleep = true; - let config_and_preset = beacon_node - .get_config_spec::() - .await - .map_err(|e| format!("Failed to get config spec: {}", e))? - .data; - - let spec = ChainSpec::from_config::(config_and_preset.config()) - .ok_or("Failed to create chain spec")?; - - let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) - .ok_or("Failed to get current epoch. Please check your system time")?; - - for validator_to_exit in &validators_to_exit { + for validator_to_exit in validators_to_exit { // Check that the validators_to_exit is in the validator client if !validators .iter() - .any(|validator| &validator.validating_pubkey == validator_to_exit) + .any(|validator| validator.validating_pubkey == validator_to_exit) { return Err(format!("Validator {} doesn't exist", validator_to_exit)); } let exit_message = http_client - .post_validator_voluntary_exit(validator_to_exit, exit_epoch) + .post_validator_voluntary_exit(&validator_to_exit, exit_epoch) .await .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; @@ -197,6 +173,16 @@ async fn run(config: ExitConfig) -> Result<(), String> { // only publish the voluntary exit if the --beacon-node flag is present if beacon_url.is_some() { + let beacon_node = if let Some(ref beacon_url) = beacon_url { + BeaconNodeHttpClient::new( + SensitiveUrl::parse(beacon_url.as_ref()) + .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, + Timeouts::set_all(Duration::from_secs(12)), + ) + } else { + return Err("Beacon URL is not provided".into()); + }; + if beacon_node .get_node_syncing() .await @@ -210,8 +196,23 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } + let genesis_data = beacon_node + .get_beacon_genesis() + .await + .map_err(|e| format!("Failed to get genesis data: {}", e))? + .data; + + let config_and_preset = beacon_node + .get_config_spec::() + .await + .map_err(|e| format!("Failed to get config spec: {}", e))? + .data; + + let spec = ChainSpec::from_config::(config_and_preset.config()) + .ok_or("Failed to create chain spec")?; + let validator_data = beacon_node - .get_beacon_states_validator_id(StateId::Head, &ValidatorId::PublicKey(*validator_to_exit)) + .get_beacon_states_validator_id(StateId::Head, &ValidatorId::PublicKey(validator_to_exit)) .await .map_err(|e| format!("Failed to get validator details: {:?}", e))? .ok_or_else(|| { @@ -224,6 +225,8 @@ async fn run(config: ExitConfig) -> Result<(), String> { .data; let activation_epoch = validator_data.validator.activation_epoch; + let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) + .ok_or("Failed to get current epoch. Please check your system time")?; // Check if validator is eligible for exit if validator_data.status == ValidatorStatus::ActiveOngoing @@ -251,49 +254,57 @@ async fn run(config: ExitConfig) -> Result<(), String> { validator_to_exit ); } - } - } - sleep(Duration::from_secs(spec.seconds_per_slot)).await; - - // Check validator status after publishing voluntary exit - for validator_to_exit in validators_to_exit { - let updated_validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), - ) - .await - .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state", - validator_to_exit + // Check validator status after publishing voluntary exit + let updated_validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), ) - })? - .data; + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state", + validator_to_exit + ) + })? + .data; - match updated_validator_data.status { - ValidatorStatus::ActiveExiting => { - let exit_epoch = updated_validator_data.validator.exit_epoch; - let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; + if first_sleep { + sleep(Duration::from_secs(spec.seconds_per_slot)).await; + first_sleep = false; + } - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + loop { + if validator_data.status == ValidatorStatus::ActiveOngoing + && updated_validator_data.status == ValidatorStatus::ActiveOngoing + // The case where the beacon node has not yet published the voluntary exit + { + eprintln!("Waiting for voluntary exit to be accepted into the beacon chain..."); + } else if updated_validator_data.status == ValidatorStatus::ActiveExiting { + let exit_epoch = updated_validator_data.validator.exit_epoch; + let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; + + eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); - eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() - ); - } - - _ => { - eprintln!("Waiting for voluntary exit to be accepted into the beacon chain...") + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() + ); + break; + } else { + eprintln!( + "Validator has not exited. Validator status is: {}", + updated_validator_data.status + ) + } } } } From 45932ed3770f51bc7059ec2dc9503484b2191050 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 09:09:55 +0800 Subject: [PATCH 28/61] cli --- book/src/help_vm.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/book/src/help_vm.md b/book/src/help_vm.md index d4c130c1bd3..2aedd801da0 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -29,7 +29,8 @@ Commands: Deletes one or more validators from a validator client using the HTTP API. exit - Exit validator using the HTTP API for a given validator keystore. + Exits one or more validators using the HTTP API. It can also be used + to generate voluntary exit message for a particular future epoch. help Print this message or the help of the given subcommand(s) @@ -102,7 +103,7 @@ Flags: should be used with caution. For Windows users, the log file permissions will be inherited from the parent folder. --stdin-inputs - If present, read all user inputs from stdin instead of tty. + If present, read all user inputs from stdin instead of tty. ``` From f00a34783baea410192ad4bdbf26f48fb587352c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 11:03:25 +0800 Subject: [PATCH 29/61] make cli --- book/src/help_vm.md | 2 +- scripts/local_testnet/network_params.yaml | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/book/src/help_vm.md b/book/src/help_vm.md index 2aedd801da0..24fb88da53c 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -103,7 +103,7 @@ Flags: should be used with caution. For Windows users, the log file permissions will be inherited from the parent folder. --stdin-inputs - If present, read all user inputs from stdin instead of tty. + If present, read all user inputs from stdin instead of tty. ``` diff --git a/scripts/local_testnet/network_params.yaml b/scripts/local_testnet/network_params.yaml index b53d88e52c5..2928e751fbb 100644 --- a/scripts/local_testnet/network_params.yaml +++ b/scripts/local_testnet/network_params.yaml @@ -10,8 +10,10 @@ participants: network_params: deneb_fork_epoch: 0 seconds_per_slot: 3 + shard_committee_period: 2 global_log_level: debug snooper_enabled: false +keymanager_enabled: true additional_services: - dora - prometheus_grafana From 8d4b6a4bc18f65cbd6a5a23a4171822ff48d4fbc Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 11:51:40 +0800 Subject: [PATCH 30/61] update validator data --- validator_manager/src/exit_validators.rs | 32 ++++++++++++------------ 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index f4880a6731b..005743b699e 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -255,28 +255,28 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } - // Check validator status after publishing voluntary exit - let updated_validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), - ) - .await - .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state", - validator_to_exit - ) - })? - .data; - if first_sleep { sleep(Duration::from_secs(spec.seconds_per_slot)).await; first_sleep = false; } loop { + // Check validator status after publishing voluntary exit + let updated_validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), + ) + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state", + validator_to_exit + ) + })? + .data; + if validator_data.status == ValidatorStatus::ActiveOngoing && updated_validator_data.status == ValidatorStatus::ActiveOngoing // The case where the beacon node has not yet published the voluntary exit From 871692a103e3e5ae343b35d4d88a5e5483485a35 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 12:19:37 +0800 Subject: [PATCH 31/61] remove loop --- validator_manager/src/exit_validators.rs | 82 +++++++++++++----------- 1 file changed, 44 insertions(+), 38 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 005743b699e..473e50d8d30 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -260,51 +260,57 @@ async fn run(config: ExitConfig) -> Result<(), String> { first_sleep = false; } - loop { - // Check validator status after publishing voluntary exit - let updated_validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), + // Check validator status after publishing voluntary exit + let updated_validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), + ) + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state", + validator_to_exit ) - .await - .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state", - validator_to_exit - ) - })? - .data; - - if validator_data.status == ValidatorStatus::ActiveOngoing - && updated_validator_data.status == ValidatorStatus::ActiveOngoing - // The case where the beacon node has not yet published the voluntary exit - { - eprintln!("Waiting for voluntary exit to be accepted into the beacon chain..."); - } else if updated_validator_data.status == ValidatorStatus::ActiveExiting { - let exit_epoch = updated_validator_data.validator.exit_epoch; - let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; + })? + .data; - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + if validator_data.status == ValidatorStatus::ActiveOngoing + && updated_validator_data.status == ValidatorStatus::ActiveOngoing + // The case where the beacon node has not yet published the voluntary exit + { + eprintln!("Waiting for voluntary exit to be accepted into the beacon chain..."); + } else if updated_validator_data.status == ValidatorStatus::ActiveExiting { + let exit_epoch = updated_validator_data.validator.exit_epoch; + let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; + + eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ probability that the exit may be reverted."); + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() + ); + } else if updated_validator_data.status == ValidatorStatus::ExitedSlashed + || updated_validator_data.status == ValidatorStatus::ExitedUnslashed + { + { eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() + "Validator has exited on epoch: {}", + updated_validator_data.validator.exit_epoch ); - break; - } else { - eprintln!( - "Validator has not exited. Validator status is: {}", - updated_validator_data.status - ) } + } else { + eprintln!( + "Validator has not initiated voluntary exit. Validator status is: {}", + updated_validator_data.status + ) } } } From 872daedc35cfeea20d6fce8213805401f2e7b4e2 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 13:46:52 +0800 Subject: [PATCH 32/61] Add exit status --- validator_manager/src/exit_validators.rs | 112 ++++++++++++----------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 473e50d8d30..98a13a2f3a2 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -9,7 +9,6 @@ use serde_json; use slot_clock::{SlotClock, SystemTimeSlotClock}; use std::path::PathBuf; use std::time::Duration; -use tokio::time::sleep; use types::{ChainSpec, EthSpec, PublicKeyBytes}; pub const CMD: &str = "exit"; @@ -19,6 +18,7 @@ pub const VC_TOKEN_FLAG: &str = "vc-token"; pub const VALIDATOR_FLAG: &str = "validators"; pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; pub const SIGNATURE_FLAG: &str = "signature"; +pub const EXIT_STATUS_FLAG: &str = "status"; pub fn cli_app() -> Command { Command::new(CMD) @@ -70,7 +70,6 @@ pub fn cli_app() -> Command { .value_name("EPOCH") .help("Provide the minimum epoch for processing voluntary exit.") .action(ArgAction::Set) - .requires(SIGNATURE_FLAG) .display_order(0), ) .arg( @@ -81,6 +80,15 @@ pub fn cli_app() -> Command { .action(ArgAction::SetTrue) .display_order(0), ) + .arg( + Arg::new(EXIT_STATUS_FLAG) + .long(EXIT_STATUS_FLAG) + .help("Display the voluntary exit status.") + .help_heading(FLAG_HEADER) + .action(ArgAction::SetTrue) + .requires(BEACON_URL_FLAG) + .display_order(0), + ) } #[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] @@ -91,6 +99,7 @@ pub struct ExitConfig { pub beacon_url: Option, pub exit_epoch: Option, pub signature: bool, + pub exit_status: bool, } impl ExitConfig { @@ -113,6 +122,7 @@ impl ExitConfig { beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, signature: matches.get_flag(SIGNATURE_FLAG), + exit_status: matches.get_flag(EXIT_STATUS_FLAG), }) } } @@ -138,6 +148,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { beacon_url, exit_epoch, signature, + exit_status, } = config; let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; @@ -147,8 +158,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } - let mut first_sleep = true; - for validator_to_exit in validators_to_exit { // Check that the validators_to_exit is in the validator client if !validators @@ -255,62 +264,58 @@ async fn run(config: ExitConfig) -> Result<(), String> { ); } - if first_sleep { - sleep(Duration::from_secs(spec.seconds_per_slot)).await; - first_sleep = false; - } - // Check validator status after publishing voluntary exit - let updated_validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), - ) - .await - .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state", - validator_to_exit + if exit_status { + let updated_validator_data = beacon_node + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), ) - })? - .data; - - if validator_data.status == ValidatorStatus::ActiveOngoing - && updated_validator_data.status == ValidatorStatus::ActiveOngoing - // The case where the beacon node has not yet published the voluntary exit - { - eprintln!("Waiting for voluntary exit to be accepted into the beacon chain..."); - } else if updated_validator_data.status == ValidatorStatus::ActiveExiting { - let exit_epoch = updated_validator_data.validator.exit_epoch; - let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state", + validator_to_exit + ) + })? + .data; + + if validator_data.status == ValidatorStatus::ActiveOngoing + && updated_validator_data.status == ValidatorStatus::ActiveOngoing + { + eprintln!("Voluntary exit for Validator {} is waiting to be accepted into the beacon chain.", validator_to_exit); + } else if updated_validator_data.status == ValidatorStatus::ActiveExiting { + let exit_epoch = updated_validator_data.validator.exit_epoch; + let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; - eprintln!("Voluntary exit has been accepted into the beacon chain, but not yet finalized. \ + eprintln!("Voluntary exit for validator {} has been accepted into the beacon chain, but not yet finalized. \ Finalization may take several minutes or longer. Before finalization there is a low \ - probability that the exit may be reverted."); - eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() - ); - } else if updated_validator_data.status == ValidatorStatus::ExitedSlashed - || updated_validator_data.status == ValidatorStatus::ExitedUnslashed - { - { + probability that the exit may be reverted.", validator_to_exit); + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); eprintln!( - "Validator has exited on epoch: {}", - updated_validator_data.validator.exit_epoch + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() ); + } else if updated_validator_data.status == ValidatorStatus::ExitedSlashed + || updated_validator_data.status == ValidatorStatus::ExitedUnslashed + { + { + eprintln!( + "Validator {} has exited at epoch: {}", + validator_to_exit, updated_validator_data.validator.exit_epoch + ); + } + } else { + eprintln!( + "Validator {} has not initiated voluntary exit. Validator status is: {}", + validator_to_exit, updated_validator_data.status + ) } - } else { - eprintln!( - "Validator has not initiated voluntary exit. Validator status is: {}", - updated_validator_data.status - ) } } } @@ -487,6 +492,7 @@ mod test { beacon_url: Some(beacon_url), exit_epoch: None, signature: false, + exit_status: false, }); self.validators = local_validators.clone(); From a5f4d2d9d4dd12a2aba45c683b23c72590867cb7 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 13:48:26 +0800 Subject: [PATCH 33/61] Minor fix --- lighthouse/tests/validator_manager.rs | 1 + validator_manager/src/exit_validators.rs | 42 +++++++++++++----------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index f6d1e749013..b6bd5def7b5 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -502,6 +502,7 @@ pub fn validator_exit_defaults() { beacon_url: None, exit_epoch: None, signature: false, + exit_status: false, }; assert_eq!(expected, config); }); diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 98a13a2f3a2..1c07c688ac6 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -238,30 +238,32 @@ async fn run(config: ExitConfig) -> Result<(), String> { .ok_or("Failed to get current epoch. Please check your system time")?; // Check if validator is eligible for exit - if validator_data.status == ValidatorStatus::ActiveOngoing - && current_epoch < activation_epoch + spec.shard_committee_period - { - eprintln!( + if !exit_status { + if validator_data.status == ValidatorStatus::ActiveOngoing + && current_epoch < activation_epoch + spec.shard_committee_period + { + eprintln!( "Validator {} is not eligible for exit. It will become eligible at epoch {}", validator_to_exit, activation_epoch + spec.shard_committee_period ) - } else if validator_data.status != ValidatorStatus::ActiveOngoing { - eprintln!( - "Validator {} is not eligible for exit. Validator status is: {:?}", - validator_to_exit, validator_data.status - ) - } else { - // Only publish voluntary exit if validator status is ActiveOngoing - beacon_node - .post_beacon_pool_voluntary_exits(&exit_message.data) - .await - .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; - // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. - eprintln!( - "Successfully validated and published voluntary exit for validator {}", - validator_to_exit - ); + } else if validator_data.status != ValidatorStatus::ActiveOngoing { + eprintln!( + "Validator {} is not eligible for exit. Validator status is: {:?}", + validator_to_exit, validator_data.status + ) + } else { + // Only publish voluntary exit if validator status is ActiveOngoing + beacon_node + .post_beacon_pool_voluntary_exits(&exit_message.data) + .await + .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; + // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. + eprintln!( + "Successfully validated and published voluntary exit for validator {}", + validator_to_exit + ); + } } // Check validator status after publishing voluntary exit From f8f94b929010d577b1ef2e30f0576526e8dc2522 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 14:29:27 +0800 Subject: [PATCH 34/61] Add doc --- book/src/validator-manager-api.md | 77 ++++++++++++++++++++++++++++++- book/src/validator-manager.md | 2 +- book/src/voluntary-exit.md | 2 + 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/book/src/validator-manager-api.md b/book/src/validator-manager-api.md index a5fc69fd5ad..63e6a39f3df 100644 --- a/book/src/validator-manager-api.md +++ b/book/src/validator-manager-api.md @@ -1,6 +1,75 @@ # Managing Validators -The `lighthouse validator-manager` uses the [Keymanager API](https://ethereum.github.io/keymanager-APIs/#/) to list, import and delete keystores via the HTTP API. This requires the validator client running with the flag `--http`. +The `lighthouse validator-manager` uses the [Keymanager API](https://ethereum.github.io/keymanager-APIs/#/) to exit, list, import and delete keystores via the HTTP API. This requires the validator client running with the flag `--http`. + +## Exit + +The `exit` command exits one or more validators from the validator client. To `exit`: + +> **Important note: Once the --beacon-node flag is used, it will publish the voluntary exit to the network. This action is irreversible.** + +```bash +lighthouse vm exit --vc-token --validators pubkey1,pubkey2 --beacon-node http://beacon-node-url:5052 +``` + +Example: + +```bash +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8885c29b8f88ee9b9a37b480fd4384fed74bda33d85bc8171a904847e65688b6c9bb4362d6597fd30109fb2def6c3ae4,0xa262dae3dcd2b2e280af534effa16bedb27c06f2959e114d53bd2a248ca324a018dc73179899a066149471a94a1bc92f --beacon-node http://localhost:5052 +``` + +If successful, the following message will be returned: + +```text +Successfully validated and published voluntary exit for validator 0x8885c29b8f88ee9b9a37b480fd4384fed74bda33d85bc8171a904847e65688b6c9bb4362d6597fd30109fb2def6c3ae4 +Successfully validated and published voluntary exit for validator +0xa262dae3dcd2b2e280af534effa16bedb27c06f2959e114d53bd2a248ca324a018dc73179899a066149471a94a1bc92f +``` + +To exit all validators on the validator client, use the keyword `all`: + +```bash +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --beacon-node http://localhost:5052 +``` + +To check the voluntary exit status, use both `--status` and `--beacon-node` flags: + +```bash +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 --beacon-node http://localhost:5052 --status +``` + +If the validator voluntary exit has been accepted by the chain, the following message will be returned: + +```text +Voluntary exit for validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has been accepted into the beacon chain, but not yet finalized. Finalization may take several minutes or longer. Before finalization there is a low probability that the exit may be reverted. +Current epoch: 2, Exit epoch: 7, Withdrawable epoch: 263 +Please keep your validator running till exit epoch +Exit epoch in approximately 480 secs +``` + +When the exit epoch is reached, querying the status will return: + +```text +Validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has exited at epoch: 7 +``` + +You can safely shut down the validator client at this point. + +The following exit command will only generate the exit message and will not publish the message to the network, i.e., there will be no voluntary exit. + +To only generate the exit message without publishing it to the network, use the flag `--signature`: + +```bash +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --signature +``` + +To generate the exit message for a particular (future) epoch, use the flag `--exit-epoch`: + +```bash +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --signature --exit-epoch 1234567 +``` + +The generated exit message will only be valid at or after the specified exit-epoch, in this case, epoch 1234567. ## Delete @@ -16,6 +85,12 @@ Example: lighthouse vm delete --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8885c29b8f88ee9b9a37b480fd4384fed74bda33d85bc8171a904847e65688b6c9bb4362d6597fd30109fb2def6c3ae4,0xa262dae3dcd2b2e280af534effa16bedb27c06f2959e114d53bd2a248ca324a018dc73179899a066149471a94a1bc92f ``` +To delete all validators on the validator client, use the keyword `all`: + +```bash +lighthouse vm delete --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all +``` + ## Import The `import` command imports validator keystores generated by the staking-deposit-cli/ethstaker-deposit-cli. To import a validator keystore: diff --git a/book/src/validator-manager.md b/book/src/validator-manager.md index 11df2af0378..fbc683fe6fa 100644 --- a/book/src/validator-manager.md +++ b/book/src/validator-manager.md @@ -32,4 +32,4 @@ The `validator-manager` boasts the following features: - [Creating and importing validators using the `create` and `import` commands.](./validator-manager-create.md) - [Moving validators between two VCs using the `move` command.](./validator-manager-move.md) -- [Managing validators such as delete, import and list validators.](./validator-manager-api.md) +- [Managing validators such as exit, delete, import and list validators.](./validator-manager-api.md) diff --git a/book/src/voluntary-exit.md b/book/src/voluntary-exit.md index 6261f2e2675..8eaf3e3c6d4 100644 --- a/book/src/voluntary-exit.md +++ b/book/src/voluntary-exit.md @@ -10,6 +10,8 @@ A validator can initiate a voluntary exit provided that the validator is current It takes at a minimum 5 epochs (32 minutes) for a validator to exit after initiating a voluntary exit. This number can be much higher depending on how many other validators are queued to exit. +You can also perform voluntary exit for one or more validators using the validator manager, see [Managing Validators](./validator-manager-api.md#exit) for more details. + ## Initiating a voluntary exit In order to initiate an exit, users can use the `lighthouse account validator exit` command. From f935b9f85ab5c6e900e56b03130c8a5ab4743d57 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 14:46:40 +0800 Subject: [PATCH 35/61] mdlint --- book/src/validator-manager-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/src/validator-manager-api.md b/book/src/validator-manager-api.md index 63e6a39f3df..ef0fdd25f50 100644 --- a/book/src/validator-manager-api.md +++ b/book/src/validator-manager-api.md @@ -53,7 +53,7 @@ When the exit epoch is reached, querying the status will return: Validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has exited at epoch: 7 ``` -You can safely shut down the validator client at this point. +You can safely shut down the validator client at this point. The following exit command will only generate the exit message and will not publish the message to the network, i.e., there will be no voluntary exit. From d1d64429376dc323d7c09cb0f4650645f038b125 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 23:12:02 +0800 Subject: [PATCH 36/61] Update lighthouse/tests --- lighthouse/tests/validator_manager.rs | 3 +- validator_manager/Cargo.toml | 1 - validator_manager/src/exit_validators.rs | 46 ++++++++++++------------ 3 files changed, 24 insertions(+), 26 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index b6bd5def7b5..ab2df06ea63 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -491,6 +491,7 @@ pub fn validator_exit_defaults() { Some(&format!("{},{}", EXAMPLE_PUBKEY_0, EXAMPLE_PUBKEY_1)), ) .flag("--vc-token", Some("./token.json")) + .flag("--beacon-node", Some("http://localhost:5052")) .assert_success(|config| { let expected = ExitConfig { vc_url: SensitiveUrl::parse("http://localhost:5062").unwrap(), @@ -499,7 +500,7 @@ pub fn validator_exit_defaults() { PublicKeyBytes::from_str(EXAMPLE_PUBKEY_0).unwrap(), PublicKeyBytes::from_str(EXAMPLE_PUBKEY_1).unwrap(), ], - beacon_url: None, + beacon_url: Some(SensitiveUrl::parse("http://localhost:5052").unwrap()), exit_epoch: None, signature: false, exit_status: false, diff --git a/validator_manager/Cargo.toml b/validator_manager/Cargo.toml index a172e0d544b..2f9034d6296 100644 --- a/validator_manager/Cargo.toml +++ b/validator_manager/Cargo.toml @@ -30,4 +30,3 @@ http_api = { workspace = true } regex = { workspace = true } tempfile = { workspace = true } validator_http_api = { workspace = true } - diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 1c07c688ac6..7cd404f1740 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -106,6 +106,7 @@ impl ExitConfig { fn from_cli(matches: &ArgMatches) -> Result { let validators_to_exit_str = clap_utils::parse_required::(matches, VALIDATOR_FLAG)?; + // Keyword "all" to exit all validators, vector to be created later let validators_to_exit = if validators_to_exit_str.trim() == "all" { Vec::new() } else { @@ -153,7 +154,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; - // Exit all validators on the VC if validators_to_exit.is_empty() { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } @@ -180,7 +180,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { } } - // only publish the voluntary exit if the --beacon-node flag is present + // Only publish the voluntary exit if the --beacon-node flag is present if beacon_url.is_some() { let beacon_node = if let Some(ref beacon_url) = beacon_url { BeaconNodeHttpClient::new( @@ -238,32 +238,29 @@ async fn run(config: ExitConfig) -> Result<(), String> { .ok_or("Failed to get current epoch. Please check your system time")?; // Check if validator is eligible for exit - if !exit_status { - if validator_data.status == ValidatorStatus::ActiveOngoing - && current_epoch < activation_epoch + spec.shard_committee_period - { - eprintln!( + if validator_data.status == ValidatorStatus::ActiveOngoing + && current_epoch < activation_epoch + spec.shard_committee_period + { + eprintln!( "Validator {} is not eligible for exit. It will become eligible at epoch {}", validator_to_exit, activation_epoch + spec.shard_committee_period ) - } else if validator_data.status != ValidatorStatus::ActiveOngoing { - eprintln!( - "Validator {} is not eligible for exit. Validator status is: {:?}", - validator_to_exit, validator_data.status - ) - } else { - // Only publish voluntary exit if validator status is ActiveOngoing - beacon_node - .post_beacon_pool_voluntary_exits(&exit_message.data) - .await - .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; - // tokio::time::sleep(std::time::Duration::from_secs(1)).await; // Provides nicer UX. - eprintln!( - "Successfully validated and published voluntary exit for validator {}", - validator_to_exit - ); - } + } else if validator_data.status != ValidatorStatus::ActiveOngoing { + eprintln!( + "Validator {} is not eligible for exit. Validator status is: {:?}", + validator_to_exit, validator_data.status + ) + } else { + // Only publish voluntary exit if validator status is ActiveOngoing + beacon_node + .post_beacon_pool_voluntary_exits(&exit_message.data) + .await + .map_err(|e| format!("Failed to publish voluntary exit: {}", e))?; + eprintln!( + "Successfully validated and published voluntary exit for validator {}", + validator_to_exit + ); } // Check validator status after publishing voluntary exit @@ -332,6 +329,7 @@ fn get_current_epoch(genesis_time: u64, spec: &ChainSpec) -> Option< ); slot_clock.now().map(|s| s.epoch(E::slots_per_epoch())) } + #[cfg(not(debug_assertions))] #[cfg(test)] mod test { From 02f09d594b69cc9afc8620c1116112a0df0cb37a Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 23:38:40 +0800 Subject: [PATCH 37/61] Simplify by remove print in test --- scripts/local_testnet/network_params.yaml | 2 - validator_manager/src/exit_validators.rs | 52 ----------------------- 2 files changed, 54 deletions(-) diff --git a/scripts/local_testnet/network_params.yaml b/scripts/local_testnet/network_params.yaml index 2928e751fbb..b53d88e52c5 100644 --- a/scripts/local_testnet/network_params.yaml +++ b/scripts/local_testnet/network_params.yaml @@ -10,10 +10,8 @@ participants: network_params: deneb_fork_epoch: 0 seconds_per_slot: 3 - shard_committee_period: 2 global_log_level: debug snooper_enabled: false -keymanager_enabled: true additional_services: - dora - prometheus_grafana diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 7cd404f1740..f6e79cf8e95 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -385,8 +385,6 @@ mod test { .move_to_terminal_block() .unwrap(); - // println!("Beacon node spec: {:?}", beacon_node.harness.chain.spec); - Self { exit_config: None, src_import_builder: None, @@ -417,8 +415,6 @@ mod test { .await; let mut builder = ImportTestBuilder::new_with_vc(vc).await; - // println!("Validator client spec: {:?}", builder.vc.spec); - self.vc_token = Some(fs::read_to_string(builder.get_import_config().vc_token_path).unwrap()); @@ -450,14 +446,6 @@ mod test { let beacon_url = SensitiveUrl::parse(self.beacon_node.client.as_ref()).unwrap(); - println!( - "Validator pubkey on beacon chain = {:?}", - index_of_validators_to_exit - .iter() - .map(|&index| &self.beacon_node.harness.validator_keypairs[index].pk) - .collect::>() - ); - let validators_to_exit = index_of_validators_to_exit .iter() .map(|&index| { @@ -483,8 +471,6 @@ mod test { ) .unwrap(); - //println!("{:?}", builder.get_import_config()); - self.exit_config = Some(ExitConfig { vc_url: import_config.vc_url, vc_token_path: import_config.vc_token_path, @@ -518,7 +504,6 @@ mod test { } let path = self.exit_config.clone().unwrap().vc_token_path; - let url = self.exit_config.clone().unwrap().vc_url; let parent = path.parent().unwrap(); fs::create_dir_all(parent).expect("Was not able to create parent directory"); @@ -533,17 +518,9 @@ mod test { .write_all(self.vc_token.clone().unwrap().as_bytes()) .unwrap(); - let (_, validators) = vc_http_client(url, path).await.unwrap(); - println!("Validators pubkey on VC = {:?}", validators); - // Advance beacon chain self.beacon_node.harness.advance_slot(); - println!( - "current slot_first_advance_slot: {:?}", - self.beacon_node.harness.get_current_slot() - ); - self.beacon_node .harness .extend_chain( @@ -553,35 +530,6 @@ mod test { ) .await; - println!( - "current slot_extend_chain: {:?}", - self.beacon_node.harness.get_current_slot() - ); - - self.beacon_node.harness.advance_slot(); - - println!( - "current slot_second_advance_slot: {:?}", - self.beacon_node.harness.get_current_slot() - ); - - let validator_to_exit = self.exit_config.as_ref().unwrap().validators_to_exit[0]; - println!("Attempting to exit validator {:?}", validator_to_exit); - - let mut current_state = self.beacon_node.harness.get_current_state(); - let validator_index = current_state - .get_validator_index(&validator_to_exit) - .expect("should find validator"); - let validator = ¤t_state - .validators() - .get(validator_index.unwrap()) - .expect("validator should exist"); - - println!( - "validator status: activation_epoch={},exit_epoch{}", - validator.activation_epoch, validator.exit_epoch - ); - let result = run::(self.exit_config.clone().unwrap()).await; if result.is_ok() { From 2ee5498456232f3dbb6162e5078b28013729b191 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 18 Dec 2024 23:42:13 +0800 Subject: [PATCH 38/61] remove debug --- validator_client/signing_method/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/validator_client/signing_method/src/lib.rs b/validator_client/signing_method/src/lib.rs index c4927652a14..f3b62c9500b 100644 --- a/validator_client/signing_method/src/lib.rs +++ b/validator_client/signing_method/src/lib.rs @@ -96,7 +96,6 @@ pub enum SigningMethod { /// The additional information used to construct a signature. Mostly used for protection from replay /// attacks. -#[derive(Debug)] pub struct SigningContext { pub domain: Domain, pub epoch: Epoch, From 47419b32a2d633fba5c432e376b011df5c22f602 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 19 Dec 2024 14:28:58 +0800 Subject: [PATCH 39/61] Add dependency --- validator_manager/Cargo.toml | 1 + 1 file changed, 1 insertion(+) diff --git a/validator_manager/Cargo.toml b/validator_manager/Cargo.toml index 0d23da6d3ee..9192f0e86b0 100644 --- a/validator_manager/Cargo.toml +++ b/validator_manager/Cargo.toml @@ -17,6 +17,7 @@ ethereum_serde_utils = { workspace = true } hex = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } +slot_clock = { workspace = true } tokio = { workspace = true } tree_hash = { workspace = true } types = { workspace = true } From 5a4f928dc6c1dc8e35ea1e91742cef4c8c9d2e58 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 19 Dec 2024 22:38:03 +0800 Subject: [PATCH 40/61] save exit message to a file --- validator_manager/src/exit_validators.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index f6e79cf8e95..bdffc8bba3b 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -175,7 +175,13 @@ async fn run(config: ExitConfig) -> Result<(), String> { if signature { let exit_message_json = serde_json::to_string(&exit_message.data); match exit_message_json { - Ok(json) => println!("Validator {}: {}", validator_to_exit, json), + Ok(json) => { + // Save the exit message to a JSON file + let file_path = format!("validator_{}.json", validator_to_exit); + std::fs::write(&file_path, json) + .map_err(|e| format!("Failed to write exit message to file: {}", e))?; + println!("Exit message saved to {}", file_path); + } Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), } } From 6cdc908ae144664f0e9feb8ee7fae30e2d61586c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 20 Dec 2024 11:50:55 +0800 Subject: [PATCH 41/61] Add merge messages to one file --- lighthouse/tests/validator_manager.rs | 1 + validator_manager/src/exit_validators.rs | 55 +++++++++++++++++++++--- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index ab2df06ea63..54410495be9 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -503,6 +503,7 @@ pub fn validator_exit_defaults() { beacon_url: Some(SensitiveUrl::parse("http://localhost:5052").unwrap()), exit_epoch: None, signature: false, + merge: false, exit_status: false, }; assert_eq!(expected, config); diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index bdffc8bba3b..d90b57d0ba9 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -19,6 +19,7 @@ pub const VALIDATOR_FLAG: &str = "validators"; pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; pub const SIGNATURE_FLAG: &str = "signature"; pub const EXIT_STATUS_FLAG: &str = "status"; +pub const MERGE_FLAG: &str = "merge"; pub fn cli_app() -> Command { Command::new(CMD) @@ -68,16 +69,37 @@ pub fn cli_app() -> Command { Arg::new(EXIT_EPOCH_FLAG) .long(EXIT_EPOCH_FLAG) .value_name("EPOCH") - .help("Provide the minimum epoch for processing voluntary exit.") + .help( + "Provide the minimum epoch for processing voluntary exit. \ + This flag is typically used in combination with `--signature` to \ + save the voluntary exit signature to a file for future use.", + ) .action(ArgAction::Set) .display_order(0), ) .arg( Arg::new(SIGNATURE_FLAG) .long(SIGNATURE_FLAG) - .help("Display the signature of the voluntary exit.") + .help( + "Generate the voluntary exit signature and save it to a file \ + named {validator_pubkey}.json. Note: Using this without the \ + `--beacon-node` flag will not publish the voluntary exit to the network.", + ) + .help_heading(FLAG_HEADER) + .action(ArgAction::SetTrue) + .display_order(0), + ) + .arg( + Arg::new(MERGE_FLAG) + .long(MERGE_FLAG) + .help( + "Merge the generated voluntary exit signatures into a single file named \ + `all_validators.json`. This flag has to be used together with \ + the `--signature` flag.", + ) .help_heading(FLAG_HEADER) .action(ArgAction::SetTrue) + .requires(SIGNATURE_FLAG) .display_order(0), ) .arg( @@ -99,6 +121,7 @@ pub struct ExitConfig { pub beacon_url: Option, pub exit_epoch: Option, pub signature: bool, + pub merge: bool, pub exit_status: bool, } @@ -123,6 +146,7 @@ impl ExitConfig { beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, signature: matches.get_flag(SIGNATURE_FLAG), + merge: matches.get_flag(MERGE_FLAG), exit_status: matches.get_flag(EXIT_STATUS_FLAG), }) } @@ -149,6 +173,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { beacon_url, exit_epoch, signature, + merge, exit_status, } = config; @@ -158,6 +183,8 @@ async fn run(config: ExitConfig) -> Result<(), String> { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } + let mut exit_message_all = Vec::new(); + for validator_to_exit in validators_to_exit { // Check that the validators_to_exit is in the validator client if !validators @@ -174,13 +201,18 @@ async fn run(config: ExitConfig) -> Result<(), String> { if signature { let exit_message_json = serde_json::to_string(&exit_message.data); + match exit_message_json { Ok(json) => { - // Save the exit message to a JSON file - let file_path = format!("validator_{}.json", validator_to_exit); - std::fs::write(&file_path, json) - .map_err(|e| format!("Failed to write exit message to file: {}", e))?; - println!("Exit message saved to {}", file_path); + // Save the exit message to JSON file(s) + if merge { + exit_message_all.push(json.clone()); + } else { + let file_path = format!("{}.json", validator_to_exit); + std::fs::write(&file_path, json) + .map_err(|e| format!("Failed to write voluntary exit message to file: {}", e))?; + println!("Voluntary exit message saved to {}", file_path); + } } Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), } @@ -324,6 +356,14 @@ async fn run(config: ExitConfig) -> Result<(), String> { } } } + + if merge { + let all_json = serde_json::to_string(&exit_message_all) + .map_err(|e| format!("Failed to serialize voluntary exit message: {}", e))?; + std::fs::write("all_validators.json", all_json) + .map_err(|e| format!("Failed to write all voluntary exit messages to file: {}", e))?; + println!("All voluntary exit messages save to all_validators.json.") + } Ok(()) } @@ -484,6 +524,7 @@ mod test { beacon_url: Some(beacon_url), exit_epoch: None, signature: false, + merge: false, exit_status: false, }); From 2b0163f561fe93181a41d06070cb96ab8d423882 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 20 Dec 2024 13:29:34 +0800 Subject: [PATCH 42/61] fmt --- validator_manager/src/exit_validators.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index d90b57d0ba9..9ee8969e2d4 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -94,7 +94,7 @@ pub fn cli_app() -> Command { .long(MERGE_FLAG) .help( "Merge the generated voluntary exit signatures into a single file named \ - `all_validators.json`. This flag has to be used together with \ + `all_validators.json`. This flag is required to be used together with \ the `--signature` flag.", ) .help_heading(FLAG_HEADER) @@ -209,8 +209,9 @@ async fn run(config: ExitConfig) -> Result<(), String> { exit_message_all.push(json.clone()); } else { let file_path = format!("{}.json", validator_to_exit); - std::fs::write(&file_path, json) - .map_err(|e| format!("Failed to write voluntary exit message to file: {}", e))?; + std::fs::write(&file_path, json).map_err(|e| { + format!("Failed to write voluntary exit message to file: {}", e) + })?; println!("Voluntary exit message saved to {}", file_path); } } From 6a70f4e566ccfa5a8dae84a46dca0e742902587c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 20 Dec 2024 13:49:31 +0800 Subject: [PATCH 43/61] Update doc --- book/src/validator-manager-api.md | 4 ++-- validator_manager/src/exit_validators.rs | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/book/src/validator-manager-api.md b/book/src/validator-manager-api.md index ef0fdd25f50..8c2148b65f0 100644 --- a/book/src/validator-manager-api.md +++ b/book/src/validator-manager-api.md @@ -55,9 +55,9 @@ Validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572 You can safely shut down the validator client at this point. -The following exit command will only generate the exit message and will not publish the message to the network, i.e., there will be no voluntary exit. +The following command will only generate the voluntary exit message and save it to a file named `{validator_pubkey}.json`. It will not publish the message to the network, i.e., there will be no voluntary exit. -To only generate the exit message without publishing it to the network, use the flag `--signature`: +To generate the exit message and save it to a file, use the flag `--signature`: ```bash lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --signature diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 9ee8969e2d4..3e0239b91e5 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -7,6 +7,7 @@ use eth2::{BeaconNodeHttpClient, SensitiveUrl, Timeouts}; use serde::{Deserialize, Serialize}; use serde_json; use slot_clock::{SlotClock, SystemTimeSlotClock}; +use std::fs::write; use std::path::PathBuf; use std::time::Duration; use types::{ChainSpec, EthSpec, PublicKeyBytes}; @@ -209,7 +210,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { exit_message_all.push(json.clone()); } else { let file_path = format!("{}.json", validator_to_exit); - std::fs::write(&file_path, json).map_err(|e| { + write(&file_path, json).map_err(|e| { format!("Failed to write voluntary exit message to file: {}", e) })?; println!("Voluntary exit message saved to {}", file_path); @@ -361,7 +362,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { if merge { let all_json = serde_json::to_string(&exit_message_all) .map_err(|e| format!("Failed to serialize voluntary exit message: {}", e))?; - std::fs::write("all_validators.json", all_json) + write("all_validators.json", all_json) .map_err(|e| format!("Failed to write all voluntary exit messages to file: {}", e))?; println!("All voluntary exit messages save to all_validators.json.") } From d327c59b07820ad84a9276d6e7e867e4c4d4cc2d Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 6 Jan 2025 18:35:17 +0800 Subject: [PATCH 44/61] Add more assert in test --- validator_manager/src/exit_validators.rs | 55 ++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 3e0239b91e5..f44835d75e2 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -581,6 +581,61 @@ mod test { let result = run::(self.exit_config.clone().unwrap()).await; + self.beacon_node.harness.advance_slot(); + + self.beacon_node + .harness + .extend_chain( + 1, + BlockStrategy::OnCanonicalHead, + AttestationStrategy::AllValidators, + ) + .await; + + let validator_data = self + .index_of_validators_to_exit + .iter() + .map(|&index| { + self.beacon_node + .harness + .get_current_state() + .get_validator(index) + .unwrap() + .clone() + }) + .collect::>(); + + let validator_exit_epoch = validator_data + .iter() + .map(|validator| validator.exit_epoch) + .collect::>(); + + let validator_withdrawable_epoch = validator_data + .iter() + .map(|validator| validator.withdrawable_epoch) + .collect::>(); + + let current_epoch = self.beacon_node.harness.get_current_state().current_epoch(); + let max_seed_lookahead = self.beacon_node.harness.spec.max_seed_lookahead; + let min_withdrawability_delay = self + .beacon_node + .harness + .spec + .min_validator_withdrawability_delay; + + // As per the spec: + // https://github.com/ethereum/consensus-specs/blob/dev/specs/phase0/beacon-chain.md#compute_activation_exit_epoch + let beacon_exit_epoch = current_epoch + 1 + max_seed_lookahead; + let beacon_withdrawable_epoch = beacon_exit_epoch + min_withdrawability_delay; + + assert!(validator_exit_epoch + .iter() + .all(|&epoch| epoch == beacon_exit_epoch)); + + assert!(validator_withdrawable_epoch + .iter() + .all(|&epoch| epoch == beacon_withdrawable_epoch)); + if result.is_ok() { return TestResult { result: Ok(()) }; } From 419eda7ffc58cf37dd3f2553c8d26904abd38572 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 22 Jan 2025 11:07:03 +0800 Subject: [PATCH 45/61] Remove --merge flag --- lighthouse/tests/validator_manager.rs | 1 - validator_manager/src/exit_validators.rs | 41 +++--------------------- 2 files changed, 5 insertions(+), 37 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index 54410495be9..ab2df06ea63 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -503,7 +503,6 @@ pub fn validator_exit_defaults() { beacon_url: Some(SensitiveUrl::parse("http://localhost:5052").unwrap()), exit_epoch: None, signature: false, - merge: false, exit_status: false, }; assert_eq!(expected, config); diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index f44835d75e2..8d109c28726 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -20,7 +20,6 @@ pub const VALIDATOR_FLAG: &str = "validators"; pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; pub const SIGNATURE_FLAG: &str = "signature"; pub const EXIT_STATUS_FLAG: &str = "status"; -pub const MERGE_FLAG: &str = "merge"; pub fn cli_app() -> Command { Command::new(CMD) @@ -90,19 +89,6 @@ pub fn cli_app() -> Command { .action(ArgAction::SetTrue) .display_order(0), ) - .arg( - Arg::new(MERGE_FLAG) - .long(MERGE_FLAG) - .help( - "Merge the generated voluntary exit signatures into a single file named \ - `all_validators.json`. This flag is required to be used together with \ - the `--signature` flag.", - ) - .help_heading(FLAG_HEADER) - .action(ArgAction::SetTrue) - .requires(SIGNATURE_FLAG) - .display_order(0), - ) .arg( Arg::new(EXIT_STATUS_FLAG) .long(EXIT_STATUS_FLAG) @@ -122,7 +108,6 @@ pub struct ExitConfig { pub beacon_url: Option, pub exit_epoch: Option, pub signature: bool, - pub merge: bool, pub exit_status: bool, } @@ -147,7 +132,6 @@ impl ExitConfig { beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, signature: matches.get_flag(SIGNATURE_FLAG), - merge: matches.get_flag(MERGE_FLAG), exit_status: matches.get_flag(EXIT_STATUS_FLAG), }) } @@ -174,7 +158,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { beacon_url, exit_epoch, signature, - merge, exit_status, } = config; @@ -184,8 +167,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { validators_to_exit = validators.iter().map(|v| v.validating_pubkey).collect(); } - let mut exit_message_all = Vec::new(); - for validator_to_exit in validators_to_exit { // Check that the validators_to_exit is in the validator client if !validators @@ -206,15 +187,11 @@ async fn run(config: ExitConfig) -> Result<(), String> { match exit_message_json { Ok(json) => { // Save the exit message to JSON file(s) - if merge { - exit_message_all.push(json.clone()); - } else { - let file_path = format!("{}.json", validator_to_exit); - write(&file_path, json).map_err(|e| { - format!("Failed to write voluntary exit message to file: {}", e) - })?; - println!("Voluntary exit message saved to {}", file_path); - } + let file_path = format!("{}.json", validator_to_exit); + write(&file_path, json).map_err(|e| { + format!("Failed to write voluntary exit message to file: {}", e) + })?; + println!("Voluntary exit message saved to {}", file_path); } Err(e) => eprintln!("Failed to serialize voluntary exit message: {}", e), } @@ -359,13 +336,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { } } - if merge { - let all_json = serde_json::to_string(&exit_message_all) - .map_err(|e| format!("Failed to serialize voluntary exit message: {}", e))?; - write("all_validators.json", all_json) - .map_err(|e| format!("Failed to write all voluntary exit messages to file: {}", e))?; - println!("All voluntary exit messages save to all_validators.json.") - } Ok(()) } @@ -526,7 +496,6 @@ mod test { beacon_url: Some(beacon_url), exit_epoch: None, signature: false, - merge: false, exit_status: false, }); From b579d408c22cc76fb4ebcc21ba984bceca653c60 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Wed, 22 Jan 2025 13:36:21 +0800 Subject: [PATCH 46/61] revise --- lighthouse/tests/validator_manager.rs | 2 +- validator_manager/src/exit_validators.rs | 68 ++++++++++++------------ 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index ab2df06ea63..3948b7c881f 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -502,7 +502,7 @@ pub fn validator_exit_defaults() { ], beacon_url: Some(SensitiveUrl::parse("http://localhost:5052").unwrap()), exit_epoch: None, - signature: false, + presign: false, exit_status: false, }; assert_eq!(expected, config); diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 8d109c28726..213449aaa70 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -18,7 +18,7 @@ pub const VC_URL_FLAG: &str = "vc-url"; pub const VC_TOKEN_FLAG: &str = "vc-token"; pub const VALIDATOR_FLAG: &str = "validators"; pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; -pub const SIGNATURE_FLAG: &str = "signature"; +pub const PRESIGN_FLAG: &str = "presign"; pub const EXIT_STATUS_FLAG: &str = "status"; pub fn cli_app() -> Command { @@ -33,7 +33,8 @@ pub fn cli_app() -> Command { .value_name("NETWORK_ADDRESS") .help("Address to a beacon node HTTP API") .action(ArgAction::Set) - .display_order(0), + .display_order(0) + .conflicts_with(PRESIGN_FLAG), ) .arg( Arg::new(VC_URL_FLAG) @@ -71,23 +72,24 @@ pub fn cli_app() -> Command { .value_name("EPOCH") .help( "Provide the minimum epoch for processing voluntary exit. \ - This flag is typically used in combination with `--signature` to \ - save the voluntary exit signature to a file for future use.", + This flag is typically used in combination with `--presign` to \ + save the voluntary exit presign to a file for future use.", ) .action(ArgAction::Set) .display_order(0), ) .arg( - Arg::new(SIGNATURE_FLAG) - .long(SIGNATURE_FLAG) + Arg::new(PRESIGN_FLAG) + .long(PRESIGN_FLAG) .help( - "Generate the voluntary exit signature and save it to a file \ + "Generate the voluntary exit presign and save it to a file \ named {validator_pubkey}.json. Note: Using this without the \ `--beacon-node` flag will not publish the voluntary exit to the network.", ) .help_heading(FLAG_HEADER) .action(ArgAction::SetTrue) - .display_order(0), + .display_order(0) + .conflicts_with(BEACON_URL_FLAG), ) .arg( Arg::new(EXIT_STATUS_FLAG) @@ -107,7 +109,7 @@ pub struct ExitConfig { pub validators_to_exit: Vec, pub beacon_url: Option, pub exit_epoch: Option, - pub signature: bool, + pub presign: bool, pub exit_status: bool, } @@ -131,7 +133,7 @@ impl ExitConfig { validators_to_exit, beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, - signature: matches.get_flag(SIGNATURE_FLAG), + presign: matches.get_flag(PRESIGN_FLAG), exit_status: matches.get_flag(EXIT_STATUS_FLAG), }) } @@ -157,7 +159,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { mut validators_to_exit, beacon_url, exit_epoch, - signature, + presign, exit_status, } = config; @@ -181,7 +183,7 @@ async fn run(config: ExitConfig) -> Result<(), String> { .await .map_err(|e| format!("Failed to generate voluntary exit message: {}", e))?; - if signature { + if presign { let exit_message_json = serde_json::to_string(&exit_message.data); match exit_message_json { @@ -198,16 +200,12 @@ async fn run(config: ExitConfig) -> Result<(), String> { } // Only publish the voluntary exit if the --beacon-node flag is present - if beacon_url.is_some() { - let beacon_node = if let Some(ref beacon_url) = beacon_url { - BeaconNodeHttpClient::new( - SensitiveUrl::parse(beacon_url.as_ref()) - .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, - Timeouts::set_all(Duration::from_secs(12)), - ) - } else { - return Err("Beacon URL is not provided".into()); - }; + if let Some(ref beacon_url) = beacon_url { + let beacon_node = BeaconNodeHttpClient::new( + SensitiveUrl::parse(beacon_url.as_ref()) + .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, + Timeouts::set_all(Duration::from_secs(12)), + ); if beacon_node .get_node_syncing() @@ -238,17 +236,21 @@ async fn run(config: ExitConfig) -> Result<(), String> { .ok_or("Failed to create chain spec")?; let validator_data = beacon_node - .get_beacon_states_validator_id(StateId::Head, &ValidatorId::PublicKey(validator_to_exit)) - .await - .map_err(|e| format!("Failed to get validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state. \ - Please ensure that your beacon node is synced and the validator has been deposited.", - validator_to_exit + .get_beacon_states_validator_id( + StateId::Head, + &ValidatorId::PublicKey(validator_to_exit), ) - })? - .data; + .await + .map_err(|e| format!("Failed to get validator details: {:?}", e))? + .ok_or_else(|| { + format!( + "Validator {} is not present in the beacon state. \ + Please ensure that your beacon node is synced \ + and the validator has been deposited.", + validator_to_exit + ) + })? + .data; let activation_epoch = validator_data.validator.activation_epoch; let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) @@ -495,7 +497,7 @@ mod test { validators_to_exit, beacon_url: Some(beacon_url), exit_epoch: None, - signature: false, + presign: false, exit_status: false, }); From 24079658dbe659cc72df196364a543f5207219e4 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 23 Jan 2025 15:01:39 +0800 Subject: [PATCH 47/61] Move check status to list_validator --- validator_manager/src/exit_validators.rs | 69 +---------- validator_manager/src/lib.rs | 2 +- validator_manager/src/list_validators.rs | 148 ++++++++++++++++++++++- 3 files changed, 144 insertions(+), 75 deletions(-) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 213449aaa70..ab8574e19c6 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -19,7 +19,6 @@ pub const VC_TOKEN_FLAG: &str = "vc-token"; pub const VALIDATOR_FLAG: &str = "validators"; pub const EXIT_EPOCH_FLAG: &str = "exit-epoch"; pub const PRESIGN_FLAG: &str = "presign"; -pub const EXIT_STATUS_FLAG: &str = "status"; pub fn cli_app() -> Command { Command::new(CMD) @@ -91,15 +90,6 @@ pub fn cli_app() -> Command { .display_order(0) .conflicts_with(BEACON_URL_FLAG), ) - .arg( - Arg::new(EXIT_STATUS_FLAG) - .long(EXIT_STATUS_FLAG) - .help("Display the voluntary exit status.") - .help_heading(FLAG_HEADER) - .action(ArgAction::SetTrue) - .requires(BEACON_URL_FLAG) - .display_order(0), - ) } #[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] @@ -110,7 +100,6 @@ pub struct ExitConfig { pub beacon_url: Option, pub exit_epoch: Option, pub presign: bool, - pub exit_status: bool, } impl ExitConfig { @@ -134,7 +123,6 @@ impl ExitConfig { beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, exit_epoch: clap_utils::parse_optional(matches, EXIT_EPOCH_FLAG)?, presign: matches.get_flag(PRESIGN_FLAG), - exit_status: matches.get_flag(EXIT_STATUS_FLAG), }) } } @@ -160,7 +148,6 @@ async fn run(config: ExitConfig) -> Result<(), String> { beacon_url, exit_epoch, presign, - exit_status, } = config; let (http_client, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; @@ -281,67 +268,13 @@ async fn run(config: ExitConfig) -> Result<(), String> { validator_to_exit ); } - - // Check validator status after publishing voluntary exit - if exit_status { - let updated_validator_data = beacon_node - .get_beacon_states_validator_id( - StateId::Head, - &ValidatorId::PublicKey(validator_to_exit), - ) - .await - .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? - .ok_or_else(|| { - format!( - "Validator {} is not present in the beacon state", - validator_to_exit - ) - })? - .data; - - if validator_data.status == ValidatorStatus::ActiveOngoing - && updated_validator_data.status == ValidatorStatus::ActiveOngoing - { - eprintln!("Voluntary exit for Validator {} is waiting to be accepted into the beacon chain.", validator_to_exit); - } else if updated_validator_data.status == ValidatorStatus::ActiveExiting { - let exit_epoch = updated_validator_data.validator.exit_epoch; - let withdrawal_epoch = updated_validator_data.validator.withdrawable_epoch; - - eprintln!("Voluntary exit for validator {} has been accepted into the beacon chain, but not yet finalized. \ - Finalization may take several minutes or longer. Before finalization there is a low \ - probability that the exit may be reverted.", validator_to_exit); - eprintln!( - "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", - current_epoch, exit_epoch, withdrawal_epoch - ); - eprintln!("Please keep your validator running till exit epoch"); - eprintln!( - "Exit epoch in approximately {} secs", - (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() - ); - } else if updated_validator_data.status == ValidatorStatus::ExitedSlashed - || updated_validator_data.status == ValidatorStatus::ExitedUnslashed - { - { - eprintln!( - "Validator {} has exited at epoch: {}", - validator_to_exit, updated_validator_data.validator.exit_epoch - ); - } - } else { - eprintln!( - "Validator {} has not initiated voluntary exit. Validator status is: {}", - validator_to_exit, updated_validator_data.status - ) - } - } } } Ok(()) } -fn get_current_epoch(genesis_time: u64, spec: &ChainSpec) -> Option { +pub fn get_current_epoch(genesis_time: u64, spec: &ChainSpec) -> Option { let slot_clock = SystemTimeSlotClock::new( spec.genesis_slot, Duration::from_secs(genesis_time), diff --git a/validator_manager/src/lib.rs b/validator_manager/src/lib.rs index 150c0ecc5c8..9322fd2d75e 100644 --- a/validator_manager/src/lib.rs +++ b/validator_manager/src/lib.rs @@ -91,7 +91,7 @@ pub fn run(matches: &ArgMatches, env: Environment) -> Result<(), move_validators::cli_run(matches, dump_config).await } Some((list_validators::CMD, matches)) => { - list_validators::cli_run(matches, dump_config).await + list_validators::cli_run::(matches, dump_config).await } Some((delete_validators::CMD, matches)) => { delete_validators::cli_run(matches, dump_config).await diff --git a/validator_manager/src/list_validators.rs b/validator_manager/src/list_validators.rs index a0a1c5fb400..e655ce22e3d 100644 --- a/validator_manager/src/list_validators.rs +++ b/validator_manager/src/list_validators.rs @@ -1,14 +1,20 @@ use clap::{Arg, ArgAction, ArgMatches, Command}; use eth2::lighthouse_vc::types::SingleKeystoreResponse; -use eth2::SensitiveUrl; +use eth2::types::{ConfigAndPreset, StateId, ValidatorId, ValidatorStatus}; +use eth2::{BeaconNodeHttpClient, SensitiveUrl, Timeouts}; use serde::{Deserialize, Serialize}; use std::path::PathBuf; +use std::time::Duration; +use types::{ChainSpec, EthSpec, PublicKeyBytes}; +use crate::exit_validators::get_current_epoch; use crate::{common::vc_http_client, DumpConfig}; pub const CMD: &str = "list"; pub const VC_URL_FLAG: &str = "vc-url"; pub const VC_TOKEN_FLAG: &str = "vc-token"; +pub const BEACON_URL_FLAG: &str = "beacon-node"; +pub const VALIDATOR_FLAG: &str = "validators"; pub fn cli_app() -> Command { Command::new(CMD) @@ -31,47 +37,177 @@ pub fn cli_app() -> Command { .action(ArgAction::Set) .display_order(0), ) + .arg( + Arg::new(BEACON_URL_FLAG) + .long(BEACON_URL_FLAG) + .value_name("NETWORK_ADDRESS") + .help( + "Address to a beacon node HTTP API. When supplied, \ + the status of validators (with regard to voluntary exit) \ + will be displayed. This flag is to be used together with \ + the --validators flag.", + ) + .action(ArgAction::Set) + .display_order(0) + .requires(VALIDATOR_FLAG), + ) + .arg( + Arg::new(VALIDATOR_FLAG) + .long(VALIDATOR_FLAG) + .value_name("STRING") + .help( + "Comma-separated list of validators (pubkey) to display status for. \ + To display the status for all validators, use the keyword \"all\". \ + This flag is to be used together with the --beacon-node flag.", + ) + .action(ArgAction::Set) + .display_order(0) + .requires(BEACON_URL_FLAG), + ) } #[derive(Clone, PartialEq, Debug, Serialize, Deserialize)] pub struct ListConfig { pub vc_url: SensitiveUrl, pub vc_token_path: PathBuf, + pub beacon_url: Option, + pub validators_to_display: Vec, } impl ListConfig { fn from_cli(matches: &ArgMatches) -> Result { + let validators_to_display_str = + clap_utils::parse_optional::(matches, VALIDATOR_FLAG)?; + + // Keyword "all" to exit all validators, vector to be created later + let validators_to_display = match validators_to_display_str { + Some(str) => { + if str.trim() == "all" { + Vec::new() + } else { + str.split(',') + .map(|s| s.trim().parse()) + .collect::, _>>()? + } + } + None => Vec::new(), + }; + Ok(Self { vc_token_path: clap_utils::parse_required(matches, VC_TOKEN_FLAG)?, vc_url: clap_utils::parse_required(matches, VC_URL_FLAG)?, + beacon_url: clap_utils::parse_optional(matches, BEACON_URL_FLAG)?, + validators_to_display, }) } } -pub async fn cli_run(matches: &ArgMatches, dump_config: DumpConfig) -> Result<(), String> { +pub async fn cli_run( + matches: &ArgMatches, + dump_config: DumpConfig, +) -> Result<(), String> { let config = ListConfig::from_cli(matches)?; if dump_config.should_exit_early(&config)? { Ok(()) } else { - run(config).await?; + run::(config).await?; Ok(()) } } -async fn run(config: ListConfig) -> Result, String> { +async fn run(config: ListConfig) -> Result, String> { let ListConfig { vc_url, vc_token_path, + beacon_url, + mut validators_to_display, } = config; let (_, validators) = vc_http_client(vc_url.clone(), &vc_token_path).await?; println!("List of validators ({}):", validators.len()); - for validator in &validators { - println!("{}", validator.validating_pubkey); + if validators_to_display.is_empty() { + validators_to_display = validators.iter().map(|v| v.validating_pubkey).collect(); } + if let Some(ref beacon_url) = beacon_url { + for validator in &validators_to_display { + let beacon_node = BeaconNodeHttpClient::new( + SensitiveUrl::parse(beacon_url.as_ref()) + .map_err(|e| format!("Failed to parse beacon http server: {:?}", e))?, + Timeouts::set_all(Duration::from_secs(12)), + ); + + let validator_data = beacon_node + .get_beacon_states_validator_id(StateId::Head, &ValidatorId::PublicKey(*validator)) + .await + .map_err(|e| format!("Failed to get updated validator details: {:?}", e))? + .ok_or_else(|| { + format!("Validator {} is not present in the beacon state", validator) + })? + .data; + + match validator_data.status { + ValidatorStatus::ActiveExiting => { + let exit_epoch = validator_data.validator.exit_epoch; + let withdrawal_epoch = validator_data.validator.withdrawable_epoch; + + let genesis_data = beacon_node + .get_beacon_genesis() + .await + .map_err(|e| format!("Failed to get genesis data: {}", e))? + .data; + + let config_and_preset = beacon_node + .get_config_spec::() + .await + .map_err(|e| format!("Failed to get config spec: {}", e))? + .data; + + let spec = ChainSpec::from_config::(config_and_preset.config()) + .ok_or("Failed to create chain spec")?; + + let current_epoch = get_current_epoch::(genesis_data.genesis_time, &spec) + .ok_or("Failed to get current epoch. Please check your system time")?; + + eprintln!( + "Voluntary exit for validator {} has been accepted into the beacon chain. \ + Note that the voluntary exit is subject chain finalization. \ + Before the chain has finalized, there is a low \ + probability that the exit may be reverted.", + validator + ); + eprintln!( + "Current epoch: {}, Exit epoch: {}, Withdrawable epoch: {}", + current_epoch, exit_epoch, withdrawal_epoch + ); + eprintln!("Please keep your validator running till exit epoch"); + eprintln!( + "Exit epoch in approximately {} secs", + (exit_epoch - current_epoch) * spec.seconds_per_slot * E::slots_per_epoch() + ); + } + ValidatorStatus::ExitedSlashed | ValidatorStatus::ExitedUnslashed => { + eprintln!( + "Validator {} has exited at epoch: {}", + validator, validator_data.validator.exit_epoch + ); + } + _ => { + eprintln!( + "Validator {} has not initiated voluntary exit or the voluntary exit \ + is yet to be accepted into the beacon chain. Validator status is: {}", + validator, validator_data.status + ) + } + } + } + } else { + for validator in &validators { + println!("{}", validator.validating_pubkey); + } + } Ok(validators) } From 6f41a19a734afa5ce6de8c81521c082ede0090a3 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 23 Jan 2025 15:41:49 +0800 Subject: [PATCH 48/61] Fix test --- lighthouse/tests/validator_manager.rs | 3 ++- validator_manager/src/exit_validators.rs | 1 - validator_manager/src/list_validators.rs | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index 3948b7c881f..d8a0609a080 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -450,6 +450,8 @@ pub fn validator_list_defaults() { let expected = ListConfig { vc_url: SensitiveUrl::parse("http://localhost:5062").unwrap(), vc_token_path: PathBuf::from("./token.json"), + beacon_url: None, + validators_to_display: vec![], }; assert_eq!(expected, config); }); @@ -503,7 +505,6 @@ pub fn validator_exit_defaults() { beacon_url: Some(SensitiveUrl::parse("http://localhost:5052").unwrap()), exit_epoch: None, presign: false, - exit_status: false, }; assert_eq!(expected, config); }); diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index ab8574e19c6..781fffbd1e0 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -431,7 +431,6 @@ mod test { beacon_url: Some(beacon_url), exit_epoch: None, presign: false, - exit_status: false, }); self.validators = local_validators.clone(); diff --git a/validator_manager/src/list_validators.rs b/validator_manager/src/list_validators.rs index e655ce22e3d..7da57511777 100644 --- a/validator_manager/src/list_validators.rs +++ b/validator_manager/src/list_validators.rs @@ -223,7 +223,9 @@ mod test { use crate::{ common::ValidatorSpecification, import_validators::tests::TestBuilder as ImportTestBuilder, }; + use types::MainnetEthSpec; use validator_http_api::{test_utils::ApiTester, Config as HttpConfig}; + type E = MainnetEthSpec; struct TestBuilder { list_config: Option, @@ -252,6 +254,8 @@ mod test { self.list_config = Some(ListConfig { vc_url: builder.get_import_config().vc_url, vc_token_path: builder.get_import_config().vc_token_path, + beacon_url: None, + validators_to_display: vec![], }); self.vc_token = @@ -288,7 +292,7 @@ mod test { .write_all(self.vc_token.clone().unwrap().as_bytes()) .unwrap(); - let result = run(self.list_config.clone().unwrap()).await; + let result = run::(self.list_config.clone().unwrap()).await; if result.is_ok() { let result_ref = result.as_ref().unwrap(); From 2c96cad61ce2207138adf69ee4966166a7b08173 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 23 Jan 2025 16:01:50 +0800 Subject: [PATCH 49/61] Update doc --- book/src/validator-manager-api.md | 46 ++++++++++++++++--------------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/book/src/validator-manager-api.md b/book/src/validator-manager-api.md index 8c2148b65f0..f7ee381d526 100644 --- a/book/src/validator-manager-api.md +++ b/book/src/validator-manager-api.md @@ -32,28 +32,7 @@ To exit all validators on the validator client, use the keyword `all`: lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --beacon-node http://localhost:5052 ``` -To check the voluntary exit status, use both `--status` and `--beacon-node` flags: - -```bash -lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 --beacon-node http://localhost:5052 --status -``` - -If the validator voluntary exit has been accepted by the chain, the following message will be returned: - -```text -Voluntary exit for validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has been accepted into the beacon chain, but not yet finalized. Finalization may take several minutes or longer. Before finalization there is a low probability that the exit may be reverted. -Current epoch: 2, Exit epoch: 7, Withdrawable epoch: 263 -Please keep your validator running till exit epoch -Exit epoch in approximately 480 secs -``` - -When the exit epoch is reached, querying the status will return: - -```text -Validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has exited at epoch: 7 -``` - -You can safely shut down the validator client at this point. +To check the voluntary exit status, refer to [the list command](./validator-manager-api.md#list). The following command will only generate the voluntary exit message and save it to a file named `{validator_pubkey}.json`. It will not publish the message to the network, i.e., there will be no voluntary exit. @@ -112,3 +91,26 @@ To list the validators running on the validator client: ```bash lighthouse vm list --vc-token ~/.lighthouse/mainnet/validators/api-token.txt ``` + +The `list` command can also be used to check the voluntary exit status of validators. To do so, use both `--beacon-node` and `--validators` flags. The `--validators` flag accepts a comma-separated list of validator public keys, or the keyword `all` to check the voluntary exit status of all validators attached to the validator client. + +```bash +lighthouse vm list --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 --beacon-node http://localhost:5052 +``` + +If the validator voluntary exit has been accepted by the chain, the following message will be returned: + +```text +Voluntary exit for validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has been accepted into the beacon chain, but not yet finalized. Finalization may take several minutes or longer. Before finalization there is a low probability that the exit may be reverted. +Current epoch: 2, Exit epoch: 7, Withdrawable epoch: 263 +Please keep your validator running till exit epoch +Exit epoch in approximately 480 secs +``` + +When the exit epoch is reached, querying the status will return: + +```text +Validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has exited at epoch: 7 +``` + +You can safely shut down the validator client at this point. \ No newline at end of file From 4fb9f538b4d3b6774dc841120b6bc9a5532a429c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Thu, 23 Jan 2025 16:20:31 +0800 Subject: [PATCH 50/61] mdlint --- book/src/validator-manager-api.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/book/src/validator-manager-api.md b/book/src/validator-manager-api.md index f7ee381d526..deb155e3682 100644 --- a/book/src/validator-manager-api.md +++ b/book/src/validator-manager-api.md @@ -113,4 +113,4 @@ When the exit epoch is reached, querying the status will return: Validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has exited at epoch: 7 ``` -You can safely shut down the validator client at this point. \ No newline at end of file +You can safely shut down the validator client at this point. From 683259dbaa2ce515ce229bb18e9764e715fe0cf9 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 24 Jan 2025 09:59:06 +0800 Subject: [PATCH 51/61] udpate doc and flags --- book/src/help_vm.md | 3 ++- book/src/validator-manager-api.md | 16 ++++++++-------- validator_manager/src/exit_validators.rs | 8 +++++--- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/book/src/help_vm.md b/book/src/help_vm.md index 24fb88da53c..347300f4410 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -30,7 +30,8 @@ Commands: API. exit Exits one or more validators using the HTTP API. It can also be used - to generate voluntary exit message for a particular future epoch. + to generate a presign voluntary exit message for a particular future + epoch. help Print this message or the help of the given subcommand(s) diff --git a/book/src/validator-manager-api.md b/book/src/validator-manager-api.md index deb155e3682..e7a82a2ae4a 100644 --- a/book/src/validator-manager-api.md +++ b/book/src/validator-manager-api.md @@ -18,7 +18,7 @@ Example: lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8885c29b8f88ee9b9a37b480fd4384fed74bda33d85bc8171a904847e65688b6c9bb4362d6597fd30109fb2def6c3ae4,0xa262dae3dcd2b2e280af534effa16bedb27c06f2959e114d53bd2a248ca324a018dc73179899a066149471a94a1bc92f --beacon-node http://localhost:5052 ``` -If successful, the following message will be returned: +If successful, the following log will be returned: ```text Successfully validated and published voluntary exit for validator 0x8885c29b8f88ee9b9a37b480fd4384fed74bda33d85bc8171a904847e65688b6c9bb4362d6597fd30109fb2def6c3ae4 @@ -34,21 +34,21 @@ lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --v To check the voluntary exit status, refer to [the list command](./validator-manager-api.md#list). -The following command will only generate the voluntary exit message and save it to a file named `{validator_pubkey}.json`. It will not publish the message to the network, i.e., there will be no voluntary exit. +The following command will only generate a presign voluntary exit message and save it to a file named `{validator_pubkey}.json`. It **will not** publish the voluntary exit to the network. -To generate the exit message and save it to a file, use the flag `--signature`: +To generate a presign exit message and save it to a file, use the flag `--presign`: ```bash -lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --signature +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --presign ``` -To generate the exit message for a particular (future) epoch, use the flag `--exit-epoch`: +To generate a presign exit message for a particular (future) epoch, use the flag `--exit-epoch`: ```bash -lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --signature --exit-epoch 1234567 +lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --presign --exit-epoch 1234567 ``` -The generated exit message will only be valid at or after the specified exit-epoch, in this case, epoch 1234567. +The generated presign exit message will only be valid at or after the specified exit-epoch, in this case, epoch 1234567. ## Delete @@ -98,7 +98,7 @@ The `list` command can also be used to check the voluntary exit status of valida lighthouse vm list --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 --beacon-node http://localhost:5052 ``` -If the validator voluntary exit has been accepted by the chain, the following message will be returned: +If the validator voluntary exit has been accepted by the chain, the following log will be returned: ```text Voluntary exit for validator 0x8de7ec501d574152f52a962bf588573df2fc3563fd0c6077651208ed20f24f3d8572425706b343117b48bdca56808416 has been accepted into the beacon chain, but not yet finalized. Finalization may take several minutes or longer. Before finalization there is a low probability that the exit may be reverted. diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index 781fffbd1e0..adf8f569d64 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -24,7 +24,7 @@ pub fn cli_app() -> Command { Command::new(CMD) .about( "Exits one or more validators using the HTTP API. It can \ - also be used to generate voluntary exit message for a particular future epoch.", + also be used to generate a presign voluntary exit message for a particular future epoch.", ) .arg( Arg::new(BEACON_URL_FLAG) @@ -71,11 +71,13 @@ pub fn cli_app() -> Command { .value_name("EPOCH") .help( "Provide the minimum epoch for processing voluntary exit. \ - This flag is typically used in combination with `--presign` to \ + This flag is required to be used in combination with `--presign` to \ save the voluntary exit presign to a file for future use.", ) .action(ArgAction::Set) - .display_order(0), + .display_order(0) + .requires(PRESIGN_FLAG) + .conflicts_with(BEACON_URL_FLAG), ) .arg( Arg::new(PRESIGN_FLAG) From 681feeb1bed96cedd2f79f3d21a98b46941dff46 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Fri, 24 Jan 2025 10:29:07 +0800 Subject: [PATCH 52/61] Add presign in wordlist.txt --- wordlist.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/wordlist.txt b/wordlist.txt index 6287366cbcb..5d630437dd2 100644 --- a/wordlist.txt +++ b/wordlist.txt @@ -188,6 +188,7 @@ pem performant pid pre +presign pubkey pubkeys rc From 929335a99a81999e7d9f5a95604fe6c7da61263c Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Sat, 25 Jan 2025 14:26:26 +0800 Subject: [PATCH 53/61] Add cli test --- lighthouse/tests/validator_manager.rs | 64 +++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index d8a0609a080..d9136cd2744 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -510,9 +510,73 @@ pub fn validator_exit_defaults() { }); } +#[test] +pub fn validator_exit_exit_epoch_and_presign_flags() { + CommandLineTest::validators_exit() + .flag( + "--validators", + Some(&format!("{},{}", EXAMPLE_PUBKEY_0, EXAMPLE_PUBKEY_1)), + ) + .flag("--vc-token", Some("./token.json")) + .flag("--exit-epoch", Some("1234567")) + .flag("--presign", None) + .assert_success(|config| { + let expected = ExitConfig { + vc_url: SensitiveUrl::parse("http://localhost:5062").unwrap(), + vc_token_path: PathBuf::from("./token.json"), + validators_to_exit: vec![ + PublicKeyBytes::from_str(EXAMPLE_PUBKEY_0).unwrap(), + PublicKeyBytes::from_str(EXAMPLE_PUBKEY_1).unwrap(), + ], + beacon_url: None, + exit_epoch: Some(Epoch::new(1234567)), + presign: true, + }; + assert_eq!(expected, config); + }); +} + #[test] pub fn validator_exit_missing_validator_flag() { CommandLineTest::validators_exit() .flag("--vc-token", Some("./token.json")) .assert_failed(); } + +#[test] +pub fn validator_exit_using_beacon_and_presign_flags() { + CommandLineTest::validators_exit() + .flag("--vc-token", Some("./token.json")) + .flag( + "--validators", + Some(&format!("{},{}", EXAMPLE_PUBKEY_0, EXAMPLE_PUBKEY_1)), + ) + .flag("--beacon-node", Some("http://localhost:1001")) + .flag("--presign", None) + .assert_failed(); +} + +#[test] +pub fn validator_exit_using_beacon_and_exit_epoch_flags() { + CommandLineTest::validators_exit() + .flag("--vc-token", Some("./token.json")) + .flag( + "--validators", + Some(&format!("{},{}", EXAMPLE_PUBKEY_0, EXAMPLE_PUBKEY_1)), + ) + .flag("--beacon-node", Some("http://localhost:1001")) + .flag("--exit-epoch", Some("1234567")) + .assert_failed(); +} + +#[test] +pub fn validator_exit_exit_epoch_flag_requires_presign_flag() { + CommandLineTest::validators_exit() + .flag("--vc-token", Some("./token.json")) + .flag( + "--validators", + Some(&format!("{},{}", EXAMPLE_PUBKEY_0, EXAMPLE_PUBKEY_1)), + ) + .flag("--exit-epoch", Some("1234567")) + .assert_failed(); +} From 49e30fd3063ea51011a2774066f94e6555f97d5b Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 27 Jan 2025 08:27:55 +0800 Subject: [PATCH 54/61] rename a bit --- lighthouse/tests/validator_manager.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lighthouse/tests/validator_manager.rs b/lighthouse/tests/validator_manager.rs index d9136cd2744..5ee9b0263a9 100644 --- a/lighthouse/tests/validator_manager.rs +++ b/lighthouse/tests/validator_manager.rs @@ -570,7 +570,7 @@ pub fn validator_exit_using_beacon_and_exit_epoch_flags() { } #[test] -pub fn validator_exit_exit_epoch_flag_requires_presign_flag() { +pub fn validator_exit_exit_epoch_flag_without_presign_flag() { CommandLineTest::validators_exit() .flag("--vc-token", Some("./token.json")) .flag( From 87527d54ba6b7b13186d8c9e45c973d3b87c0034 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Sun, 30 Mar 2025 22:10:12 +0800 Subject: [PATCH 55/61] Fix .md links --- book/src/validator_manager.md | 6 +++--- book/src/validator_manager_api.md | 2 +- book/src/validator_voluntary_exit.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/book/src/validator_manager.md b/book/src/validator_manager.md index 7bec7897bb4..277607941f0 100644 --- a/book/src/validator_manager.md +++ b/book/src/validator_manager.md @@ -30,9 +30,9 @@ The `validator-manager` boasts the following features: ## Guides -- [Creating and importing validators using the `create` and `import` commands.](./validator-manager-create.md) -- [Moving validators between two VCs using the `move` command.](./validator-manager-move.md) -- [Managing validators such as exit, delete, import and list validators.](./validator-manager-api.md) +- [Creating and importing validators using the `create` and `import` commands.](./validator_manager_create.md) +- [Moving validators between two VCs using the `move` command.](./validator_manager_move.md) +- [Managing validators such as exit, delete, import and list validators.](./validator_manager_api.md) - [Creating and importing validators using the `create` and `import` commands.](./validator_manager_create.md) - [Moving validators between two VCs using the `move` command.](./validator_manager_move.md) - [Managing validators such as delete, import and list validators.](./validator_manager_api.md) diff --git a/book/src/validator_manager_api.md b/book/src/validator_manager_api.md index e7a82a2ae4a..6f5c4e119f0 100644 --- a/book/src/validator_manager_api.md +++ b/book/src/validator_manager_api.md @@ -32,7 +32,7 @@ To exit all validators on the validator client, use the keyword `all`: lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --beacon-node http://localhost:5052 ``` -To check the voluntary exit status, refer to [the list command](./validator-manager-api.md#list). +To check the voluntary exit status, refer to [the list command](./validator_manager_api.md#list). The following command will only generate a presign voluntary exit message and save it to a file named `{validator_pubkey}.json`. It **will not** publish the voluntary exit to the network. diff --git a/book/src/validator_voluntary_exit.md b/book/src/validator_voluntary_exit.md index 8eaf3e3c6d4..d1eccb35cc3 100644 --- a/book/src/validator_voluntary_exit.md +++ b/book/src/validator_voluntary_exit.md @@ -10,7 +10,7 @@ A validator can initiate a voluntary exit provided that the validator is current It takes at a minimum 5 epochs (32 minutes) for a validator to exit after initiating a voluntary exit. This number can be much higher depending on how many other validators are queued to exit. -You can also perform voluntary exit for one or more validators using the validator manager, see [Managing Validators](./validator-manager-api.md#exit) for more details. +You can also perform voluntary exit for one or more validators using the validator manager, see [Managing Validators](./validator_manager_api.md#exit) for more details. ## Initiating a voluntary exit From 586a32a85468a0353237ee63c15245582b84155d Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Sun, 30 Mar 2025 22:25:49 +0800 Subject: [PATCH 56/61] mdlint --- book/src/validator_manager.md | 1 - 1 file changed, 1 deletion(-) diff --git a/book/src/validator_manager.md b/book/src/validator_manager.md index 277607941f0..656e15c21cf 100644 --- a/book/src/validator_manager.md +++ b/book/src/validator_manager.md @@ -36,4 +36,3 @@ The `validator-manager` boasts the following features: - [Creating and importing validators using the `create` and `import` commands.](./validator_manager_create.md) - [Moving validators between two VCs using the `move` command.](./validator_manager_move.md) - [Managing validators such as delete, import and list validators.](./validator_manager_api.md) - From 9f3a152ec5e75dcd896ad2400ad22283f84fc163 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Mon, 30 Jun 2025 10:08:46 +1000 Subject: [PATCH 57/61] Remove duplicated docs --- book/src/validator_manager.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/book/src/validator_manager.md b/book/src/validator_manager.md index 6a49d3fd595..609f1769013 100644 --- a/book/src/validator_manager.md +++ b/book/src/validator_manager.md @@ -33,6 +33,3 @@ The `validator-manager` boasts the following features: - [Creating and importing validators using the `create` and `import` commands.](./validator_manager_create.md) - [Moving validators between two VCs using the `move` command.](./validator_manager_move.md) - [Managing validators such as exit, delete, import and list validators.](./validator_manager_api.md) -- [Creating and importing validators using the `create` and `import` commands.](./validator_manager_create.md) -- [Moving validators between two VCs using the `move` command.](./validator_manager_move.md) -- [Managing validators such as delete, import and list validators.](./validator_manager_api.md) From dc46086042ec62a9b03e3d8cb8738648b4ac79be Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Mon, 30 Jun 2025 10:11:37 +1000 Subject: [PATCH 58/61] Update command description --- book/src/help_vm.md | 4 ++-- validator_manager/src/exit_validators.rs | 2 +- wordlist.txt | 1 + 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/book/src/help_vm.md b/book/src/help_vm.md index 48965d79aeb..f1459f12086 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -30,8 +30,8 @@ Commands: API. exit Exits one or more validators using the HTTP API. It can also be used - to generate a presign voluntary exit message for a particular future - epoch. + to generate a presigned voluntary exit message for a particular + future epoch. help Print this message or the help of the given subcommand(s) diff --git a/validator_manager/src/exit_validators.rs b/validator_manager/src/exit_validators.rs index adf8f569d64..30d8c5c47db 100644 --- a/validator_manager/src/exit_validators.rs +++ b/validator_manager/src/exit_validators.rs @@ -24,7 +24,7 @@ pub fn cli_app() -> Command { Command::new(CMD) .about( "Exits one or more validators using the HTTP API. It can \ - also be used to generate a presign voluntary exit message for a particular future epoch.", + also be used to generate a presigned voluntary exit message for a particular future epoch.", ) .arg( Arg::new(BEACON_URL_FLAG) diff --git a/wordlist.txt b/wordlist.txt index 162a3ea4334..ada0384d364 100644 --- a/wordlist.txt +++ b/wordlist.txt @@ -197,6 +197,7 @@ performant pid pre presign +presigned pubkey pubkeys rc From 852804fdb1438bf2fd1a56a46c7fce0de0692b55 Mon Sep 17 00:00:00 2001 From: Michael Sproul Date: Mon, 30 Jun 2025 13:38:01 +1000 Subject: [PATCH 59/61] Update validator_manager/src/list_validators.rs --- validator_manager/src/list_validators.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/validator_manager/src/list_validators.rs b/validator_manager/src/list_validators.rs index 7da57511777..6016b89eea1 100644 --- a/validator_manager/src/list_validators.rs +++ b/validator_manager/src/list_validators.rs @@ -79,7 +79,7 @@ impl ListConfig { let validators_to_display_str = clap_utils::parse_optional::(matches, VALIDATOR_FLAG)?; - // Keyword "all" to exit all validators, vector to be created later + // Keyword "all" to list all validators, vector to be created later let validators_to_display = match validators_to_display_str { Some(str) => { if str.trim() == "all" { From bb410521481c9e6c52bd0096f81fd4eed6808fb3 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 30 Jun 2025 12:04:20 +0800 Subject: [PATCH 60/61] cli check --- book/src/help_vm.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/book/src/help_vm.md b/book/src/help_vm.md index f1459f12086..f58537ae1ca 100644 --- a/book/src/help_vm.md +++ b/book/src/help_vm.md @@ -30,8 +30,8 @@ Commands: API. exit Exits one or more validators using the HTTP API. It can also be used - to generate a presigned voluntary exit message for a particular - future epoch. + to generate a presigned voluntary exit message for a particular future + epoch. help Print this message or the help of the given subcommand(s) From 1c1f6862a6f78e45943374a2cc4f7b06a26183b5 Mon Sep 17 00:00:00 2001 From: Tan Chee Keong Date: Mon, 30 Jun 2025 12:09:51 +0800 Subject: [PATCH 61/61] presigned --- book/src/validator_manager_api.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/book/src/validator_manager_api.md b/book/src/validator_manager_api.md index c8326997382..05420084631 100644 --- a/book/src/validator_manager_api.md +++ b/book/src/validator_manager_api.md @@ -34,21 +34,21 @@ lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --v To check the voluntary exit status, refer to [the list command](./validator_manager_api.md#list). -The following command will only generate a presign voluntary exit message and save it to a file named `{validator_pubkey}.json`. It **will not** publish the voluntary exit to the network. +The following command will only generate a presigned voluntary exit message and save it to a file named `{validator_pubkey}.json`. It **will not** publish the voluntary exit to the network. -To generate a presign exit message and save it to a file, use the flag `--presign`: +To generate a presigned exit message and save it to a file, use the flag `--presign`: ```bash lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --presign ``` -To generate a presign exit message for a particular (future) epoch, use the flag `--exit-epoch`: +To generate a presigned exit message for a particular (future) epoch, use the flag `--exit-epoch`: ```bash lighthouse vm exit --vc-token ~/.lighthouse/mainnet/validators/api-token.txt --validators all --presign --exit-epoch 1234567 ``` -The generated presign exit message will only be valid at or after the specified exit-epoch, in this case, epoch 1234567. +The generated presigned exit message will only be valid at or after the specified exit-epoch, in this case, epoch 1234567. ## Delete