diff --git a/Cargo.lock b/Cargo.lock index a142f1c..0d555bf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "ahash" version = "0.8.12" @@ -46,9 +31,9 @@ checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" [[package]] name = "alloy" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6cfe35f100bc496007c9a00f90b88bdf565f1421d4c707c9f07e0717e2aaad" +checksum = "ae62e633fa48b4190af5e841eb05179841bb8b713945103291e2c0867037c0d1" dependencies = [ "alloy-consensus", "alloy-contract", @@ -71,9 +56,9 @@ dependencies = [ [[package]] name = "alloy-chains" -version = "0.2.14" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf01dd83a1ca5e4807d0ca0223c9615e211ce5db0a9fd1443c2778cacf89b546" +checksum = "0bbb778f50ecb0cebfb5c05580948501927508da7bd628833a8c4bd8545e23e2" dependencies = [ "alloy-primitives", "num_enum", @@ -82,9 +67,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59094911f05dbff1cf5b29046a00ef26452eccc8d47136d50a47c0cf22f00c85" +checksum = "b9b151e38e42f1586a01369ec52a6934702731d07e8509a7307331b09f6c46dc" dependencies = [ "alloy-eips", "alloy-primitives", @@ -108,9 +93,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "903cb8f728107ca27c816546f15be38c688df3c381d7bd1a4a9f215effc1ddb4" +checksum = "6e2d5e8668ef6215efdb7dcca6f22277b4e483a5650e05f5de22b2350971f4b8" dependencies = [ "alloy-consensus", "alloy-eips", @@ -122,9 +107,9 @@ dependencies = [ [[package]] name = "alloy-contract" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03df5cb3b428ac96b386ad64c11d5c6e87a5505682cf1fbd6f8f773e9eda04f6" +checksum = "630288cf4f3a34a8c6bc75c03dce1dbd47833138f65f37d53a1661eafc96b83f" dependencies = [ "alloy-consensus", "alloy-dyn-abi", @@ -145,9 +130,9 @@ dependencies = [ [[package]] name = "alloy-core" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "575053cea24ea8cb7e775e39d5c53c33b19cfd0ca1cf6c0fd653f3d8c682095f" +checksum = "5ca96214615ec8cf3fa2a54b32f486eb49100ca7fe7eb0b8c1137cd316e7250a" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -158,9 +143,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6c2905bafc2df7ccd32ca3af13f0b0d82f2e2ff9dfbeb12196c0d978d5c0deb" +checksum = "3fdff496dd4e98a81f4861e66f7eaf5f2488971848bb42d9c892f871730245c8" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -210,9 +195,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac7f1c9a1ccc7f3e03c36976455751a6166a4f0d2d2c530c3f87dfe7d0cdc836" +checksum = "e5434834adaf64fa20a6fb90877bc1d33214c41b055cc49f82189c98614368cc" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -232,9 +217,9 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1421f6c9d15e5b86afbfe5865ca84dea3b9f77173a0963c1a2ee4e626320ada9" +checksum = "919a8471cfbed7bcd8cf1197a57dda583ce0e10c6385f6ff4e8b41304b223392" dependencies = [ "alloy-eips", "alloy-primitives", @@ -246,9 +231,9 @@ dependencies = [ [[package]] name = "alloy-json-abi" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2acb6637a9c0e1cdf8971e0ced8f3fa34c04c5e9dccf6bb184f6a64fe0e37d8" +checksum = "5513d5e6bd1cba6bdcf5373470f559f320c05c8c59493b6e98912fbe6733943f" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -258,9 +243,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "65f763621707fa09cece30b73ecc607eb43fd7a72451fe3b46f645b905086926" +checksum = "d7c69f6c9c68a1287c9d5ff903d0010726934de0dac10989be37b75a29190d55" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -273,9 +258,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f59a869fa4b4c3a7f08b1c8cb79aec61c29febe6e24a24fe0fcfded8a9b5703" +checksum = "8eaf2ae05219e73e0979cb2cf55612aafbab191d130f203079805eaf881cca58" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -299,9 +284,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46e9374c667c95c41177602ebe6f6a2edd455193844f011d973d374b65501b38" +checksum = "e58f4f345cef483eab7374f2b6056973c7419ffe8ad35e994b7a7f5d8e0c7ba4" dependencies = [ "alloy-consensus", "alloy-eips", @@ -312,9 +297,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b77f7d5e60ad8ae6bd2200b8097919712a07a6db622a4b201e7ead6166f02e5" +checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" dependencies = [ "alloy-rlp", "bytes", @@ -323,7 +308,7 @@ dependencies = [ "derive_more", "foldhash 0.2.0", "hashbrown 0.16.0", - "indexmap 2.11.4", + "indexmap 2.12.0", "itoa", "k256", "keccak-asm", @@ -339,9 +324,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77818b7348bd5486491a5297579dbfe5f706a81f8e1f5976393025f1e22a7c7d" +checksum = "de2597751539b1cc8fe4204e5325f9a9ed83fcacfb212018dfcfa7877e76de21" dependencies = [ "alloy-chains", "alloy-consensus", @@ -380,9 +365,9 @@ dependencies = [ [[package]] name = "alloy-pubsub" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "249b45103a66c9ad60ad8176b076106d03a2399a37f0ee7b0e03692e6b354cb9" +checksum = "06e45a68423e732900a0c824b8e22237db461b79d2e472dd68b7547c16104427" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -419,14 +404,14 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "alloy-rpc-client" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2430d5623e428dd012c6c2156ae40b7fe638d6fca255e3244e0fba51fa698e93" +checksum = "edf8eb8be597cfa8c312934d2566ec4516f066d69164f9212d7a148979fdcfd8" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -449,9 +434,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9e131624d08a25cfc40557041e7dc42e1182fa1153e7592d120f769a1edce56" +checksum = "339af7336571dd39ae3a15bde08ae6a647e62f75350bd415832640268af92c06" dependencies = [ "alloy-primitives", "alloy-rpc-types-eth", @@ -461,9 +446,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07429a1099cd17227abcddb91b5e38c960aaeb02a6967467f5bb561fbe716ac6" +checksum = "fbde0801a32d21c5f111f037bee7e22874836fba7add34ed4a6919932dd7cf23" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -472,9 +457,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db46b0901ee16bbb68d986003c66dcb74a12f9d9b3c44f8e85d51974f2458f0f" +checksum = "361cd87ead4ba7659bda8127902eda92d17fa7ceb18aba1676f7be10f7222487" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -493,9 +478,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5413814be7a22fbc81e0f04a2401fcc3eb25e56fd53b04683e8acecc6e1fe01b" +checksum = "64600fc6c312b7e0ba76f73a381059af044f4f21f43e07f51f1fa76c868fe302" dependencies = [ "alloy-primitives", "serde", @@ -504,9 +489,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53410a18a61916e2c073a6519499514e027b01e77eeaf96acd1df7cf96ef6bb2" +checksum = "5772858492b26f780468ae693405f895d6a27dea6e3eab2c36b6217de47c2647" dependencies = [ "alloy-primitives", "async-trait", @@ -519,9 +504,9 @@ dependencies = [ [[package]] name = "alloy-signer-local" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6006c4cbfa5d08cadec1fcabea6cb56dc585a30a9fce40bcf81e307d6a71c8e" +checksum = "f4195b803d0a992d8dbaab2ca1986fc86533d4bc80967c0cce7668b26ad99ef9" dependencies = [ "alloy-consensus", "alloy-network", @@ -535,42 +520,42 @@ dependencies = [ [[package]] name = "alloy-sol-macro" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c84c3637bee9b5c4a4d2b93360ee16553d299c3b932712353caf1cea76d0e6" +checksum = "f3ce480400051b5217f19d6e9a82d9010cdde20f1ae9c00d53591e4a1afbb312" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "alloy-sol-macro-expander" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a882aa4e1790063362434b9b40d358942b188477ac1c44cfb8a52816ffc0cc17" +checksum = "6d792e205ed3b72f795a8044c52877d2e6b6e9b1d13f431478121d8d4eaa9028" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", "const-hex", "heck", - "indexmap 2.11.4", + "indexmap 2.12.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5772107f9bb265d8d8c86e0733937bb20d0857ea5425b1b6ddf51a9804042" +checksum = "0bd1247a8f90b465ef3f1207627547ec16940c35597875cdc09c49d58b19693c" dependencies = [ "alloy-json-abi", "const-hex", @@ -580,15 +565,15 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.106", + "syn 2.0.108", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e188b939aa4793edfaaa099cb1be4e620036a775b4bdf24fdc56f1cd6fd45890" +checksum = "954d1b2533b9b2c7959652df3076954ecb1122a28cc740aa84e7b0a49f6ac0a9" dependencies = [ "serde", "winnow", @@ -596,9 +581,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c8a9a909872097caffc05df134e5ef2253a1cdb56d3a9cf0052a042ac763f9" +checksum = "70319350969a3af119da6fb3e9bddb1bce66c9ea933600cb297c8b1850ad2a3c" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -608,9 +593,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d94ee404368a3d9910dfe61b203e888c6b0e151a50e147f95da8baff9f9c7763" +checksum = "025a940182bddaeb594c26fe3728525ae262d0806fe6a4befdf5d7bc13d54bce" dependencies = [ "alloy-json-rpc", "alloy-primitives", @@ -632,9 +617,9 @@ dependencies = [ [[package]] name = "alloy-transport-http" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8a6338d594f6c6481292215ee8f2fd7b986c80aba23f3f44e761a8658de78" +checksum = "e3b5064d1e1e1aabc918b5954e7fb8154c39e77ec6903a581b973198b26628fa" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -647,9 +632,9 @@ dependencies = [ [[package]] name = "alloy-transport-ws" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "679b0122b7bca9d4dc5eb2c0549677a3c53153f6e232f23f4b3ba5575f74ebde" +checksum = "9476a36a34e2fb51b6746d009c53d309a186a825aa95435407f0e07149f4ad2d" dependencies = [ "alloy-pubsub", "alloy-transport", @@ -681,15 +666,15 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.37" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64c09ec565a90ed8390d82aa08cd3b22e492321b96cb4a3d4f58414683c9e2f" +checksum = "f8e52276fdb553d3c11563afad2898f4085165e4093604afe3d78b69afbf408f" dependencies = [ "alloy-primitives", "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -749,7 +734,7 @@ checksum = "e7e89fe77d1f0f4fe5b96dfc940923d88d17b6a773808124f21e764dfb063c6a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -858,7 +843,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -896,7 +881,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1000,7 +985,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1079,7 +1064,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1090,7 +1075,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1118,7 +1103,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1179,21 +1164,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link 0.2.0", -] - [[package]] name = "base16ct" version = "0.2.0" @@ -1266,9 +1236,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.4" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +checksum = "812e12b5285cc515a9c72a5c1d3b6d46a19dac5acfef5265968c166106e31dd3" [[package]] name = "bitvec" @@ -1351,7 +1321,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1368,22 +1338,22 @@ checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" [[package]] name = "bytemuck" -version = "1.23.2" +version = "1.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3995eaeebcdf32f91f980d360f78732ddc061097ab4e39991ae7a6ace9194677" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.10.1" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f154e572231cb6ba2bd1176980827e3d5dc04cc183a75dea38109fbdd672d29" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1450,9 +1420,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.39" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ "find-msvc-tools", "shlex", @@ -1460,9 +1430,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -1479,7 +1449,7 @@ dependencies = [ "iana-time-zone", "num-traits", "serde", - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -1493,9 +1463,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.16.0" +version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6407bff74dea37e0fa3dc1c1c974e5d46405f0c987bf9997a0762adce71eda6" +checksum = "3bb320cac8a0750d7f25280aa97b09c26edfe161164238ecbbb31092b079e735" dependencies = [ "cfg-if", "cpufeatures", @@ -1511,9 +1481,9 @@ checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" [[package]] name = "const_format" -version = "0.2.34" +version = "0.2.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126f97965c8ad46d6d9163268ff28432e8f6a1196a55578867832e3049df63dd" +checksum = "7faa7469a93a566e9ccc1c73fe783b4a65c274c5ace346038dca9c39fe0030ad" dependencies = [ "const_format_proc_macros", ] @@ -1645,7 +1615,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1660,7 +1630,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1671,7 +1641,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1682,7 +1652,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1755,7 +1725,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1765,7 +1735,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1785,7 +1755,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "unicode-xid", ] @@ -1828,7 +1798,7 @@ dependencies = [ "libc", "option-ext", "redox_users", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -1839,7 +1809,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1901,7 +1871,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1977,7 +1947,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -1993,7 +1963,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -2048,9 +2018,9 @@ dependencies = [ [[package]] name = "find-msvc-tools" -version = "0.1.2" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ced73b1dacfc750a6db6c0a0c3a3853c8b41997e2e2c563dc90804ae6867959" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" [[package]] name = "fixed-hash" @@ -2109,7 +2079,7 @@ checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2195,7 +2165,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2236,9 +2206,9 @@ checksum = "42012b0f064e01aa58b545fe3727f90f7dd4020f4a3ea735b50344965f5a57e9" [[package]] name = "generic-array" -version = "0.14.7" +version = "0.14.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2" dependencies = [ "typenum", "version_check", @@ -2254,30 +2224,24 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.1+wasi-snapshot-preview1", + "wasi", "wasm-bindgen", ] [[package]] name = "getrandom" -version = "0.3.3" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26145e563e54f2cadc477553f1ec5ee650b00862f0a58bcd12cbdc5f0ea2d2f4" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" dependencies = [ "cfg-if", "js-sys", "libc", "r-efi", - "wasi 0.14.7+wasi-0.2.4", + "wasip2", "wasm-bindgen", ] -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - [[package]] name = "glob" version = "0.3.3" @@ -2307,7 +2271,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.11.4", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -2481,7 +2445,7 @@ dependencies = [ "tokio", "tokio-rustls", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] @@ -2680,7 +2644,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2702,9 +2666,9 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.11.4" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "equivalent", "hashbrown 0.16.0", @@ -2712,17 +2676,6 @@ dependencies = [ "serde_core", ] -[[package]] -name = "io-uring" -version = "0.7.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" -dependencies = [ - "bitflags 2.9.4", - "cfg-if", - "libc", -] - [[package]] name = "ipnet" version = "2.11.0" @@ -2835,7 +2788,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2849,9 +2802,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.176" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libm" @@ -2865,7 +2818,7 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "libc", ] @@ -2893,11 +2846,10 @@ checksum = "241eaef5fd12c88705a01fc1066c48c4b36e0dd4377dcdc7ec3942cea7a69956" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] @@ -2930,7 +2882,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2956,7 +2908,7 @@ checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -2983,7 +2935,7 @@ version = "0.29.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "block", "core-graphics-types", "foreign-types 0.5.0", @@ -2998,24 +2950,15 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", -] - [[package]] name = "mio" -version = "1.0.4" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" +checksum = "69d83b0086dc8ecf3ce9ae2874b2d1290252e2a30720bea58a5c6639b0092873" dependencies = [ "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.59.0", + "wasi", + "windows-sys 0.61.2", ] [[package]] @@ -3116,9 +3059,9 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a973b4e44ce6cad84ce69d797acf9a044532e4184c4f267913d1b546a0727b7a" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", "rustversion", @@ -3126,13 +3069,13 @@ dependencies = [ [[package]] name = "num_enum_derive" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77e878c846a8abae00dd069496dbe8751b16ac1c3d6bd2a7283a938e8228f90d" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3158,15 +3101,6 @@ dependencies = [ "malloc_buf", ] -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - [[package]] name = "once_cell" version = "1.21.3" @@ -3175,11 +3109,11 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "openssl" -version = "0.10.73" +version = "0.10.74" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" +checksum = "24ad14dd45412269e1a30f52ad8f0664f0f4f4a89ee8fe28c3b3527021ebb654" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "cfg-if", "foreign-types 0.3.2", "libc", @@ -3196,7 +3130,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3207,9 +3141,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.109" +version = "0.9.110" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" +checksum = "0a9f0075ba3c21b09f8e8b2026584b1d18d49388648f2fbbf3c97ea8deced8e2" dependencies = [ "cc", "libc", @@ -3248,14 +3182,14 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -3263,15 +3197,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -3297,12 +3231,11 @@ checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.2" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21e0a3a33733faeaf8651dfee72dd0f388f0c8e5ad496a3478fa5a922f49cfa8" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", - "thiserror", "ucd-trie", ] @@ -3333,7 +3266,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3428,7 +3361,7 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" dependencies = [ - "toml_edit 0.23.6", + "toml_edit 0.23.7", ] [[package]] @@ -3450,14 +3383,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "proc-macro2" -version = "1.0.101" +version = "1.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" +checksum = "8e0f6df8eaa422d97d72edcd152e1451618fed47fabbdbd5a8864167b1d4aff7" dependencies = [ "unicode-ident", ] @@ -3470,7 +3403,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "version_check", "yansi", ] @@ -3483,7 +3416,7 @@ checksum = "2bb0be07becd10686a0bb407298fb425360a5c44a663774406340c59a22de4ce" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.9.4", + "bitflags 2.10.0", "lazy_static", "num-traits", "rand 0.9.2", @@ -3515,7 +3448,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -3551,7 +3484,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", - "getrandom 0.3.3", + "getrandom 0.3.4", "lru-slab", "rand 0.9.2", "ring", @@ -3658,7 +3591,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ - "getrandom 0.3.3", + "getrandom 0.3.4", "serde", ] @@ -3673,11 +3606,11 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", ] [[package]] @@ -3708,14 +3641,14 @@ checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "regex" -version = "1.11.3" +version = "1.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" +checksum = "843bc0191f75f3e22651ae5f1e72939ab2f72a4bc30fa80a066bd66edefc24d4" dependencies = [ "aho-corasick", "memchr", @@ -3725,9 +3658,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" +checksum = "5276caf25ac86c8d810222b3dbb938e512c55c6831a10f3e6ed1c93b84041f1c" dependencies = [ "aho-corasick", "memchr", @@ -3736,15 +3669,15 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.6" +version = "0.8.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" +checksum = "7a2d987857b319362043e95f5353c0535c1f58eec5336fdfcf626430af7def58" [[package]] name = "reqwest" -version = "0.12.23" +version = "0.12.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" +checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64", "bytes", @@ -3785,7 +3718,7 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] @@ -4019,7 +3952,7 @@ dependencies = [ "bytemuck", "cfg-if", "getrandom 0.2.16", - "getrandom 0.3.3", + "getrandom 0.3.4", "libm", "num_enum", "paste", @@ -4107,7 +4040,7 @@ version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "fallible-iterator", "fallible-streaming-iterator", "hashlink", @@ -4115,12 +4048,6 @@ dependencies = [ "smallvec", ] -[[package]] -name = "rustc-demangle" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -4157,18 +4084,18 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] name = "rustls" -version = "0.23.32" +version = "0.23.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" +checksum = "6a9586e9ee2b4f8fab52a0048ca7334d7024eef48e2cb9407e3497bb7cab7fa7" dependencies = [ "once_cell", "ring", @@ -4190,9 +4117,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.6" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8572f3c2cb9934231157b45499fc41e1f58c589fdfb81a844ba873265e80f8eb" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "ring", "rustls-pki-types", @@ -4207,9 +4134,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "rusty-fork" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +checksum = "cc6bf79ff24e648f6da1f8d1f011e9cac26491b619e6b9280f2b47f1774e6ee2" dependencies = [ "fnv", "quick-error", @@ -4248,7 +4175,7 @@ version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -4323,7 +4250,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation", "core-foundation-sys", "libc", @@ -4401,7 +4328,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4451,19 +4378,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.1" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c522100790450cf78eeac1507263d0a350d4d5b30df0c8e1fe051a10c22b376e" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" dependencies = [ "base64", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.11.4", + "indexmap 2.12.0", "schemars 0.9.0", "schemars 1.0.4", - "serde", - "serde_derive", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -4471,14 +4397,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.1" +version = "3.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327ada00f7d64abaac1e55a6911e90cf665aa051b9a561c7006c157f4633135e" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4487,7 +4413,7 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7b4db627b98b36d4203a7b458cf3573730f2bb591b28871d916dfa9efabfd41f" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "itoa", "ryu", "serde", @@ -4588,12 +4514,12 @@ dependencies = [ [[package]] name = "socket2" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233504af464074f9d066d7b5416c5f9b894a5862a6506e306f7b816cdd6f1807" +checksum = "17129e116933cf371d018bb80ae557e889637989d8638274fb25622827b03881" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] @@ -4619,14 +4545,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" dependencies = [ "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "static_assertions" @@ -4658,7 +4584,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4680,9 +4606,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.106" +version = "2.0.108" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" +checksum = "da58917d35242480a05c2897064da0a80589a2a0476c9a3f2fdc83b53502e917" dependencies = [ "proc-macro2", "quote", @@ -4691,14 +4617,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "1.4.0" +version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2375c17f6067adc651d8c2c51658019cef32edfff4a982adaf1d7fd1c039f08b" +checksum = "ff790eb176cc81bb8936aed0f7b9f14fc4670069a2d371b3e3b0ecce908b2cb3" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4718,7 +4644,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4727,7 +4653,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "core-foundation", "system-configuration-sys", ] @@ -4755,10 +4681,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", - "getrandom 0.3.3", + "getrandom 0.3.4", "once_cell", "rustix", - "windows-sys 0.61.1", + "windows-sys 0.61.2", ] [[package]] @@ -4778,7 +4704,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4857,33 +4783,30 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.47.1" +version = "1.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89e49afdadebb872d3145a5638b59eb0691ea23e46ca484037cfab3b76b95038" +checksum = "ff360e02eab121e0bc37a2d3b4d4dc622e6eda3a8e5253d5435ecf5bd4c68408" dependencies = [ - "backtrace", "bytes", - "io-uring", "libc", "mio", "parking_lot", "pin-project-lite", "signal-hook-registry", - "slab", "socket2", "tokio-macros", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "tokio-macros" -version = "2.5.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" +checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -4970,9 +4893,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.2" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f1085dec27c2b6632b04c80b3bb1b4300d6495d1e129693bdda7d91e72eec1" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ "serde_core", ] @@ -4983,7 +4906,7 @@ version = "0.22.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" dependencies = [ - "indexmap 2.11.4", + "indexmap 2.12.0", "serde", "serde_spanned", "toml_datetime 0.6.11", @@ -4993,21 +4916,21 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.23.6" +version = "0.23.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3effe7c0e86fdff4f69cdd2ccc1b96f933e24811c5441d44904e8683e27184b" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" dependencies = [ - "indexmap 2.11.4", - "toml_datetime 0.7.2", + "indexmap 2.12.0", + "toml_datetime 0.7.3", "toml_parser", "winnow", ] [[package]] name = "toml_parser" -version = "1.0.3" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf893c33be71572e0e9aa6dd15e6677937abd686b066eac3f8cd3531688a627" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] @@ -5040,7 +4963,7 @@ version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ - "bitflags 2.9.4", + "bitflags 2.10.0", "bytes", "futures-util", "http", @@ -5084,7 +5007,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5133,9 +5056,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" @@ -5163,9 +5086,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unicode-ident" -version = "1.0.19" +version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" +checksum = "462eeb75aeb73aea900253ce739c8e18a67423fadf006037cd3ff27e82748a06" [[package]] name = "unicode-xid" @@ -5230,7 +5153,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] name = "void-app" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-base.git#775df8e06e6d6cbbfb0e73009c0969136eb5dc27" +source = "git+ssh://git@github.com/essential-contributions/void-base.git#12bc2e795961c39ba6c4ef41a003b6af8d8b6b6a" dependencies = [ "futures", "pin-project-lite", @@ -5243,7 +5166,7 @@ dependencies = [ [[package]] name = "void-hash" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-base.git#775df8e06e6d6cbbfb0e73009c0969136eb5dc27" +source = "git+ssh://git@github.com/essential-contributions/void-base.git#12bc2e795961c39ba6c4ef41a003b6af8d8b6b6a" dependencies = [ "sha2", "void-types", @@ -5281,7 +5204,7 @@ dependencies = [ [[package]] name = "void-oracle" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#0891abf239fa417a8ae293356d6e692d0eb93e6f" +source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#51d98d313403ee6b5a80fe3b976b553e099f53fe" dependencies = [ "alloy", "axum", @@ -5310,10 +5233,11 @@ dependencies = [ [[package]] name = "void-oracle-db" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#0891abf239fa417a8ae293356d6e692d0eb93e6f" +source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#51d98d313403ee6b5a80fe3b976b553e099f53fe" dependencies = [ "rusqlite", "sha2", + "tracing", "void-oracle-db-sql", "void-oracle-types", ] @@ -5321,7 +5245,7 @@ dependencies = [ [[package]] name = "void-oracle-db-sql" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#0891abf239fa417a8ae293356d6e692d0eb93e6f" +source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#51d98d313403ee6b5a80fe3b976b553e099f53fe" [[package]] name = "void-oracle-decoder" @@ -5337,7 +5261,7 @@ dependencies = [ [[package]] name = "void-oracle-types" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#0891abf239fa417a8ae293356d6e692d0eb93e6f" +source = "git+ssh://git@github.com/essential-contributions/void-oracle.git#51d98d313403ee6b5a80fe3b976b553e099f53fe" dependencies = [ "serde", "serde_json", @@ -5377,6 +5301,7 @@ dependencies = [ "tokio", "tracing", "void-app", + "void-hash", "void-merkle", "void-network-channel", "void-oracle", @@ -5392,6 +5317,7 @@ name = "void-toolkit-examples" version = "0.1.0" dependencies = [ "alloy", + "anyhow", "futures", "tokio", "tracing", @@ -5402,7 +5328,7 @@ dependencies = [ [[package]] name = "void-types" version = "0.1.0" -source = "git+ssh://git@github.com/essential-contributions/void-base.git#775df8e06e6d6cbbfb0e73009c0969136eb5dc27" +source = "git+ssh://git@github.com/essential-contributions/void-base.git#12bc2e795961c39ba6c4ef41a003b6af8d8b6b6a" dependencies = [ "serde", ] @@ -5431,15 +5357,6 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" -[[package]] -name = "wasi" -version = "0.14.7+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" -dependencies = [ - "wasip2", -] - [[package]] name = "wasip2" version = "1.0.1+wasi-0.2.4" @@ -5472,7 +5389,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "wasm-bindgen-shared", ] @@ -5507,7 +5424,7 @@ checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5574,51 +5491,51 @@ version = "0.26.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521bc38abb08001b01866da9f51eb7c5d647a19260e00054a8c7fd5f9e57f7a9" dependencies = [ - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] [[package]] name = "windows-core" -version = "0.62.1" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6844ee5416b285084d3d3fffd743b925a6c9385455f64f6d4fa3031c4c2749a9" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link 0.2.0", - "windows-result 0.4.0", - "windows-strings 0.5.0", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] name = "windows-implement" -version = "0.60.1" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edb307e42a74fb6de9bf3a02d9712678b22399c87e6fa869d6dfcd8c1b7754e0" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] name = "windows-interface" -version = "0.59.2" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0abd1ddbc6964ac14db11c7213d6532ef34bd9aa042c2e5935f59d7908b46a5" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5629,9 +5546,9 @@ checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-link" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e46c0661abb7180e7b9c281db115305d49ca1709ab8242adf09666d2173c65" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] name = "windows-registry" @@ -5655,11 +5572,11 @@ dependencies = [ [[package]] name = "windows-result" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7084dcc306f89883455a206237404d3eaf961e5bd7e0f312f7c91f57eb44167f" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -5673,11 +5590,11 @@ dependencies = [ [[package]] name = "windows-strings" -version = "0.5.0" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7218c655a553b0bed4426cf54b20d7ba363ef543b52d515b3e48d7fd55318dda" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -5689,31 +5606,22 @@ dependencies = [ "windows-targets 0.52.6", ] -[[package]] -name = "windows-sys" -version = "0.59.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" -dependencies = [ - "windows-targets 0.52.6", -] - [[package]] name = "windows-sys" version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.4", + "windows-targets 0.53.5", ] [[package]] name = "windows-sys" -version = "0.61.1" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.0", + "windows-link 0.2.1", ] [[package]] @@ -5734,19 +5642,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.4" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d42b7b7f66d2a06854650af09cfdf8713e427a439c97ad65a6375318033ac4b" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link 0.2.0", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -5757,9 +5665,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -5769,9 +5677,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -5781,9 +5689,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -5793,9 +5701,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -5805,9 +5713,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -5817,9 +5725,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -5829,9 +5737,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -5841,9 +5749,9 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" @@ -5931,7 +5839,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure", ] @@ -5952,7 +5860,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -5972,7 +5880,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", "synstructure", ] @@ -5993,7 +5901,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] [[package]] @@ -6026,5 +5934,5 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.106", + "syn 2.0.108", ] diff --git a/Cargo.toml b/Cargo.toml index d6ee919..f7e21e6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ repository = "https://github.com/essential-contributions/void-toolkit" [workspace.dependencies] alloy = { version = "1.0.30", default-features = false, features = ["sol-types"] } +anyhow = "1.0.100" axum = "0.8.4" base64 = "0.22" futures = "0.3.31" @@ -32,6 +33,7 @@ tempfile = "3.23" tracing = { version = "0.1.41" } tracing-subscriber = { version = "0.3.19", features = ["env-filter"] } void-app = { git = "ssh://git@github.com/essential-contributions/void-base.git" } +void-hash = { git = "ssh://git@github.com/essential-contributions/void-base.git" } void-oracle = { git = "ssh://git@github.com/essential-contributions/void-oracle.git" } void-oracle-types = { git = "ssh://git@github.com/essential-contributions/void-oracle.git" } void-types = { git = "ssh://git@github.com/essential-contributions/void-base.git" } diff --git a/README.md b/README.md index 5a7231b..8032ed3 100644 --- a/README.md +++ b/README.md @@ -87,23 +87,25 @@ void-toolkit = { version = "0.1", features = ["run", "oracle", "load-config"] } ### Basic Usage ```rust +use std::convert::Infallible; + +use futures::TryStreamExt; use void_toolkit::{ + app::UpdateLatestBlock, load_config::load_config, - oracle::oracle, - oracle::Db, + oracle::{oracle, Db}, oracle_types::config::Config, run::run_node, types::{Block, Lock}, }; -// Simple unit type that implements the required trait bound of `run_node` function -pub struct StateUnit; - pub struct State(pub u64); -impl From<&mut State> for StateUnit { - fn from(_: &mut State) -> Self { - StateUnit +impl UpdateLatestBlock for State { + type Error = Infallible; + + fn update_latest_block(&mut self, _height: u64, _hash: [u8; 32]) -> Result<(), Self::Error> { + todo!() } } @@ -113,10 +115,10 @@ async fn main() -> Result<(), Box> { let config: Config = load_config("config.yaml")?; // Start oracle to watch for cross-chain events - let blocks = oracle(config, Db::memory(), 0); + let blocks = oracle(config, Db::memory(), 0).map_err(|e| anyhow::anyhow!(e)); // Define your app's state and transition logic - let state_transition = |block: &Block, _state: &mut State| { + let state_transition = |block: &Block, _state: &mut State| -> Result<(), Infallible> { // Process block and update state for _event in &block.events { // Handle cross-chain events @@ -126,11 +128,12 @@ async fn main() -> Result<(), Box> { block.height ); } + Ok(()) }; let state = Lock::new(State(0)); // Run your VOID node - run_node::<_, Lock, _, StateUnit>(blocks, state, state_transition).await; + run_node(blocks, state, state_transition).await?; Ok(()) } @@ -280,7 +283,7 @@ Use the event decoder to handle events from different chains: ```rust use alloy::sol; -use futures::StreamExt; +use futures::TryStreamExt; use void_toolkit::{ load_config::load_config, oracle::oracle, oracle::Db, oracle_decoder::decode_events, oracle_types::config::Config, @@ -308,7 +311,7 @@ async fn main() -> Result<(), Box> { // Process decoded events in your state transition function blocks - .for_each(|block| async move { + .try_for_each(|block| async move { println!("Processing block with {} events", block.events.len()); for event in &block.events { @@ -329,8 +332,9 @@ async fn main() -> Result<(), Box> { println!("Unknown event: {} bytes", event.len()); } } + Ok(()) }) - .await; + .await?; Ok(()) } diff --git a/crates/examples/Cargo.toml b/crates/examples/Cargo.toml index 4d3fbe3..59b649f 100644 --- a/crates/examples/Cargo.toml +++ b/crates/examples/Cargo.toml @@ -21,6 +21,7 @@ path = "proof_generation.rs" [dependencies] alloy.workspace = true +anyhow.workspace = true futures.workspace = true tokio.workspace = true tracing.workspace = true diff --git a/crates/examples/basic_usage.rs b/crates/examples/basic_usage.rs index 6138576..4ce0cb6 100644 --- a/crates/examples/basic_usage.rs +++ b/crates/examples/basic_usage.rs @@ -1,20 +1,22 @@ +use std::convert::Infallible; + +use futures::TryStreamExt; use void_toolkit::{ + app::UpdateLatestBlock, load_config::load_config, - oracle::oracle, - oracle::Db, + oracle::{oracle, Db}, oracle_types::config::Config, run::run_node, types::{Block, Lock}, }; -// Simple unit type that implements the required trait bound of `run_node` function -pub struct StateUnit; - pub struct State(pub u64); -impl From<&mut State> for StateUnit { - fn from(_: &mut State) -> Self { - StateUnit +impl UpdateLatestBlock for State { + type Error = Infallible; + + fn update_latest_block(&mut self, _height: u64, _hash: [u8; 32]) -> Result<(), Self::Error> { + todo!() } } @@ -24,10 +26,10 @@ async fn main() -> Result<(), Box> { let config: Config = load_config("config.yaml")?; // Start oracle to watch for cross-chain events - let blocks = oracle(config, Db::memory(), 0); + let blocks = oracle(config, Db::memory(), 0).map_err(|e| anyhow::anyhow!(e)); // Define your app's state and transition logic - let state_transition = |block: &Block, _state: &mut State| { + let state_transition = |block: &Block, _state: &mut State| -> Result<(), Infallible> { // Process block and update state for _event in &block.events { // Handle cross-chain events @@ -37,11 +39,12 @@ async fn main() -> Result<(), Box> { block.height ); } + Ok(()) }; let state = Lock::new(State(0)); // Run your VOID node - run_node::<_, Lock, _, StateUnit>(blocks, state, state_transition).await; + run_node(blocks, state, state_transition).await?; Ok(()) } diff --git a/crates/examples/event_processing.rs b/crates/examples/event_processing.rs index 0f4f863..48fac4c 100644 --- a/crates/examples/event_processing.rs +++ b/crates/examples/event_processing.rs @@ -1,5 +1,5 @@ use alloy::sol; -use futures::StreamExt; +use futures::TryStreamExt; use void_toolkit::{ load_config::load_config, oracle::oracle, oracle::Db, oracle_decoder::decode_events, oracle_types::config::Config, @@ -27,7 +27,7 @@ async fn main() -> Result<(), Box> { // Process decoded events in your state transition function blocks - .for_each(|block| async move { + .try_for_each(|block| async move { println!("Processing block with {} events", block.events.len()); for event in &block.events { @@ -48,8 +48,9 @@ async fn main() -> Result<(), Box> { println!("Unknown event: {} bytes", event.len()); } } + Ok(()) }) - .await; + .await?; Ok(()) } diff --git a/crates/merkle/src/fixed_sparse_merkle.rs b/crates/merkle/src/fixed_sparse_merkle.rs index 6268e2a..bb5cb10 100644 --- a/crates/merkle/src/fixed_sparse_merkle.rs +++ b/crates/merkle/src/fixed_sparse_merkle.rs @@ -7,17 +7,17 @@ //! # Example //! //! ```rust -//! use void_merkle::fixed_sparse_merkle::{SparseMerkleTree, Sha256, proof_root}; +//! use void_merkle::fixed_sparse_merkle::{SparseMerkleTree, Sha256, proof_root, get_hashes_height}; //! -//! let mut tree = SparseMerkleTree::::new(64); +//! let mut tree = SparseMerkleTree::<{ get_hashes_height(64) }, Sha256>::new_in_memory(); //! let address = [0x42u8; 20]; //! tree.insert(1000, address); //! -//! let proof = tree.generate_proof(1000); -//! let root = tree.root(); +//! let proof = tree.generate_proof(1000).unwrap(); +//! let root = tree.root().unwrap(); //! assert_eq!(proof_root::(1000, address, &proof, 64), root); //! ``` -use std::{collections::HashMap, marker::PhantomData}; +use std::{collections::HashMap, convert::Infallible, marker::PhantomData}; /// Trait for hash function implementations used in fixed-size Merkle trees. pub trait Hasher: Default { @@ -25,10 +25,59 @@ pub trait Hasher: Default { fn hash(self, data: &[&[u8]]) -> [u8; 32]; } +/// Trait for storage backends used by the sparse Merkle tree. +pub trait Storage { + /// Error type for storage operations. + type Error; + + /// Retrieves a leaf value at the specified index, if it exists. + fn get_leaf(&self, index: u64) -> Result, Self::Error>; + /// Retrieves a node hash at the specified level and index, if it exists. + fn get_node(&self, level: usize, index: u64) -> Result, Self::Error>; +} + +/// Trait for storage backends used by the sparse Merkle tree. +pub trait StorageMut: Storage { + /// Inserts a leaf value at the specified index. + fn insert_leaf(&mut self, index: u64, value: [u8; 20]) -> Result<(), Self::Error>; + /// Inserts a node hash at the specified level and index. + fn insert_node(&mut self, level: usize, index: u64, hash: [u8; 32]) -> Result<(), Self::Error>; +} + #[derive(Default, Debug, Clone)] /// Wrapper around [`sha2::Sha256`] that implements the [`Hasher`] trait. pub struct Sha256(pub sha2::Sha256); +/// In-memory storage backend for the sparse Merkle tree. +#[derive(Debug, Clone, Default)] +pub struct InMemoryStorage { + leaves: HashMap, + nodes: HashMap<(usize, u64), [u8; 32]>, +} + +impl Storage for InMemoryStorage { + type Error = Infallible; + fn get_leaf(&self, index: u64) -> Result, Self::Error> { + Ok(self.leaves.get(&index).copied()) + } + + fn get_node(&self, level: usize, index: u64) -> Result, Self::Error> { + Ok(self.nodes.get(&(level, index)).copied()) + } +} + +impl StorageMut for InMemoryStorage { + fn insert_leaf(&mut self, index: u64, value: [u8; 20]) -> Result<(), Self::Error> { + self.leaves.insert(index, value); + Ok(()) + } + + fn insert_node(&mut self, level: usize, index: u64, hash: [u8; 32]) -> Result<(), Self::Error> { + self.nodes.insert((level, index), hash); + Ok(()) + } +} + /// A fixed-height sparse Merkle tree with 64-bit indexing. /// /// This implementation provides a memory-efficient sparse Merkle tree that only @@ -39,60 +88,219 @@ pub struct Sha256(pub sha2::Sha256); /// /// * `H` - The hasher implementation to use for computing node hashes #[derive(Debug)] -pub struct SparseMerkleTree { - /// Height of the tree - height: usize, - /// Storage for non-empty nodes: (level, index) -> hash - nodes: HashMap<(usize, u64), [u8; 32]>, - /// Storage for leaf values - leaves: HashMap, +pub struct SparseMerkleTree { + /// Underlying storage for nodes and leaves + storage: S, + /// Default hashes for each level (empty subtree roots) + default_hashes: [[u8; 32]; HASHES_HEIGHT], + /// The hasher to use + _hasher: PhantomData, +} + +#[derive(Debug)] +/// A reference to a sparse Merkle tree that operates on a mutable storage reference. +pub struct SparseMerkleTreeMut< + 'a, + const HASHES_HEIGHT: usize, + H: Hasher, + S: Storage = InMemoryStorage, +> { + /// Underlying storage for nodes and leaves + storage: &'a mut S, + /// Default hashes for each level (empty subtree roots) + default_hashes: &'a [[u8; 32]; HASHES_HEIGHT], + /// The hasher to use + _hasher: PhantomData, +} + +#[derive(Debug)] +/// A reference to a sparse Merkle tree that operates on a storage reference. +pub struct SparseMerkleTreeRef< + 'a, + const HASHES_HEIGHT: usize, + H: Hasher, + S: Storage = InMemoryStorage, +> { + /// Underlying storage for nodes and leaves + storage: &'a S, /// Default hashes for each level (empty subtree roots) - default_hashes: Vec<[u8; 32]>, + default_hashes: &'a [[u8; 32]; HASHES_HEIGHT], /// The hasher to use _hasher: PhantomData, } -impl SparseMerkleTree { +impl SparseMerkleTree { + /// Create a new Sparse Merkle Tree with in-memory storage. + pub fn new_in_memory() -> Self { + Self::new_with_storage(InMemoryStorage::default()) + } +} + +/// Generates default hashes for each level of the tree. +/// +pub fn compute_default_hashes(default_hashes: &mut [[u8; 32]]) { + if default_hashes.is_empty() { + return; + } + // Level 0 (leaves) - default is hash of empty value + let empty_leaf = [0u8; 20]; + default_hashes[0] = hash_leaf::(&empty_leaf); + + let mut prev_hash = default_hashes[0]; + // Build default hashes for each level + for dh in default_hashes.iter_mut().skip(1) { + let combined = hash_pair::(&prev_hash, &prev_hash); + *dh = combined; + prev_hash = combined; + } +} + +impl SparseMerkleTree +where + H: Hasher, + S: Storage, +{ /// Create a new Sparse Merkle Tree. - pub fn new(height: usize) -> Self { - let mut default_hashes = Vec::with_capacity(height + 1); - - // Level 0 (leaves) - default is hash of empty value - let empty_leaf = [0u8; 20]; - default_hashes.push(hash_leaf::(&empty_leaf)); - - // Build default hashes for each level - for _ in 1..=height { - let prev_hash = default_hashes - .last() - .expect("Default hashes tree is not empty"); - let combined = hash_pair::(prev_hash, prev_hash); - default_hashes.push(combined); + pub fn new_with_storage(storage: S) -> Self { + let mut default_hashes = [[0u8; 32]; HASHES_HEIGHT]; + compute_default_hashes::(&mut default_hashes); + SparseMerkleTree { + storage, + default_hashes, + _hasher: PhantomData, } + } - SparseMerkleTree { - height, - nodes: HashMap::new(), - leaves: HashMap::new(), + /// Get a mutable reference to the tree with mutable storage. + pub fn as_mut(&mut self) -> SparseMerkleTreeMut<'_, HASHES_HEIGHT, H, S> { + self.into() + } + + /// Get a reference to the tree with reference storage. + pub fn as_ref(&self) -> SparseMerkleTreeRef<'_, HASHES_HEIGHT, H, S> { + self.into() + } +} + +impl<'a, const HASHES_HEIGHT: usize, H, S> From<&'a mut SparseMerkleTree> + for SparseMerkleTreeMut<'a, HASHES_HEIGHT, H, S> +where + H: Hasher, + S: Storage, +{ + fn from(tree: &'a mut SparseMerkleTree) -> Self { + Self { + storage: &mut tree.storage, + default_hashes: &tree.default_hashes, + _hasher: PhantomData, + } + } +} + +impl<'a, const HASHES_HEIGHT: usize, H, S> From<&'a SparseMerkleTree> + for SparseMerkleTreeRef<'a, HASHES_HEIGHT, H, S> +where + H: Hasher, + S: Storage, +{ + fn from(tree: &'a SparseMerkleTree) -> Self { + SparseMerkleTreeRef { + storage: &tree.storage, + default_hashes: &tree.default_hashes, + _hasher: PhantomData, + } + } +} + +impl<'a, const HASHES_HEIGHT: usize, H, S> From<&'a SparseMerkleTreeMut<'a, HASHES_HEIGHT, H, S>> + for SparseMerkleTreeRef<'a, HASHES_HEIGHT, H, S> +where + H: Hasher, + S: Storage, +{ + fn from(tree: &'a SparseMerkleTreeMut<'a, HASHES_HEIGHT, H, S>) -> Self { + SparseMerkleTreeRef { + storage: tree.storage, + default_hashes: tree.default_hashes, + _hasher: PhantomData, + } + } +} + +/// Computes the number of hashes in the proof for a tree of given height. +pub const fn get_hashes_height(height: usize) -> usize { + height + 1 +} + +impl SparseMerkleTree +where + H: Hasher, + S: StorageMut, +{ + /// Returns the height of the tree (number of levels). + pub const fn tree_height() -> usize { + HASHES_HEIGHT - 1 + } + + /// Insert or update a value at the given index. + pub fn insert(&mut self, index: u64, value: [u8; 20]) -> Result<(), S::Error> { + self.as_mut().insert(index, value) + } + + /// Get the root hash of the tree. + pub fn root(&self) -> Result<[u8; 32], S::Error> { + self.as_ref().root() + } + + /// Generate a merkle proof for a given index. + pub fn generate_proof(&self, index: u64) -> Result, S::Error> { + self.as_ref().generate_proof(index) + } + + /// Get a value at the given index (returns empty array if not set). + pub fn get(&self, index: u64) -> Result<[u8; 20], S::Error> { + self.as_ref().get(index) + } +} + +impl<'a, const HASHES_HEIGHT: usize, H, S> SparseMerkleTreeMut<'a, HASHES_HEIGHT, H, S> +where + H: Hasher, + S: StorageMut, +{ + /// Create a new Sparse Merkle Tree with mutable storage reference. + pub fn new(storage: &'a mut S, default_hashes: &'a [[u8; 32]; HASHES_HEIGHT]) -> Self { + SparseMerkleTreeMut { + storage, default_hashes, _hasher: PhantomData, } } + /// Returns the height of the tree (number of levels). + pub const fn tree_height() -> usize { + HASHES_HEIGHT - 1 + } + + /// Get a reference to the tree with reference storage. + pub fn as_ref(&self) -> SparseMerkleTreeRef<'_, HASHES_HEIGHT, H, S> { + self.into() + } + /// Insert or update a value at the given index. - pub fn insert(&mut self, index: u64, value: [u8; 20]) { + pub fn insert(&mut self, index: u64, value: [u8; 20]) -> Result<(), S::Error> { // Store the leaf value - self.leaves.insert(index, value); + self.storage.insert_leaf(index, value)?; // Update the path from leaf to root let leaf_hash = hash_leaf::(&value); - self.nodes.insert((0, index), leaf_hash); + self.storage.insert_node(0, index, leaf_hash)?; // Propagate changes up the tree let mut current_index = index; let mut current_hash = leaf_hash; - for level in 0..self.height { + for level in 0..Self::tree_height() { let parent_index = current_index >> 1; let is_left = (current_index & 1) == 0; @@ -104,9 +312,8 @@ impl SparseMerkleTree { // Get sibling hash (either from storage or default) let sibling_hash = self - .nodes - .get(&(level, sibling_index)) - .copied() + .storage + .get_node(level, sibling_index)? .unwrap_or(self.default_hashes[level]); // Compute parent hash @@ -117,28 +324,65 @@ impl SparseMerkleTree { }; // Store parent hash - self.nodes.insert((level + 1, parent_index), parent_hash); + self.storage + .insert_node(level + 1, parent_index, parent_hash)?; // Move up current_index = parent_index; current_hash = parent_hash; } + Ok(()) + } + + /// Get the root hash of the tree. + pub fn root(&self) -> Result<[u8; 32], S::Error> { + self.as_ref().root() + } + + /// Generate a merkle proof for a given index. + pub fn generate_proof(&self, index: u64) -> Result, S::Error> { + self.as_ref().generate_proof(index) + } + + /// Get a value at the given index (returns empty array if not set). + pub fn get(&self, index: u64) -> Result<[u8; 20], S::Error> { + self.as_ref().get(index) + } +} + +impl<'a, const HASHES_HEIGHT: usize, H, S> SparseMerkleTreeRef<'a, HASHES_HEIGHT, H, S> +where + H: Hasher, + S: Storage, +{ + /// Returns the height of the tree (number of levels). + pub const fn tree_height() -> usize { + HASHES_HEIGHT - 1 + } + + /// Create a new Sparse Merkle Tree with mutable storage reference. + pub fn new(storage: &'a S, default_hashes: &'a [[u8; 32]; HASHES_HEIGHT]) -> Self { + SparseMerkleTreeRef { + storage, + default_hashes, + _hasher: PhantomData, + } } /// Get the root hash of the tree. - pub fn root(&self) -> [u8; 32] { - self.nodes - .get(&(self.height, 0)) - .copied() - .unwrap_or(self.default_hashes[self.height]) + pub fn root(&self) -> Result<[u8; 32], S::Error> { + Ok(self + .storage + .get_node(Self::tree_height(), 0)? + .unwrap_or(self.default_hashes[Self::tree_height()])) } /// Generate a merkle proof for a given index. - pub fn generate_proof(&self, index: u64) -> Vec<[u8; 32]> { - let mut proof = Vec::with_capacity(self.height); + pub fn generate_proof(&self, index: u64) -> Result, S::Error> { + let mut proof = Vec::with_capacity(Self::tree_height()); let mut current_index = index; - for level in 0..self.height { + for level in 0..Self::tree_height() { let is_left = (current_index & 1) == 0; let sibling_index = if is_left { current_index + 1 @@ -148,21 +392,20 @@ impl SparseMerkleTree { // Get sibling hash let sibling_hash = self - .nodes - .get(&(level, sibling_index)) - .copied() + .storage + .get_node(level, sibling_index)? .unwrap_or(self.default_hashes[level]); proof.push(sibling_hash); current_index >>= 1; } - proof + Ok(proof) } /// Get a value at the given index (returns empty array if not set). - pub fn get(&self, index: u64) -> [u8; 20] { - self.leaves.get(&index).copied().unwrap_or([0u8; 20]) + pub fn get(&self, index: u64) -> Result<[u8; 20], S::Error> { + Ok(self.storage.get_leaf(index)?.unwrap_or([0u8; 20])) } } @@ -305,13 +548,13 @@ impl Hasher for Sha256 { } } -impl Clone for SparseMerkleTree { +impl Clone + for SparseMerkleTree +{ fn clone(&self) -> Self { Self { - height: self.height, - nodes: self.nodes.clone(), - leaves: self.leaves.clone(), - default_hashes: self.default_hashes.clone(), + storage: self.storage.clone(), + default_hashes: self.default_hashes, _hasher: PhantomData, } } @@ -323,78 +566,78 @@ mod tests { #[test] fn test_empty_tree() { - let tree = SparseMerkleTree::::new(64); - let root = tree.root(); + let tree = SparseMerkleTree::<{ get_hashes_height(64) }, Sha256>::new_in_memory(); + let root = tree.root().unwrap(); assert_ne!(root, [0u8; 32]); } #[test] fn test_insert_and_proof() { - let mut tree = SparseMerkleTree::::new(64); + let mut tree = SparseMerkleTree::<{ get_hashes_height(64) }, Sha256>::new_in_memory(); let value1 = [1u8; 20]; let value2 = [2u8; 20]; - tree.insert(0, value1); - tree.insert(100, value2); + tree.insert(0, value1).unwrap(); + tree.insert(100, value2).unwrap(); - let root = tree.root(); + let root = tree.root().unwrap(); // Generate and verify proof for index 0 - let proof1 = tree.generate_proof(0); + let proof1 = tree.generate_proof(0).unwrap(); assert_eq!(proof_root::(0, value1, &proof1, 64), root); // Generate and verify proof for index 100 - let proof2 = tree.generate_proof(100); + let proof2 = tree.generate_proof(100).unwrap(); assert_eq!(proof_root::(100, value2, &proof2, 64), root); // Verify proof fails for wrong value let wrong_value = [3u8; 20]; - let proof3 = tree.generate_proof(0); + let proof3 = tree.generate_proof(0).unwrap(); assert_ne!(proof_root::(0, wrong_value, &proof3, 64), root); } #[test] fn test_update() { - let mut tree = SparseMerkleTree::::new(64); + let mut tree = SparseMerkleTree::<{ get_hashes_height(64) }, Sha256>::new_in_memory(); let value1 = [1u8; 20]; let value2 = [2u8; 20]; - tree.insert(42, value1); - let root1 = tree.root(); + tree.insert(42, value1).unwrap(); + let root1 = tree.root().unwrap(); - tree.insert(42, value2); - let root2 = tree.root(); + tree.insert(42, value2).unwrap(); + let root2 = tree.root().unwrap(); assert_ne!(root1, root2); - let proof = tree.generate_proof(42); + let proof = tree.generate_proof(42).unwrap(); assert_eq!(proof_root::(42, value2, &proof, 64), root2); } #[test] fn test_large_indices() { - let mut tree = SparseMerkleTree::::new(64); + let mut tree = SparseMerkleTree::<{ get_hashes_height(64) }, Sha256>::new_in_memory(); let value = [0xAAu8; 20]; let large_index = u64::MAX / 2; - tree.insert(large_index, value); - let root = tree.root(); + tree.insert(large_index, value).unwrap(); + let root = tree.root().unwrap(); - let proof = tree.generate_proof(large_index); + let proof = tree.generate_proof(large_index).unwrap(); assert_eq!(proof_root::(large_index, value, &proof, 64), root); } #[test] fn test_empty_proof() { - let tree = SparseMerkleTree::::new(64); - let root = tree.root(); + let tree = SparseMerkleTree::<{ get_hashes_height(64) }, Sha256>::new_in_memory(); + let root = tree.root().unwrap(); // Proof for empty value at index 999 let empty_value = [0u8; 20]; - let proof = tree.generate_proof(999); + let proof = tree.generate_proof(999).unwrap(); assert_eq!(proof_root::(999, empty_value, &proof, 64), root); } } diff --git a/crates/toolkit/Cargo.toml b/crates/toolkit/Cargo.toml index 7a1d4e8..f26170b 100644 --- a/crates/toolkit/Cargo.toml +++ b/crates/toolkit/Cargo.toml @@ -17,6 +17,7 @@ thiserror = { workspace = true, optional = true } # load config tokio = { workspace = true, optional = true } # oracle tracing = { workspace = true, optional = true } # tracing void-app = { workspace = true, optional = true } +void-hash = { workspace = true, optional = true } void-merkle = { workspace = true, optional = true } void-network-channel = { workspace = true, optional = true } void-oracle = { workspace = true, optional = true } @@ -33,6 +34,7 @@ tempfile.workspace = true default = ["run"] app = ["dep:void-app"] +hash = ["dep:void-hash"] load-config = [ "dep:serde", "dep:serde_json", @@ -66,5 +68,5 @@ oracle = [ ] proof-guest = ["dep:void-proof", "void-proof?/guest"] proof-host = ["dep:void-proof", "void-proof?/host"] -run = ["dep:futures", "dep:tracing", "dep:void-app"] +run = ["dep:futures", "dep:tracing", "app", "dep:void-hash"] sign = ["dep:void-sign"] diff --git a/crates/toolkit/src/lib.rs b/crates/toolkit/src/lib.rs index 37274bb..a27686b 100644 --- a/crates/toolkit/src/lib.rs +++ b/crates/toolkit/src/lib.rs @@ -18,6 +18,10 @@ #[cfg(feature = "app")] pub use void_app as app; +#[doc(inline)] +#[cfg(feature = "hash")] +pub use void_hash as hash; + #[doc(inline)] #[cfg(feature = "oracle-decoder")] pub use void_oracle_decoder as oracle_decoder; diff --git a/crates/toolkit/src/oracle.rs b/crates/toolkit/src/oracle.rs index 9e359eb..29971ac 100644 --- a/crates/toolkit/src/oracle.rs +++ b/crates/toolkit/src/oracle.rs @@ -1,5 +1,5 @@ use alloy::signers::local::PrivateKeySigner; -use futures::{Stream, StreamExt}; +use futures::{Stream, TryStreamExt}; use std::net::SocketAddr; use tracing::{Instrument, debug, info, instrument}; use void_types::Block; @@ -26,17 +26,17 @@ pub use void_oracle::db::Db; /// ```rust,no_run /// use void_toolkit::oracle::oracle; /// use void_oracle::types::config::Config; -/// use futures::StreamExt; +/// use futures::TryStreamExt; /// /// tokio::spawn(async { /// let config: Config = void_toolkit::load_config::load_config("config.yaml").unwrap(); /// let db = void_toolkit::oracle::Db::memory(); /// let blocks = oracle(config, db, 0); /// -/// blocks.for_each(|block| { +/// blocks.try_for_each(|block| { /// println!("Received block with {} events", block.events.len()); -/// async {} -/// }).await; +/// async { Ok(()) } +/// }).await.unwrap(); /// }); /// ``` #[instrument(skip(config, db), fields(from))] @@ -44,9 +44,9 @@ pub fn oracle( config: void_oracle::types::config::Config, db: Db, from: u64, -) -> impl Stream { +) -> impl Stream> { info!("starting oracle"); - void_oracle::watch_blocks(config, from, db).map(|block| Block { + void_oracle::watch_blocks(config, from, db).map_ok(|block| Block { height: Default::default(), parent_hash: Default::default(), events: block.events.into_iter().map(|e| e.to_bytes()).collect(), @@ -76,7 +76,7 @@ pub fn oracle( /// use void_toolkit::oracle::publisher_oracle; /// use void_oracle::types::config::Config; /// use std::net::SocketAddr; -/// use futures::StreamExt; +/// use futures::TryStreamExt; /// /// tokio::spawn(async { /// let config: Config = void_toolkit::load_config::load_config("config.yaml").unwrap(); @@ -85,10 +85,10 @@ pub fn oracle( /// let blocks = publisher_oracle(config, db, 0, addr, 100, None); /// /// // Blocks are now available at http://127.0.0.1:8080/blocks -/// blocks.for_each(|block| { +/// blocks.try_for_each(|block| { /// println!("Published block with {} events", block.events.len()); -/// async {} -/// }).await; +/// async { Ok(()) } +/// }).await.unwrap(); /// }); /// ``` #[instrument(skip(config, signing_key, db), fields(from, ?bind_address, conn_limit, has_signing_key = signing_key.is_some()))] @@ -99,7 +99,7 @@ pub fn publisher_oracle( bind_address: SocketAddr, conn_limit: usize, signing_key: Option, -) -> impl Stream { +) -> impl Stream> { info!("starting publisher oracle"); let state = void_oracle::blocks_sse::State::new(db.clone()); let state = match signing_key { @@ -117,7 +117,7 @@ pub fn publisher_oracle( .in_current_span(), ); void_oracle::watch_blocks(config, from, db) - .map(|block| { + .map_ok(|block| { debug!(event_count = block.events.len(), "publishing block"); Block { height: Default::default(), @@ -125,7 +125,7 @@ pub fn publisher_oracle( events: block.events.into_iter().map(|e| e.to_bytes()).collect(), } }) - .map(move |block| { + .map_ok(move |block| { new_blocks.send(()).ok(); block }) @@ -150,7 +150,7 @@ pub fn publisher_oracle( /// ```rust,no_run /// use void_toolkit::oracle::observer_oracle; /// use void_oracle::types::config::OracleBlocksConfig; -/// use futures::StreamExt; +/// use futures::TryStreamExt; /// /// tokio::spawn(async { /// let config = OracleBlocksConfig { @@ -161,19 +161,19 @@ pub fn publisher_oracle( /// let db = void_toolkit::oracle::Db::memory(); /// let blocks = observer_oracle(config, db); /// -/// blocks.for_each(|block| { +/// blocks.try_for_each(|block| { /// println!("Received block with {} events from remote producer", block.events.len()); -/// async {} -/// }).await; +/// async { Ok(()) } +/// }).await.unwrap(); /// }); /// ``` #[instrument(skip(config, db), fields(endpoint = %config.endpoint, height = config.height))] pub fn observer_oracle( config: void_oracle::types::config::OracleBlocksConfig, db: Db, -) -> impl Stream { +) -> impl Stream> { info!("starting observer oracle"); - void_oracle::recv_blocks(config, db).map(|block| Block { + void_oracle::recv_blocks(config, db).map_ok(|block| Block { height: Default::default(), parent_hash: Default::default(), events: block.events.into_iter().map(|e| e.to_bytes()).collect(), @@ -204,7 +204,7 @@ pub fn observer_oracle( /// use void_toolkit::oracle::relay_oracle; /// use void_oracle::types::config::OracleBlocksConfig; /// use std::net::SocketAddr; -/// use futures::StreamExt; +/// use futures::TryStreamExt; /// /// tokio::spawn(async { /// let config = OracleBlocksConfig { @@ -217,10 +217,10 @@ pub fn observer_oracle( /// let blocks = relay_oracle(config, db, addr, 100); /// /// // Blocks from upstream:8080 are now relayed at 127.0.0.1:8081/blocks -/// blocks.for_each(|block| { +/// blocks.try_for_each(|block| { /// println!("Relayed block with {} events", block.events.len()); -/// async {} -/// }).await; +/// async { Ok(()) } +/// }).await.unwrap(); /// }); /// ``` #[instrument(skip(config, db), fields(endpoint = %config.endpoint, height = config.height, ?bind_address, conn_limit))] @@ -229,7 +229,7 @@ pub fn relay_oracle( db: Db, bind_address: SocketAddr, conn_limit: usize, -) -> impl Stream { +) -> impl Stream> { info!("starting relay oracle"); let state = void_oracle::blocks_sse::State::new(db.clone()); let new_blocks = state.new_blocks.clone(); @@ -240,7 +240,7 @@ pub fn relay_oracle( .in_current_span(), ); void_oracle::recv_signed_blocks(config, db) - .map(|block| { + .map_ok(|block| { debug!(event_count = block.block.events.len(), "relaying block"); Block { height: Default::default(), @@ -253,7 +253,7 @@ pub fn relay_oracle( .collect(), } }) - .map(move |block| { + .map_ok(move |block| { new_blocks.send(()).ok(); block }) diff --git a/crates/toolkit/src/run.rs b/crates/toolkit/src/run.rs index 7829f0e..53702c4 100644 --- a/crates/toolkit/src/run.rs +++ b/crates/toolkit/src/run.rs @@ -1,23 +1,40 @@ -use futures::Stream; -use futures::StreamExt; +use futures::TryStream; +use futures::TryStreamExt; use tracing::{debug, info, instrument}; +use void_app::UpdateLatestBlock; use void_app::VoidStream; +use void_hash::Hash; use void_types::{Block, SyncAccess}; #[instrument(skip_all)] -pub async fn run_node(blocks: B, state: S, state_transition: St) +pub async fn run_node( + blocks: B, + state: S, + state_transition: St, +) -> Result<(), B::Error> where - B: Stream, + B: TryStream, S: SyncAccess, - T: for<'a, 'b> From<&'a mut ::Item<'b>>, - St: Fn(&Block, &mut S::Item<'_>), + St: Fn(&Block, &mut S::Item<'_>) -> Result<(), E>, + B::Error: From + for<'a> From< as UpdateLatestBlock>::Error>, + for<'a> S::Item<'a>: UpdateLatestBlock, { info!("starting node"); blocks - .state_transition_sync::<_, _, T>(state, state_transition) - .for_each(|_| { + .scan_owned( + (state, state_transition), + |(state, state_transition), block| async move { + let res: Result<(), B::Error> = state.access(|state| { + state_transition(&block, state)?; + state.update_latest_block(block.height, block.hash())?; + Ok(()) + }); + ((state, state_transition), res) + }, + ) + .try_for_each(|_| { debug!("state transition completed"); - std::future::ready(()) + std::future::ready(Ok(())) }) - .await; + .await }