From d08cfb51d9082412213cffc81d3157d06652ee1f Mon Sep 17 00:00:00 2001 From: Tom Date: Mon, 13 Oct 2025 10:59:26 +1100 Subject: [PATCH] bump oracle - reexport void-hash const tree with storage traits Updates the fixed size tree to have `Storage` and `StorageMut`. Adds ref and mut types for borrowing the tree. This is useful to avoid recomputing the default hashes in situations where you can't store the actual tree. This comes up when the storage is actually a db transaction which can't live long. The tree needs to be constructed on demand but you don't want the default hashes to be computed on demand. --- Cargo.lock | 704 ++++++++++------------- Cargo.toml | 2 + README.md | 32 +- crates/examples/Cargo.toml | 1 + crates/examples/basic_usage.rs | 25 +- crates/examples/event_processing.rs | 7 +- crates/merkle/src/fixed_sparse_merkle.rs | 405 ++++++++++--- crates/toolkit/Cargo.toml | 4 +- crates/toolkit/src/lib.rs | 4 + crates/toolkit/src/oracle.rs | 54 +- crates/toolkit/src/run.rs | 37 +- 11 files changed, 730 insertions(+), 545 deletions(-) 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 }