diff --git a/Cargo.lock b/Cargo.lock index 4a3dbdf3..3fd92083 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -239,9 +239,9 @@ dependencies = [ [[package]] name = "alloy-eip7928" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3231de68d5d6e75332b7489cfcc7f4dfabeba94d990a10e4b923af0e6623540" +checksum = "f8222b1d88f9a6d03be84b0f5e76bb60cd83991b43ad8ab6477f0e4a7809b98d" dependencies = [ "alloy-primitives", "alloy-rlp", @@ -439,7 +439,7 @@ checksum = "ce8849c74c9ca0f5a03da1c865e3eb6f768df816e67dd3721a398a8a7e398011" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -562,7 +562,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -580,7 +580,7 @@ dependencies = [ "proc-macro2", "quote", "sha3", - "syn 2.0.116", + "syn 2.0.117", "syn-solidity", ] @@ -598,7 +598,7 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.116", + "syn 2.0.117", "syn-solidity", ] @@ -689,7 +689,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -759,9 +759,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e0fee31ef5ed1ba1316088939cea399010ed7731dba877ed44aeb407a75ea" +checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "ark-ff" @@ -848,7 +848,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -886,7 +886,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -991,7 +991,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "synstructure", ] @@ -1003,7 +1003,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1087,7 +1087,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1098,7 +1098,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1140,7 +1140,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1151,9 +1151,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.16.0" +version = "1.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" +checksum = "94bffc006df10ac2a68c83692d734a465f8ee6c5b384d8545a636f81d858f4bf" dependencies = [ "aws-lc-sys", "zeroize", @@ -1161,9 +1161,9 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.37.1" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" +checksum = "4321e568ed89bb5a7d291a7f37997c2c0df89809d7b6d12062c81ddb54aa782e" dependencies = [ "cc", "cmake", @@ -1282,7 +1282,7 @@ checksum = "7b9a5040dce49a7642c97ccb1ae59567098967b5d52c29773f1299a42d23bb39" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1322,12 +1322,6 @@ dependencies = [ "hex-conservative", ] -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.11.0" @@ -1384,7 +1378,7 @@ checksum = "87a52479c9237eb04047ddb94788c41ca0d26eaff8b697ecfbb4c32f7fdc3b1b" dependencies = [ "async-stream", "base64 0.22.1", - "bitflags 2.11.0", + "bitflags", "bollard-buildkit-proto", "bollard-stubs", "bytes", @@ -1475,7 +1469,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1498,7 +1492,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1523,9 +1517,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.20.1" +version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c6f81257d10a0f602a294ae4182251151ff97dbb504ef9afcdda4a64b24d9b4" +checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" [[package]] name = "byte-slice-cast" @@ -1550,9 +1544,9 @@ dependencies = [ [[package]] name = "c-kzg" -version = "2.1.5" +version = "2.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e00bf4b112b07b505472dbefd19e37e53307e2bfed5a79e0cc161d58ccd0e687" +checksum = "1a0f582957c24870b7bfd12bf562c40b4734b533cafbaf8ded31d6d85f462c01" dependencies = [ "blst", "cc", @@ -1652,9 +1646,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.43" +version = "0.4.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fac4744fb15ae8337dc853fee7fb3f4e48c0fbaa23d0afe49c447b4fab126118" +checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" dependencies = [ "iana-time-zone", "js-sys", @@ -1704,9 +1698,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.59" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5caf74d17c3aec5495110c34cc3f78644bfa89af6c8993ed4de2790e49b6499" +checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" dependencies = [ "clap_builder", "clap_derive", @@ -1714,9 +1708,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.59" +version = "4.5.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370daa45065b80218950227371916a1633217ae42b2715b2287b606dcd618e24" +checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" dependencies = [ "anstream", "anstyle", @@ -1733,7 +1727,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -1784,9 +1778,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.17.0" +version = "1.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" +checksum = "531185e432bb31db1ecda541e9e7ab21468d4d844ad7505e0546a49b4945d49b" dependencies = [ "cfg-if", "cpufeatures", @@ -2027,7 +2021,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" dependencies = [ "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2074,7 +2068,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2118,7 +2112,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2133,7 +2127,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2146,7 +2140,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2157,7 +2151,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2168,7 +2162,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2179,7 +2173,7 @@ checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" dependencies = [ "darling_core 0.23.0", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2267,9 +2261,9 @@ dependencies = [ [[package]] name = "deranged" -version = "0.5.6" +version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4" +checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ "powerfmt", "serde_core", @@ -2305,7 +2299,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version 0.4.1", - "syn 2.0.116", + "syn 2.0.117", "unicode-xid", ] @@ -2338,7 +2332,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2418,7 +2412,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2478,7 +2472,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2498,7 +2492,7 @@ checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2818,7 +2812,7 @@ checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -2921,20 +2915,20 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "r-efi", + "r-efi 5.3.0", "wasip2", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ "cfg-if", "libc", - "r-efi", + "r-efi 6.0.0", "wasip2", "wasip3", ] @@ -2955,7 +2949,7 @@ version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b88256088d75a56f8ecfa070513a775dd9107f6530ef14919dac831af9cfe2b" dependencies = [ - "bitflags 2.11.0", + "bitflags", "libc", "libgit2-sys", "log", @@ -3354,7 +3348,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "socket2 0.6.2", - "system-configuration 0.7.0", + "system-configuration", "tokio", "tower-service", "tracing", @@ -3516,19 +3510,19 @@ dependencies = [ [[package]] name = "if-addrs" -version = "0.10.2" +version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cabb0019d51a643781ff15c9c8a3e5dedc365c47211270f4e8f82812fedd8f0a" +checksum = "c0a05c691e1fae256cf7013d99dad472dc52d5543322761f83ec8d47eab40d2b" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.61.2", ] [[package]] name = "if-watch" -version = "3.2.1" +version = "3.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf9d64cfcf380606e64f9a0bcf493616b65331199f984151a6fa11a7b3cde38" +checksum = "71c02a5161c313f0cbdbadc511611893584a10a7b6153cb554bdf83ddce99ec2" dependencies = [ "async-io", "core-foundation 0.9.4", @@ -3542,9 +3536,9 @@ dependencies = [ "netlink-proto", "netlink-sys", "rtnetlink", - "system-configuration 0.6.1", + "system-configuration", "tokio", - "windows 0.53.0", + "windows 0.62.2", ] [[package]] @@ -3585,7 +3579,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -3634,9 +3628,9 @@ dependencies = [ [[package]] name = "ipnet" -version = "2.11.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130" +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] name = "iri-string" @@ -3721,9 +3715,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c942ebf8e95485ca0d52d97da7c5a2c387d0e7f0ba4c35e93bfcaee045955b3" +checksum = "b49715b7073f385ba4bc528e5747d02e66cb39c6146efb66b781f131f0fb399c" dependencies = [ "once_cell", "wasm-bindgen", @@ -4328,7 +4322,7 @@ checksum = "dd297cf53f0cb3dee4d2620bb319ae47ef27c702684309f682bdb7e55a18ae9c" dependencies = [ "heck", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -4507,25 +4501,26 @@ dependencies = [ "thiserror 2.0.18", "tracing", "yamux 0.12.1", - "yamux 0.13.8", + "yamux 0.13.9", ] [[package]] name = "libredox" -version = "0.1.12" +version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" +checksum = "1744e39d1d6a9948f4f388969627434e31128196de472883b39f148769bfe30a" dependencies = [ - "bitflags 2.11.0", + "bitflags", "libc", - "redox_syscall 0.7.1", + "plain", + "redox_syscall 0.7.3", ] [[package]] name = "libz-sys" -version = "1.1.23" +version = "1.1.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15d118bbf3771060e7311cc7bb0545b01d08a8b4a7de949198dec1fa0ca1c0f7" +checksum = "4735e9cbde5aac84a5ce588f6b23a90b9b0b528f6c5a8db8a4aff300463a0839" dependencies = [ "cc", "libc", @@ -4535,9 +4530,9 @@ dependencies = [ [[package]] name = "linux-raw-sys" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] name = "litemap" @@ -4593,7 +4588,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -4604,7 +4599,7 @@ checksum = "757aee279b8bdbb9f9e676796fd459e4207a1f986e87886700abf589f5abf771" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -4673,9 +4668,9 @@ dependencies = [ [[package]] name = "moka" -version = "0.12.13" +version = "0.12.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ac832c50ced444ef6be0767a008b02c106a909ba79d1d830501e94b96f6b7e" +checksum = "85f8024e1c8e71c778968af91d43700ce1d11b219d127d79fb2934153b82b42b" dependencies = [ "crossbeam-channel", "crossbeam-epoch", @@ -4769,46 +4764,30 @@ dependencies = [ [[package]] name = "netlink-packet-core" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72724faf704479d67b388da142b186f916188505e7e0b26719019c525882eda4" +checksum = "3463cbb78394cb0141e2c926b93fc2197e473394b761986eca3b9da2c63ae0f4" dependencies = [ - "anyhow", - "byteorder", - "netlink-packet-utils", + "paste", ] [[package]] name = "netlink-packet-route" -version = "0.17.1" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053998cea5a306971f88580d0829e90f270f940befd7cf928da179d4187a5a66" +checksum = "4ce3636fa715e988114552619582b530481fd5ef176a1e5c1bf024077c2c9445" dependencies = [ - "anyhow", - "bitflags 1.3.2", - "byteorder", + "bitflags", "libc", + "log", "netlink-packet-core", - "netlink-packet-utils", -] - -[[package]] -name = "netlink-packet-utils" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ede8a08c71ad5a95cdd0e4e52facd37190977039a4704eb82a283f713747d34" -dependencies = [ - "anyhow", - "byteorder", - "paste", - "thiserror 1.0.69", ] [[package]] name = "netlink-proto" -version = "0.11.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72452e012c2f8d612410d89eea01e2d9b56205274abb35d53f60200b2ec41d60" +checksum = "b65d130ee111430e47eed7896ea43ca693c387f097dd97376bffafbf25812128" dependencies = [ "bytes", "futures", @@ -4833,12 +4812,13 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.4" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "bitflags 1.3.2", + "bitflags", "cfg-if", + "cfg_aliases", "libc", ] @@ -4984,7 +4964,7 @@ checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5044,7 +5024,7 @@ dependencies = [ "serde_json", "serde_path_to_error", "serde_with", - "syn 2.0.116", + "syn 2.0.117", "thiserror 2.0.18", "uuid", "validator", @@ -5093,7 +5073,7 @@ version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.11.0", + "bitflags", "cfg-if", "foreign-types", "libc", @@ -5110,7 +5090,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5178,7 +5158,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5232,7 +5212,7 @@ dependencies = [ "regex", "regex-syntax", "structmeta", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5310,29 +5290,29 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.10" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] name = "pin-project-lite" -version = "0.2.16" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] name = "pin-utils" @@ -5356,6 +5336,12 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "plotters" version = "0.3.7" @@ -5475,13 +5461,16 @@ dependencies = [ "prost-types 0.14.3", "rand 0.8.5", "rand_core 0.6.4", + "reqwest 0.13.2", "serde", "serde_json", "serde_with", + "tempfile", "test-case", "thiserror 2.0.18", "tokio", "uuid", + "wiremock", ] [[package]] @@ -5795,7 +5784,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5820,11 +5809,11 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "3.4.0" +version = "3.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", + "toml_edit 0.25.3+spec-1.1.0", ] [[package]] @@ -5846,7 +5835,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5878,7 +5867,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5889,7 +5878,7 @@ checksum = "37566cb3fdacef14c0737f9546df7cfeadbfbc9fef10991038bf5015d0c80532" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.11.0", + "bitflags", "num-traits", "rand 0.9.2", "rand_chacha 0.9.0", @@ -5935,7 +5924,7 @@ dependencies = [ "prost 0.14.3", "prost-types 0.14.3", "regex", - "syn 2.0.116", + "syn 2.0.117", "tempfile", ] @@ -5949,7 +5938,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -5962,7 +5951,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -6013,9 +6002,9 @@ dependencies = [ [[package]] name = "quick-xml" -version = "0.39.1" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd58c6a1fc307e1092aa0bb23d204ca4d1f021764142cd0424dccc84d2d5d106" +checksum = "958f21e8e7ceb5a1aa7fa87fab28e7c75976e0bfe7e23ff069e0a260f894067d" dependencies = [ "memchr", "serde", @@ -6080,9 +6069,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.44" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ "proc-macro2", ] @@ -6093,6 +6082,12 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + [[package]] name = "radium" version = "0.7.0" @@ -6213,9 +6208,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.4.0" +version = "4.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "111325c42c4bafae99e777cd77b40dea9a2b30c69e9d8c74b6eccd7fba4337de" +checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" dependencies = [ "rustversion", ] @@ -6259,16 +6254,16 @@ version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] name = "redox_syscall" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b" +checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16" dependencies = [ - "bitflags 2.11.0", + "bitflags", ] [[package]] @@ -6288,7 +6283,7 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -6316,9 +6311,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a96887878f22d7bad8a3b6dc5b7440e0ada9a245242924394987b21cf2210a4c" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] name = "reqwest" @@ -6448,15 +6443,15 @@ dependencies = [ [[package]] name = "rtnetlink" -version = "0.13.1" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a552eb82d19f38c3beed3f786bd23aa434ceb9ac43ab44419ca6d67a7e186c0" +checksum = "4b960d5d873a75b5be9761b1e73b146f52dddcd27bac75263f40fba686d4d7b5" dependencies = [ - "futures", + "futures-channel", + "futures-util", "log", "netlink-packet-core", "netlink-packet-route", - "netlink-packet-utils", "netlink-proto", "netlink-sys", "nix", @@ -6539,11 +6534,11 @@ dependencies = [ [[package]] name = "rustix" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "146c9e247ccc180c1f61615433868c99f3de3ae256a30a43b49f67c2d9171f34" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "bitflags 2.11.0", + "bitflags", "errno", "libc", "linux-raw-sys", @@ -6552,9 +6547,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.36" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c665f33d38cea657d9614f766881e4d510e0eda4239891eea56b4cadcf01801b" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ "aws-lc-rs", "log", @@ -6778,11 +6773,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.6.0" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d17b898a6d6948c3a8ee4372c17cb384f90d2e6e912ef00895b14fd7ab54ec38" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", + "bitflags", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -6791,9 +6786,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.16.0" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "321c8673b092a9a42605034a9879d73cb79101ed5fd117bc9a597b89b4e9e61a" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ "core-foundation-sys", "libc", @@ -6869,7 +6864,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -6905,7 +6900,7 @@ checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -6931,9 +6926,9 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.16.1" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fa237f2807440d238e0364a218270b98f767a00d3dada77b1c53ae88940e2e7" +checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" dependencies = [ "base64 0.22.1", "chrono", @@ -6950,14 +6945,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.16.1" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a8e3ca0ca629121f70ab50f95249e5a6f925cc0f6ffe8256c45b728875706c" +checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7170,7 +7165,7 @@ dependencies = [ "proc-macro2", "quote", "structmeta-derive", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7181,7 +7176,7 @@ checksum = "152a0b65a590ff6c3da95cabe2353ee04e6167c896b28e3b14478c2636c922fc" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7202,7 +7197,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7224,9 +7219,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.116" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3df424c70518695237746f84cede799c9c58fcb37450d7b23716568cc8bc69cb" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", @@ -7242,7 +7237,7 @@ dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7262,7 +7257,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7279,24 +7274,13 @@ dependencies = [ "windows 0.57.0", ] -[[package]] -name = "system-configuration" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" -dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.9.4", - "system-configuration-sys", -] - [[package]] name = "system-configuration" version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a13f3d0daba03132c0aa9767f98351b3488edc2c100cda2d2ec2b04f3d8d3c8b" dependencies = [ - "bitflags 2.11.0", + "bitflags", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -7325,12 +7309,12 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.25.0" +version = "3.26.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1" +checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" dependencies = [ "fastrand", - "getrandom 0.4.1", + "getrandom 0.4.2", "once_cell", "rustix", "windows-sys 0.61.2", @@ -7354,7 +7338,7 @@ dependencies = [ "cfg-if", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7365,7 +7349,7 @@ checksum = "5c89e72a01ed4c579669add59014b9a524d609c0c88c6a585ce37485879f6ffb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "test-case-core", ] @@ -7425,7 +7409,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7436,7 +7420,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7525,9 +7509,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.49.0" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ "bytes", "libc", @@ -7542,13 +7526,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7619,9 +7603,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +version = "1.0.0+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "32c2555c699578a4f59f0cc68e5116c8d7cabbd45e1409b989d4be085b53f13e" dependencies = [ "serde_core", ] @@ -7642,12 +7626,12 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.10+spec-1.0.0" +version = "0.25.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "a0a07913e63758bc95142d9863a5a45173b71515e68b690cad70cf99c3255ce1" dependencies = [ "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", + "toml_datetime 1.0.0+spec-1.1.0", "toml_parser", "winnow", ] @@ -7669,9 +7653,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "tonic" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f32a6f80051a4111560201420c7885d0082ba9efe2ab61875c587bb6b18b9a0" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" dependencies = [ "async-trait", "axum", @@ -7698,9 +7682,9 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.4" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f86539c0089bfd09b1f8c0ab0239d80392af74c21bc9e0f15e1b4aca4c1647f" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" dependencies = [ "bytes", "prost 0.14.3", @@ -7732,7 +7716,7 @@ version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ - "bitflags 2.11.0", + "bitflags", "bytes", "futures-util", "http", @@ -7776,7 +7760,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -7871,7 +7855,7 @@ dependencies = [ "darling 0.23.0", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8057,7 +8041,7 @@ version = "1.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b672338555252d43fd2240c714dc444b8c6fb0a5c5335e65a07bba7742735ddb" dependencies = [ - "getrandom 0.4.1", + "getrandom 0.4.2", "js-sys", "serde_core", "wasm-bindgen", @@ -8090,7 +8074,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8145,7 +8129,7 @@ source = "git+https://github.com/matter-labs/vise?rev=73c654303d8190023cf30034d6 dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8208,9 +8192,9 @@ dependencies = [ [[package]] name = "wasm-bindgen" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64024a30ec1e37399cf85a7ffefebdb72205ca1c972291c51512360d90bd8566" +checksum = "6532f9a5c1ece3798cb1c2cfdba640b9b3ba884f5db45973a6f442510a87d38e" dependencies = [ "cfg-if", "once_cell", @@ -8221,9 +8205,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.58" +version = "0.4.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a6e77fd0ae8029c9ea0063f87c46fde723e7d887703d74ad2616d792e51e6f" +checksum = "e9c5522b3a28661442748e09d40924dfb9ca614b21c00d3fd135720e48b67db8" dependencies = [ "cfg-if", "futures-util", @@ -8235,9 +8219,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "008b239d9c740232e71bd39e8ef6429d27097518b6b30bdf9086833bd5b6d608" +checksum = "18a2d50fcf105fb33bb15f00e7a77b772945a2ee45dcf454961fd843e74c18e6" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8245,22 +8229,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5256bae2d58f54820e6490f9839c49780dff84c65aeab9e772f15d5f0e913a55" +checksum = "03ce4caeaac547cdf713d280eda22a730824dd11e6b8c3ca9e42247b25c631e3" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.108" +version = "0.2.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f01b580c9ac74c8d8f0c0e4afb04eeef2acf145458e52c03845ee9cd23e3d12" +checksum = "75a326b8c223ee17883a4251907455a2431acc2791c98c26279376490c378c16" dependencies = [ "unicode-ident", ] @@ -8306,7 +8290,7 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags", "hashbrown 0.15.5", "indexmap 2.13.0", "semver 1.0.27", @@ -8328,9 +8312,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.85" +version = "0.3.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312e32e551d92129218ea9a2452120f4aabc03529ef03e4d0d82fb2780608598" +checksum = "854ba17bb104abfb26ba36da9729addc7ce7f06f5c0f90f3c391f8461cca21f9" dependencies = [ "js-sys", "wasm-bindgen", @@ -8412,32 +8396,33 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows" -version = "0.53.0" +version = "0.57.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efc5cf48f83140dcaab716eeaea345f9e93d0018fb81162753a3f76c3397b538" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" dependencies = [ - "windows-core 0.53.0", + "windows-core 0.57.0", "windows-targets 0.52.6", ] [[package]] name = "windows" -version = "0.57.0" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" dependencies = [ - "windows-core 0.57.0", - "windows-targets 0.52.6", + "windows-collections", + "windows-core 0.62.2", + "windows-future", + "windows-numerics", ] [[package]] -name = "windows-core" -version = "0.53.0" +name = "windows-collections" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcc5b895a6377f1ab9fa55acedab1fd5ac0db66ad1e6c7f47e28a22e446a5dd" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ - "windows-result 0.1.2", - "windows-targets 0.52.6", + "windows-core 0.62.2", ] [[package]] @@ -8465,6 +8450,17 @@ dependencies = [ "windows-strings", ] +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link", + "windows-threading", +] + [[package]] name = "windows-implement" version = "0.57.0" @@ -8473,7 +8469,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8484,7 +8480,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8495,7 +8491,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8506,7 +8502,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -8515,6 +8511,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link", +] + [[package]] name = "windows-registry" version = "0.6.1" @@ -8661,6 +8667,15 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -8913,7 +8928,7 @@ dependencies = [ "heck", "indexmap 2.13.0", "prettyplease", - "syn 2.0.116", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -8929,7 +8944,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -8941,7 +8956,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags", "indexmap 2.13.0", "log", "serde", @@ -9057,9 +9072,9 @@ dependencies = [ [[package]] name = "yamux" -version = "0.13.8" +version = "0.13.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deab71f2e20691b4728b349c6cee8fc7223880fa67b6b4f92225ec32225447e5" +checksum = "c650efd29044140aa63caaf80129996a9e2659a2ab7045a7e061807d02fc8549" dependencies = [ "futures", "log", @@ -9099,28 +9114,28 @@ checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "a789c6e490b576db9f7e6b6d661bcc9799f7c0ac8352f56ea20193b2681532e5" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "f65c489a7071a749c849713807783f70672b28094011623e200cb86dcb835953" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -9140,7 +9155,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", "synstructure", ] @@ -9161,7 +9176,7 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] @@ -9194,7 +9209,7 @@ checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.116", + "syn 2.0.117", ] [[package]] diff --git a/crates/cli/src/commands/create_enr.rs b/crates/cli/src/commands/create_enr.rs index 852991d8..51f19c3b 100644 --- a/crates/cli/src/commands/create_enr.rs +++ b/crates/cli/src/commands/create_enr.rs @@ -37,7 +37,7 @@ pub fn run(args: CreateEnrArgs) -> Result<()> { let key = k1::new_saved_priv_key(&args.data_dir)?; - let record = Record::new(key, Vec::new())?; + let record = Record::new(&key, Vec::new())?; let key_path = k1::key_path(&args.data_dir); let mut writer = io::stdout(); diff --git a/crates/cli/src/commands/enr.rs b/crates/cli/src/commands/enr.rs index e7ec6feb..77a7de77 100644 --- a/crates/cli/src/commands/enr.rs +++ b/crates/cli/src/commands/enr.rs @@ -47,7 +47,7 @@ pub fn run(args: EnrArgs) -> Result<()> { } }; - let record = Record::new(key.clone(), vec![])?; + let record = Record::new(&key, vec![])?; writeln!(writer, "{}", record)?; diff --git a/crates/cli/src/commands/test/mod.rs b/crates/cli/src/commands/test/mod.rs index 800d571c..57dc3a8c 100644 --- a/crates/cli/src/commands/test/mod.rs +++ b/crates/cli/src/commands/test/mod.rs @@ -402,7 +402,7 @@ pub(crate) async fn publish_result_to_obol_api( private_key_file: impl AsRef, ) -> CliResult<()> { let private_key = load_or_generate_key(private_key_file.as_ref()).await?; - let enr = Record::new(private_key.clone(), vec![])?; + let enr = Record::new(&private_key, vec![])?; let sign_data_bytes = serde_json::to_vec(&data)?; let hash = hash_ssz(&sign_data_bytes)?; let sig = sign(&private_key, &hash)?; diff --git a/crates/cluster/Cargo.toml b/crates/cluster/Cargo.toml index 0e53d541..a881a110 100644 --- a/crates/cluster/Cargo.toml +++ b/crates/cluster/Cargo.toml @@ -26,6 +26,8 @@ pluto-eth2util.workspace = true pluto-eth1wrap.workspace = true pluto-k1util.workspace = true k256.workspace = true +tokio.workspace = true +reqwest = { workspace = true, features = ["json"] } [build-dependencies] prost-build.workspace = true @@ -34,7 +36,8 @@ prost-build.workspace = true test-case.workspace = true pluto-testutil.workspace = true rand.workspace = true -tokio.workspace = true +tempfile.workspace = true +wiremock.workspace = true [lints] workspace = true diff --git a/crates/cluster/src/definition.rs b/crates/cluster/src/definition.rs index 8e5cf2de..dbd8143b 100644 --- a/crates/cluster/src/definition.rs +++ b/crates/cluster/src/definition.rs @@ -11,7 +11,7 @@ use crate::{ ssz_hasher::Hasher, version::{CURRENT_VERSION, DKG_ALGO, versions::*}, }; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, Timelike, Utc}; use libp2p::PeerId; use pluto_eth1wrap::{EthClient, EthClientError}; use pluto_eth2util::enr::{Record, RecordError}; @@ -394,7 +394,12 @@ impl Definition { uuid: uuid.to_string(), name, version: CURRENT_VERSION.to_string(), - timestamp: Utc::now().to_string(), + // TODO: This is very error prone and should be replaced with a controlled timestamp in + // UTC. + timestamp: chrono::Local::now() + .with_nanosecond(0) + .expect("nanoseconds = 0") + .to_rfc3339(), num_validators, threshold, dkg_algorithm: DKG_ALGO.to_string(), @@ -441,7 +446,9 @@ impl Definition { return Err(InvalidGasLimitError::GasLimitNotSet.into()); } - def.set_definition_hashes() + def.set_definition_hashes()?; + + Ok(def) } /// Returns the timestamp of the definition. @@ -479,7 +486,7 @@ impl Definition { // there are no EIP712 signatures before v1.3.0. For definition versions // earlier than v1.3.0, error if either config signature or enr signature for // any operator is present. - if !Self::support_eip712_sigs(self.version.as_str()) { + if !Self::support_eip712_sigs(&self.version) { return if Self::eip712_sigs_present(&self.operators) { Err(DefinitionError::OlderVersionSignaturesNotSupported) } else { @@ -664,18 +671,18 @@ impl Definition { } /// Sets the definition hashes. - pub fn set_definition_hashes(mut self) -> Result { + pub fn set_definition_hashes(&mut self) -> Result<(), DefinitionError> { let config_hash = - hash_definition(&self, true).map_err(|e| DefinitionError::SSZError(Box::new(e)))?; + hash_definition(self, true).map_err(|e| DefinitionError::SSZError(Box::new(e)))?; self.config_hash = config_hash.to_vec(); let definition_hash = - hash_definition(&self, false).map_err(|e| DefinitionError::SSZError(Box::new(e)))?; + hash_definition(self, false).map_err(|e| DefinitionError::SSZError(Box::new(e)))?; self.definition_hash = definition_hash.to_vec(); - Ok(self) + Ok(()) } /// `verify_hashes` returns an error if hashes populated from json object @@ -707,8 +714,8 @@ impl Definition { /// Returns true if the provided definition version supports EIP712 /// signatures. Note that Definition versions prior to v1.3.0 don't /// support EIP712 signatures. - pub(crate) fn support_eip712_sigs(version: &str) -> bool { - !matches!(version, V1_0 | V1_1 | V1_2) + pub fn support_eip712_sigs(version: impl AsRef) -> bool { + !matches!(version.as_ref(), V1_0 | V1_1 | V1_2) } fn eip712_sigs_present(operators: &[Operator]) -> bool { diff --git a/crates/cluster/src/eip712sigs.rs b/crates/cluster/src/eip712sigs.rs index 5b5979a4..e24b2f87 100644 --- a/crates/cluster/src/eip712sigs.rs +++ b/crates/cluster/src/eip712sigs.rs @@ -164,7 +164,8 @@ pub(crate) fn digest_eip712( Ok(digest) } -fn sign_eip712( +/// Returns the EIP712 signature for the primary type. +pub(crate) fn sign_eip712( secret_key: &SecretKey, typ: &EIP712Type, definition: &Definition, diff --git a/crates/cluster/src/helpers.rs b/crates/cluster/src/helpers.rs index b004be23..b5be6f86 100644 --- a/crates/cluster/src/helpers.rs +++ b/crates/cluster/src/helpers.rs @@ -1,13 +1,17 @@ use chrono::{DateTime, Utc}; +use pluto_crypto::tbls::Tbls; use pluto_eth2util::helpers::{checksum_address, public_key_to_address}; use pluto_k1util::K1UtilError; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use serde_with::{DeserializeAs, SerializeAs}; -use std::borrow::Cow; +use std::{borrow::Cow, path::PathBuf}; -use crate::{definition::ADDRESS_LEN, ssz::SSZError, ssz_hasher::HashWalker}; - -type VerifySigResult = std::result::Result; +use crate::{ + definition::{self, ADDRESS_LEN, Definition}, + eip712sigs, operator, + ssz::SSZError, + ssz_hasher::HashWalker, +}; /// Error type returned by `verify_sig`. #[derive(Debug, thiserror::Error)] @@ -22,13 +26,65 @@ pub enum VerifySigError { } /// Returns true if the signature matches the digest and expected address. -pub fn verify_sig(expected_addr: &str, digest: &[u8], sig: &[u8]) -> VerifySigResult { +pub fn verify_sig( + expected_addr: &str, + digest: &[u8], + sig: &[u8], +) -> std::result::Result { let expected_addr = checksum_address(expected_addr)?; let recovered = pluto_k1util::recover(digest, sig)?; let actual_addr = public_key_to_address(&recovered); Ok(expected_addr == actual_addr) } +/// Error type returned by `fetch_definition`. +#[derive(Debug, thiserror::Error)] +pub enum FetchError { + /// Timeout while fetching the definition. + #[error("timeout {0}")] + Timeout(#[from] tokio::time::error::Elapsed), + + /// HTTP error while fetching the definition. + #[error("HTTP error {0}")] + Http(#[from] reqwest::Error), +} + +/// Fetch cluster definition file from a remote URI. +pub async fn fetch_definition( + url: impl reqwest::IntoUrl, +) -> std::result::Result { + let definition = tokio::time::timeout(std::time::Duration::from_secs(10), async { + let response = reqwest::get(url).await?.error_for_status()?; + response.json::().await + }) + .await??; + + Ok(definition) +} + +/// Creates a new directory for validator keys. +/// If the directory "validator_keys" exists, it checks if the directory is +/// empty. +pub async fn create_validator_keys_dir(parent_dir: &std::path::Path) -> std::io::Result { + let vk_dir = parent_dir.join("validator_keys"); + + if let Err(e) = tokio::fs::create_dir(&vk_dir).await { + if e.kind() != std::io::ErrorKind::AlreadyExists { + return Err(e); + } + + let mut entries = tokio::fs::read_dir(&vk_dir).await?; + if entries.next_entry().await?.is_some() { + return Err(std::io::Error::new( + std::io::ErrorKind::AlreadyExists, + "validator_keys directory exists and is not empty", + )); + } + } + + Ok(vk_dir) +} + /// EthHex represents byte slices that are json formatted as 0x prefixed hex. /// Can be used both as a standalone type and with serde_as. #[derive(Debug, Clone, PartialEq, Eq)] @@ -239,8 +295,69 @@ pub fn to_0x_hex(bytes: &[u8]) -> String { format!("0x{}", hex::encode(bytes)) } +/// Signs the creator's config hash. +pub fn sign_creator( + secret: &k256::SecretKey, + definition: &mut definition::Definition, +) -> Result<(), eip712sigs::EIP712Error> { + let config_signature = eip712sigs::sign_eip712( + secret, + &eip712sigs::eip712_creator_config_hash(), + definition, + &operator::Operator::default(), + )?; + + definition.creator.config_signature = config_signature; + + Ok(()) +} + +/// Signs the operator's config hash and enr. +pub fn sign_operator( + secret: &k256::SecretKey, + definition: &definition::Definition, + operator: &mut operator::Operator, +) -> Result<(), crate::eip712sigs::EIP712Error> { + let config_signature = crate::eip712sigs::sign_eip712( + secret, + &crate::eip712sigs::get_operator_eip712_type(&definition.version), + definition, + operator, + )?; + + let enr_signature = crate::eip712sigs::sign_eip712( + secret, + &crate::eip712sigs::eip712_enr(), + definition, + operator, + )?; + + operator.config_signature = config_signature; + operator.enr_signature = enr_signature; + + Ok(()) +} + +/// Returns a BLS aggregate signature of the message signed by all the shares. +pub fn agg_sign( + secrets: &[Vec], + message: &[u8], +) -> Result { + let blst = pluto_crypto::blst_impl::BlstImpl; + + let sigs = secrets + .iter() + .flat_map(|shares| shares.iter()) + .map(|share| blst.sign(share, message)) + .collect::, _>>()?; + + blst.aggregate(&sigs) +} + #[cfg(test)] mod tests { + use crate::test_cluster; + use super::*; use serde_with::serde_as; @@ -330,4 +447,81 @@ mod tests { assert!(json.contains("\"0x010203\"")); assert!(json.contains("[4,5,6]")); } + + #[tokio::test] + async fn fetch_definition_valid() { + let (lock, ..) = test_cluster::new_for_test(1, 2, 3, 0); + let expected_definition = lock.definition.clone(); + + let server = wiremock::MockServer::start().await; + wiremock::Mock::given(wiremock::matchers::method("GET")) + .and(wiremock::matchers::path("/validDef")) + .respond_with(wiremock::ResponseTemplate::new(200).set_body_json(lock.definition)) + .mount(&server) + .await; + + let actual_definition = super::fetch_definition(format!("{}/validDef", &server.uri())) + .await + .unwrap(); + + assert_eq!(actual_definition, expected_definition); + } + + #[tokio::test] + async fn fetch_definition_invalid() { + let server = wiremock::MockServer::start().await; + wiremock::Mock::given(wiremock::matchers::method("GET")) + .and(wiremock::matchers::path("/invalidDef")) + .respond_with( + wiremock::ResponseTemplate::new(200).set_body_raw("r#{}#", "application/json"), + ) + .mount(&server) + .await; + + let response = super::fetch_definition(format!("{}/invalidDef", &server.uri())).await; + + assert!(matches!(response, Err(super::FetchError::Http(e)) if e.is_decode())); + } + + #[tokio::test] + async fn fetch_definition_non_200() { + let server = wiremock::MockServer::start().await; + wiremock::Mock::given(wiremock::matchers::method("GET")) + .and(wiremock::matchers::path("/non_ok")) + .respond_with(wiremock::ResponseTemplate::new(500)) + .mount(&server) + .await; + + let response = super::fetch_definition(format!("{}/non_ok", &server.uri())).await; + + assert!(matches!(response, Err(super::FetchError::Http(e)) if e.is_status())); + } + + #[tokio::test] + async fn create_validator_keys_dir() { + let tmp = tempfile::tempdir().unwrap(); + let parent_dir = tmp.path(); + + // First attempt must succeed. + let dir = super::create_validator_keys_dir(parent_dir).await.unwrap(); + assert!(dir.starts_with(parent_dir)); + assert!(dir.ends_with("validator_keys")); + + // Second attempt shall succeed as long as the dir is empty. + let dir2 = super::create_validator_keys_dir(parent_dir).await.unwrap(); + assert_eq!(dir, dir2); + + // Create a file in the directory to make it non-empty. + tokio::fs::write(dir.join("file"), b"data").await.unwrap(); + let err = super::create_validator_keys_dir(parent_dir) + .await + .unwrap_err(); + assert!(matches!(err, e if e.kind() == std::io::ErrorKind::AlreadyExists)); + + // Parent directory does not exist + let err = super::create_validator_keys_dir(&parent_dir.join("nonexistent")) + .await + .unwrap_err(); + assert!(matches!(err, e if e.kind() == std::io::ErrorKind::NotFound)); + } } diff --git a/crates/cluster/src/lib.rs b/crates/cluster/src/lib.rs index 91fc1c37..fc85adc6 100644 --- a/crates/cluster/src/lib.rs +++ b/crates/cluster/src/lib.rs @@ -29,6 +29,7 @@ pub mod ssz; /// Cluster SSZ hashing management and coordination. pub mod ssz_hasher; /// Cluster test cluster management and coordination. +#[cfg(test)] pub mod test_cluster; /// Cluster version management and coordination. pub mod version; diff --git a/crates/cluster/src/manifest/cluster.rs b/crates/cluster/src/manifest/cluster.rs index e40ee71a..d0a6c11b 100644 --- a/crates/cluster/src/manifest/cluster.rs +++ b/crates/cluster/src/manifest/cluster.rs @@ -426,7 +426,7 @@ mod tests { for i in 0..operator_amt { let k1_key = generate_insecure_k1_key(i); - let enr = Record::new(k1_key.clone(), vec![]).unwrap(); + let enr = Record::new(&k1_key, vec![]).unwrap(); operators.push(Operator { address: format!("0x{:040x}", i), @@ -457,7 +457,7 @@ mod tests { let k1_key0 = generate_insecure_k1_key(1); let k1_key_unknown = generate_insecure_k1_key(200); - let enr0 = Record::new(k1_key0, vec![]).unwrap(); + let enr0 = Record::new(&k1_key0, vec![]).unwrap(); let cluster = Cluster { operators: vec![Operator { diff --git a/crates/cluster/src/test_cluster.rs b/crates/cluster/src/test_cluster.rs index 8b137891..7b7e6dc3 100644 --- a/crates/cluster/src/test_cluster.rs +++ b/crates/cluster/src/test_cluster.rs @@ -1 +1,204 @@ +use crate::{definition, distvalidator, helpers, lock, operator, registration, version}; +use chrono::{TimeZone, Utc}; +use pluto_crypto::tbls::Tbls; +use rand::{RngCore, SeedableRng}; +/// Returns a new cluster lock with `dv` number of distributed validators, `k` +/// threshold and `n` peers. It also returns the peer p2p keys and BLS secret +/// shares. +/// +/// If the seed is zero, a random cluster on available loopback ports +/// is generated, else a deterministic cluster is generated. +pub fn new_for_test( + dv: usize, + k: pluto_crypto::types::Index, + n: pluto_crypto::types::Index, + seed: u64, +) -> ( + lock::Lock, + Vec, + Vec>, +) { + let mut rng = { + let inner = if seed == 0 { + rand::rngs::OsRng::next_u64(&mut rand::rngs::OsRng) + } else { + seed + }; + rand::rngs::StdRng::seed_from_u64(inner) + }; + + let mut vals = Vec::with_capacity(dv); + let mut dv_shares = Vec::with_capacity(dv); + + let mut fee_recipient_addresses = Vec::with_capacity(dv); + let mut withdrawal_addresses = Vec::with_capacity(dv); + + for _ in 0..dv { + let blst = pluto_crypto::blst_impl::BlstImpl; + let root_secret = blst.generate_insecure_secret(&mut rng).unwrap(); + let root_public = blst.secret_to_public_key(&root_secret).unwrap(); + let shares = blst + .threshold_split_insecure(&root_secret, n, k, &mut rng) + .unwrap(); + + let mut pub_shares: Vec = Vec::with_capacity(n as usize); + let mut priv_shares: Vec = Vec::with_capacity(n as usize); + + for i in 0..n { + let share_priv_key = *shares.get(&i).unwrap(); // NOTE: Pluto implementation does not use 1-based indexing for shares + let share_pub = blst.secret_to_public_key(&share_priv_key).unwrap(); + + pub_shares.push(share_pub); + priv_shares.push(share_priv_key); + } + + let fee_recipient_address = pluto_testutil::random::random_eth_address(&mut rng); + + let network_name = pluto_eth2util::network::GOERLI.name; + let reg = get_signed_registration(&root_secret, fee_recipient_address, network_name); + + let dist_validator = distvalidator::DistValidator { + pub_key: root_public.to_vec(), + pub_shares: pub_shares.iter().map(|pk| pk.to_vec()).collect(), + builder_registration: reg, + partial_deposit_data: Vec::new(), + }; + + vals.push(dist_validator); + dv_shares.push(priv_shares); + + fee_recipient_addresses.push(helpers::to_0x_hex(&fee_recipient_address)); + withdrawal_addresses.push(helpers::to_0x_hex( + &pluto_testutil::random::random_eth_address(&mut rng), + )); + } + + let mut ops = Vec::with_capacity(n as usize); + let mut p2p_keys = Vec::with_capacity(n as usize); + + for i in 0..n { + // Generate ENR + #[allow( + clippy::arithmetic_side_effects, + reason = "matches the original implementation, test code only" + )] + #[allow( + clippy::cast_possible_truncation, + reason = "intentional truncation for testing purposes" + )] + let p2p_key = pluto_testutil::random::generate_insecure_k1_key(seed as u8 + i); + let addr = pluto_eth2util::helpers::public_key_to_address(&p2p_key.public_key()); + let record = pluto_eth2util::enr::Record::new(&p2p_key, Vec::new()).unwrap(); + let op = operator::Operator { + address: addr, + enr: record.to_string(), + enr_signature: Vec::new(), + config_signature: Vec::new(), + }; + + ops.push(op); + p2p_keys.push(p2p_key); + } + + // Use operator 0 as the creator. + let creator = definition::Creator { + address: ops[0].address.clone(), + ..Default::default() + }; + + let mut definition = definition::Definition::new( + "test cluster".into(), + dv.try_into().unwrap(), + k.into(), + fee_recipient_addresses, + withdrawal_addresses, + pluto_eth2util::network::GOERLI + .genesis_fork_version_hex + .into(), + creator, + ops, + Vec::new(), + "".into(), + 30_000_000, + false, + Vec::new(), + ) + .unwrap(); + + // Definition version prior to v1.3.0 don't support EIP712 signatures. + if definition::Definition::support_eip712_sigs(&definition.version) { + let mut operators = std::mem::take(&mut definition.operators); + for (operator, p2p_key) in operators.iter_mut().zip(p2p_keys.iter()) { + helpers::sign_operator(p2p_key, &definition, operator).unwrap(); + } + definition.operators = operators; + + helpers::sign_creator(&p2p_keys[0], &mut definition).unwrap(); + + // Recalculate definition hash after adding signatures. + definition.set_definition_hashes().unwrap(); + } + + let mut lock = lock::Lock { + definition, + distributed_validators: vals, + signature_aggregate: Vec::new(), + lock_hash: Vec::new(), + node_signatures: Vec::new(), + }; + + lock.set_lock_hash().unwrap(); + + let signature_aggregate = helpers::agg_sign(&dv_shares, &lock.lock_hash).unwrap(); + lock.signature_aggregate = signature_aggregate.to_vec(); + + if version::support_node_signatures(&lock.version) { + for p2p_key in p2p_keys.iter() { + let node_sig = pluto_k1util::sign(p2p_key, &lock.lock_hash).unwrap(); + lock.node_signatures.push(node_sig.to_vec()); + } + } + + (lock, p2p_keys, dv_shares) +} + +fn get_signed_registration( + secret: &pluto_crypto::types::PrivateKey, + fee_recipient: [u8; 20], + network_name: impl AsRef, +) -> registration::BuilderRegistration { + let blst = pluto_crypto::blst_impl::BlstImpl; + + let timestamp = + pluto_eth2util::network::network_to_genesis_time(network_name.as_ref()).unwrap(); + let pubkey = blst.secret_to_public_key(secret).unwrap(); + let eth2pubkey = pluto_crypto::tblsconv::pubkey_to_eth2(pubkey); + + let msg = pluto_eth2api::v1::ValidatorRegistration { + fee_recipient, + gas_limit: pluto_eth2util::registration::DEFAULT_GAS_LIMIT, + timestamp: timestamp.timestamp().try_into().unwrap(), + pubkey: eth2pubkey, + }; + + let fork_version = pluto_eth2util::network::network_to_fork_version_bytes(network_name) + .unwrap() + .try_into() + .unwrap(); + + let sig_root = pluto_eth2util::registration::get_message_signing_root(&msg, fork_version); + let signature = blst.sign(secret, &sig_root).unwrap(); + + registration::BuilderRegistration { + message: registration::Registration { + fee_recipient: msg.fee_recipient, + gas_limit: msg.gas_limit, + timestamp: Utc + .timestamp_opt(msg.timestamp.try_into().unwrap(), 0) + .unwrap(), + pub_key: msg.pubkey, + }, + signature, + } +} diff --git a/crates/crypto/src/blst_impl.rs b/crates/crypto/src/blst_impl.rs index 84a14579..a0f0e78e 100644 --- a/crates/crypto/src/blst_impl.rs +++ b/crates/crypto/src/blst_impl.rs @@ -129,7 +129,7 @@ impl Tbls for BlstImpl { Ok(recovered.to_bytes()) } - fn aggregate(&self, signatures: Vec) -> Result { + fn aggregate(&self, signatures: &[Signature]) -> Result { if signatures.is_empty() { return Err(Error::EmptySignatureArray); } @@ -755,7 +755,7 @@ mod tests { } // Aggregate signatures - let aggregated_sig = blst.aggregate(signatures).unwrap(); + let aggregated_sig = blst.aggregate(&signatures).unwrap(); // Verify aggregate let result = blst.verify_aggregate(&public_keys, aggregated_sig, data); @@ -788,7 +788,7 @@ mod tests { } // Aggregate signatures - let aggregated_sig = blst.aggregate(signatures).unwrap(); + let aggregated_sig = blst.aggregate(&signatures).unwrap(); // Verify with data2 (wrong data) let result = blst.verify_aggregate(&public_keys, aggregated_sig, data2); @@ -808,7 +808,7 @@ mod tests { let sk = blst.generate_secret_key(OsRng).unwrap(); let sig = blst.sign(&sk, data).unwrap(); - let aggregated = blst.aggregate(vec![sig]).unwrap(); + let aggregated = blst.aggregate(&[sig]).unwrap(); assert_eq!( sig, aggregated, "Aggregating single signature should return the same signature" @@ -830,7 +830,7 @@ mod tests { signatures.push(sig); } - let aggregated = blst.aggregate(signatures).unwrap(); + let aggregated = blst.aggregate(&signatures).unwrap(); assert_eq!( aggregated.len(), 96, @@ -914,7 +914,7 @@ mod tests { fn test_empty_aggregate_fails() { let blst = setup(); - let result = blst.aggregate(vec![]); + let result = blst.aggregate(&[]); assert!( result.is_err(), "Aggregating empty signature list should fail" diff --git a/crates/crypto/src/tbls.rs b/crates/crypto/src/tbls.rs index e7d7f495..69eef6b4 100644 --- a/crates/crypto/src/tbls.rs +++ b/crates/crypto/src/tbls.rs @@ -63,7 +63,7 @@ pub trait Tbls { fn recover_secret(&self, shares: &HashMap) -> Result; /// Aggregates a set of signatures into a single signature - fn aggregate(&self, signatures: Vec) -> Result; + fn aggregate(&self, signatures: &[Signature]) -> Result; /// Aggregates a set of partial signatures into a single /// signature diff --git a/crates/eth2util/src/enr.rs b/crates/eth2util/src/enr.rs index 179c06ba..e22ad253 100644 --- a/crates/eth2util/src/enr.rs +++ b/crates/eth2util/src/enr.rs @@ -131,7 +131,7 @@ pub fn with_udp_impl(udp: u16) -> OptionFn { impl Record { /// Creates a new record. - pub fn new(secret_key: SecretKey, opts: Vec) -> Result { + pub fn new(secret_key: &SecretKey, opts: Vec) -> Result { let mut kvs: HashMap> = HashMap::new(); kvs.insert(KEY_ID.to_string(), VAL_ID.as_bytes().to_vec()); @@ -144,7 +144,7 @@ impl Record { opt(&mut kvs); } - let signature = sign(&secret_key, &encode_elements(&[], &kvs))?; + let signature = sign(secret_key, &encode_elements(&[], &kvs))?; Ok(Record { public_key: Some(secret_key.public_key()), @@ -367,7 +367,7 @@ mod tests { fn test_encode_decode() { let secret_key: SecretKey = SecretKey::random(&mut OsRng); - let r1 = Record::new(secret_key, vec![]).expect("Failed to create record"); + let r1 = Record::new(&secret_key, vec![]).expect("Failed to create record"); let r2 = Record::try_from(r1.to_string().as_str()).expect("Failed to parse record"); @@ -386,7 +386,7 @@ mod tests { let expect_udp = 9000; let r1 = Record::new( - secret_key, + &secret_key, vec![ with_ip_impl(expect_ip), with_tcp_impl(expect_tcp), @@ -422,7 +422,7 @@ mod tests { fn test_new() { let secret_key: SecretKey = generate_insecure_k1_key(0); - let r = Record::new(secret_key, vec![]).expect("Failed to create record"); + let r = Record::new(&secret_key, vec![]).expect("Failed to create record"); assert_eq!( r.to_string(), diff --git a/crates/eth2util/src/network.rs b/crates/eth2util/src/network.rs index 131d4185..d4825751 100644 --- a/crates/eth2util/src/network.rs +++ b/crates/eth2util/src/network.rs @@ -157,14 +157,14 @@ pub fn supported_networks() -> Result> { .clone()) } -fn network_from_name(name: &str) -> Result { +fn network_from_name(name: impl AsRef) -> Result { let networks = supported_networks()?; networks .iter() - .find(|network| network.name == name) + .find(|network| network.name == name.as_ref()) .ok_or(NetworkError::InvalidName { - name: name.to_string(), + name: name.as_ref().to_string(), }) .cloned() } @@ -200,13 +200,13 @@ pub fn fork_version_to_network(fork_version: &[u8]) -> Result { } /// Network to fork version. -pub fn network_to_fork_version(network: &str) -> Result { +pub fn network_to_fork_version(network: impl AsRef) -> Result { let network = network_from_name(network)?; Ok(network.genesis_fork_version_hex.to_string()) } /// Network to fork version bytes. -pub fn network_to_fork_version_bytes(network: &str) -> Result> { +pub fn network_to_fork_version_bytes(network: impl AsRef) -> Result> { let fork_version = network_to_fork_version(network)?; let b = diff --git a/crates/eth2util/src/registration.rs b/crates/eth2util/src/registration.rs index 4cab0b29..8545a909 100644 --- a/crates/eth2util/src/registration.rs +++ b/crates/eth2util/src/registration.rs @@ -44,9 +44,7 @@ pub fn new_message( /// Parses and validates a `0x`-prefixed hex Ethereum address into `[u8; 20]`. fn execution_address_from_str(addr: &str) -> Result { let address = crate::helpers::verify_address(addr)?; - let mut result = ExecutionAddress::default(); - result.copy_from_slice(address.as_slice()); - Ok(result) + Ok(address.0.0) } /// Returns the validator registration signature domain. diff --git a/crates/p2p/examples/p2p.rs b/crates/p2p/examples/p2p.rs index 8241b4cc..72ae6465 100644 --- a/crates/p2p/examples/p2p.rs +++ b/crates/p2p/examples/p2p.rs @@ -96,7 +96,7 @@ async fn main() -> Result<()> { let args = Args::parse(); - let enr = Record::new(key.clone(), vec![])?; + let enr = Record::new(&key, vec![])?; if let Some(relay_url) = &args.relay_url { p2p.dial(relay_url.clone())?; diff --git a/crates/p2p/src/peer.rs b/crates/p2p/src/peer.rs index ac1dd26f..a5ed73f9 100644 --- a/crates/p2p/src/peer.rs +++ b/crates/p2p/src/peer.rs @@ -249,7 +249,7 @@ mod tests { fn test_new_peer() { let p2p_key = generate_insecure_k1_key(1); - let record = Record::new(p2p_key, vec![]).unwrap(); + let record = Record::new(&p2p_key, vec![]).unwrap(); let peer = Peer::from_enr(&record, 0).unwrap(); diff --git a/crates/peerinfo/examples/peerinfo.rs b/crates/peerinfo/examples/peerinfo.rs index 9d1ef055..6238ceba 100644 --- a/crates/peerinfo/examples/peerinfo.rs +++ b/crates/peerinfo/examples/peerinfo.rs @@ -259,7 +259,7 @@ async fn main() -> anyhow::Result<()> { }; let enr = pluto_eth2util::enr::Record::new( - key.clone(), + &key, vec![ pluto_eth2util::enr::with_ip_impl(Ipv4Addr::from([0, 0, 0, 0])), pluto_eth2util::enr::with_tcp_impl(args.port), diff --git a/crates/relay-server/src/web.rs b/crates/relay-server/src/web.rs index 7f5b7ec5..215ac4d0 100644 --- a/crates/relay-server/src/web.rs +++ b/crates/relay-server/src/web.rs @@ -228,7 +228,7 @@ pub async fn enr_handler( // Create ENR record let record = pluto_eth2util::enr::Record::new( - state.secret_key.clone(), + &state.secret_key, vec![ pluto_eth2util::enr::with_ip_impl(ip), pluto_eth2util::enr::with_tcp_impl(tcp_port), diff --git a/crates/testutil/src/random.rs b/crates/testutil/src/random.rs index 718f59bc..65be74cc 100644 --- a/crates/testutil/src/random.rs +++ b/crates/testutil/src/random.rs @@ -67,6 +67,13 @@ pub fn generate_test_bls_key(seed: u64) -> PrivateKey { .expect("deterministic key generation should not fail") } +/// Generate random Ethereum address for testing. +pub fn random_eth_address(rand: &mut impl Rng) -> [u8; 20] { + let mut bytes = [0u8; 20]; + rand.fill(&mut bytes[..]); + bytes +} + #[cfg(test)] mod tests { use super::*;