diff --git a/.github/workflows/ci-pr.yaml b/.github/workflows/ci-pr.yaml index 7018cb9..84f7154 100644 --- a/.github/workflows/ci-pr.yaml +++ b/.github/workflows/ci-pr.yaml @@ -31,7 +31,9 @@ jobs: uses: zingolabs/infrastructure/.github/actions/cargo-shear@20485fed7a080e381130ed8120419dc81acae641 cargo-checkmate: - uses: zingolabs/infrastructure/.github/workflows/cargo-checkmate.yaml@20485fed7a080e381130ed8120419dc81acae641 + uses: zingolabs/infrastructure/.github/workflows/cargo-checkmate.yaml@46d6b15c994835f386973aabbc76a5503760dafe + with: + doc-all-features: 'true' cargo-deny: name: Cargo Deny diff --git a/Cargo.lock b/Cargo.lock index 47d6054..38e5244 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,12 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - [[package]] name = "aead" version = "0.5.2" @@ -27,7 +21,6 @@ dependencies = [ "cfg-if", "cipher", "cpufeatures", - "zeroize", ] [[package]] @@ -39,73 +32,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "amplify" -version = "4.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f7fb4ac7c881e54a8e7015e399b6112a2a5bc958b6c89ac510840ff20273b31" -dependencies = [ - "amplify_derive", - "amplify_num", - "ascii", - "getrandom 0.2.17", - "getrandom 0.3.4", - "wasm-bindgen", -] - -[[package]] -name = "amplify_derive" -version = "4.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a6309e6b8d89b36b9f959b7a8fa093583b94922a0f6438a24fb08936de4d428" -dependencies = [ - "amplify_syn", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "amplify_num" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99bcb75a2982047f733547042fc3968c0f460dfcf7d90b90dea3b2744580e9ad" -dependencies = [ - "wasm-bindgen", -] - -[[package]] -name = "amplify_syn" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7736fb8d473c0d83098b5bac44df6a561e20470375cd8bcae30516dc889fd62a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "android_system_properties" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" -dependencies = [ - "libc", -] - -[[package]] -name = "anes" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" - -[[package]] -name = "anstyle" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78" - [[package]] name = "anyhow" version = "1.0.102" @@ -124,61 +50,6 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" -[[package]] -name = "arti-client" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a79ca5ce63b36033a5ccbfbcc7f919cbd93db61708543aa5e2e4917856205e7" -dependencies = [ - "async-trait", - "cfg-if", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "educe", - "fs-mistrust", - "futures", - "hostname-validator", - "humantime", - "humantime-serde", - "libc", - "once_cell", - "postage", - "rand 0.9.2", - "safelog", - "serde", - "thiserror 2.0.18", - "time", - "tor-async-utils", - "tor-basic-utils", - "tor-chanmgr", - "tor-circmgr", - "tor-config", - "tor-config-path", - "tor-dircommon", - "tor-dirmgr", - "tor-error", - "tor-guardmgr", - "tor-keymgr", - "tor-linkspec", - "tor-llcrypto", - "tor-memquota", - "tor-netdir", - "tor-netdoc", - "tor-persist", - "tor-proto", - "tor-protover", - "tor-rtcompat", - "tracing", - "void", -] - -[[package]] -name = "ascii" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92bec98840b8f03a5ff5413de5293bfcd8bf96467cf5452609f939ec6f5de16" - [[package]] name = "asn1-rs" version = "0.7.1" @@ -203,7 +74,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -215,25 +86,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "assert_matches" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9" - -[[package]] -name = "async-compression" -version = "0.4.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f9ee0f6e02ffd7ad5816e9464499fba7b3effd01123b515c41d1697c43dad1" -dependencies = [ - "compression-codecs", - "compression-core", - "futures-io", - "pin-project-lite", + "syn", ] [[package]] @@ -244,50 +97,7 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "async_executors" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a982d2f86de6137cc05c9db9a915a19886c97911f9790d04f174cede74be01a5" -dependencies = [ - "blanket", - "futures-core", - "futures-task", - "futures-util", - "pin-project", - "rustc_version", - "tokio", -] - -[[package]] -name = "asynchronous-codec" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a860072022177f903e59730004fb5dc13db9275b79bb2aef7ba8ce831956c233" -dependencies = [ - "bytes", - "futures-sink", - "futures-util", - "memchr", - "pin-project-lite", -] - -[[package]] -name = "atomic" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" - -[[package]] -name = "atomic" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89cbf775b137e9b968e67227ef7f775587cde3fd31b0d8599dbd0f598a48340" -dependencies = [ - "bytemuck", + "syn", ] [[package]] @@ -302,28 +112,6 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" -[[package]] -name = "aws-lc-rs" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9a7b350e3bb1767102698302bc37256cbd48422809984b98d292c40e2579aa9" -dependencies = [ - "aws-lc-sys", - "zeroize", -] - -[[package]] -name = "aws-lc-sys" -version = "0.37.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549" -dependencies = [ - "cc", - "cmake", - "dunce", - "fs_extra", -] - [[package]] name = "axum" version = "0.8.8" @@ -367,24 +155,12 @@ dependencies = [ "tower-service", ] -[[package]] -name = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base64" version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" -[[package]] -name = "base64ct" -version = "1.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" - [[package]] name = "bech32" version = "0.11.1" @@ -403,20 +179,10 @@ dependencies = [ "ff", "group", "pairing", - "rand_core 0.6.4", + "rand_core", "subtle", ] -[[package]] -name = "bincode" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36eaf5d7b090263e8150820482d5d93cd964a81e4019913c972f4edcc6edb740" -dependencies = [ - "serde", - "unty", -] - [[package]] name = "bip32" version = "0.6.0-pre.1" @@ -424,8 +190,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "143f5327f23168716be068f8e1014ba2ea16a6c91e8777bc8927da7b51e1df1f" dependencies = [ "bs58", - "hmac 0.13.0-pre.4", - "rand_core 0.6.4", + "hmac", + "rand_core", "ripemd 0.2.0-pre.4", "secp256k1", "sha2 0.11.0-pre.4", @@ -433,12 +199,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - [[package]] name = "bitflags" version = "2.11.0" @@ -479,17 +239,6 @@ dependencies = [ "constant_time_eq", ] -[[package]] -name = "blanket" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b121a9fe0df916e362fb3271088d071159cdf11db0e4182d02152850756eff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -517,7 +266,7 @@ dependencies = [ "ff", "group", "pairing", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -540,35 +289,6 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "bstr" -version = "1.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63044e1ae8e69f3b5a92c736ca6269b8d12fa7efe39bf34ddb06d102cf0e2cab" -dependencies = [ - "memchr", - "regex-automata", - "serde", -] - -[[package]] -name = "bumpalo" -version = "3.20.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" - -[[package]] -name = "by_address" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64fa3c856b712db6612c019f14756e64e4bcea13337a6b33b696333a9eaa2d06" - -[[package]] -name = "bytemuck" -version = "1.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" - [[package]] name = "byteorder" version = "1.5.0" @@ -581,18 +301,6 @@ version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -[[package]] -name = "caret" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4d27042e727de6261ee6391b834c6e1adec7031a03228cc1a67f95a3d8f2202" - -[[package]] -name = "cast" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" - [[package]] name = "cbc" version = "0.1.2" @@ -604,13 +312,11 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.56" +version = "1.2.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aebf35691d1bfb0ac386a69bac2fde4dd276fb618cf8bf4f5318fe285e821bb2" +checksum = "7a0dd1ca384932ff3641c8718a02769f1698e7563dc6974ffd03346116310423" dependencies = [ "find-msvc-tools", - "jobserver", - "libc", "shlex", ] @@ -644,45 +350,6 @@ dependencies = [ "zeroize", ] -[[package]] -name = "chrono" -version = "0.4.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" -dependencies = [ - "iana-time-zone", - "num-traits", - "serde", - "windows-link 0.2.1", -] - -[[package]] -name = "ciborium" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" -dependencies = [ - "ciborium-io", - "ciborium-ll", - "serde", -] - -[[package]] -name = "ciborium-io" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" - -[[package]] -name = "ciborium-ll" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" -dependencies = [ - "ciborium-io", - "half", -] - [[package]] name = "cipher" version = "0.4.4" @@ -695,4780 +362,1851 @@ dependencies = [ ] [[package]] -name = "clap" -version = "4.5.60" +name = "constant_time_eq" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2797f34da339ce31042b27d23607e051786132987f595b02ba4f6a6dffb7030a" -dependencies = [ - "clap_builder", -] +checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" [[package]] -name = "clap_builder" -version = "4.5.60" +name = "core-foundation" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24a241312cea5059b13574bb9b3861cabf758b879c15190b37b6d6fd63ab6876" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ - "anstyle", - "clap_lex", + "core-foundation-sys", + "libc", ] [[package]] -name = "clap_lex" -version = "1.0.0" +name = "core-foundation-sys" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a822ea5bc7590f9d40f1ba12c0dc3c2760f3482c6984db1573ad11031420831" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" [[package]] -name = "cmake" -version = "0.1.57" +name = "core2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75443c44cd6b379beb8c5b45d85d0773baf31cce901fe7bb252f4eff3008ef7d" +checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" dependencies = [ - "cc", + "memchr", ] [[package]] -name = "coarsetime" -version = "0.1.37" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e58eb270476aa4fc7843849f8a35063e8743b4dbcdf6dd0f8ea0886980c204c2" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ "libc", - "wasix", - "wasm-bindgen", ] [[package]] -name = "compression-codecs" -version = "0.4.37" +name = "crossbeam-channel" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7b51a7d9c967fc26773061ba86150f19c50c0d65c887cb1fbe295fd16619b7" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" dependencies = [ - "compression-core", - "flate2", - "liblzma", - "zstd", - "zstd-safe", + "crossbeam-utils", ] [[package]] -name = "compression-core" -version = "0.4.31" +name = "crossbeam-deque" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75984efb6ed102a0d42db99afb6c1948f0380d1d91808d5529916e6c08b49d8d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] [[package]] -name = "concurrent-queue" -version = "2.5.0" +name = "crossbeam-epoch" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ "crossbeam-utils", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "crossbeam-utils" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] -name = "constant_time_eq" -version = "0.4.2" +name = "crunchy" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" [[package]] -name = "convert_case" -version = "0.10.0" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "633458d4ef8c78b72454de2d54fd6ab2e60f9e02be22f3c6104cdc8a4e0fceb9" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "unicode-segmentation", + "generic-array", + "typenum", ] [[package]] -name = "cookie-factory" -version = "0.3.3" +name = "crypto-common" +version = "0.2.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9885fa71e26b8ab7855e2ec7cae6e9b380edff76cd052e07c683a0319d51b3a2" +checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" dependencies = [ - "futures", + "hybrid-array", ] [[package]] -name = "core-foundation" -version = "0.10.1" +name = "data-encoding" +version = "2.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" [[package]] -name = "core2" -version = "0.3.3" +name = "der-parser" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239fa3ae9b63c2dc74bd3fa852d4792b8b305ae64eeede946265b6af62f1fff3" +checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" dependencies = [ - "memchr", + "asn1-rs", + "displaydoc", + "nom", + "num-bigint", + "num-traits", + "rusticata-macros", ] [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "deranged" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ - "libc", + "powerfmt", ] [[package]] -name = "crc32fast" -version = "1.5.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9481c1c90cbf2ac953f07c8d4a58aa3945c425b7185c9154d67a65e4230da511" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "cfg-if", + "block-buffer 0.10.4", + "crypto-common 0.1.7", ] [[package]] -name = "criterion" -version = "0.7.0" +name = "digest" +version = "0.11.0-pre.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1c047a62b0cc3e145fa84415a3191f628e980b194c2755aa12300a4e6cbd928" +checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" dependencies = [ - "anes", - "cast", - "ciborium", - "clap", - "criterion-plot", - "itertools 0.13.0", - "num-traits", - "oorandom", - "plotters", - "rayon", - "regex", - "serde", - "serde_json", - "tinytemplate", - "walkdir", + "block-buffer 0.11.0-rc.3", + "crypto-common 0.2.0-rc.1", + "subtle", ] [[package]] -name = "criterion-cycles-per-byte" -version = "0.7.0" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f82e634fea1e2312dc41e6c0ca7444c5d6e7a1ccf3cf4b8de559831c3dcc271" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "cfg-if", - "criterion", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "criterion-plot" -version = "0.6.0" +name = "document-features" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b1bcc0dc7dfae599d84ad0b1a55f80cde8af3725da8313b528da95ef783e338" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ - "cast", - "itertools 0.13.0", + "litrs", ] [[package]] -name = "crossbeam-channel" -version = "0.5.15" +name = "either" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "equihash" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "ca4f333d4ccc9d23c06593733673026efa71a332e028b00f12cf427b9677dce9" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "blake2b_simd", + "core2", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" -dependencies = [ - "crossbeam-utils", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "crossbeam-queue" -version = "0.3.12" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f58bbc28f91df819d0aa2a2c00cd19754769c2fad90579b3592b1c9ba7a3115" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "crossbeam-utils", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" - -[[package]] -name = "crunchy" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" - -[[package]] -name = "crypto-bigint" -version = "0.5.5" +name = "f4jumble" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76" +checksum = "0d42773cb15447644d170be20231a3268600e0c4cea8987d013b93ac973d3cf7" dependencies = [ - "generic-array", - "rand_core 0.6.4", - "subtle", - "zeroize", + "blake2b_simd", ] [[package]] -name = "crypto-common" -version = "0.1.7" +name = "fastrand" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" -dependencies = [ - "generic-array", - "typenum", -] +checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" [[package]] -name = "crypto-common" -version = "0.2.0-rc.1" +name = "ff" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" +checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" dependencies = [ - "hybrid-array", + "bitvec", + "rand_core", + "subtle", ] [[package]] -name = "ctr" -version = "0.9.2" +name = "find-msvc-tools" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0369ee1ad671834580515889b80f2ea915f23b8be8d0daa4bbaf2ac5c7590835" -dependencies = [ - "cipher", -] +checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "fixedbitset" +version = "0.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" -dependencies = [ - "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "subtle", - "zeroize", -] +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "fnv" +version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] -name = "darling" -version = "0.14.4" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850" -dependencies = [ - "darling_core 0.14.4", - "darling_macro 0.14.4", -] +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "darling" -version = "0.21.3" +name = "fpe" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +checksum = "26c4b37de5ae15812a764c958297cfc50f5c010438f60c6ce75d11b802abd404" dependencies = [ - "darling_core 0.21.3", - "darling_macro 0.21.3", + "cbc", + "cipher", + "libm", + "num-bigint", + "num-integer", + "num-traits", ] [[package]] -name = "darling_core" -version = "0.14.4" +name = "funty" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", -] +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] -name = "darling_core" -version = "0.21.3" +name = "futures-channel" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.11.1", - "syn 2.0.117", + "futures-core", ] [[package]] -name = "darling_macro" -version = "0.14.4" +name = "futures-core" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e" -dependencies = [ - "darling_core 0.14.4", - "quote", - "syn 1.0.109", -] +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] -name = "darling_macro" -version = "0.21.3" +name = "futures-sink" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" -dependencies = [ - "darling_core 0.21.3", - "quote", - "syn 2.0.117", -] +checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" [[package]] -name = "data-encoding" -version = "2.10.0" +name = "futures-task" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a1e2f27636f116493b8b860f5546edb47c8d8f8ea73e1d2a20be88e28d1fea" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] -name = "der" -version = "0.7.10" +name = "futures-util" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", + "futures-core", + "futures-task", + "pin-project-lite", + "slab", ] [[package]] -name = "der-parser" -version = "10.0.0" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07da5016415d5a3c4dd39b11ed26f915f52fc4e0dc197d87908bc916e51bc1a6" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "asn1-rs", - "cookie-factory", - "displaydoc", - "nom", - "num-bigint", - "num-traits", - "rusticata-macros", + "typenum", + "version_check", ] [[package]] -name = "deranged" -version = "0.3.11" +name = "getrandom" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ - "powerfmt", - "serde", + "cfg-if", + "libc", + "wasi", ] [[package]] -name = "derive-deftly" -version = "1.3.0" +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d308ebe4b10924331bd079044b418da7b227d724d3e2408567a47ad7c3da2a0" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ - "derive-deftly-macros", - "heck", + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", ] [[package]] -name = "derive-deftly-macros" -version = "1.3.0" +name = "getset" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd5f2b7218a51c827a11d22d1439b598121fac94bf9b99452e4afffe512d78c9" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" dependencies = [ - "heck", - "indexmap 2.13.0", - "itertools 0.14.0", - "proc-macro-crate", + "proc-macro-error2", "proc-macro2", "quote", - "sha3", - "strum", - "syn 2.0.117", - "void", + "syn", ] [[package]] -name = "derive_builder_core_fork_arti" -version = "0.11.2" +name = "group" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24c1b715c79be6328caa9a5e1a387a196ea503740f0722ec3dd8f67a9e72314d" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" dependencies = [ - "darling 0.14.4", - "proc-macro2", - "quote", - "syn 1.0.109", + "ff", + "memuse", + "rand_core", + "subtle", ] [[package]] -name = "derive_builder_fork_arti" -version = "0.11.2" +name = "h2" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3eae24d595f4d0ecc90a9a5a6d11c2bd8dafe2375ec4a1ec63250e5ade7d228" +checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" dependencies = [ - "derive_builder_macro_fork_arti", + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap 2.13.0", + "slab", + "tokio", + "tokio-util", + "tracing", ] [[package]] -name = "derive_builder_macro_fork_arti" -version = "0.11.2" +name = "halo2_gadgets" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69887769a2489cd946bf782eb2b1bb2cb7bc88551440c94a765d4f040c08ebf3" +checksum = "73a5e510d58a07d8ed238a5a8a436fe6c2c79e1bb2611f62688bc65007b4e6e7" dependencies = [ - "derive_builder_core_fork_arti", - "syn 1.0.109", + "arrayvec", + "bitvec", + "ff", + "group", + "halo2_poseidon", + "halo2_proofs", + "lazy_static", + "pasta_curves", + "rand", + "sinsemilla", + "subtle", + "uint", ] [[package]] -name = "derive_more" -version = "2.1.1" +name = "halo2_legacy_pdqsort" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d751e9e49156b02b44f9c1815bcb94b984cdcc4396ecc32521c739452808b134" -dependencies = [ - "derive_more-impl", -] +checksum = "47716fe1ae67969c5e0b2ef826f32db8c3be72be325e1aa3c1951d06b5575ec5" [[package]] -name = "derive_more-impl" -version = "2.1.1" +name = "halo2_poseidon" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799a97264921d8623a957f6c3b9011f3b5492f557bbb7a5a19b7fa6d06ba8dcb" +checksum = "0fa3da60b81f02f9b33ebc6252d766f843291fb4d2247a07ae73d20b791fc56f" dependencies = [ - "convert_case", - "proc-macro2", - "quote", - "rustc_version", - "syn 2.0.117", - "unicode-xid", + "bitvec", + "ff", + "group", + "pasta_curves", ] [[package]] -name = "digest" -version = "0.10.7" +name = "halo2_proofs" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "05713f117155643ce10975e0bee44a274bcda2f4bb5ef29a999ad67c1fa8d4d3" dependencies = [ - "block-buffer 0.10.4", - "const-oid", - "crypto-common 0.1.7", - "subtle", + "blake2b_simd", + "ff", + "group", + "halo2_legacy_pdqsort", + "indexmap 1.9.3", + "maybe-rayon", + "pasta_curves", + "rand_core", + "tracing", ] [[package]] -name = "digest" -version = "0.11.0-pre.9" +name = "hashbrown" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" -dependencies = [ - "block-buffer 0.11.0-rc.3", - "crypto-common 0.2.0-rc.1", - "subtle", -] +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] -name = "directories" -version = "6.0.0" +name = "hashbrown" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16f5094c54661b38d03bd7e50df373292118db60b585c08a411c6d840017fe7d" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "dirs-sys", + "foldhash", ] [[package]] -name = "dirs" -version = "6.0.0" +name = "hashbrown" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" -dependencies = [ - "dirs-sys", -] +checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" [[package]] -name = "dirs-sys" +name = "heck" version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "displaydoc" -version = "0.2.5" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.13.0-pre.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "digest 0.11.0-pre.9", ] [[package]] -name = "document-features" -version = "0.2.12" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "litrs", + "bytes", + "itoa", ] [[package]] -name = "downcast-rs" -version = "2.0.2" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "117240f60069e65410b3ae1bb213295bd828f707b5bec6596a1afc8793ce0cbc" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +dependencies = [ + "bytes", + "http", +] [[package]] -name = "dunce" -version = "1.0.5" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] [[package]] -name = "dyn-clone" -version = "1.0.20" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "dynosaur" -version = "0.3.0" +name = "httpdate" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a12303417f378f29ba12cb12fc78a9df0d8e16ccb1ad94abf04d48d96bdda532" -dependencies = [ - "dynosaur_derive", -] +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" [[package]] -name = "dynosaur_derive" -version = "0.3.0" +name = "hybrid-array" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b0713d5c1d52e774c5cd7bb8b043d7c0fc4f921abfb678556140bfbe6ab2364" +checksum = "f2d35805454dc9f8662a98d6d61886ffe26bd465f5960e0e55345c70d5c0d2a9" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "typenum", ] [[package]] -name = "ecdsa" -version = "0.16.9" +name = "hyper" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee27f32b5c5292967d2d4a9d7f1e0b0aed2c15daded5a60300e4abb9d8020bca" +checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" dependencies = [ - "der", - "digest 0.10.7", - "elliptic-curve", - "rfc6979", - "signature", - "spki", + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "pin-utils", + "smallvec", + "tokio", + "want", ] [[package]] -name = "ed25519" -version = "2.2.3" +name = "hyper-rustls" +version = "0.27.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" dependencies = [ - "pkcs8", - "signature", + "http", + "hyper", + "hyper-util", + "log", + "rustls", + "rustls-native-certs", + "rustls-pki-types", + "tokio", + "tokio-rustls", + "tower-service", ] [[package]] -name = "ed25519-dalek" -version = "2.2.0" +name = "hyper-timeout" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70e796c081cee67dc755e1a36a0a172b897fab85fc3f6bc48307991f64e4eca9" +checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" dependencies = [ - "curve25519-dalek", - "ed25519", - "merlin", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", + "hyper", + "hyper-util", + "pin-project-lite", + "tokio", + "tower-service", ] [[package]] -name = "educe" -version = "0.4.23" +name = "hyper-util" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "enum-ordinalize", - "proc-macro2", - "quote", - "syn 1.0.109", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "either" -version = "1.15.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] -name = "elliptic-curve" -version = "0.13.8" +name = "incrementalmerkletree" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6043086bf7973472e0c7dff2142ea0b680d30e18d9cc40f267efbf222bd47" +checksum = "30821f91f0fa8660edca547918dc59812893b497d07c1144f326f07fdd94aba9" dependencies = [ - "base16ct", - "crypto-bigint", - "digest 0.10.7", - "ff", - "generic-array", - "group", - "pkcs8", - "rand_core 0.6.4", - "sec1", - "subtle", - "zeroize", + "either", ] [[package]] -name = "enum-ordinalize" -version = "3.1.15" +name = "indexmap" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "num-bigint", - "num-traits", - "proc-macro2", - "quote", - "syn 2.0.117", + "autocfg", + "hashbrown 0.12.3", ] [[package]] -name = "enum_dispatch" -version = "0.3.13" +name = "indexmap" +version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa18ce2bc66555b3218614519ac839ddb759a7d6720732f979ef8d13be147ecd" +checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" dependencies = [ - "once_cell", - "proc-macro2", - "quote", - "syn 2.0.117", + "equivalent", + "hashbrown 0.16.1", + "serde", + "serde_core", ] [[package]] -name = "env_home" -version = "0.1.0" +name = "inout" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "generic-array", +] [[package]] -name = "equihash" -version = "0.2.2" +name = "itertools" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca4f333d4ccc9d23c06593733673026efa71a332e028b00f12cf427b9677dce9" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" dependencies = [ - "blake2b_simd", - "core2", + "either", ] [[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" +name = "itoa" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "event-listener" -version = "5.4.1" +name = "jubjub" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", + "bitvec", + "bls12_381", + "ff", + "group", + "rand_core", + "subtle", ] [[package]] -name = "f4jumble" -version = "0.1.1" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d42773cb15447644d170be20231a3268600e0c4cea8987d013b93ac973d3cf7" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" dependencies = [ - "blake2b_simd", + "spin", ] [[package]] -name = "fallible-iterator" -version = "0.3.0" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] -name = "fallible-streaming-iterator" -version = "0.1.9" +name = "libc" +version = "0.2.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a" +checksum = "b5b646652bf6661599e1da8901b3b9522896f01e736bad5f723fe7a3a27f899d" [[package]] -name = "fastrand" -version = "2.3.0" +name = "libm" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] -name = "ff" -version = "0.13.1" +name = "lightwallet-protocol" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "0d72a1e80c511125c79cf54cc35fe263fed710abe88d6291f64e6e1ca4b909ec" dependencies = [ - "bitvec", - "rand_core 0.6.4", - "subtle", + "prost", + "tonic", + "tonic-prost", ] [[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "figment" -version = "0.10.19" +name = "linux-raw-sys" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cb01cd46b0cf372153850f4c6c272d9cbea2da513e07538405148f95bd789f3" -dependencies = [ - "atomic 0.6.1", - "serde", - "toml 0.8.23", - "uncased", - "version_check", -] +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "filetime" -version = "0.2.27" +name = "litrs" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f98844151eee8917efc50bd9e8318cb963ae8b297431495d3f758616ea5c57db" -dependencies = [ - "cfg-if", - "libc", - "libredox", -] +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] -name = "find-msvc-tools" -version = "0.1.9" +name = "log" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "fixedbitset" -version = "0.5.7" +name = "matchit" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" [[package]] -name = "flate2" -version = "1.1.9" +name = "maybe-rayon" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843fba2746e448b37e26a819579957415c8cef339bf08564fe8b7ddbd959573c" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" dependencies = [ - "crc32fast", - "miniz_oxide", + "cfg-if", ] [[package]] -name = "fluid-let" -version = "1.0.0" +name = "memchr" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "749cff877dc1af878a0b31a41dd221a753634401ea0ef2f87b62d3171522485a" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] -name = "fnv" -version = "1.0.7" +name = "memuse" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" [[package]] -name = "foldhash" -version = "0.1.5" +name = "mime" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" [[package]] -name = "fpe" -version = "0.6.1" +name = "minimal-lexical" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c4b37de5ae15812a764c958297cfc50f5c010438f60c6ce75d11b802abd404" -dependencies = [ - "cbc", - "cipher", - "libm", - "num-bigint", - "num-integer", - "num-traits", -] +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] -name = "fs-mistrust" -version = "0.12.0" +name = "mio" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7a157b06319bb4868718fd20177a0d3373d465e429d89cd0ee493d9f5918902" +checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" dependencies = [ - "derive_builder_fork_arti", - "dirs", "libc", - "pwd-grp", - "serde", - "thiserror 2.0.18", - "walkdir", + "wasi", + "windows-sys 0.61.2", ] [[package]] -name = "fs_extra" -version = "1.3.0" +name = "multimap" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" +checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" [[package]] -name = "fslock" -version = "0.2.1" +name = "nom" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04412b8935272e3a9bae6f48c7bfff74c2911f60525404edfdd28e49884c3bfb" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" dependencies = [ - "libc", - "winapi", + "memchr", + "minimal-lexical", ] [[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures" -version = "0.3.32" +name = "nonempty" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] +checksum = "549e471b99ccaf2f89101bec68f4d244457d5a95a9c3d0672e9564124397741d" [[package]] -name = "futures-channel" -version = "0.3.32" +name = "num-bigint" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ - "futures-core", - "futures-sink", + "num-integer", + "num-traits", ] [[package]] -name = "futures-core" -version = "0.3.32" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] -name = "futures-executor" -version = "0.3.32" +name = "num-integer" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "futures-core", - "futures-task", - "futures-util", + "num-traits", ] [[package]] -name = "futures-io" -version = "0.3.32" +name = "num-traits" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] [[package]] -name = "futures-macro" -version = "0.3.32" +name = "oid-registry" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "asn1-rs", ] [[package]] -name = "futures-rustls" -version = "0.26.0" +name = "once_cell" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f2f12607f92c69b12ed746fabf9ca4f5c482cba46679c1a75b874ed7c26adb" -dependencies = [ - "futures-io", - "rustls", - "rustls-pki-types", -] +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] -name = "futures-sink" -version = "0.3.32" +name = "opaque-debug" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" [[package]] -name = "futures-task" -version = "0.3.32" +name = "openssl-probe" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" [[package]] -name = "futures-util" -version = "0.3.32" +name = "orchard" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "b1ef66fcf99348242a20d582d7434da381a867df8dc155b3a980eca767c56137" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", + "aes", + "bitvec", + "blake2b_simd", + "core2", + "ff", + "fpe", + "getset", + "group", + "halo2_gadgets", + "halo2_poseidon", + "halo2_proofs", + "hex", + "incrementalmerkletree", + "lazy_static", + "memuse", + "nonempty", + "pasta_curves", + "rand", + "reddsa", + "serde", + "sinsemilla", + "subtle", + "tracing", + "visibility", + "zcash_note_encryption", + "zcash_spec", + "zip32", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "pairing" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" dependencies = [ - "typenum", - "version_check", - "zeroize", + "group", ] [[package]] -name = "getrandom" -version = "0.2.17" +name = "pasta_curves" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi", - "wasm-bindgen", + "blake2b_simd", + "ff", + "group", + "lazy_static", + "rand", + "static_assertions", + "subtle", ] [[package]] -name = "getrandom" -version = "0.3.4" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "petgraph" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi", - "wasip2", - "wasm-bindgen", + "fixedbitset", + "hashbrown 0.15.5", + "indexmap 2.13.0", ] [[package]] -name = "getrandom" -version = "0.4.1" +name = "pin-project" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ef39800118c7683f2fd3c98c1b23c09ae076556b435f8e9064ae108aaeeec" +checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasip2", - "wasip3", + "pin-project-internal", ] [[package]] -name = "getset" -version = "0.1.6" +name = "pin-project-internal" +version = "1.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" +checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" dependencies = [ - "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] -name = "glob-match" -version = "0.2.1" +name = "pin-project-lite" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9985c9503b412198aa4197559e9a318524ebc4519c229bfa05a535828c950b9d" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "group" -version = "0.13.0" +name = "pin-utils" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "memuse", - "rand_core 0.6.4", - "subtle", -] +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "h2" -version = "0.4.13" +name = "poly1305" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f44da3a8150a6703ed5d34e164b875fd14c2cdab9af1252a9a1020bde2bdc54" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.13.0", - "slab", - "tokio", - "tokio-util", - "tracing", + "cpufeatures", + "opaque-debug", + "universal-hash", ] [[package]] -name = "half" -version = "2.7.1" +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "cfg-if", - "crunchy", "zerocopy", ] [[package]] -name = "halo2_gadgets" -version = "0.3.1" +name = "prettyplease" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73a5e510d58a07d8ed238a5a8a436fe6c2c79e1bb2611f62688bc65007b4e6e7" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ - "arrayvec", - "bitvec", - "ff", - "group", - "halo2_poseidon", - "halo2_proofs", - "lazy_static", - "pasta_curves", - "rand 0.8.5", - "sinsemilla", - "subtle", - "uint", + "proc-macro2", + "syn", ] [[package]] -name = "halo2_legacy_pdqsort" -version = "0.1.0" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47716fe1ae67969c5e0b2ef826f32db8c3be72be325e1aa3c1951d06b5575ec5" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] [[package]] -name = "halo2_poseidon" -version = "0.1.0" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa3da60b81f02f9b33ebc6252d766f843291fb4d2247a07ae73d20b791fc56f" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ - "bitvec", - "ff", - "group", - "pasta_curves", + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "halo2_proofs" -version = "0.3.2" +name = "proc-macro2" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05713f117155643ce10975e0bee44a274bcda2f4bb5ef29a999ad67c1fa8d4d3" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_legacy_pdqsort", - "indexmap 1.9.3", - "maybe-rayon", - "pasta_curves", - "rand_core 0.6.4", - "tracing", + "unicode-ident", ] [[package]] -name = "hashbrown" -version = "0.12.3" +name = "prost" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +dependencies = [ + "bytes", + "prost-derive", +] [[package]] -name = "hashbrown" -version = "0.15.5" +name = "prost-build" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" dependencies = [ - "foldhash", + "heck", + "itertools", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn", + "tempfile", ] [[package]] -name = "hashbrown" -version = "0.16.1" +name = "prost-derive" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "hashlink" -version = "0.10.0" +name = "prost-types" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7382cf6263419f2d8df38c55d7da83da5c18aef87fc7a7fc1fb1e344edfe14c1" +checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" dependencies = [ - "hashbrown 0.15.5", + "prost", ] [[package]] -name = "heck" -version = "0.5.0" +name = "quote" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +dependencies = [ + "proc-macro2", +] [[package]] -name = "hex" -version = "0.4.3" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] -name = "hkdf" -version = "0.12.4" +name = "radium" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" -dependencies = [ - "hmac 0.12.1", -] +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] -name = "hmac" -version = "0.12.1" +name = "rand" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ - "digest 0.10.7", + "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "hmac" -version = "0.13.0-pre.4" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "digest 0.11.0-pre.9", + "ppv-lite86", + "rand_core", ] [[package]] -name = "hostname-validator" -version = "1.1.1" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f558a64ac9af88b5ba400d99b579451af0d39c6d360980045b91aac966d705e2" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] [[package]] -name = "http" -version = "1.4.0" +name = "rayon" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" +checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" dependencies = [ - "bytes", - "itoa", + "either", + "rayon-core", ] [[package]] -name = "http-body" -version = "1.0.1" +name = "rayon-core" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" dependencies = [ - "bytes", - "http", + "crossbeam-deque", + "crossbeam-utils", ] [[package]] -name = "http-body-util" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "pin-project-lite", -] - -[[package]] -name = "httparse" -version = "1.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" - -[[package]] -name = "httpdate" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" - -[[package]] -name = "humantime" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" - -[[package]] -name = "humantime-serde" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a3db5ea5923d99402c94e9feb261dc5ee9b4efa158b0315f788cf549cc200c" -dependencies = [ - "humantime", - "serde", -] - -[[package]] -name = "hybrid-array" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2d35805454dc9f8662a98d6d61886ffe26bd465f5960e0e55345c70d5c0d2a9" -dependencies = [ - "typenum", -] - -[[package]] -name = "hyper" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab2d4f250c3d7b1c9fcdff1cece94ea4e2dfbec68614f7b87cb205f24ca9d11" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "pin-utils", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3c93eb611681b207e1fe55d5a71ecf91572ec8a6705cdb6857f7d8d5242cf58" -dependencies = [ - "http", - "hyper", - "hyper-util", - "log", - "rustls", - "rustls-native-certs", - "rustls-pki-types", - "tokio", - "tokio-rustls", - "tower-service", -] - -[[package]] -name = "hyper-timeout" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b90d566bffbce6a75bd8b09a05aa8c2cb1fabb6cb348f8840c9e4c90a0d83b0" -dependencies = [ - "hyper", - "hyper-util", - "pin-project-lite", - "tokio", - "tower-service", -] - -[[package]] -name = "hyper-util" -version = "0.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" -dependencies = [ - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "libc", - "pin-project-lite", - "socket2", - "tokio", - "tower-service", - "tracing", -] - -[[package]] -name = "iana-time-zone" -version = "0.1.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" -dependencies = [ - "android_system_properties", - "core-foundation-sys", - "iana-time-zone-haiku", - "js-sys", - "log", - "wasm-bindgen", - "windows-core 0.62.2", -] - -[[package]] -name = "iana-time-zone-haiku" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" -dependencies = [ - "cc", -] - -[[package]] -name = "id-arena" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" - -[[package]] -name = "ident_case" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" - -[[package]] -name = "incrementalmerkletree" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30821f91f0fa8660edca547918dc59812893b497d07c1144f326f07fdd94aba9" -dependencies = [ - "either", -] - -[[package]] -name = "indexmap" -version = "1.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" -dependencies = [ - "autocfg", - "hashbrown 0.12.3", - "serde", -] - -[[package]] -name = "indexmap" -version = "2.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7714e70437a7dc3ac8eb7e6f8df75fd8eb422675fc7678aff7364301092b1017" -dependencies = [ - "equivalent", - "hashbrown 0.16.1", - "serde", - "serde_core", -] - -[[package]] -name = "inotify" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f37dccff2791ab604f9babef0ba14fbe0be30bd368dc541e2b08d07c8aa908f3" -dependencies = [ - "bitflags 2.11.0", - "inotify-sys", - "libc", -] - -[[package]] -name = "inotify-sys" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e05c02b5e89bff3b946cedeca278abc628fe811e604f027c45a8aa3cf793d0eb" -dependencies = [ - "libc", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "inventory" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "009ae045c87e7082cb72dab0ccd01ae075dd00141ddc108f43a0ea150a9e7227" -dependencies = [ - "rustversion", -] - -[[package]] -name = "itertools" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" -dependencies = [ - "either", -] - -[[package]] -name = "itertools" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" -dependencies = [ - "either", -] - -[[package]] -name = "itoa" -version = "1.0.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92ecc6618181def0457392ccd0ee51198e065e016d1d527a7ac1b6dc7c1f09d2" - -[[package]] -name = "jobserver" -version = "0.1.34" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" -dependencies = [ - "getrandom 0.3.4", - "libc", -] - -[[package]] -name = "js-sys" -version = "0.3.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14dc6f6450b3f6d4ed5b16327f38fed626d375a886159ca555bd7822c0c3a5a6" -dependencies = [ - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "jubjub" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" -dependencies = [ - "bitvec", - "bls12_381", - "ff", - "group", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "keccak" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb26cec98cce3a3d96cbb7bced3c4b16e3d13f27ec56dbd62cbc8f39cfb9d653" -dependencies = [ - "cpufeatures", -] - -[[package]] -name = "kqueue" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eac30106d7dce88daf4a3fcb4879ea939476d5074a9b7ddd0fb97fa4bed5596a" -dependencies = [ - "kqueue-sys", - "libc", -] - -[[package]] -name = "kqueue-sys" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed9625ffda8729b85e45cf04090035ac368927b8cebc34898e7c120f52e4838b" -dependencies = [ - "bitflags 1.3.2", - "libc", -] - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "leb128fmt" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" - -[[package]] -name = "libc" -version = "0.2.182" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6800badb6cb2082ffd7b6a67e6125bb39f18782f793520caee8cb8846be06112" - -[[package]] -name = "liblzma" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6033b77c21d1f56deeae8014eb9fbe7bdf1765185a6c508b5ca82eeaed7f899" -dependencies = [ - "liblzma-sys", -] - -[[package]] -name = "liblzma-sys" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2db66f3268487b5033077f266da6777d057949b8f93c8ad82e441df25e6186" -dependencies = [ - "cc", - "libc", - "pkg-config", -] - -[[package]] -name = "libm" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" - -[[package]] -name = "libredox" -version = "0.1.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616" -dependencies = [ - "bitflags 2.11.0", - "libc", - "redox_syscall 0.7.2", -] - -[[package]] -name = "libsqlite3-sys" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133c182a6a2c87864fe97778797e46c7e999672690dc9fa3ee8e241aa4a9c13f" -dependencies = [ - "pkg-config", - "vcpkg", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litrs" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" - -[[package]] -name = "lock_api" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" -dependencies = [ - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" - -[[package]] -name = "matchers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1525a2a28c7f4fa0fc98bb91ae755d1e2d1505079e05539e35bc876b5d65ae9" -dependencies = [ - "regex-automata", -] - -[[package]] -name = "matchit" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47e1ffaa40ddd1f3ed91f717a33c8c0ee23fff369e3aa8772b9605cc1d22f4c3" - -[[package]] -name = "maybe-rayon" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "memmap2" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "714098028fe011992e1c3962653c96b2d578c4b4bce9036e15ff220319b1e0e3" -dependencies = [ - "libc", -] - -[[package]] -name = "memuse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" - -[[package]] -name = "merlin" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58c38e2799fc0978b65dfff8023ec7843e2330bb462f19198840b34b6582397d" -dependencies = [ - "byteorder", - "keccak", - "rand_core 0.6.4", - "zeroize", -] - -[[package]] -name = "mime" -version = "0.3.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" - -[[package]] -name = "minimal-lexical" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" - -[[package]] -name = "miniz_oxide" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" -dependencies = [ - "adler2", - "simd-adler32", -] - -[[package]] -name = "mio" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a69bcab0ad47271a0234d9422b131806bf3968021e5dc9328caf2d4cd58557fc" -dependencies = [ - "libc", - "log", - "wasi", - "windows-sys 0.61.2", -] - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "nom" -version = "7.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" -dependencies = [ - "memchr", - "minimal-lexical", -] - -[[package]] -name = "nonany" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6b8866ec53810a9a4b3d434a29801e78c707430a9ae11c2db4b8b62bb9675a0" - -[[package]] -name = "nonempty" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549e471b99ccaf2f89101bec68f4d244457d5a95a9c3d0672e9564124397741d" - -[[package]] -name = "notify" -version = "8.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d3d07927151ff8575b7087f245456e549fea62edf0ec4e565a5ee50c8402bc3" -dependencies = [ - "bitflags 2.11.0", - "inotify", - "kqueue", - "libc", - "log", - "mio", - "notify-types", - "walkdir", - "windows-sys 0.60.2", -] - -[[package]] -name = "notify-types" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42b8cfee0e339a0337359f3c88165702ac6e600dc01c0cc9579a92d62b08477a" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "ntapi" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" -dependencies = [ - "winapi", -] - -[[package]] -name = "nu-ansi-term" -version = "0.50.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "num-bigint" -version = "0.4.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-bigint-dig" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" -dependencies = [ - "lazy_static", - "libm", - "num-integer", - "num-iter", - "num-traits", - "rand 0.8.5", - "smallvec", - "zeroize", -] - -[[package]] -name = "num-conv" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" - -[[package]] -name = "num-integer" -version = "0.1.46" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1429034a0490724d0075ebb2bc9e875d6503c3cf69e235a8941aa757d83ef5bf" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", - "libm", -] - -[[package]] -name = "num_enum" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" -dependencies = [ - "num_enum_derive", - "rustversion", -] - -[[package]] -name = "num_enum_derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "objc2-core-foundation" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "objc2-io-kit" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33fafba39597d6dc1fb709123dfa8289d39406734be322956a69f0931c73bb15" -dependencies = [ - "libc", - "objc2-core-foundation", -] - -[[package]] -name = "oid-registry" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f40cff3dde1b6087cc5d5f5d4d65712f34016a03ed60e9c08dcc392736b5b7" -dependencies = [ - "asn1-rs", -] - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "oneshot-fused-workaround" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5480ab52bd005e9f14e3071d0227bfa204e16a496a719c58bfa013f880b41593" -dependencies = [ - "futures", -] - -[[package]] -name = "oorandom" -version = "11.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openssl-probe" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" - -[[package]] -name = "option-ext" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" - -[[package]] -name = "orchard" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1ef66fcf99348242a20d582d7434da381a867df8dc155b3a980eca767c56137" -dependencies = [ - "aes", - "bitvec", - "blake2b_simd", - "core2", - "ff", - "fpe", - "getset", - "group", - "halo2_gadgets", - "halo2_poseidon", - "halo2_proofs", - "hex", - "incrementalmerkletree", - "lazy_static", - "memuse", - "nonempty", - "pasta_curves", - "rand 0.8.5", - "reddsa", - "serde", - "sinsemilla", - "subtle", - "tracing", - "visibility", - "zcash_note_encryption", - "zcash_spec", - "zip32", -] - -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - -[[package]] -name = "os_str_bytes" -version = "6.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2355d85b9a3786f481747ced0e0ff2ba35213a1f9bd406ed906554d7af805a1" -dependencies = [ - "memchr", -] - -[[package]] -name = "p256" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "p384" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe42f1670a52a47d448f14b6a5c61dd78fce51856e68edaa38f7ae3a46b8d6b6" -dependencies = [ - "ecdsa", - "elliptic-curve", - "primeorder", - "sha2 0.10.9", -] - -[[package]] -name = "p521" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fc9e2161f1f215afdfce23677034ae137bbd45016a880c2eb3ba8eb95f085b2" -dependencies = [ - "base16ct", - "ecdsa", - "elliptic-curve", - "primeorder", - "rand_core 0.6.4", - "sha2 0.10.9", -] - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - -[[package]] -name = "parking_lot" -version = "0.12.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall 0.5.18", - "smallvec", - "windows-link 0.2.1", -] - -[[package]] -name = "pasta_curves" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "lazy_static", - "rand 0.8.5", - "static_assertions", - "subtle", -] - -[[package]] -name = "paste" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" - -[[package]] -name = "pem-rfc7468" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" -dependencies = [ - "base64ct", -] - -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - -[[package]] -name = "petgraph" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8701b58ea97060d5e5b155d383a69952a60943f0e6dfe30b04c287beb0b27455" -dependencies = [ - "fixedbitset", - "hashbrown 0.15.5", - "indexmap 2.13.0", -] - -[[package]] -name = "phf" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" -dependencies = [ - "phf_macros", - "phf_shared", - "serde", -] - -[[package]] -name = "phf_generator" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" -dependencies = [ - "fastrand", - "phf_shared", -] - -[[package]] -name = "phf_macros" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "phf_shared" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677f1add503faace112b9f1373e43e9e054bfdd22ff1a63c1bc485eaec6a6a8a" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkcs1" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" -dependencies = [ - "der", - "pkcs8", - "spki", -] - -[[package]] -name = "pkcs8" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" -dependencies = [ - "der", - "spki", -] - -[[package]] -name = "pkg-config" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" - -[[package]] -name = "plotters" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb6f403d7a4911efb1e33402027fc44f29b5bf6def3effcc22d7bb75f2b747" -dependencies = [ - "num-traits", - "plotters-backend", - "plotters-svg", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "plotters-backend" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df42e13c12958a16b3f7f4386b9ab1f3e7933914ecea48da7139435263a4172a" - -[[package]] -name = "plotters-svg" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51bae2ac328883f7acdfea3d66a7c35751187f870bc81f94563733a154d7a670" -dependencies = [ - "plotters-backend", -] - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "postage" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" -dependencies = [ - "atomic 0.5.3", - "crossbeam-queue", - "futures", - "parking_lot", - "pin-project", - "static_assertions", - "thiserror 1.0.69", -] - -[[package]] -name = "powerfmt" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.117", -] - -[[package]] -name = "primeorder" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" -dependencies = [ - "elliptic-curve", -] - -[[package]] -name = "priority-queue" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93980406f12d9f8140ed5abe7155acb10bb1e69ea55c88960b9c2f117445ef96" -dependencies = [ - "equivalent", - "indexmap 2.13.0", - "serde", -] - -[[package]] -name = "proc-macro-crate" -version = "3.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" -dependencies = [ - "toml_edit 0.23.10+spec-1.0.0", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" -dependencies = [ - "heck", - "itertools 0.14.0", - "log", - "multimap", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.117", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "prost-types" -version = "0.14.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" -dependencies = [ - "prost", -] - -[[package]] -name = "pwd-grp" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e2023f41b5fcb7c30eb5300a5733edfaa9e0e0d502d51b586f65633fd39e40c" -dependencies = [ - "derive-deftly", - "libc", - "paste", - "thiserror 2.0.18", -] - -[[package]] -name = "quote" -version = "1.0.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21b2ebcf727b7760c461f091f9f0f539b77b8e87f2fd88131e7f1b433b3cece4" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_jitter" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16df48f071248e67b8fc5e866d9448d45c08ad8b672baaaf796e2f15e606ff0" -dependencies = [ - "libc", - "rand_core 0.9.5", - "winapi", -] - -[[package]] -name = "rayon" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "368f01d005bf8fd9b1206fb6fa653e6c4a81ceb1466406b81792d87c5677a58f" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "rdrand" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92195228612ac8eed47adbc2ed0f04e513a4ccb98175b6f2bd04d963b533655" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "reddsa" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a5191930e84973293aa5f532b513404460cd2216c1cfb76d08748c15b40b02" -dependencies = [ - "blake2b_simd", - "byteorder", - "group", - "hex", - "jubjub", - "pasta_curves", - "rand_core 0.6.4", - "serde", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "redjubjub" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b0ac1bc6bb3696d2c6f52cff8fba57238b81da8c0214ee6cd146eb8fde364e" -dependencies = [ - "rand_core 0.6.4", - "reddsa", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_syscall" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d94dd2f7cd932d4dc02cc8b2b50dfd38bd079a4e5d79198b99743d7fcf9a4b4" -dependencies = [ - "bitflags 2.11.0", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - -[[package]] -name = "retry-error" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b295404fa4a9e1e63537ccbd4e4b6309d9688bd70608ddc16d3b8af0389a673a" - -[[package]] -name = "rfc6979" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2" -dependencies = [ - "hmac 0.12.1", - "subtle", -] - -[[package]] -name = "ring" -version = "0.17.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" -dependencies = [ - "cc", - "cfg-if", - "getrandom 0.2.17", - "libc", - "untrusted", - "windows-sys 0.52.0", -] - -[[package]] -name = "ripemd" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "ripemd" -version = "0.2.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48cf93482ea998ad1302c42739bc73ab3adc574890c373ec89710e219357579" -dependencies = [ - "digest 0.11.0-pre.9", -] - -[[package]] -name = "rsa" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8573f03f5883dcaebdfcf4725caa1ecb9c15b2ef50c43a07b816e06799bb12d" -dependencies = [ - "const-oid", - "digest 0.10.7", - "num-bigint-dig", - "num-integer", - "num-traits", - "pkcs1", - "pkcs8", - "rand_core 0.6.4", - "sha2 0.10.9", - "signature", - "spki", - "subtle", - "zeroize", -] - -[[package]] -name = "rusqlite" -version = "0.37.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "165ca6e57b20e1351573e3729b958bc62f0e48025386970b6e4d29e7a7e71f3f" -dependencies = [ - "bitflags 2.11.0", - "fallible-iterator", - "fallible-streaming-iterator", - "hashlink", - "libsqlite3-sys", - "smallvec", - "time", -] - -[[package]] -name = "rust_decimal" -version = "1.40.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61f703d19852dbf87cbc513643fa81428361eb6940f1ac14fd58155d295a3eb0" -dependencies = [ - "arrayvec", - "num-traits", - "serde", -] - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", -] - -[[package]] -name = "rusticata-macros" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" -dependencies = [ - "nom", -] - -[[package]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags 2.11.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" -dependencies = [ - "aws-lc-rs", - "log", - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-native-certs" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" -dependencies = [ - "openssl-probe", - "rustls-pki-types", - "schannel", - "security-framework", -] - -[[package]] -name = "rustls-pemfile" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" -dependencies = [ - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7df23109aa6c1567d1c575b9952556388da57401e4ace1d15f79eedad0d8f53" -dependencies = [ - "aws-lc-rs", - "ring", - "rustls-pki-types", - "untrusted", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "safelog" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e75b0880210c750d9189aa2d1ef94075a5500ccd9e7e98ad868e017c17c4a4bc" -dependencies = [ - "derive_more", - "educe", - "either", - "fluid-let", - "thiserror 2.0.18", -] - -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - -[[package]] -name = "sanitize-filename" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc984f4f9ceb736a7bb755c3e3bd17dc56370af2600c9780dcc48c66453da34d" -dependencies = [ - "regex", -] - -[[package]] -name = "sapling-crypto" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9d3c081c83f1dc87403d9d71a06f52301c0aa9ea4c17da2a3435bbf493ffba4" -dependencies = [ - "aes", - "bellman", - "bitvec", - "blake2b_simd", - "blake2s_simd", - "bls12_381", - "core2", - "document-features", - "ff", - "fpe", - "getset", - "group", - "hex", - "incrementalmerkletree", - "jubjub", - "lazy_static", - "memuse", - "rand 0.8.5", - "rand_core 0.6.4", - "redjubjub", - "subtle", - "tracing", - "zcash_note_encryption", - "zcash_spec", - "zip32", -] - -[[package]] -name = "schannel" -version = "0.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "schemars" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "schemars" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2b42f36aa1cd011945615b92222f6bf73c599a102a300334cd7f8dbeec726cc" -dependencies = [ - "dyn-clone", - "ref-cast", - "serde", - "serde_json", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "sec1" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3e97a565f76233a6003f9f5c54be1d9c5bdfa3eccfb189469f11ec4901c47dc" -dependencies = [ - "base16ct", - "der", - "generic-array", - "pkcs8", - "subtle", - "zeroize", -] - -[[package]] -name = "secp256k1" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" -dependencies = [ - "secp256k1-sys", -] - -[[package]] -name = "secp256k1-sys" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" -dependencies = [ - "cc", -] - -[[package]] -name = "secrecy" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" -dependencies = [ - "zeroize", -] - -[[package]] -name = "security-framework" -version = "3.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" -dependencies = [ - "bitflags 2.11.0", - "core-foundation", - "core-foundation-sys", - "libc", - "security-framework-sys", -] - -[[package]] -name = "security-framework-sys" -version = "2.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" -dependencies = [ - "core-foundation-sys", - "libc", -] - -[[package]] -name = "semver" -version = "1.0.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-value" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" -dependencies = [ - "ordered-float", - "serde", -] - -[[package]] -name = "serde_core" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_ignored" -version = "0.1.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115dffd5f3853e06e746965a20dcbae6ee747ae30b543d91b0e089668bb07798" -dependencies = [ - "serde", - "serde_core", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_spanned" -version = "0.6.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" -dependencies = [ - "serde", -] - -[[package]] -name = "serde_spanned" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" -dependencies = [ - "serde_core", -] - -[[package]] -name = "serde_with" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "381b283ce7bc6b476d903296fb59d0d36633652b633b27f64db4fb46dcbfc3b9" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.13.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6d4e30573c8cb306ed6ab1dca8423eec9a463ea0e155f45399455e0368b27e0" -dependencies = [ - "darling 0.21.3", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.11.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540c0893cce56cdbcfebcec191ec8e0f470dd1889b6e7a0b503e310a94a168f5" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.11.0-pre.9", -] - -[[package]] -name = "sha3" -version = "0.10.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60" -dependencies = [ - "digest 0.10.7", - "keccak", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shardtree" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "359e552886ae54d1642091645980d83f7db465fd9b5b0248e3680713c1773388" -dependencies = [ - "bitflags 2.11.0", - "either", - "incrementalmerkletree", - "tracing", -] - -[[package]] -name = "shellexpand" -version = "3.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32824fab5e16e6c4d86dc1ba84489390419a39f97699852b66480bb87d297ed8" -dependencies = [ - "bstr", - "dirs", - "os_str_bytes", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "digest 0.10.7", - "rand_core 0.6.4", -] - -[[package]] -name = "simd-adler32" -version = "0.3.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e320a6c5ad31d271ad523dcf3ad13e2767ad8b1cb8f047f75a8aeaf8da139da2" - -[[package]] -name = "sinsemilla" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d268ae0ea06faafe1662e9967cd4f9022014f5eeb798e0c302c876df8b7af9c" -dependencies = [ - "group", - "pasta_curves", - "subtle", -] - -[[package]] -name = "siphasher" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" - -[[package]] -name = "slab" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "slotmap" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" -dependencies = [ - "serde", - "version_check", -] - -[[package]] -name = "slotmap-careful" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d866fb978c1cf6d71abde4dce1905369edd0d0028ff9bc55e2431b83df7a36e8" -dependencies = [ - "paste", - "serde", - "slotmap", - "thiserror 2.0.18", - "void", -] - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f4aa3ad99f2088c990dfa82d367e19cb29268ed67c574d10d0a4bfe71f07e0" -dependencies = [ - "libc", - "windows-sys 0.60.2", -] - -[[package]] -name = "spin" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "ssh-cipher" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "caac132742f0d33c3af65bfcde7f6aa8f62f0e991d80db99149eb9d44708784f" -dependencies = [ - "cipher", - "ssh-encoding", -] - -[[package]] -name = "ssh-encoding" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb9242b9ef4108a78e8cd1a2c98e193ef372437f8c22be363075233321dd4a15" -dependencies = [ - "base64ct", - "pem-rfc7468", - "sha2 0.10.9", -] - -[[package]] -name = "ssh-key" -version = "0.6.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b86f5297f0f04d08cabaa0f6bff7cb6aec4d9c3b49d87990d63da9d9156a8c3" -dependencies = [ - "num-bigint-dig", - "p256", - "p384", - "p521", - "rand_core 0.6.4", - "rsa", - "sec1", - "sha2 0.10.9", - "signature", - "ssh-cipher", - "ssh-encoding", - "subtle", - "zeroize", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "strsim" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" - -[[package]] -name = "strum" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" -dependencies = [ - "strum_macros", -] - -[[package]] -name = "strum_macros" -version = "0.27.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "subtle" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.117" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "sysinfo" -version = "0.36.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252800745060e7b9ffb7b2badbd8b31cfa4aa2e61af879d0a3bf2a317c20217d" -dependencies = [ - "libc", - "memchr", - "ntapi", - "objc2-core-foundation", - "objc2-io-kit", - "windows", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82a72c767771b47409d2345987fda8628641887d5466101319899796367354a0" -dependencies = [ - "fastrand", - "getrandom 0.4.1", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.37" +name = "reddsa" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" +checksum = "78a5191930e84973293aa5f532b513404460cd2216c1cfb76d08748c15b40b02" dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", + "blake2b_simd", + "byteorder", + "group", + "hex", + "jubjub", + "pasta_curves", + "rand_core", "serde", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" - -[[package]] -name = "time-macros" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" -dependencies = [ - "num-conv", - "time-core", + "thiserror 1.0.69", + "zeroize", ] [[package]] -name = "tinystr" -version = "0.8.2" +name = "redjubjub" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" +checksum = "89b0ac1bc6bb3696d2c6f52cff8fba57238b81da8c0214ee6cd146eb8fde364e" dependencies = [ - "displaydoc", - "serde_core", - "zerovec", + "rand_core", + "reddsa", + "thiserror 1.0.69", + "zeroize", ] [[package]] -name = "tinytemplate" -version = "1.2.1" +name = "regex" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ - "serde", - "serde_json", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "tinyvec" -version = "1.10.0" +name = "regex-automata" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ - "tinyvec_macros", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "tinyvec_macros" -version = "0.1.1" +name = "regex-syntax" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] -name = "tokio" -version = "1.49.0" +name = "ring" +version = "0.17.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72a2903cd7736441aac9df9d7688bd0ce48edccaadf181c3b90be801e81d3d86" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" dependencies = [ - "bytes", + "cc", + "cfg-if", + "getrandom 0.2.17", "libc", - "mio", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "untrusted", + "windows-sys 0.52.0", ] [[package]] -name = "tokio-rustls" -version = "0.26.4" +name = "ripemd" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" dependencies = [ - "rustls", - "tokio", + "digest 0.10.7", ] [[package]] -name = "tokio-stream" -version = "0.1.18" +name = "ripemd" +version = "0.2.0-pre.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" +checksum = "e48cf93482ea998ad1302c42739bc73ab3adc574890c373ec89710e219357579" dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", + "digest 0.11.0-pre.9", ] [[package]] -name = "tokio-util" -version = "0.7.18" +name = "rusticata-macros" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" +checksum = "faf0c4a6ece9950b9abdb62b1cfcf2a68b3b67a10ba445b3bb85be2a293d0632" dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "tokio", + "nom", ] [[package]] -name = "toml" -version = "0.8.23" +name = "rustix" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_edit 0.22.27", + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.61.2", ] [[package]] -name = "toml" -version = "0.9.12+spec-1.1.0" +name = "rustls" +version = "0.23.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863" +checksum = "758025cb5fccfd3bc2fd74708fd4682be41d99e5dff73c377c0646c6012c73a4" dependencies = [ - "indexmap 2.13.0", - "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "toml_writer", - "winnow", + "log", + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", ] [[package]] -name = "toml_datetime" -version = "0.6.11" +name = "rustls-native-certs" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +checksum = "612460d5f7bea540c490b2b6395d8e34a953e52b491accd6c86c8164c5932a63" dependencies = [ - "serde", + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", ] [[package]] -name = "toml_datetime" -version = "0.7.5+spec-1.1.0" +name = "rustls-pemfile" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92e1cfed4a3038bc5a127e35a2d360f145e1f4b971b551a2ba5fd7aedf7e1347" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" dependencies = [ - "serde_core", + "rustls-pki-types", ] [[package]] -name = "toml_edit" -version = "0.22.27" +name = "rustls-pki-types" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +checksum = "be040f8b0a225e40375822a563fa9524378b9d63112f53e19ffff34df5d33fdd" dependencies = [ - "indexmap 2.13.0", - "serde", - "serde_spanned 0.6.9", - "toml_datetime 0.6.11", - "toml_write", - "winnow", + "zeroize", ] [[package]] -name = "toml_edit" -version = "0.23.10+spec-1.0.0" +name = "rustls-webpki" +version = "0.103.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84c8b9f757e028cee9fa244aea147aab2a9ec09d5325a9b01e0a49730c2b5269" +checksum = "df33b2b81ac578cabaf06b89b0631153a3f416b0a886e8a7a1707fb51abbd1ef" dependencies = [ - "indexmap 2.13.0", - "toml_datetime 0.7.5+spec-1.1.0", - "toml_parser", - "winnow", + "ring", + "rustls-pki-types", + "untrusted", ] [[package]] -name = "toml_parser" -version = "1.0.9+spec-1.1.0" +name = "sapling-crypto" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702d4415e08923e7e1ef96cd5727c0dfed80b4d2fa25db9647fe5eb6f7c5a4c4" +checksum = "f9d3c081c83f1dc87403d9d71a06f52301c0aa9ea4c17da2a3435bbf493ffba4" dependencies = [ - "winnow", + "aes", + "bellman", + "bitvec", + "blake2b_simd", + "blake2s_simd", + "bls12_381", + "core2", + "document-features", + "ff", + "fpe", + "getset", + "group", + "hex", + "incrementalmerkletree", + "jubjub", + "lazy_static", + "memuse", + "rand", + "rand_core", + "redjubjub", + "subtle", + "tracing", + "zcash_note_encryption", + "zcash_spec", + "zip32", ] [[package]] -name = "toml_write" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" - -[[package]] -name = "toml_writer" -version = "1.0.6+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab16f14aed21ee8bfd8ec22513f7287cd4a91aa92e44edfe2c17ddd004e92607" - -[[package]] -name = "tonic" -version = "0.14.5" +name = "schannel" +version = "0.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" -dependencies = [ - "async-trait", - "axum", - "base64", - "bytes", - "h2", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-timeout", - "hyper-util", - "percent-encoding", - "pin-project", - "socket2", - "sync_wrapper", - "tokio", - "tokio-rustls", - "tokio-stream", - "tower", - "tower-layer", - "tower-service", - "tracing", - "webpki-roots", +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", ] [[package]] -name = "tonic-build" -version = "0.14.5" +name = "secp256k1" +version = "0.29.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" +checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" dependencies = [ - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", + "secp256k1-sys", ] [[package]] -name = "tonic-prost" -version = "0.14.5" +name = "secp256k1-sys" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" dependencies = [ - "bytes", - "prost", - "tonic", + "cc", ] [[package]] -name = "tonic-prost-build" -version = "0.14.5" +name = "secrecy" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.117", - "tempfile", - "tonic-build", + "zeroize", ] [[package]] -name = "tor-async-utils" -version = "0.35.0" +name = "security-framework" +version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad5e568ad4e025a68aa0395a146247609dd5b6d8c2141255f5e4f367e7fda8a" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "derive-deftly", - "educe", - "futures", - "oneshot-fused-workaround", - "pin-project", - "postage", - "thiserror 2.0.18", - "void", + "bitflags", + "core-foundation", + "core-foundation-sys", + "libc", + "security-framework-sys", ] [[package]] -name = "tor-basic-utils" -version = "0.35.0" +name = "security-framework-sys" +version = "2.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30122645feee76f76ba1ad011b316a2b135d44a00c45ed9c14af58b32ad93b69" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" dependencies = [ - "derive_more", - "hex", - "itertools 0.14.0", + "core-foundation-sys", "libc", - "paste", - "rand 0.9.2", - "rand_chacha 0.9.0", - "serde", - "slab", - "smallvec", - "thiserror 2.0.18", ] [[package]] -name = "tor-bytes" -version = "0.35.0" +name = "semver" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" + +[[package]] +name = "serde" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fc7fb465ba671ee1486d8bd1e0a8f546887c2ce034004c4c9b03a6227e1c381" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "bytes", - "derive-deftly", - "digest 0.10.7", - "educe", - "getrandom 0.3.4", - "safelog", - "thiserror 2.0.18", - "tor-error", - "tor-llcrypto", - "zeroize", + "serde_core", + "serde_derive", ] [[package]] -name = "tor-cell" -version = "0.35.0" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ba1b43f22fab2daee3e0c902f1455b3aed8e086b2d83d8c60b36523b173d25" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" dependencies = [ - "amplify", - "bitflags 2.11.0", - "bytes", - "caret", - "derive-deftly", - "derive_more", - "educe", - "itertools 0.14.0", - "paste", - "rand 0.9.2", - "smallvec", - "thiserror 2.0.18", - "tor-basic-utils", - "tor-bytes", - "tor-cert", - "tor-error", - "tor-linkspec", - "tor-llcrypto", - "tor-memquota", - "tor-protover", - "tor-units", - "void", + "serde_derive", ] [[package]] -name = "tor-cert" -version = "0.35.0" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e63e2db09b6d6d3453f63d7d55796c9b10a7cd2bcc14e553666b1f3a84df66" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ - "caret", - "derive_builder_fork_arti", - "derive_more", - "digest 0.10.7", - "thiserror 2.0.18", - "tor-bytes", - "tor-checkable", - "tor-llcrypto", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tor-chanmgr" -version = "0.35.0" +name = "serde_json" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd6924b1716b7d071221087e18eb911ff8331eca4bc2d896f2a03864ff67f2c" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ - "async-trait", - "caret", - "derive_builder_fork_arti", - "derive_more", - "educe", - "futures", - "oneshot-fused-workaround", - "postage", - "rand 0.9.2", - "safelog", + "itoa", + "memchr", "serde", - "thiserror 2.0.18", - "tor-async-utils", - "tor-basic-utils", - "tor-cell", - "tor-config", - "tor-error", - "tor-keymgr", - "tor-linkspec", - "tor-llcrypto", - "tor-memquota", - "tor-netdir", - "tor-proto", - "tor-rtcompat", - "tor-socksproto", - "tor-units", - "tracing", - "void", + "serde_core", + "zmij", ] [[package]] -name = "tor-checkable" -version = "0.35.0" +name = "sha1" +version = "0.10.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c9839e9bb302f17447c350e290bb107084aca86c640882a91522f2059f6a686" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" dependencies = [ - "humantime", - "signature", - "thiserror 2.0.18", - "tor-llcrypto", + "cfg-if", + "cpufeatures", + "digest 0.10.7", ] [[package]] -name = "tor-circmgr" -version = "0.35.0" +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea86ed519745136c7d90bb42efe4786dc7aa7548b92d9091ec8237cd16b9c12f" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "amplify", - "async-trait", "cfg-if", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "downcast-rs", - "dyn-clone", - "educe", - "futures", - "humantime-serde", - "itertools 0.14.0", - "once_cell", - "oneshot-fused-workaround", - "pin-project", - "rand 0.9.2", - "retry-error", - "safelog", - "serde", - "thiserror 2.0.18", - "tor-async-utils", - "tor-basic-utils", - "tor-cell", - "tor-chanmgr", - "tor-config", - "tor-dircommon", - "tor-error", - "tor-guardmgr", - "tor-linkspec", - "tor-memquota", - "tor-netdir", - "tor-netdoc", - "tor-persist", - "tor-proto", - "tor-protover", - "tor-relay-selection", - "tor-rtcompat", - "tor-units", - "tracing", - "void", - "weak-table", + "cpufeatures", + "digest 0.10.7", ] [[package]] -name = "tor-config" -version = "0.35.0" +name = "sha2" +version = "0.11.0-pre.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb15df773842025010d885fbe862062ebaa342b799f9716273eaf733b92f2f45" +checksum = "540c0893cce56cdbcfebcec191ec8e0f470dd1889b6e7a0b503e310a94a168f5" dependencies = [ - "amplify", "cfg-if", - "derive-deftly", - "derive_builder_fork_arti", - "educe", - "either", - "figment", - "fs-mistrust", - "futures", - "itertools 0.14.0", - "notify", - "paste", - "postage", - "regex", - "serde", - "serde-value", - "serde_ignored", - "strum", - "thiserror 2.0.18", - "toml 0.9.12+spec-1.1.0", - "tor-basic-utils", - "tor-error", - "tor-rtcompat", - "tracing", - "void", + "cpufeatures", + "digest 0.11.0-pre.9", ] [[package]] -name = "tor-config-path" -version = "0.35.0" +name = "shardtree" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c80d2784120508b5374a979cc0f6be0177ed870d176b0b31c94cf822200091dc" +checksum = "359e552886ae54d1642091645980d83f7db465fd9b5b0248e3680713c1773388" dependencies = [ - "directories", - "serde", - "shellexpand", - "thiserror 2.0.18", - "tor-error", - "tor-general-addr", + "bitflags", + "either", + "incrementalmerkletree", + "tracing", ] [[package]] -name = "tor-consdiff" -version = "0.35.0" +name = "shlex" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1690438c1fc778fc7c89c132e529365b1430d6afe03aeecbc2508324807bf0b" -dependencies = [ - "digest 0.10.7", - "hex", - "thiserror 2.0.18", - "tor-llcrypto", -] +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] -name = "tor-dirclient" -version = "0.35.0" +name = "sinsemilla" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5e730873fdc4b7f9545472c0d1cf0c43a7e89d6c996c234b6b548163010284c" +checksum = "3d268ae0ea06faafe1662e9967cd4f9022014f5eeb798e0c302c876df8b7af9c" dependencies = [ - "async-compression", - "base64ct", - "derive_more", - "futures", - "hex", - "http", - "httparse", - "httpdate", - "itertools 0.14.0", - "memchr", - "thiserror 2.0.18", - "tor-circmgr", - "tor-error", - "tor-linkspec", - "tor-llcrypto", - "tor-netdoc", - "tor-proto", - "tor-rtcompat", - "tracing", + "group", + "pasta_curves", + "subtle", ] [[package]] -name = "tor-dircommon" -version = "0.35.0" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b60043697f94ec228f4fb6d30834a037774f2f3c2cdb0bdb805248f46b5320e" -dependencies = [ - "base64ct", - "derive_builder_fork_arti", - "getset", - "humantime", - "humantime-serde", - "serde", - "tor-basic-utils", - "tor-checkable", - "tor-config", - "tor-linkspec", - "tor-llcrypto", - "tor-netdoc", - "tracing", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "smallvec" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "tor-dirmgr" -version = "0.35.0" +name = "socket2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86f5e21a574acb35dd1a32960b10cb184db2e2ffbb4007abd3515951ce09d0f2" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ - "async-trait", - "base64ct", - "derive_builder_fork_arti", - "derive_more", - "digest 0.10.7", - "educe", - "event-listener", - "fs-mistrust", - "fslock", - "futures", - "hex", - "humantime", - "humantime-serde", - "itertools 0.14.0", - "memmap2", - "oneshot-fused-workaround", - "paste", - "postage", - "rand 0.9.2", - "rusqlite", - "safelog", - "scopeguard", - "serde", - "serde_json", - "signature", - "static_assertions", - "strum", - "thiserror 2.0.18", - "time", - "tor-async-utils", - "tor-basic-utils", - "tor-checkable", - "tor-circmgr", - "tor-config", - "tor-consdiff", - "tor-dirclient", - "tor-dircommon", - "tor-error", - "tor-guardmgr", - "tor-llcrypto", - "tor-netdir", - "tor-netdoc", - "tor-persist", - "tor-proto", - "tor-protover", - "tor-rtcompat", - "tracing", + "libc", + "windows-sys 0.61.2", ] [[package]] -name = "tor-error" -version = "0.35.0" +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "syn" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63d766a5d11ddad7946cf8357ce7a1e948abdc3ad3ef06ed23f35af522dc089c" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ - "derive_more", - "futures", - "paste", - "retry-error", - "static_assertions", - "strum", - "thiserror 2.0.18", - "tracing", - "void", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] -name = "tor-general-addr" -version = "0.35.0" +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" + +[[package]] +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42cb5b5aec0584db2fba4a88c4e08fb09535ef61e4ef5674315a89e69ec31a2" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "derive_more", - "thiserror 2.0.18", - "void", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tor-guardmgr" -version = "0.35.0" +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0585a83a4c56b4f31f6fa2965e2f9c490c9f4d29fba2fedb5a9ee71009f793c0" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "amplify", - "base64ct", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "dyn-clone", - "educe", - "futures", - "humantime", - "humantime-serde", - "itertools 0.14.0", - "num_enum", - "oneshot-fused-workaround", - "pin-project", - "postage", - "rand 0.9.2", - "safelog", - "serde", - "strum", - "thiserror 2.0.18", - "tor-async-utils", - "tor-basic-utils", - "tor-config", - "tor-dircommon", - "tor-error", - "tor-linkspec", - "tor-llcrypto", - "tor-netdir", - "tor-netdoc", - "tor-persist", - "tor-proto", - "tor-relay-selection", - "tor-rtcompat", - "tor-units", - "tracing", + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys 0.61.2", ] [[package]] -name = "tor-hscrypto" -version = "0.35.0" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9ee6e0dbec9ba11c3d046181a42dd4759e108de38e2b5927689edbdc458a51" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "data-encoding", - "derive-deftly", - "derive_more", - "digest 0.10.7", - "hex", - "humantime", - "itertools 0.14.0", - "paste", - "rand 0.9.2", - "safelog", - "serde", - "signature", - "subtle", - "thiserror 2.0.18", - "tor-basic-utils", - "tor-bytes", - "tor-error", - "tor-key-forge", - "tor-llcrypto", - "tor-units", - "void", + "thiserror-impl 1.0.69", ] [[package]] -name = "tor-key-forge" -version = "0.35.0" +name = "thiserror" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa30066b80ade55a1b88a82b5320dfc50d1724918ad614ded8ecb4820c32062" +checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" dependencies = [ - "derive-deftly", - "derive_more", - "downcast-rs", - "paste", - "rand 0.9.2", - "rsa", - "signature", - "ssh-key", - "thiserror 2.0.18", - "tor-bytes", - "tor-cert", - "tor-checkable", - "tor-error", - "tor-llcrypto", + "thiserror-impl 2.0.18", ] [[package]] -name = "tor-keymgr" -version = "0.35.0" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e331dede46246977ae6722888329a60ef446df437f1a13ad2addcdff840692cc" -dependencies = [ - "amplify", - "arrayvec", - "cfg-if", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "downcast-rs", - "dyn-clone", - "fs-mistrust", - "glob-match", - "humantime", - "inventory", - "itertools 0.14.0", - "rand 0.9.2", - "safelog", - "serde", - "signature", - "ssh-key", - "thiserror 2.0.18", - "tor-basic-utils", - "tor-bytes", - "tor-config", - "tor-config-path", - "tor-error", - "tor-hscrypto", - "tor-key-forge", - "tor-llcrypto", - "tor-persist", - "tracing", - "visibility", - "walkdir", - "zeroize", +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tor-linkspec" -version = "0.35.0" +name = "thiserror-impl" +version = "2.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9daa8b71777ecf02d317c200e96fd777d3668ddac4fc2fe3054216429b7917f" +checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ - "base64ct", - "by_address", - "caret", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "hex", - "itertools 0.14.0", - "safelog", - "serde", - "serde_with", - "strum", - "thiserror 2.0.18", - "tor-basic-utils", - "tor-bytes", - "tor-config", - "tor-llcrypto", - "tor-memquota", - "tor-protover", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tor-llcrypto" -version = "0.35.0" +name = "time" +version = "0.3.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95cb3920ea326ba2bb7c2674293655d045a1112eb93cc8ddcbf948bb59307a97" +checksum = "35e7868883861bd0e56d9ac6efcaaca0d6d5d82a2a7ec8209ff492c07cf37b21" dependencies = [ - "aes", - "base64ct", - "ctr", - "curve25519-dalek", - "der-parser", - "derive-deftly", - "derive_more", - "digest 0.10.7", - "ed25519-dalek", - "educe", - "getrandom 0.3.4", - "hex", - "rand 0.9.2", - "rand_chacha 0.9.0", - "rand_core 0.6.4", - "rand_core 0.9.5", - "rand_jitter", - "rdrand", - "rsa", - "safelog", + "deranged", + "itoa", + "num-conv", + "powerfmt", "serde", - "sha1", - "sha2 0.10.9", - "sha3", - "signature", - "subtle", - "thiserror 2.0.18", - "tor-error", - "tor-memquota", - "visibility", - "x25519-dalek", - "zeroize", + "time-core", + "time-macros", ] [[package]] -name = "tor-log-ratelim" -version = "0.35.0" +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "845d65304be6a614198027c4b2d1b35aaf073335c26df619d17e5f4027f2657f" +checksum = "2834e6017e3e5e4b9834939793b282bc03b37a3336245fa820e35e233e2a85de" dependencies = [ - "futures", - "humantime", - "thiserror 2.0.18", - "tor-error", - "tor-rtcompat", - "tracing", - "weak-table", + "num-conv", + "time-core", ] [[package]] -name = "tor-memquota" -version = "0.35.0" +name = "tinyvec" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef375c3442a4ea74f0b6bf91a3eed660d55301b2e2f59b366aba4849b2321a6f" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ - "cfg-if", - "derive-deftly", - "derive_more", - "dyn-clone", - "educe", - "futures", - "itertools 0.14.0", - "paste", - "pin-project", - "serde", - "slotmap-careful", - "static_assertions", - "sysinfo", - "thiserror 2.0.18", - "tor-async-utils", - "tor-basic-utils", - "tor-config", - "tor-error", - "tor-log-ratelim", - "tor-rtcompat", - "tracing", - "void", + "tinyvec_macros", ] [[package]] -name = "tor-netdir" -version = "0.35.0" +name = "tinyvec_macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "638b4e6507e3786488859d3c463fa73addbad4f788806c6972603727e527672e" -dependencies = [ - "async-trait", - "bitflags 2.11.0", - "derive_more", - "futures", - "humantime", - "itertools 0.14.0", - "num_enum", - "rand 0.9.2", - "serde", - "strum", - "thiserror 2.0.18", - "tor-basic-utils", - "tor-error", - "tor-linkspec", - "tor-llcrypto", - "tor-netdoc", - "tor-protover", - "tor-units", - "tracing", - "typed-index-collections", -] +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "tor-netdoc" -version = "0.35.0" +name = "tokio" +version = "1.50.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dbc32d89e7ea2e2799168d0c453061647a727e39fc66f52e1bcb4c38c8dc433" +checksum = "27ad5e34374e03cfffefc301becb44e9dc3c17584f414349ebe29ed26661822d" dependencies = [ - "amplify", - "base64ct", - "bitflags 2.11.0", - "cipher", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "digest 0.10.7", - "educe", - "hex", - "humantime", - "itertools 0.14.0", - "memchr", - "paste", - "phf", - "serde", - "serde_with", - "signature", - "smallvec", - "strum", - "subtle", - "thiserror 2.0.18", - "time", - "tinystr", - "tor-basic-utils", - "tor-bytes", - "tor-cell", - "tor-cert", - "tor-checkable", - "tor-error", - "tor-llcrypto", - "tor-protover", - "void", - "weak-table", - "zeroize", + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "tokio-macros", + "windows-sys 0.61.2", ] [[package]] -name = "tor-persist" -version = "0.35.0" +name = "tokio-macros" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59e41aea027686b05f21e0ad75aa2c0c9681a87f2f3130b6d6f7a7a8c06edd7b" +checksum = "5c55a2eff8b69ce66c84f85e1da1c233edc36ceb85a2058d11b0d6a3c7e7569c" dependencies = [ - "derive-deftly", - "derive_more", - "filetime", - "fs-mistrust", - "fslock", - "futures", - "itertools 0.14.0", - "oneshot-fused-workaround", - "paste", - "sanitize-filename", - "serde", - "serde_json", - "thiserror 2.0.18", - "time", - "tor-async-utils", - "tor-basic-utils", - "tor-error", - "tracing", - "void", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tor-proto" -version = "0.35.0" +name = "tokio-rustls" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b95119789898b1b12e8f487745b70215e9f7d3df7c23325e4901ae65aec9703b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "amplify", - "asynchronous-codec", - "bitvec", - "bytes", - "caret", - "cfg-if", - "cipher", - "coarsetime", - "criterion-cycles-per-byte", - "derive-deftly", - "derive_builder_fork_arti", - "derive_more", - "digest 0.10.7", - "educe", - "enum_dispatch", - "futures", - "futures-util", - "hkdf", - "hmac 0.12.1", - "itertools 0.14.0", - "nonany", - "oneshot-fused-workaround", - "pin-project", - "postage", - "rand 0.9.2", - "rand_core 0.9.5", - "safelog", - "slotmap-careful", - "smallvec", - "static_assertions", - "subtle", - "sync_wrapper", - "thiserror 2.0.18", + "rustls", "tokio", - "tokio-util", - "tor-async-utils", - "tor-basic-utils", - "tor-bytes", - "tor-cell", - "tor-cert", - "tor-checkable", - "tor-config", - "tor-error", - "tor-linkspec", - "tor-llcrypto", - "tor-log-ratelim", - "tor-memquota", - "tor-protover", - "tor-rtcompat", - "tor-rtmock", - "tor-units", - "tracing", - "typenum", - "visibility", - "void", - "zeroize", ] [[package]] -name = "tor-protover" -version = "0.35.0" +name = "tokio-stream" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "484dc40a0ea58e8cc809ca2faf4df010327f7089ceafa6c8781a767260a34f6e" +checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" dependencies = [ - "caret", - "paste", - "serde_with", - "thiserror 2.0.18", - "tor-bytes", + "futures-core", + "pin-project-lite", + "tokio", ] [[package]] -name = "tor-relay-selection" -version = "0.35.0" +name = "tokio-util" +version = "0.7.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54cc2b365bf5881b4380059e0636cc40e1fa18a1b3b050f78ce322c95139d467" +checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" dependencies = [ - "rand 0.9.2", - "serde", - "tor-basic-utils", - "tor-linkspec", - "tor-netdir", - "tor-netdoc", + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", ] [[package]] -name = "tor-rtcompat" -version = "0.35.0" +name = "tonic" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "591b0b0695e86c2958b8ab9c431f6fea17b544ef3ed3931bbfe96239fd5c9193" +checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" dependencies = [ "async-trait", - "async_executors", - "asynchronous-codec", - "coarsetime", - "derive_more", - "dyn-clone", - "educe", - "futures", - "futures-rustls", - "hex", - "libc", - "paste", + "axum", + "base64", + "bytes", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-timeout", + "hyper-util", + "percent-encoding", "pin-project", - "rustls-pki-types", - "rustls-webpki", - "thiserror 2.0.18", + "socket2", + "sync_wrapper", "tokio", - "tokio-util", - "tor-error", - "tor-general-addr", + "tokio-rustls", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", "tracing", - "void", + "webpki-roots", ] [[package]] -name = "tor-rtmock" -version = "0.35.0" +name = "tonic-build" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cdbf415d79f7a4d2a502039645a39d8bf0ff8af715e588575ac812b2baa7a91" +checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" dependencies = [ - "amplify", - "assert_matches", - "async-trait", - "derive-deftly", - "derive_more", - "educe", - "futures", - "humantime", - "itertools 0.14.0", - "oneshot-fused-workaround", - "pin-project", - "priority-queue", - "slotmap-careful", - "strum", - "thiserror 2.0.18", - "tor-error", - "tor-general-addr", - "tor-rtcompat", - "tracing", - "tracing-test", - "void", + "prettyplease", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tor-socksproto" -version = "0.35.0" +name = "tonic-prost" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dbb9b68d9cf8e07eeafbca91ac11b7d9c4be1e674cb59830edfbac153333e7f" +checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" dependencies = [ - "amplify", - "caret", - "derive-deftly", - "educe", - "safelog", - "subtle", - "thiserror 2.0.18", - "tor-bytes", - "tor-error", + "bytes", + "prost", + "tonic", ] [[package]] -name = "tor-units" -version = "0.35.0" +name = "tonic-prost-build" +version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48139f001dd6f409325b7c190ebcea1033b27f09042543946ab7aa4ad286257b" +checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" dependencies = [ - "derive-deftly", - "derive_more", - "serde", - "thiserror 2.0.18", - "tor-memquota", + "prettyplease", + "proc-macro2", + "prost-build", + "prost-types", + "quote", + "syn", + "tempfile", + "tonic-build", ] [[package]] @@ -5521,7 +2259,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5531,68 +2269,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ "once_cell", - "valuable", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f30143827ddab0d256fd843b7a66d164e9f271cfa0dde49142c5ca0ca291f1e" -dependencies = [ - "matchers", - "nu-ansi-term", - "once_cell", - "regex-automata", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "tracing-test" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19a4c448db514d4f24c5ddb9f73f2ee71bfb24c526cf0c570ba142d1119e0051" -dependencies = [ - "tracing-core", - "tracing-subscriber", - "tracing-test-macro", -] - -[[package]] -name = "tracing-test-macro" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad06847b7afb65c7866a36664b75c40b895e318cea4f71299f013fb22965329d" -dependencies = [ - "quote", - "syn 2.0.117", -] - -[[package]] -name = "trait-variant" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70977707304198400eb4835a78f6a9f928bf41bba420deb8fdb175cd965d77a7" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", ] [[package]] @@ -5601,16 +2277,6 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" -[[package]] -name = "typed-index-collections" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "898160f1dfd383b4e92e17f0512a7d62f3c51c44937b23b6ffc3a1614a8eaccd" -dependencies = [ - "bincode", - "serde", -] - [[package]] name = "typenum" version = "1.19.0" @@ -5629,27 +2295,12 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "uncased" -version = "0.9.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1b88fcfe09e89d3866a5c11019378088af2d24c3fbd4f0543f96b479ec90697" -dependencies = [ - "version_check", -] - [[package]] name = "unicode-ident" version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" -[[package]] -name = "unicode-segmentation" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" - [[package]] name = "unicode-xid" version = "0.2.6" @@ -5662,33 +2313,15 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" dependencies = [ - "crypto-common 0.1.7", - "subtle", -] - -[[package]] -name = "untrusted" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" - -[[package]] -name = "unty" -version = "0.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d49784317cd0d1ee7ec5c716dd598ec5b4483ea832a2dced265471cc0f690ae" - -[[package]] -name = "valuable" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" + "crypto-common 0.1.7", + "subtle", +] [[package]] -name = "vcpkg" -version = "0.2.15" +name = "untrusted" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "version_check" @@ -5704,23 +2337,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "walkdir" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" -dependencies = [ - "same-file", - "winapi-util", + "syn", ] [[package]] @@ -5756,60 +2373,6 @@ dependencies = [ "wit-bindgen", ] -[[package]] -name = "wasix" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1757e0d1f8456693c7e5c6c629bdb54884e032aa0bb53c155f6a39f94440d332" -dependencies = [ - "wasi", -] - -[[package]] -name = "wasm-bindgen" -version = "0.2.113" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "60722a937f594b7fde9adb894d7c092fc1bb6612897c46368d18e7a20208eff2" -dependencies = [ - "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-macro" -version = "0.2.113" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac8c6395094b6b91c4af293f4c79371c163f9a6f56184d2c9a85f5a95f3950" -dependencies = [ - "quote", - "wasm-bindgen-macro-support", -] - -[[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.113" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3fabce6159dc20728033842636887e4877688ae94382766e00b180abac9d60" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.117", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.113" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de0e091bdb824da87dc01d967388880d017a0a9bc4f3bdc0d86ee9f9336e3bb5" -dependencies = [ - "unicode-ident", -] - [[package]] name = "wasm-encoder" version = "0.244.0" @@ -5838,28 +2401,12 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags", "hashbrown 0.15.5", "indexmap 2.13.0", "semver", ] -[[package]] -name = "weak-table" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "323f4da9523e9a669e1eaf9c6e763892769b1d38c623913647bfdc1532fe4549" - -[[package]] -name = "web-sys" -version = "0.3.90" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "705eceb4ce901230f8625bd1d665128056ccbe4b7408faa625eec1ba80f59a97" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - [[package]] name = "webpki-roots" version = "1.0.6" @@ -5871,201 +2418,26 @@ dependencies = [ [[package]] name = "which" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fabb953106c3c8eea8306e4393700d7657561cb43122571b172bbfb7c7ba1d" -dependencies = [ - "env_home", - "rustix", - "winsafe", -] - -[[package]] -name = "winapi" -version = "0.3.9" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-util" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows" -version = "0.61.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" -dependencies = [ - "windows-collections", - "windows-core 0.61.2", - "windows-future", - "windows-link 0.1.3", - "windows-numerics", -] - -[[package]] -name = "windows-collections" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" -dependencies = [ - "windows-core 0.61.2", -] - -[[package]] -name = "windows-core" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.1.3", - "windows-result 0.3.4", - "windows-strings 0.4.2", -] - -[[package]] -name = "windows-core" -version = "0.62.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" -dependencies = [ - "windows-implement", - "windows-interface", - "windows-link 0.2.1", - "windows-result 0.4.1", - "windows-strings 0.5.1", -] - -[[package]] -name = "windows-future" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", - "windows-threading", -] - -[[package]] -name = "windows-implement" -version = "0.60.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "windows-interface" -version = "0.59.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "libc", ] -[[package]] -name = "windows-link" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" - [[package]] name = "windows-link" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" -[[package]] -name = "windows-numerics" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" -dependencies = [ - "windows-core 0.61.2", - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link 0.2.1", -] - -[[package]] -name = "windows-strings" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" -dependencies = [ - "windows-link 0.1.3", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link 0.2.1", -] - [[package]] name = "windows-sys" version = "0.52.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" 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.5", + "windows-targets", ] [[package]] @@ -6074,7 +2446,7 @@ version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "windows-link 0.2.1", + "windows-link", ] [[package]] @@ -6083,40 +2455,14 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" dependencies = [ - "windows_aarch64_gnullvm 0.52.6", - "windows_aarch64_msvc 0.52.6", - "windows_i686_gnu 0.52.6", - "windows_i686_gnullvm 0.52.6", - "windows_i686_msvc 0.52.6", - "windows_x86_64_gnu 0.52.6", - "windows_x86_64_gnullvm 0.52.6", - "windows_x86_64_msvc 0.52.6", -] - -[[package]] -name = "windows-targets" -version = "0.53.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" -dependencies = [ - "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]] -name = "windows-threading" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" -dependencies = [ - "windows-link 0.1.3", + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", ] [[package]] @@ -6125,111 +2471,48 @@ version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" - [[package]] name = "windows_aarch64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" -[[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" - [[package]] name = "windows_i686_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" -[[package]] -name = "windows_i686_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" - [[package]] name = "windows_i686_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" -[[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" - [[package]] name = "windows_i686_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" -[[package]] -name = "windows_i686_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" - [[package]] name = "windows_x86_64_gnu" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" -[[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" - [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" - [[package]] name = "windows_x86_64_msvc" version = "0.52.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" -[[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" - -[[package]] -name = "winnow" -version = "0.7.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5364e9d77fcdeeaa6062ced926ee3381faa2ee02d3eb83a5c27a8825540829" -dependencies = [ - "memchr", -] - -[[package]] -name = "winsafe" -version = "0.0.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" - [[package]] name = "wit-bindgen" version = "0.51.0" @@ -6260,7 +2543,7 @@ dependencies = [ "heck", "indexmap 2.13.0", "prettyplease", - "syn 2.0.117", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -6276,7 +2559,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -6288,7 +2571,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags", "indexmap 2.13.0", "log", "serde", @@ -6327,18 +2610,6 @@ dependencies = [ "tap", ] -[[package]] -name = "x25519-dalek" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" -dependencies = [ - "curve25519-dalek", - "rand_core 0.6.4", - "serde", - "zeroize", -] - [[package]] name = "x509-parser" version = "0.18.1" @@ -6372,53 +2643,37 @@ dependencies = [ [[package]] name = "zcash_client_backend" -version = "0.21.0" +version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5493217c813ba1f7ef4e6b6bf846f4e4cd57b6a070d679c9f15d2477e12d1464" +checksum = "d2b5eca509a516dbd9e4d13c1f5befd6d9fa25c7e62460444ef1b3f62122f323" dependencies = [ - "arti-client", "base64", "bech32", "bls12_381", "bs58", "crossbeam-channel", "document-features", - "dynosaur", - "fs-mistrust", - "futures-util", "getset", "group", "hex", - "http-body-util", - "hyper", "hyper-util", "incrementalmerkletree", "memuse", "nonempty", "percent-encoding", "prost", - "rand 0.8.5", - "rand_core 0.6.4", + "rand_core", "rayon", - "rust_decimal", "sapling-crypto", "secrecy", - "serde", - "serde_json", "shardtree", "subtle", "time", "time-core", - "tokio", - "tokio-rustls", "tonic", "tonic-prost", "tonic-prost-build", - "tor-rtcompat", - "tower", "tracing", - "trait-variant", - "webpki-roots", "which", "zcash_address", "zcash_encoding", @@ -6457,7 +2712,7 @@ dependencies = [ "group", "memuse", "nonempty", - "rand_core 0.6.4", + "rand_core", "sapling-crypto", "secrecy", "subtle", @@ -6478,7 +2733,7 @@ dependencies = [ "chacha20", "chacha20poly1305", "cipher", - "rand_core 0.6.4", + "rand_core", "subtle", ] @@ -6506,8 +2761,8 @@ dependencies = [ "memuse", "nonempty", "orchard", - "rand 0.8.5", - "rand_core 0.6.4", + "rand", + "rand_core", "redjubjub", "ripemd 0.1.3", "sapling-crypto", @@ -6543,7 +2798,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6ef9d04e0434a80b62ad06c5a610557be358ef60a98afa5dbc8ecaf19ad72e7" dependencies = [ "bip32", - "bitflags 2.11.0", + "bitflags", "bounded-vec", "hex", "ripemd 0.1.3", @@ -6590,30 +2845,24 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.39" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db6d35d663eadb6c932438e763b262fe1a70987f9ae936e60158176d710cae4a" +checksum = "efbb2a062be311f2ba113ce66f697a4dc589f85e78a4aea276200804cea0ed87" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.39" +version = "0.8.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4122cd3169e94605190e77839c9a40d40ed048d305bfdc146e7df40ab0f3e517" +checksum = "0e8bc7269b54418e7aeeef514aa68f8690b8c0489a06b0136e5f57c4c5ccab89" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" - [[package]] name = "zeroize" version = "1.8.2" @@ -6631,32 +2880,24 @@ checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "serde", - "zerofrom", + "syn", ] [[package]] name = "zingo-netutils" -version = "2.0.2" +version = "4.0.0" dependencies = [ "http", "http-body-util", "hyper", "hyper-rustls", "hyper-util", + "lightwallet-protocol", "rustls-pemfile", "thiserror 1.0.69", "tokio", "tokio-rustls", + "tokio-stream", "tonic", "x509-parser", "zcash_client_backend", @@ -6697,31 +2938,3 @@ name = "zmij" version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa" - -[[package]] -name = "zstd" -version = "0.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e91ee311a569c327171651566e07972200e76fcfe2242a4fa446149a3881c08a" -dependencies = [ - "zstd-safe", -] - -[[package]] -name = "zstd-safe" -version = "7.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f49c4d5f0abb602a93fb8736af2a4f4dd9512e36f7f570d66e65ff867ed3b9d" -dependencies = [ - "zstd-sys", -] - -[[package]] -name = "zstd-sys" -version = "2.0.16+zstd.1.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" -dependencies = [ - "cc", - "pkg-config", -] diff --git a/Cargo.toml b/Cargo.toml index 1996785..64aa76a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,14 +8,16 @@ package.edition = "2024" http = "1.1.0" hyper-util = "0.1.20" hyper = { version = "1" } -hyper-rustls = { version = "0.27" } +hyper-rustls = { version = "0.27", default-features = false, features = ["ring", "http1", "tls12", "logging", "native-tokio"] } http-body-util = "0.1.3" rustls-pemfile = "2" -tokio-rustls = "0.26" +tokio-rustls = { version = "0.26", default-features = false, features = ["ring", "logging", "tls12"] } tokio = { version = "1" } tonic = { version = "0.14.4", features = ["tls-webpki-roots"] } # error thiserror = "1.0.64" x509-parser = "0.18" -zcash_client_backend = "0.21" +lightwallet-protocol = "0.3.0" +tokio-stream = "0.1" +zcash_client_backend = { version = "0.21", features = ["lightwalletd-tonic"] } diff --git a/zingo-netutils/CHANGELOG.md b/zingo-netutils/CHANGELOG.md index f1a1941..9721eea 100644 --- a/zingo-netutils/CHANGELOG.md +++ b/zingo-netutils/CHANGELOG.md @@ -5,33 +5,88 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [Unreleased] - -### Deprecated +## [4.0.0] ### Added +- `Indexer` trait covering the full `CompactTxStreamer` gRPC service: + `get_info`, `get_latest_block`, `send_transaction`, `get_tree_state`, + `get_block`, `get_block_range`, `get_transaction`, `get_mempool_tx`, + `get_mempool_stream`, `get_latest_tree_state`, `get_subtree_roots`. +- `TransparentIndexer: Indexer` sub-trait in `src/globally_public.rs` + for transparent address methods: `get_taddress_txids` (deprecated), + `get_taddress_transactions`, `get_taddress_balance`, + `get_taddress_balance_stream` (client-streaming via `Vec
`), + `get_address_utxos`, `get_address_utxos_stream`. +- `Indexer::ping()` method for server latency testing. +- Per-method error enums for every trait method (`src/error.rs`), each + with `GetClientError` (connection) and a method-specific `tonic::Status` + variant. `SendTransactionError` adds `SendRejected`. All bounded by + `std::error::Error`. +- `TransparentIndexer` per-method error enums in `error::transparent` + submodule (gated by `globally-public-transparent`). +- Unit test suite for every error enum variant (`error::tests`, + `error::transparent::tests`). +- Doc-test on every error enum proving the contract (`From` conversions, + variant matching). Feature-gated doc-tests use `#[cfg]` so + `cargo test --doc` passes with or without features. +- `GrpcIndexer` struct implementing `Indexer` (and `TransparentIndexer`) + over gRPC. Validates URI at construction (`new` returns `Result`) and + pre-builds the TLS endpoint. +- `get_client` inherent method on `GrpcIndexer` returning + `CompactTxStreamerClient` from `lightwallet_protocol`. +- `pub use lightwallet_protocol` re-export so consumers can access proto + types via `zingo_netutils::lightwallet_protocol::*`. +- Feature gates (all off by default): + - `globally-public-transparent` — `TransparentIndexer` sub-trait and + `GrpcIndexer` implementation. Pulls in `tokio-stream`. + - `ping-very-insecure` — `Indexer::ping()`. Name mirrors the + lightwalletd `--ping-very-insecure` CLI flag required server-side. + - `back_compatible` — `GrpcIndexer::get_zcb_client()` returning + `zcash_client_backend`'s `CompactTxStreamerClient` for + pepper-sync compatibility. +- Deprecated trait methods: `get_block_nullifiers`, + `get_block_range_nullifiers`, `get_taddress_txids`. +- Compile-time proto agreement tests (`src/proto_agreement.rs`): 20 + dead-code async functions that reference both the generated client + method and the trait method with explicit type annotations. If either + side drifts, compilation fails. +- Integration test `get_block_range_supports_descending_order` verifying + descending block range ordering against a public indexer. + ### Changed -- Support for Zebra 4.1.0 through `zebra-chain = "5.0"` -- Bump `tonic` from `0.13` to `0.14`, with `tls-webpki-roots` enabled. -- **Breaking:** Replace `GrpcConnector` struct with free function `get_client(uri: http::Uri)`. - Callers must change `GrpcConnector::new(uri).get_client().await` to `get_client(uri).await`. -- **Breaking:** `get_client` now returns `CompactTxStreamerClient` instead of - `CompactTxStreamerClient`. TLS and transport are handled internally - by tonic. -- **Breaking:** `GetClientError` gains a `Transport` variant (wrapping `tonic::transport::Error`). +- **Breaking:** Replace `zcash_client_backend` with `lightwallet-protocol` + for all proto-generated types. Consumers must update imports. +- **Breaking:** `GrpcIndexer::new(uri)` now returns `Result` + (validates scheme and authority at construction). +- **Breaking:** `uri()` returns `&http::Uri` (not `Option`). +- **Breaking:** Per-method error types (`GetInfoError`, `GetLatestBlockError`, + `SendTransactionError`, `GetTreeStateError`) replace the single + `GrpcIndexerError`. +- **Breaking:** Renamed `get_trees` to `get_tree_state`; now takes + `BlockId` instead of `u64`, matching the proto (`GetTreeState(BlockID)`). +- **Breaking:** Renamed `GetTreesError` to `GetTreeStateError`. +- `get_block_range` documents both ascending (`start <= end`) and + descending (`start > end`) ordering per the proto spec. +- Bump `tonic` to `0.14`, `lightwallet-protocol` to `0.3`. +- `hyper`, `hyper-rustls`, `hyper-util` moved from dependencies to + dev-dependencies. +- `cargo doc` requires `--all-features` for intra-doc links to + feature-gated items (`TransparentIndexer`, `Indexer::ping`, + `GrpcIndexer::get_zcb_client`). ### Removed -- `client` module and `client_from_connector` utility function. -- `http-body` dependency. -- `GrpcConnector` struct, `GrpcConnector::new()`, and `GrpcConnector::uri()`. -- `UnderlyingService` type alias (`BoxCloneService<...>`). -- Manual URI rewrite logic (scheme/authority injection into requests); now handled - internally by tonic's `Endpoint`. -- Direct dependencies on `tower` and `webpki-roots` (TLS root certs now provided by - tonic's `tls-webpki-roots` feature). +- `zcash_client_backend` dependency (available optionally via + `back_compatible`). +- `set_uri`, `disconnect`, `disconnected` methods. +- `GrpcIndexerError` unified error type. +- `GetClientError::NoUri` variant. +- `Option` internal state — `GrpcIndexer` always holds a valid URI. +- `client` module, `GrpcConnector`, `UnderlyingService`, free `get_client` + function. +- Direct dependencies on `tower`, `webpki-roots`, `zebra-chain`. ## [1.1.0] diff --git a/zingo-netutils/Cargo.toml b/zingo-netutils/Cargo.toml index b1f92d3..ae88070 100644 --- a/zingo-netutils/Cargo.toml +++ b/zingo-netutils/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "zingo-netutils" -version = "2.0.2" +version = "4.0.0" description = "network utility crate" authors = ["zingo@zingolabs.org"] edition.workspace = true @@ -13,20 +13,24 @@ maintenance = { status = "actively-developed" } [dependencies] http.workspace = true -hyper-rustls.workspace = true -hyper-util.workspace = true -hyper.workspace = true thiserror.workspace = true tokio-rustls.workspace = true tonic.workspace = true +lightwallet-protocol.workspace = true +tokio-stream = { workspace = true, optional = true } +zcash_client_backend = { workspace = true, optional = true } -zcash_client_backend = { workspace = true, features = [ - "lightwalletd-tonic", - "tor", -] } +[features] +globally-public-transparent = ["dep:tokio-stream"] +ping-very-insecure = [] +back_compatible = ["dep:zcash_client_backend"] [dev-dependencies] +tokio-stream.workspace = true +hyper-rustls.workspace = true +hyper-util.workspace = true +hyper.workspace = true rustls-pemfile.workspace = true tokio.workspace = true http-body-util.workspace = true -x509-parser = { workspace = true } +x509-parser.workspace = true diff --git a/zingo-netutils/README.md b/zingo-netutils/README.md index d565a46..92eec65 100644 --- a/zingo-netutils/README.md +++ b/zingo-netutils/README.md @@ -1,39 +1,204 @@ # zingo-netutils -Network utilities for connecting to Zcash light-wallet indexers (`lightwalletd` / `zainod`). +A complete `Indexer` abstraction for communicating with Zcash chain indexers +(`lightwalletd` / `zainod`). -## Overview +## Organizing principle -This crate provides a single async entry point, `get_client`, that returns a -ready-to-use gRPC `CompactTxStreamerClient`. TLS, HTTP/2 enforcement, and -webpki root certificates are handled internally so callers only need to supply -a URI. +This crate defines the **`Indexer` trait** -- the sole interface a Zcash +wallet or tool needs to query, sync, and broadcast against a chain indexer. +The trait is implementation-agnostic: production code uses the provided +`GrpcIndexer` (gRPC over tonic), while tests can supply a mock implementor +with no network dependency. + +All proto types are provided by +[`lightwallet-protocol`](https://crates.io/crates/lightwallet-protocol) +and re-exported via `pub use lightwallet_protocol` so consumers do not need +an additional dependency. ## Usage ```rust -use zingo_netutils::get_client; +use zingo_netutils::{GrpcIndexer, Indexer}; + +let uri: http::Uri = "https://zec.rocks:443".parse().unwrap(); +let indexer = GrpcIndexer::new(uri)?; + +let info = indexer.get_info().await?; +let tip = indexer.get_latest_block().await?; +``` + +`GrpcIndexer::new` validates the URI (scheme must be `http` or `https`, +authority must be present) and pre-builds the TLS endpoint. It returns +`Result` -- there is no invalid-state representation. + +## Backwards compatibility + +Code that needs a raw `CompactTxStreamerClient` (e.g. pepper-sync) +can still obtain one: + +```rust +// Using lightwallet-protocol types (preferred) +let client = indexer.get_client().await?; -let uri = "https://mainnet.zainod.com:9067".parse().unwrap(); -let mut client = get_client(uri).await?; +// Using zcash_client_backend types (migration aid) +// Requires: zingo-netutils = { features = ["back_compatible"] } +let client = indexer.get_zcb_client().await?; ``` +The `back_compatible` feature brings in `zcash_client_backend` as an +optional dependency and exposes `get_zcb_client()`, which returns +`zcash_client_backend`'s `CompactTxStreamerClient`. This is a +bridge for consumers that have not yet migrated to `lightwallet-protocol` +types. + +## Feature gates + +All features are **off by default**. + +| Feature | What it enables | +|---|---| +| `globally-public-transparent` | `TransparentIndexer` sub-trait: t-address balance, transaction history, and UTXO queries. Requires `tokio-stream`. | +| `ping-very-insecure` | `Indexer::ping()` method. Name mirrors the lightwalletd `--ping-very-insecure` CLI flag required server-side. Testing only. | +| `back_compatible` | `GrpcIndexer::get_zcb_client()` returning `zcash_client_backend`'s client type for pepper-sync compatibility. | + ## Error handling -`get_client` returns a `GetClientError` with the following variants: +Every trait method has a dedicated error enum (defined in `src/error.rs`). +Each enum has two variants: + +- `GetClientError(GetClientError)` — the connection was never established. + `InvalidScheme` and `InvalidAuthority` are deterministic; `Transport` + may be transient and retryable. +- A method-specific gRPC variant wrapping `tonic::Status` — the server + received the request but returned an error. + +`SendTransactionError` adds a third variant, `SendRejected(String)`, for +transactions the server evaluated and rejected (not retryable with the +same bytes). + +All error types are bounded by `std::error::Error`. Transparent method +errors live in `error::transparent` (gated by `globally-public-transparent`). + +Every error enum has a doc-test proving the contract: `From` +produces the connection variant, `From` produces the +method-specific variant. Feature-gated doc-tests use `#[cfg]` so +`cargo test --doc` passes with or without features, and assertions +execute when the feature is enabled. -| Variant | Cause | -|----------------------|-----------------------------------------| -| `InvalidScheme` | URI scheme is not `http` or `https` | -| `InvalidAuthority` | URI has no host/authority component | -| `InvalidPathAndQuery`| URI contains an unexpected path / query | -| `Transport` | Underlying tonic transport failure | +| Error type | Used by | +|---|---| +| `GetClientError` | `GrpcIndexer::new`, `get_client`, embedded in every method error | +| `GetInfoError` | `get_info` | +| `GetLatestBlockError` | `get_latest_block` | +| `SendTransactionError` | `send_transaction` | +| `GetTreeStateError` | `get_tree_state` | +| `GetBlockError` | `get_block` | +| `GetBlockNullifiersError` | `get_block_nullifiers` | +| `GetBlockRangeError` | `get_block_range` | +| `GetBlockRangeNullifiersError` | `get_block_range_nullifiers` | +| `GetTransactionError` | `get_transaction` | +| `GetMempoolTxError` | `get_mempool_tx` | +| `GetMempoolStreamError` | `get_mempool_stream` | +| `GetLatestTreeStateError` | `get_latest_tree_state` | +| `GetSubtreeRootsError` | `get_subtree_roots` | +| `PingError` | `ping` | +| `GetTaddressTxidsError` | `get_taddress_txids` | +| `GetTaddressTransactionsError` | `get_taddress_transactions` | +| `GetTaddressBalanceError` | `get_taddress_balance` | +| `GetTaddressBalanceStreamError` | `get_taddress_balance_stream` | +| `GetAddressUtxosError` | `get_address_utxos` | +| `GetAddressUtxosStreamError` | `get_address_utxos_stream` | + +## Building docs + +Docs must be built with `--all-features` so intra-doc links to +feature-gated items resolve: + +```sh +RUSTDOCFLAGS="-D warnings" cargo doc --all-features --document-private-items +``` ## TLS HTTPS connections use rustls with webpki root certificates (via tonic's `tls-webpki-roots` feature). No system OpenSSL installation is required. +## gRPC endpoint audit + +Every `CompactTxStreamer` RPC from `walletrpc/service.proto` is covered. +The table below shows the mapping between proto RPCs and trait methods. + +### Exact matches (13) + +| Proto RPC | Trait method | Input | Output | +|---|---|---|---| +| `GetTreeState(BlockID)` | `get_tree_state(BlockId)` | `BlockId` | `TreeState` | +| `GetBlock(BlockID)` | `get_block(BlockId)` | `BlockId` | `CompactBlock` | +| `GetBlockNullifiers(BlockID)` | `get_block_nullifiers(BlockId)` | `BlockId` | `CompactBlock` | +| `GetBlockRange(BlockRange)` | `get_block_range(BlockRange)` | `BlockRange` | `Streaming` | +| `GetBlockRangeNullifiers(BlockRange)` | `get_block_range_nullifiers(BlockRange)` | `BlockRange` | `Streaming` | +| `GetTransaction(TxFilter)` | `get_transaction(TxFilter)` | `TxFilter` | `RawTransaction` | +| `GetTaddressTxids(TABF)` | `get_taddress_txids(TABF)` | `TABF` | `Streaming` | +| `GetTaddressTransactions(TABF)` | `get_taddress_transactions(TABF)` | `TABF` | `Streaming` | +| `GetTaddressBalance(AddressList)` | `get_taddress_balance(AddressList)` | `AddressList` | `Balance` | +| `GetMempoolTx(GetMempoolTxRequest)` | `get_mempool_tx(GetMempoolTxRequest)` | `GetMempoolTxRequest` | `Streaming` | +| `GetSubtreeRoots(GetSubtreeRootsArg)` | `get_subtree_roots(GetSubtreeRootsArg)` | `GetSubtreeRootsArg` | `Streaming` | +| `GetAddressUtxos(GetAddressUtxosArg)` | `get_address_utxos(GetAddressUtxosArg)` | `GetAddressUtxosArg` | `GetAddressUtxosReplyList` | +| `GetAddressUtxosStream(GetAddressUtxosArg)` | `get_address_utxos_stream(GetAddressUtxosArg)` | `GetAddressUtxosArg` | `Streaming` | +| `Ping(Duration)` | `ping(ProtoDuration)` | `ProtoDuration` | `PingResponse` | + +### Intentional divergences (7) + +| Proto RPC | Trait method | What diverges | Why | +|---|---|---|---| +| `GetLightdInfo(Empty)` | `get_info()` | Hides `Empty` arg | Ergonomic -- unit request type adds no information | +| `GetLatestBlock(ChainSpec)` | `get_latest_block()` | Hides `ChainSpec` arg | Same reason | +| `GetMempoolStream(Empty)` | `get_mempool_stream()` | Hides `Empty` arg | Same reason | +| `GetLatestTreeState(Empty)` | `get_latest_tree_state()` | Hides `Empty` arg | Same reason | +| `SendTransaction(RawTransaction)` | `send_transaction(Box<[u8]>)` | Abstracts input and output | Takes raw bytes, returns txid string -- decouples callers from proto | +| `GetTaddressBalanceStream(stream Address)` | `get_taddress_balance_stream(Vec
)` | `Vec` instead of client stream | Impl converts to stream internally; simpler call-site API | +| `Ping(Duration)` | `ping(ProtoDuration)` | Type alias | Avoids collision with `std::time::Duration` | + +### Compile-time enforcement + +The `proto_agreement` test module (`src/proto_agreement.rs`) contains 20 +dead-code async functions that reference both the generated +`CompactTxStreamerClient` method and the corresponding trait method with +explicit type annotations. If either side drifts from the proto, the +module fails to compile. + +### Full RPC / method / error audit + +Every proto RPC has a 1:1 trait method and a 1:1 error enum. + +| # | Proto RPC | Trait method | Error enum | +|---|---|---|---| +| 1 | `GetLightdInfo(Empty)` | `get_info` | `GetInfoError` | +| 2 | `GetLatestBlock(ChainSpec)` | `get_latest_block` | `GetLatestBlockError` | +| 3 | `SendTransaction(RawTransaction)` | `send_transaction` | `SendTransactionError` | +| 4 | `GetTreeState(BlockID)` | `get_tree_state` | `GetTreeStateError` | +| 5 | `GetBlock(BlockID)` | `get_block` | `GetBlockError` | +| 6 | `GetBlockNullifiers(BlockID)` | `get_block_nullifiers` | `GetBlockNullifiersError` | +| 7 | `GetBlockRange(BlockRange)` | `get_block_range` | `GetBlockRangeError` | +| 8 | `GetBlockRangeNullifiers(BlockRange)` | `get_block_range_nullifiers` | `GetBlockRangeNullifiersError` | +| 9 | `GetTransaction(TxFilter)` | `get_transaction` | `GetTransactionError` | +| 10 | `GetMempoolTx(GetMempoolTxRequest)` | `get_mempool_tx` | `GetMempoolTxError` | +| 11 | `GetMempoolStream(Empty)` | `get_mempool_stream` | `GetMempoolStreamError` | +| 12 | `GetLatestTreeState(Empty)` | `get_latest_tree_state` | `GetLatestTreeStateError` | +| 13 | `GetSubtreeRoots(GetSubtreeRootsArg)` | `get_subtree_roots` | `GetSubtreeRootsError` | +| 14 | `Ping(Duration)` | `ping` | `PingError` | +| 15 | `GetTaddressTxids(TABF)` | `get_taddress_txids` | `GetTaddressTxidsError` | +| 16 | `GetTaddressTransactions(TABF)` | `get_taddress_transactions` | `GetTaddressTransactionsError` | +| 17 | `GetTaddressBalance(AddressList)` | `get_taddress_balance` | `GetTaddressBalanceError` | +| 18 | `GetTaddressBalanceStream(stream Address)` | `get_taddress_balance_stream` | `GetTaddressBalanceStreamError` | +| 19 | `GetAddressUtxos(GetAddressUtxosArg)` | `get_address_utxos` | `GetAddressUtxosError` | +| 20 | `GetAddressUtxosStream(GetAddressUtxosArg)` | `get_address_utxos_stream` | `GetAddressUtxosStreamError` | + +All error enums share `GetClientError` (connection failure) as their first +variant. Each has a method-specific second variant wrapping `tonic::Status`. +`SendTransactionError` adds a third variant, `SendRejected(String)`. + ## License [MIT](LICENSE-MIT) diff --git a/zingo-netutils/src/error.rs b/zingo-netutils/src/error.rs new file mode 100644 index 0000000..02f501f --- /dev/null +++ b/zingo-netutils/src/error.rs @@ -0,0 +1,775 @@ +//! Error types for the [`Indexer`](super::Indexer) and +//! `TransparentIndexer` traits. +//! +//! Each trait method has a dedicated error enum so callers can +//! distinguish connection failures ([`GetClientError`]) from +//! server-side gRPC errors ([`tonic::Status`]). + +/// Connection-level error returned by [`GrpcIndexer::new`](super::GrpcIndexer::new) +/// and the connection phase of every trait method. +/// +/// Callers can depend on: +/// - `InvalidScheme` and `InvalidAuthority` are deterministic — retrying +/// with the same URI will always fail. +/// - `Transport` wraps a [`tonic::transport::Error`] and may be transient +/// (e.g. DNS resolution, TCP connect timeout). Retrying may succeed. +/// +/// ``` +/// use zingo_netutils::GetClientError; +/// +/// let e = GetClientError::InvalidScheme; +/// assert_eq!(e.to_string(), "bad uri: invalid scheme"); +/// +/// let e = GetClientError::InvalidAuthority; +/// assert_eq!(e.to_string(), "bad uri: invalid authority"); +/// +/// // Transport variant accepts From +/// let _: fn(tonic::transport::Error) -> GetClientError = GetClientError::from; +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetClientError { + #[error("bad uri: invalid scheme")] + InvalidScheme, + + #[error("bad uri: invalid authority")] + InvalidAuthority, + + #[error(transparent)] + Transport(#[from] tonic::transport::Error), +} + +#[cfg(test)] +mod get_client_error_tests { + use super::*; + + #[test] + fn invalid_scheme() { + let e = GetClientError::InvalidScheme; + assert!(matches!(e, GetClientError::InvalidScheme)); + assert_eq!(e.to_string(), "bad uri: invalid scheme"); + } + + #[test] + fn invalid_authority() { + let e = GetClientError::InvalidAuthority; + assert!(matches!(e, GetClientError::InvalidAuthority)); + assert_eq!(e.to_string(), "bad uri: invalid authority"); + } + + #[test] + fn transport_from_conversion() { + // Verify the From impl exists at compile time. + let _: fn(tonic::transport::Error) -> GetClientError = GetClientError::from; + } +} + +/// Error from the `get_info` (`GetLightdInfo`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetLightdInfoError` means the server received the request but +/// returned a gRPC status (e.g. `Unavailable`, `Internal`). +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetInfoError}; +/// +/// let e = GetInfoError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetInfoError::GetClientError(_))); +/// +/// let e = GetInfoError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetInfoError::GetLightdInfoError(_))); +/// assert!(e.to_string().contains("oops")); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetInfoError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetLightdInfoError(#[from] tonic::Status), +} + +/// Error from the `get_latest_block` (`GetLatestBlock`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetLatestBlockError` means the server returned a gRPC status. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetLatestBlockError}; +/// +/// let e = GetLatestBlockError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetLatestBlockError::GetClientError(_))); +/// +/// let e = GetLatestBlockError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetLatestBlockError::GetLatestBlockError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetLatestBlockError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetLatestBlockError(#[from] tonic::Status), +} + +/// Error from the `send_transaction` (`SendTransaction`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `SendTransactionError` means the server returned a gRPC status +/// before evaluating the transaction. +/// - `SendRejected` means the server received and evaluated the +/// transaction but rejected it (e.g. duplicate, invalid). The string +/// contains the server's rejection reason. This is **not** retryable +/// with the same transaction bytes. +/// +/// ``` +/// use zingo_netutils::{GetClientError, SendTransactionError}; +/// +/// let e = SendTransactionError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, SendTransactionError::GetClientError(_))); +/// +/// let e = SendTransactionError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, SendTransactionError::SendTransactionError(_))); +/// +/// let e = SendTransactionError::SendRejected("duplicate".into()); +/// assert!(matches!(e, SendTransactionError::SendRejected(_))); +/// assert_eq!(e.to_string(), "send rejected: duplicate"); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum SendTransactionError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + SendTransactionError(#[from] tonic::Status), + + #[error("send rejected: {0}")] + SendRejected(String), +} + +/// Error from the `get_tree_state` (`GetTreeState`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetTreeStateError` means the server returned a gRPC status +/// (e.g. the requested block does not exist). +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetTreeStateError}; +/// +/// let e = GetTreeStateError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetTreeStateError::GetClientError(_))); +/// +/// let e = GetTreeStateError::from(tonic::Status::not_found("no such block")); +/// assert!(matches!(e, GetTreeStateError::GetTreeStateError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetTreeStateError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetTreeStateError(#[from] tonic::Status), +} + +/// Error from the `get_block` (`GetBlock`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetBlockError` means the server returned a gRPC status +/// (e.g. the requested block does not exist). +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetBlockError}; +/// +/// let e = GetBlockError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetBlockError::GetClientError(_))); +/// +/// let e = GetBlockError::from(tonic::Status::not_found("no such block")); +/// assert!(matches!(e, GetBlockError::GetBlockError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetBlockError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetBlockError(#[from] tonic::Status), +} + +/// Error from the deprecated `get_block_nullifiers` (`GetBlockNullifiers`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetBlockNullifiersError` means the server returned a gRPC status. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetBlockNullifiersError}; +/// +/// let e = GetBlockNullifiersError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetBlockNullifiersError::GetClientError(_))); +/// +/// let e = GetBlockNullifiersError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetBlockNullifiersError::GetBlockNullifiersError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetBlockNullifiersError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetBlockNullifiersError(#[from] tonic::Status), +} + +/// Error from the `get_block_range` (`GetBlockRange`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetBlockRangeError` means the server returned a gRPC status +/// before or instead of streaming blocks. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetBlockRangeError}; +/// +/// let e = GetBlockRangeError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetBlockRangeError::GetClientError(_))); +/// +/// let e = GetBlockRangeError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetBlockRangeError::GetBlockRangeError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetBlockRangeError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetBlockRangeError(#[from] tonic::Status), +} + +/// Error from the deprecated `get_block_range_nullifiers` (`GetBlockRangeNullifiers`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetBlockRangeNullifiersError` means the server returned a gRPC status. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetBlockRangeNullifiersError}; +/// +/// let e = GetBlockRangeNullifiersError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetBlockRangeNullifiersError::GetClientError(_))); +/// +/// let e = GetBlockRangeNullifiersError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetBlockRangeNullifiersError::GetBlockRangeNullifiersError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetBlockRangeNullifiersError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetBlockRangeNullifiersError(#[from] tonic::Status), +} + +/// Error from the `get_transaction` (`GetTransaction`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetTransactionError` means the server returned a gRPC status +/// (e.g. the transaction was not found). +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetTransactionError}; +/// +/// let e = GetTransactionError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetTransactionError::GetClientError(_))); +/// +/// let e = GetTransactionError::from(tonic::Status::not_found("no such tx")); +/// assert!(matches!(e, GetTransactionError::GetTransactionError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetTransactionError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetTransactionError(#[from] tonic::Status), +} + +/// Error from the `get_mempool_tx` (`GetMempoolTx`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetMempoolTxError` means the server returned a gRPC status +/// before or instead of streaming mempool transactions. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetMempoolTxError}; +/// +/// let e = GetMempoolTxError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetMempoolTxError::GetClientError(_))); +/// +/// let e = GetMempoolTxError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetMempoolTxError::GetMempoolTxError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetMempoolTxError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetMempoolTxError(#[from] tonic::Status), +} + +/// Error from the `get_mempool_stream` (`GetMempoolStream`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetMempoolStreamError` means the server returned a gRPC status +/// before or instead of opening the stream. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetMempoolStreamError}; +/// +/// let e = GetMempoolStreamError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetMempoolStreamError::GetClientError(_))); +/// +/// let e = GetMempoolStreamError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetMempoolStreamError::GetMempoolStreamError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetMempoolStreamError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetMempoolStreamError(#[from] tonic::Status), +} + +/// Error from the `get_latest_tree_state` (`GetLatestTreeState`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetLatestTreeStateError` means the server returned a gRPC status. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetLatestTreeStateError}; +/// +/// let e = GetLatestTreeStateError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetLatestTreeStateError::GetClientError(_))); +/// +/// let e = GetLatestTreeStateError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetLatestTreeStateError::GetLatestTreeStateError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetLatestTreeStateError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetLatestTreeStateError(#[from] tonic::Status), +} + +/// Error from the `get_subtree_roots` (`GetSubtreeRoots`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `GetSubtreeRootsError` means the server returned a gRPC status +/// before or instead of streaming subtree roots. +/// +/// ``` +/// use zingo_netutils::{GetClientError, GetSubtreeRootsError}; +/// +/// let e = GetSubtreeRootsError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, GetSubtreeRootsError::GetClientError(_))); +/// +/// let e = GetSubtreeRootsError::from(tonic::Status::internal("oops")); +/// assert!(matches!(e, GetSubtreeRootsError::GetSubtreeRootsError(_))); +/// ``` +#[derive(Debug, thiserror::Error)] +pub enum GetSubtreeRootsError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetSubtreeRootsError(#[from] tonic::Status), +} + +/// Error from the `ping` (`Ping`) RPC. +/// +/// Callers can depend on: +/// - `GetClientError` means the connection was never established. +/// - `PingError` means the server returned a gRPC status (e.g. the +/// server was not started with `--ping-very-insecure`). +/// +/// ``` +/// # #[cfg(feature = "ping-very-insecure")] +/// # { +/// use zingo_netutils::{GetClientError, PingError}; +/// +/// let e = PingError::from(GetClientError::InvalidScheme); +/// assert!(matches!(e, PingError::GetClientError(_))); +/// +/// let e = PingError::from(tonic::Status::permission_denied("not enabled")); +/// assert!(matches!(e, PingError::PingError(_))); +/// # } +/// ``` +#[cfg(feature = "ping-very-insecure")] +#[derive(Debug, thiserror::Error)] +pub enum PingError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + PingError(#[from] tonic::Status), +} + +/// Helper to construct a `tonic::Status` for testing. +#[cfg(test)] +fn test_status() -> tonic::Status { + tonic::Status::internal("test error") +} + +/// Helper to construct a `GetClientError` for testing. +#[cfg(test)] +fn test_client_error() -> GetClientError { + GetClientError::InvalidScheme +} + +/// Macro that generates a test module for a standard 2-variant error enum +/// (GetClientError + tonic::Status). +#[cfg(test)] +macro_rules! two_variant_error_tests { + ($mod_name:ident, $error_type:ident, $status_variant:ident) => { + mod $mod_name { + use super::*; + + #[test] + fn from_get_client_error() { + let inner = test_client_error(); + let e = $error_type::from(inner); + assert!(matches!(e, $error_type::GetClientError(_))); + assert!(e.to_string().contains("invalid scheme")); + } + + #[test] + fn from_status() { + let status = test_status(); + let e = $error_type::from(status); + assert!(matches!(e, $error_type::$status_variant(_))); + assert!(e.to_string().contains("test error")); + } + } + }; +} + +#[cfg(test)] +mod tests { + use super::*; + + two_variant_error_tests!(get_info, GetInfoError, GetLightdInfoError); + two_variant_error_tests!(get_latest_block, GetLatestBlockError, GetLatestBlockError); + two_variant_error_tests!(get_tree_state, GetTreeStateError, GetTreeStateError); + two_variant_error_tests!(get_block, GetBlockError, GetBlockError); + two_variant_error_tests!( + get_block_nullifiers, + GetBlockNullifiersError, + GetBlockNullifiersError + ); + two_variant_error_tests!(get_block_range, GetBlockRangeError, GetBlockRangeError); + two_variant_error_tests!( + get_block_range_nullifiers, + GetBlockRangeNullifiersError, + GetBlockRangeNullifiersError + ); + two_variant_error_tests!(get_transaction, GetTransactionError, GetTransactionError); + two_variant_error_tests!(get_mempool_tx, GetMempoolTxError, GetMempoolTxError); + two_variant_error_tests!( + get_mempool_stream, + GetMempoolStreamError, + GetMempoolStreamError + ); + two_variant_error_tests!( + get_latest_tree_state, + GetLatestTreeStateError, + GetLatestTreeStateError + ); + two_variant_error_tests!( + get_subtree_roots, + GetSubtreeRootsError, + GetSubtreeRootsError + ); + + mod send_transaction { + use super::*; + + #[test] + fn from_get_client_error() { + let inner = test_client_error(); + let e = SendTransactionError::from(inner); + assert!(matches!(e, SendTransactionError::GetClientError(_))); + } + + #[test] + fn from_status() { + let status = test_status(); + let e = SendTransactionError::from(status); + assert!(matches!(e, SendTransactionError::SendTransactionError(_))); + } + + #[test] + fn send_rejected() { + let e = SendTransactionError::SendRejected("bad tx".into()); + assert!(matches!(e, SendTransactionError::SendRejected(_))); + assert_eq!(e.to_string(), "send rejected: bad tx"); + } + } + + #[cfg(feature = "ping-very-insecure")] + two_variant_error_tests!(ping, PingError, PingError); +} + +// ── TransparentIndexer errors ─────────────────────────────────────── + +#[cfg(feature = "globally-public-transparent")] +pub mod transparent { + use super::GetClientError; + + /// Error from the deprecated `get_taddress_txids` (`GetTaddressTxids`) RPC. + /// + /// Callers can depend on: + /// - `GetClientError` means the connection was never established. + /// - `GetTaddressTxidsError` means the server returned a gRPC status. + /// + /// ``` + /// # #[cfg(feature = "globally-public-transparent")] + /// # { + /// use zingo_netutils::error::transparent::GetTaddressTxidsError; + /// use zingo_netutils::GetClientError; + /// + /// let e = GetTaddressTxidsError::from(GetClientError::InvalidScheme); + /// assert!(matches!(e, GetTaddressTxidsError::GetClientError(_))); + /// + /// let e = GetTaddressTxidsError::from(tonic::Status::internal("oops")); + /// assert!(matches!(e, GetTaddressTxidsError::GetTaddressTxidsError(_))); + /// # } + /// ``` + #[derive(Debug, thiserror::Error)] + pub enum GetTaddressTxidsError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetTaddressTxidsError(#[from] tonic::Status), + } + + /// Error from the `get_taddress_transactions` (`GetTaddressTransactions`) RPC. + /// + /// Callers can depend on: + /// - `GetClientError` means the connection was never established. + /// - `GetTaddressTransactionsError` means the server returned a gRPC status. + /// + /// ``` + /// # #[cfg(feature = "globally-public-transparent")] + /// # { + /// use zingo_netutils::error::transparent::GetTaddressTransactionsError; + /// use zingo_netutils::GetClientError; + /// + /// let e = GetTaddressTransactionsError::from(GetClientError::InvalidScheme); + /// assert!(matches!(e, GetTaddressTransactionsError::GetClientError(_))); + /// + /// let e = GetTaddressTransactionsError::from(tonic::Status::internal("oops")); + /// assert!(matches!(e, GetTaddressTransactionsError::GetTaddressTransactionsError(_))); + /// # } + /// ``` + #[derive(Debug, thiserror::Error)] + pub enum GetTaddressTransactionsError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetTaddressTransactionsError(#[from] tonic::Status), + } + + /// Error from the `get_taddress_balance` (`GetTaddressBalance`) RPC. + /// + /// Callers can depend on: + /// - `GetClientError` means the connection was never established. + /// - `GetTaddressBalanceError` means the server returned a gRPC status. + /// + /// ``` + /// # #[cfg(feature = "globally-public-transparent")] + /// # { + /// use zingo_netutils::error::transparent::GetTaddressBalanceError; + /// use zingo_netutils::GetClientError; + /// + /// let e = GetTaddressBalanceError::from(GetClientError::InvalidScheme); + /// assert!(matches!(e, GetTaddressBalanceError::GetClientError(_))); + /// + /// let e = GetTaddressBalanceError::from(tonic::Status::internal("oops")); + /// assert!(matches!(e, GetTaddressBalanceError::GetTaddressBalanceError(_))); + /// # } + /// ``` + #[derive(Debug, thiserror::Error)] + pub enum GetTaddressBalanceError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetTaddressBalanceError(#[from] tonic::Status), + } + + /// Error from the `get_taddress_balance_stream` (`GetTaddressBalanceStream`) RPC. + /// + /// Callers can depend on: + /// - `GetClientError` means the connection was never established. + /// - `GetTaddressBalanceStreamError` means the server returned a gRPC status. + /// + /// ``` + /// # #[cfg(feature = "globally-public-transparent")] + /// # { + /// use zingo_netutils::error::transparent::GetTaddressBalanceStreamError; + /// use zingo_netutils::GetClientError; + /// + /// let e = GetTaddressBalanceStreamError::from(GetClientError::InvalidScheme); + /// assert!(matches!(e, GetTaddressBalanceStreamError::GetClientError(_))); + /// + /// let e = GetTaddressBalanceStreamError::from(tonic::Status::internal("oops")); + /// assert!(matches!(e, GetTaddressBalanceStreamError::GetTaddressBalanceStreamError(_))); + /// # } + /// ``` + #[derive(Debug, thiserror::Error)] + pub enum GetTaddressBalanceStreamError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetTaddressBalanceStreamError(#[from] tonic::Status), + } + + /// Error from the `get_address_utxos` (`GetAddressUtxos`) RPC. + /// + /// Callers can depend on: + /// - `GetClientError` means the connection was never established. + /// - `GetAddressUtxosError` means the server returned a gRPC status. + /// + /// ``` + /// # #[cfg(feature = "globally-public-transparent")] + /// # { + /// use zingo_netutils::error::transparent::GetAddressUtxosError; + /// use zingo_netutils::GetClientError; + /// + /// let e = GetAddressUtxosError::from(GetClientError::InvalidScheme); + /// assert!(matches!(e, GetAddressUtxosError::GetClientError(_))); + /// + /// let e = GetAddressUtxosError::from(tonic::Status::internal("oops")); + /// assert!(matches!(e, GetAddressUtxosError::GetAddressUtxosError(_))); + /// # } + /// ``` + #[derive(Debug, thiserror::Error)] + pub enum GetAddressUtxosError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetAddressUtxosError(#[from] tonic::Status), + } + + /// Error from the `get_address_utxos_stream` (`GetAddressUtxosStream`) RPC. + /// + /// Callers can depend on: + /// - `GetClientError` means the connection was never established. + /// - `GetAddressUtxosStreamError` means the server returned a gRPC status + /// before or instead of streaming UTXOs. + /// + /// ``` + /// # #[cfg(feature = "globally-public-transparent")] + /// # { + /// use zingo_netutils::error::transparent::GetAddressUtxosStreamError; + /// use zingo_netutils::GetClientError; + /// + /// let e = GetAddressUtxosStreamError::from(GetClientError::InvalidScheme); + /// assert!(matches!(e, GetAddressUtxosStreamError::GetClientError(_))); + /// + /// let e = GetAddressUtxosStreamError::from(tonic::Status::internal("oops")); + /// assert!(matches!(e, GetAddressUtxosStreamError::GetAddressUtxosStreamError(_))); + /// # } + /// ``` + #[derive(Debug, thiserror::Error)] + pub enum GetAddressUtxosStreamError { + #[error(transparent)] + GetClientError(#[from] GetClientError), + + #[error("gRPC error: {0}")] + GetAddressUtxosStreamError(#[from] tonic::Status), + } + + #[cfg(test)] + mod tests { + use super::*; + + fn test_status() -> tonic::Status { + tonic::Status::internal("test error") + } + + fn test_client_error() -> GetClientError { + GetClientError::InvalidScheme + } + + macro_rules! two_variant_error_tests { + ($mod_name:ident, $error_type:ident, $status_variant:ident) => { + mod $mod_name { + use super::*; + + #[test] + fn from_get_client_error() { + let inner = test_client_error(); + let e = $error_type::from(inner); + assert!(matches!(e, $error_type::GetClientError(_))); + assert!(e.to_string().contains("invalid scheme")); + } + + #[test] + fn from_status() { + let status = test_status(); + let e = $error_type::from(status); + assert!(matches!(e, $error_type::$status_variant(_))); + assert!(e.to_string().contains("test error")); + } + } + }; + } + + two_variant_error_tests!( + get_taddress_txids, + GetTaddressTxidsError, + GetTaddressTxidsError + ); + two_variant_error_tests!( + get_taddress_transactions, + GetTaddressTransactionsError, + GetTaddressTransactionsError + ); + two_variant_error_tests!( + get_taddress_balance, + GetTaddressBalanceError, + GetTaddressBalanceError + ); + two_variant_error_tests!( + get_taddress_balance_stream, + GetTaddressBalanceStreamError, + GetTaddressBalanceStreamError + ); + two_variant_error_tests!( + get_address_utxos, + GetAddressUtxosError, + GetAddressUtxosError + ); + two_variant_error_tests!( + get_address_utxos_stream, + GetAddressUtxosStreamError, + GetAddressUtxosStreamError + ); + } +} diff --git a/zingo-netutils/src/globally_public.rs b/zingo-netutils/src/globally_public.rs new file mode 100644 index 0000000..f64a864 --- /dev/null +++ b/zingo-netutils/src/globally_public.rs @@ -0,0 +1,159 @@ +//! Transparent address operations for the [`Indexer`] trait. +//! +//! These methods expose transparent (t-address) balance queries, transaction +//! history, and UTXO lookups. They are gated behind the +//! `globally-public-transparent` feature because transparent data is +//! publicly visible on-chain and using these methods leaks which +//! addresses belong to the caller. + +use std::future::Future; + +use lightwallet_protocol::{ + Address, AddressList, Balance, GetAddressUtxosArg, GetAddressUtxosReply, + GetAddressUtxosReplyList, RawTransaction, TransparentAddressBlockFilter, +}; + +pub use super::error::transparent::*; +use super::{GrpcIndexer, Indexer}; + +/// Extension of [`Indexer`] for transparent address operations. +/// +/// All methods in this trait expose globally-public transparent data. +/// Callers can depend on the following: +/// +/// - Balance and UTXO results reflect only confirmed (mined) state. +/// - Streaming results are sorted by block height. +/// - Errors are partitioned per method so callers can distinguish +/// which operation failed. +pub trait TransparentIndexer: Indexer { + type GetTaddressTxidsError: std::error::Error; + type GetTaddressTransactionsError: std::error::Error; + type GetTaddressBalanceError: std::error::Error; + type GetTaddressBalanceStreamError: std::error::Error; + type GetAddressUtxosError: std::error::Error; + type GetAddressUtxosStreamError: std::error::Error; + + /// Return a stream of transactions for a transparent address in a block range. + /// + /// Same behavior as + /// [`get_taddress_transactions`](TransparentIndexer::get_taddress_transactions). + /// This method is a legacy alias; callers should migrate. + #[deprecated(note = "use get_taddress_transactions instead")] + fn get_taddress_txids( + &self, + filter: TransparentAddressBlockFilter, + ) -> impl Future, Self::GetTaddressTxidsError>>; + + /// Return a stream of transactions for a transparent address in a block range. + /// + /// Results are sorted by block height. Mempool transactions are not included. + fn get_taddress_transactions( + &self, + filter: TransparentAddressBlockFilter, + ) -> impl Future, Self::GetTaddressTransactionsError>>; + + /// Return the total confirmed balance for the given transparent addresses. + /// + /// The returned [`Balance`] contains the sum in zatoshis. Only confirmed + /// (mined) outputs are included; mempool UTXOs are not counted. + fn get_taddress_balance( + &self, + addresses: AddressList, + ) -> impl Future>; + + /// Return the total confirmed balance by streaming addresses to the server. + /// + /// Client-streaming variant of + /// [`get_taddress_balance`](TransparentIndexer::get_taddress_balance). + /// The addresses are streamed individually, avoiding message size limits + /// for large address sets. Returns the same [`Balance`] sum. + fn get_taddress_balance_stream( + &self, + addresses: Vec
, + ) -> impl Future>; + + /// Return UTXOs for the given addresses as a single response. + /// + /// Results are sorted by block height. Pass `max_entries = 0` for + /// unlimited results. + fn get_address_utxos( + &self, + arg: GetAddressUtxosArg, + ) -> impl Future>; + + /// Return a stream of UTXOs for the given addresses. + /// + /// Prefer this over [`get_address_utxos`](TransparentIndexer::get_address_utxos) + /// when the result set may be large. + fn get_address_utxos_stream( + &self, + arg: GetAddressUtxosArg, + ) -> impl Future< + Output = Result, Self::GetAddressUtxosStreamError>, + >; +} + +impl TransparentIndexer for GrpcIndexer { + type GetTaddressTxidsError = GetTaddressTxidsError; + type GetTaddressTransactionsError = GetTaddressTransactionsError; + type GetTaddressBalanceError = GetTaddressBalanceError; + type GetTaddressBalanceStreamError = GetTaddressBalanceStreamError; + type GetAddressUtxosError = GetAddressUtxosError; + type GetAddressUtxosStreamError = GetAddressUtxosStreamError; + + #[allow(deprecated)] + async fn get_taddress_txids( + &self, + filter: TransparentAddressBlockFilter, + ) -> Result, GetTaddressTxidsError> { + let (mut client, request) = self.stream_call(filter).await?; + Ok(client.get_taddress_txids(request).await?.into_inner()) + } + + async fn get_taddress_transactions( + &self, + filter: TransparentAddressBlockFilter, + ) -> Result, GetTaddressTransactionsError> { + let (mut client, request) = self.stream_call(filter).await?; + Ok(client + .get_taddress_transactions(request) + .await? + .into_inner()) + } + + async fn get_taddress_balance( + &self, + addresses: AddressList, + ) -> Result { + let (mut client, request) = self.time_boxed_call(addresses).await?; + Ok(client.get_taddress_balance(request).await?.into_inner()) + } + + async fn get_taddress_balance_stream( + &self, + addresses: Vec
, + ) -> Result { + let mut client = self.get_client().await?; + let stream = tokio_stream::iter(addresses); + Ok(client + .get_taddress_balance_stream(stream) + .await? + .into_inner()) + } + + async fn get_address_utxos( + &self, + arg: GetAddressUtxosArg, + ) -> Result { + let (mut client, request) = self.time_boxed_call(arg).await?; + Ok(client.get_address_utxos(request).await?.into_inner()) + } + + async fn get_address_utxos_stream( + &self, + arg: GetAddressUtxosArg, + ) -> Result, GetAddressUtxosStreamError> { + let (mut client, request) = self.stream_call(arg).await?; + Ok(client.get_address_utxos_stream(request).await?.into_inner()) + } +} diff --git a/zingo-netutils/src/lib.rs b/zingo-netutils/src/lib.rs index 0f86dda..0e058a2 100644 --- a/zingo-netutils/src/lib.rs +++ b/zingo-netutils/src/lib.rs @@ -1,95 +1,477 @@ -//! `zingo-netutils` +//! A complete [`Indexer`] abstraction for communicating with Zcash chain +//! indexers (`lightwalletd` / `zainod`). //! -//! This crate provides the `GrpcConnector` struct, -//! used to communicate with an indexer. +//! # Organizing principle +//! +//! The [`Indexer`] trait is the sole interface a Zcash wallet or tool needs +//! to query, sync, and broadcast against a chain indexer. It is +//! implementation-agnostic: production code uses the provided [`GrpcIndexer`] +//! (gRPC over tonic), while tests can supply a mock implementor with no +//! network dependency. +//! +//! All proto types come from +//! [`lightwallet-protocol`](https://crates.io/crates/lightwallet-protocol) +//! and are re-exported via `pub use lightwallet_protocol` so consumers do +//! not need an additional dependency. +//! +//! # Feature gates +//! +//! All features are **off by default**. +//! +//! | Feature | What it enables | +//! |---|---| +//! | `globally-public-transparent` | [`TransparentIndexer`] sub-trait for t-address balance, transaction history, and UTXO queries. Pulls in `tokio-stream`. | +//! | `ping-very-insecure` | [`Indexer::ping`] method. Name mirrors the lightwalletd `--ping-very-insecure` CLI flag. Testing only. | +//! | `back_compatible` | [`GrpcIndexer::get_zcb_client`] returning `zcash_client_backend`'s `CompactTxStreamerClient` for pepper-sync compatibility. | +//! +//! **Note:** Build docs with `--all-features` so intra-doc links to +//! feature-gated items resolve: +//! ```text +//! RUSTDOCFLAGS="-D warnings" cargo doc --all-features --document-private-items +//! ``` +//! +//! # Backwards compatibility +//! +//! Code that needs a raw `CompactTxStreamerClient` (e.g. +//! pepper-sync) can call [`GrpcIndexer::get_client`] for +//! `lightwallet_protocol` types, or enable the `back_compatible` feature +//! for [`GrpcIndexer::get_zcb_client`] which returns +//! `zcash_client_backend`'s client type as a migration bridge. -#[cfg(test)] -use tokio_rustls::rustls::RootCertStore; +use std::future::Future; +use std::time::Duration; + +use tonic::Request; use tonic::transport::{Channel, ClientTlsConfig, Endpoint}; -use zcash_client_backend::proto::service::compact_tx_streamer_client::CompactTxStreamerClient; -#[derive(Debug, thiserror::Error)] -pub enum GetClientError { - #[error("bad uri: invalid scheme")] - InvalidScheme, +pub use lightwallet_protocol; - #[error("bad uri: invalid authority")] - InvalidAuthority, +use lightwallet_protocol::{ + BlockId, BlockRange, ChainSpec, CompactBlock, CompactTx, CompactTxStreamerClient, Empty, + GetMempoolTxRequest, GetSubtreeRootsArg, LightdInfo, RawTransaction, SubtreeRoot, TreeState, + TxFilter, +}; - #[error("bad uri: invalid path and/or query")] - InvalidPathAndQuery, +#[cfg(feature = "ping-very-insecure")] +use lightwallet_protocol::{Duration as ProtoDuration, PingResponse}; - #[error(transparent)] - Transport(#[from] tonic::transport::Error), -} +pub mod error; +pub use error::*; -#[cfg(test)] -fn load_test_cert_pem() -> Option> { - const TEST_PEMFILE_PATH: &str = "test-data/localhost.pem"; - std::fs::read(TEST_PEMFILE_PATH).ok() -} -fn client_tls_config() -> Result { +#[cfg(feature = "globally-public-transparent")] +mod globally_public; +#[cfg(feature = "globally-public-transparent")] +pub use globally_public::TransparentIndexer; + +fn client_tls_config() -> ClientTlsConfig { // Allow self-signed certs in tests #[cfg(test)] { - if let Some(pem) = load_test_cert_pem() { - return Ok(ClientTlsConfig::new() - .ca_certificate(tonic::transport::Certificate::from_pem(pem)) - .with_webpki_roots()); - } + ClientTlsConfig::new() + .ca_certificate(tonic::transport::Certificate::from_pem( + std::fs::read("test-data/localhost.pem").expect("test file"), + )) + .with_webpki_roots() } + #[cfg(not(test))] + ClientTlsConfig::new().with_webpki_roots() +} + +const DEFAULT_GRPC_TIMEOUT: Duration = Duration::from_secs(10); + +/// Trait for communicating with a Zcash chain indexer. +/// +/// Implementors provide access to a lightwalletd-compatible server. +/// Callers can depend on the following guarantees: +/// +/// - Each method opens a fresh connection (or reuses a pooled one) — no +/// persistent session state is assumed between calls. +/// - Errors are partitioned per method so callers can handle connection +/// failures separately from server-side errors. +/// - All methods are safe to call concurrently from multiple tasks. +pub trait Indexer { + type GetInfoError: std::error::Error; + type GetLatestBlockError: std::error::Error; + type SendTransactionError: std::error::Error; + type GetTreeStateError: std::error::Error; + type GetBlockError: std::error::Error; + type GetBlockNullifiersError: std::error::Error; + type GetBlockRangeError: std::error::Error; + type GetBlockRangeNullifiersError: std::error::Error; + type GetTransactionError: std::error::Error; + type GetMempoolTxError: std::error::Error; + type GetMempoolStreamError: std::error::Error; + type GetLatestTreeStateError: std::error::Error; + type GetSubtreeRootsError: std::error::Error; + + #[cfg(feature = "ping-very-insecure")] + type PingError: std::error::Error; + + /// Return server metadata (chain name, block height, version, etc.). + /// + /// The returned [`LightdInfo`] includes the chain name, current block height, + /// server version, and consensus branch ID. Callers should not cache this + /// value across sync boundaries as the block height is a point-in-time snapshot. + fn get_info(&self) -> impl Future>; + + /// Return the height and hash of the chain tip. + /// + /// The returned [`BlockId`] identifies the most recent block the server + /// is aware of. The hash may be omitted by some implementations. + fn get_latest_block(&self) -> impl Future>; + + /// Submit a raw transaction to the network. + /// + /// On success, returns the transaction ID as a hex string. + /// On rejection by the network, returns a [`Self::SendTransactionError`] + /// containing the rejection reason. Callers should be prepared for + /// transient failures and may retry. + fn send_transaction( + &self, + tx_bytes: Box<[u8]>, + ) -> impl Future>; + + /// Fetch the note commitment tree state for the given block. + /// + /// Returns Sapling and Orchard commitment tree frontiers as of the + /// end of the specified block. The block can be identified by height, + /// hash, or both via [`BlockId`]. Requesting an unmined block is an error. + fn get_tree_state( + &self, + block_id: BlockId, + ) -> impl Future>; + + /// Return the compact block at the given height. + /// + /// The returned [`CompactBlock`] contains compact transaction data + /// sufficient for trial decryption and nullifier detection. + fn get_block( + &self, + block_id: BlockId, + ) -> impl Future>; + + /// Return the compact block at the given height, containing only nullifiers. + /// + /// The returned [`CompactBlock`] omits output data, retaining only + /// spend nullifiers. Callers should migrate to [`get_block`](Indexer::get_block). + #[deprecated(note = "use get_block instead")] + fn get_block_nullifiers( + &self, + block_id: BlockId, + ) -> impl Future>; + + /// Return a stream of consecutive compact blocks for the given range. + /// + /// Both endpoints of the range are inclusive. If `start <= end`, blocks + /// are yielded in ascending height order; if `start > end`, blocks are + /// yielded in descending height order. See the test + /// `tests::get_block_range_supports_descending_order` for a live + /// verification of descending order against a public indexer. + /// + /// Callers must consume or drop the stream before the connection is reused. + fn get_block_range( + &self, + range: BlockRange, + ) -> impl Future, Self::GetBlockRangeError>>; + + /// Return a stream of consecutive compact blocks (nullifiers only) for the given range. + /// + /// Same streaming guarantees as [`get_block_range`](Indexer::get_block_range) + /// but each block contains only nullifiers. + /// Callers should migrate to [`get_block_range`](Indexer::get_block_range). + #[deprecated(note = "use get_block_range instead")] + fn get_block_range_nullifiers( + &self, + range: BlockRange, + ) -> impl Future, Self::GetBlockRangeNullifiersError>>; + + /// Return the full serialized transaction matching the given filter. + /// + /// The filter identifies a transaction by its txid hash. The returned + /// [`RawTransaction`] contains the complete serialized bytes and the + /// block height at which it was mined (0 if in the mempool). + fn get_transaction( + &self, + filter: TxFilter, + ) -> impl Future>; + + /// Return a stream of compact transactions currently in the mempool. + /// + /// The request may include txid suffixes to exclude from the results, + /// allowing the caller to avoid re-fetching known transactions. + /// Results may be seconds out of date. + fn get_mempool_tx( + &self, + request: GetMempoolTxRequest, + ) -> impl Future, Self::GetMempoolTxError>>; + + /// Return a stream of raw mempool transactions. + /// + /// The stream remains open while there are mempool transactions and + /// closes when a new block is mined. + fn get_mempool_stream( + &self, + ) -> impl Future, Self::GetMempoolStreamError>>; - Ok(ClientTlsConfig::new().with_webpki_roots()) + /// Return the note commitment tree state at the chain tip. + /// + /// Equivalent to calling [`get_tree_state`](Indexer::get_tree_state) with + /// the current tip height, but avoids the need to query the tip first. + fn get_latest_tree_state( + &self, + ) -> impl Future>; + + /// Return a stream of subtree roots for the given shielded protocol. + /// + /// Yields roots in ascending index order starting from `start_index`. + /// Pass `max_entries = 0` to request all available roots. + fn get_subtree_roots( + &self, + arg: GetSubtreeRootsArg, + ) -> impl Future, Self::GetSubtreeRootsError>>; + + /// Simulate server latency for testing. + /// + /// The server will delay for the requested duration before responding. + /// Returns the number of concurrent Ping RPCs at entry and exit. + /// Requires the server to be started with `--ping-very-insecure`. + /// Do not enable in production. + #[cfg(feature = "ping-very-insecure")] + fn ping( + &self, + duration: ProtoDuration, + ) -> impl Future>; } -/// The connector, containing the URI to connect to. -/// This type is mostly an interface to the `get_client` method. -/// The proto-generated `CompactTxStreamerClient` type is the main -/// interface to actually communicating with a Zcash indexer. -/// Connect to the URI, and return a Client. For the full list of methods -/// the client supports, see the service.proto file (some of the types -/// are defined in the `compact_formats.proto` file). -pub async fn get_client( + +/// gRPC-backed [`Indexer`] that connects to a lightwalletd server. +#[derive(Clone)] +pub struct GrpcIndexer { uri: http::Uri, -) -> Result, GetClientError> { - let scheme = uri.scheme_str().ok_or(GetClientError::InvalidScheme)?; - if scheme != "http" && scheme != "https" { - return Err(GetClientError::InvalidScheme); + scheme: String, + authority: http::uri::Authority, + endpoint: Endpoint, +} + +impl std::fmt::Debug for GrpcIndexer { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("GrpcIndexer") + .field("scheme", &self.scheme) + .field("authority", &self.authority) + .finish_non_exhaustive() + } +} + +impl GrpcIndexer { + pub fn new(uri: http::Uri) -> Result { + let scheme = uri + .scheme_str() + .ok_or(GetClientError::InvalidScheme)? + .to_string(); + if scheme != "http" && scheme != "https" { + return Err(GetClientError::InvalidScheme); + } + let authority = uri + .authority() + .ok_or(GetClientError::InvalidAuthority)? + .clone(); + + let endpoint = Endpoint::from_shared(uri.to_string())?.tcp_nodelay(true); + let endpoint = if scheme == "https" { + endpoint.tls_config(client_tls_config())? + } else { + endpoint + }; + + Ok(Self { + uri, + scheme, + authority, + endpoint, + }) } - let _authority = uri.authority().ok_or(GetClientError::InvalidAuthority)?; - let endpoint = Endpoint::from_shared(uri.to_string())?.tcp_nodelay(true); + pub fn uri(&self) -> &http::Uri { + &self.uri + } - let channel = if scheme == "https" { - let tls = client_tls_config()?; - endpoint.tls_config(tls)?.connect().await? - } else { - endpoint.connect().await? - }; + /// Connect to the pre-configured endpoint and return a gRPC client. + pub async fn get_client(&self) -> Result, GetClientError> { + let channel = self.endpoint.connect().await?; + Ok(CompactTxStreamerClient::new(channel)) + } - Ok(CompactTxStreamerClient::new(channel)) + async fn time_boxed_call( + &self, + payload: T, + ) -> Result<(CompactTxStreamerClient, Request), GetClientError> { + let client = self.get_client().await?; + let mut request = Request::new(payload); + request.set_timeout(DEFAULT_GRPC_TIMEOUT); + Ok((client, request)) + } + + async fn stream_call( + &self, + payload: T, + ) -> Result<(CompactTxStreamerClient, Request), GetClientError> { + let client = self.get_client().await?; + Ok((client, Request::new(payload))) + } } -#[cfg(test)] -fn add_test_cert_to_roots(roots: &mut RootCertStore) { - use tonic::transport::CertificateDer; - eprintln!("Adding test cert to roots"); +#[cfg(feature = "back_compatible")] +impl GrpcIndexer { + /// Return a gRPC client using `zcash_client_backend`'s generated types, + /// for compatibility with code that expects that crate's + /// `CompactTxStreamerClient` (e.g. pepper-sync). + pub async fn get_zcb_client( + &self, + ) -> Result< + zcash_client_backend::proto::service::compact_tx_streamer_client::CompactTxStreamerClient< + Channel, + >, + GetClientError, + > { + let channel = self.endpoint.connect().await?; + Ok( + zcash_client_backend::proto::service::compact_tx_streamer_client::CompactTxStreamerClient::new(channel), + ) + } +} - const TEST_PEMFILE_PATH: &str = "test-data/localhost.pem"; +impl Indexer for GrpcIndexer { + type GetInfoError = GetInfoError; + type GetLatestBlockError = GetLatestBlockError; + type SendTransactionError = SendTransactionError; + type GetTreeStateError = GetTreeStateError; + type GetBlockError = GetBlockError; + type GetBlockNullifiersError = GetBlockNullifiersError; + type GetBlockRangeError = GetBlockRangeError; + type GetBlockRangeNullifiersError = GetBlockRangeNullifiersError; + type GetTransactionError = GetTransactionError; + type GetMempoolTxError = GetMempoolTxError; + type GetMempoolStreamError = GetMempoolStreamError; + type GetLatestTreeStateError = GetLatestTreeStateError; + type GetSubtreeRootsError = GetSubtreeRootsError; + #[cfg(feature = "ping-very-insecure")] + type PingError = PingError; + + async fn get_info(&self) -> Result { + let (mut client, request) = self.time_boxed_call(Empty {}).await?; + Ok(client.get_lightd_info(request).await?.into_inner()) + } - let Ok(fd) = std::fs::File::open(TEST_PEMFILE_PATH) else { - eprintln!("Test TLS cert not found at {TEST_PEMFILE_PATH}, skipping"); - return; - }; + async fn get_latest_block(&self) -> Result { + let (mut client, request) = self.time_boxed_call(ChainSpec {}).await?; + Ok(client.get_latest_block(request).await?.into_inner()) + } - let mut buf = std::io::BufReader::new(fd); - let certs_bytes: Vec = rustls_pemfile::certs(&mut buf) - .filter_map(Result::ok) - .collect(); + async fn send_transaction(&self, tx_bytes: Box<[u8]>) -> Result { + let (mut client, request) = self + .time_boxed_call(RawTransaction { + data: tx_bytes.to_vec(), + height: 0, + }) + .await?; + let sendresponse = client.send_transaction(request).await?.into_inner(); + if sendresponse.error_code == 0 { + let mut transaction_id = sendresponse.error_message; + if transaction_id.starts_with('\"') && transaction_id.ends_with('\"') { + transaction_id = transaction_id[1..transaction_id.len() - 1].to_string(); + } + Ok(transaction_id) + } else { + Err(SendTransactionError::SendRejected(format!( + "{sendresponse:?}" + ))) + } + } + + async fn get_tree_state(&self, block_id: BlockId) -> Result { + let (mut client, request) = self.time_boxed_call(block_id).await?; + Ok(client.get_tree_state(request).await?.into_inner()) + } + + async fn get_block(&self, block_id: BlockId) -> Result { + let (mut client, request) = self.time_boxed_call(block_id).await?; + Ok(client.get_block(request).await?.into_inner()) + } + + #[allow(deprecated)] + async fn get_block_nullifiers( + &self, + block_id: BlockId, + ) -> Result { + let (mut client, request) = self.time_boxed_call(block_id).await?; + Ok(client.get_block_nullifiers(request).await?.into_inner()) + } + + async fn get_block_range( + &self, + range: BlockRange, + ) -> Result, GetBlockRangeError> { + let (mut client, request) = self.stream_call(range).await?; + Ok(client.get_block_range(request).await?.into_inner()) + } + + #[allow(deprecated)] + async fn get_block_range_nullifiers( + &self, + range: BlockRange, + ) -> Result, GetBlockRangeNullifiersError> { + let (mut client, request) = self.stream_call(range).await?; + Ok(client + .get_block_range_nullifiers(request) + .await? + .into_inner()) + } + + async fn get_transaction( + &self, + filter: TxFilter, + ) -> Result { + let (mut client, request) = self.time_boxed_call(filter).await?; + Ok(client.get_transaction(request).await?.into_inner()) + } - let certs: Vec> = certs_bytes.into_iter().collect(); - roots.add_parsable_certificates(certs); + async fn get_mempool_tx( + &self, + request: GetMempoolTxRequest, + ) -> Result, GetMempoolTxError> { + let (mut client, request) = self.stream_call(request).await?; + Ok(client.get_mempool_tx(request).await?.into_inner()) + } + + async fn get_mempool_stream( + &self, + ) -> Result, GetMempoolStreamError> { + let (mut client, request) = self.stream_call(Empty {}).await?; + Ok(client.get_mempool_stream(request).await?.into_inner()) + } + + async fn get_latest_tree_state(&self) -> Result { + let (mut client, request) = self.time_boxed_call(Empty {}).await?; + Ok(client.get_latest_tree_state(request).await?.into_inner()) + } + + async fn get_subtree_roots( + &self, + arg: GetSubtreeRootsArg, + ) -> Result, GetSubtreeRootsError> { + let (mut client, request) = self.stream_call(arg).await?; + Ok(client.get_subtree_roots(request).await?.into_inner()) + } + + #[cfg(feature = "ping-very-insecure")] + async fn ping(&self, duration: ProtoDuration) -> Result { + let (mut client, request) = self.time_boxed_call(duration).await?; + Ok(client.ping(request).await?.into_inner()) + } } +#[cfg(test)] +mod proto_agreement; + #[cfg(test)] mod tests { //! Unit and integration-style tests for `zingo-netutils`. @@ -119,6 +501,28 @@ mod tests { use super::*; + use tokio_rustls::rustls::RootCertStore; + + fn add_test_cert_to_roots(roots: &mut RootCertStore) { + use tonic::transport::CertificateDer; + eprintln!("Adding test cert to roots"); + + const TEST_PEMFILE_PATH: &str = "test-data/localhost.pem"; + + let Ok(fd) = std::fs::File::open(TEST_PEMFILE_PATH) else { + eprintln!("Test TLS cert not found at {TEST_PEMFILE_PATH}, skipping"); + return; + }; + + let mut buf = std::io::BufReader::new(fd); + let certs_bytes: Vec = rustls_pemfile::certs(&mut buf) + .filter_map(Result::ok) + .collect(); + + let certs: Vec> = certs_bytes.into_iter().collect(); + roots.add_parsable_certificates(certs); + } + /// Ensures the committed localhost test certificate exists and is parseable as X.509. /// /// This catches: @@ -196,7 +600,6 @@ mod tests { let certs = rustls_pemfile::certs(&mut cert_cursor) .filter_map(Result::ok) - .map(rustls::pki_types::CertificateDer::from) .collect::>(); let key = rustls_pemfile::private_key(&mut key_cursor) @@ -229,8 +632,6 @@ mod tests { use tokio_rustls::TlsAcceptor; use tokio_rustls::rustls; - let _ = rustls::crypto::ring::default_provider().install_default(); - let listener = TcpListener::bind("127.0.0.1:0").await.expect("bind failed"); let addr = listener.local_addr().expect("local_addr failed"); @@ -284,7 +685,7 @@ mod tests { .expect("serve_connection failed"); }); - let _ = timeout(Duration::from_secs(1), ready_rx) + timeout(Duration::from_secs(1), ready_rx) .await .expect("server ready signal timed out") .expect("server dropped before ready"); @@ -333,17 +734,16 @@ mod tests { /// Validates that the connector rejects non-HTTP(S) URIs. /// - /// This test is intended to fail until production code checks for: - /// - `http` and `https` schemes only - /// and rejects everything else (e.g. `ftp`). - #[tokio::test] - async fn rejects_non_http_schemes() { + /// This test is intended to fail until production code checks for + /// `http` and `https` schemes only, rejecting everything else (e.g. `ftp`). + #[test] + fn rejects_non_http_schemes() { let uri: http::Uri = "ftp://example.com:1234".parse().unwrap(); - let res = get_client(uri).await; + let res = GrpcIndexer::new(uri); assert!( res.is_err(), - "expected get_client() to reject non-http(s) schemes, but got Ok" + "expected GrpcIndexer::new() to reject non-http(s) schemes, but got Ok" ); } @@ -356,8 +756,6 @@ mod tests { async fn https_connector_must_not_downgrade_to_http1() { use http_body_util::Full; - let _ = rustls::crypto::ring::default_provider().install_default(); - let listener = TcpListener::bind("127.0.0.1:0").await.expect("bind failed"); let addr = listener.local_addr().expect("local_addr failed"); @@ -391,9 +789,8 @@ mod tests { .expect("endpoint") .tcp_nodelay(true); - let tls = client_tls_config().expect("tls config"); let connect_res = endpoint - .tls_config(tls) + .tls_config(client_tls_config()) .expect("tls_config failed") .connect() .await; @@ -409,31 +806,15 @@ mod tests { #[tokio::test] async fn connects_to_public_mainnet_indexer_and_gets_info() { - use std::time::Duration; - use tokio::time::timeout; - use tonic::Request; - use zcash_client_backend::proto::service::Empty; - - let _ = rustls::crypto::ring::default_provider().install_default(); - let endpoint = "https://zec.rocks:443".to_string(); let uri: http::Uri = endpoint.parse().expect("bad mainnet indexer URI"); - let mut client = timeout(Duration::from_secs(10), get_client(uri)) + let response = GrpcIndexer::new(uri) + .expect("URI to be valid.") + .get_info() .await - .expect("timed out connecting to public indexer") - .expect("failed to connect to public indexer"); - - let response = timeout( - Duration::from_secs(10), - client.get_lightd_info(Request::new(Empty {})), - ) - .await - .expect("timed out calling GetLightdInfo") - .expect("GetLightdInfo RPC failed") - .into_inner(); - + .expect("to get info"); assert!( !response.chain_name.is_empty(), "chain_name should not be empty" @@ -451,4 +832,61 @@ mod tests { response.chain_name ); } + + /// The proto spec says: + /// "If range.start <= range.end, blocks are returned increasing height order; + /// otherwise blocks are returned in decreasing height order." + /// + /// Our doc for `get_block_range` currently claims ascending-only. + /// This test requests a descending range (start > end) and asserts + /// the server returns blocks in decreasing height order. + #[tokio::test] + async fn get_block_range_supports_descending_order() { + use tokio_stream::StreamExt; + + let uri: http::Uri = "https://zec.rocks:443".parse().unwrap(); + let indexer = GrpcIndexer::new(uri).expect("valid URI"); + + let tip = indexer.get_latest_block().await.expect("get_latest_block"); + let start_height = tip.height; + let end_height = start_height.saturating_sub(4); + + // start > end → proto says descending order + let range = BlockRange { + start: Some(BlockId { + height: start_height, + hash: vec![], + }), + end: Some(BlockId { + height: end_height, + hash: vec![], + }), + pool_types: vec![], + }; + + let mut stream = indexer + .get_block_range(range) + .await + .expect("get_block_range"); + + let mut heights = Vec::new(); + while let Some(block) = stream.next().await { + let block = block.expect("stream item"); + heights.push(block.height); + } + + assert!( + !heights.is_empty(), + "expected at least one block in the descending range", + ); + + // The proto guarantees descending order when start > end. + // If this assertion fails, the server does not support descending ranges. + for window in heights.windows(2) { + assert!( + window[0] > window[1], + "expected descending order, but got heights: {heights:?}", + ); + } + } } diff --git a/zingo-netutils/src/proto_agreement.rs b/zingo-netutils/src/proto_agreement.rs new file mode 100644 index 0000000..9179e00 --- /dev/null +++ b/zingo-netutils/src/proto_agreement.rs @@ -0,0 +1,315 @@ +//! Compile-time assertions that each trait method maps to the correct +//! [`CompactTxStreamerClient`] method with compatible types. +//! +//! The proto source of truth is `walletrpc/service.proto` from the +//! [`lightwallet-protocol`](https://crates.io/crates/lightwallet-protocol) +//! crate (see `Cargo.toml` for the pinned version). That crate compiles +//! `service.proto` and `compact_formats.proto` from +//! at build time. +//! +//! These functions are never called — they exist only to fail compilation +//! if the proto-generated client and the trait diverge. Each function +//! documents the proto RPC it covers. + +#![allow(dead_code, unused_variables, clippy::needless_return)] + +use super::*; + +// ── Indexer trait ──────────────────────────────────────────────────── + +// Proto: GetLightdInfo(Empty) -> LightdInfo +// Trait: get_info() -> LightdInfo (Empty hidden by impl) +async fn get_lightd_info(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let _p: LightdInfo = c + .get_lightd_info(Request::new(Empty {})) + .await + .unwrap() + .into_inner(); + let _t: LightdInfo = i.get_info().await.unwrap(); +} + +// Proto: GetLatestBlock(ChainSpec) -> BlockID +// Trait: get_latest_block() -> BlockId (ChainSpec hidden by impl) +async fn get_latest_block(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let _p: BlockId = c + .get_latest_block(Request::new(ChainSpec {})) + .await + .unwrap() + .into_inner(); + let _t: BlockId = i.get_latest_block().await.unwrap(); +} + +// Proto: SendTransaction(RawTransaction) -> SendResponse +// Trait: send_transaction(Box<[u8]>) -> String (abstracts both sides) +async fn send_transaction(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let _p: lightwallet_protocol::SendResponse = c + .send_transaction(Request::new(RawTransaction { + data: vec![], + height: 0, + })) + .await + .unwrap() + .into_inner(); + let _t: String = i.send_transaction(vec![].into_boxed_slice()).await.unwrap(); +} + +// Proto: GetTreeState(BlockID) -> TreeState +// Trait: get_tree_state(BlockId) -> TreeState +async fn get_tree_state(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let id = BlockId { + height: 0, + hash: vec![], + }; + let _p: TreeState = c + .get_tree_state(Request::new(id.clone())) + .await + .unwrap() + .into_inner(); + let _t: TreeState = i.get_tree_state(id).await.unwrap(); +} + +// Proto: GetBlock(BlockID) -> CompactBlock +// Trait: get_block(BlockId) -> CompactBlock +async fn get_block(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let id = BlockId { + height: 0, + hash: vec![], + }; + let _p: CompactBlock = c + .get_block(Request::new(id.clone())) + .await + .unwrap() + .into_inner(); + let _t: CompactBlock = i.get_block(id).await.unwrap(); +} + +// Proto: GetBlockNullifiers(BlockID) -> CompactBlock [deprecated] +// Trait: get_block_nullifiers(BlockId) -> CompactBlock +#[allow(deprecated)] +async fn get_block_nullifiers(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let id = BlockId { + height: 0, + hash: vec![], + }; + let _p: CompactBlock = c + .get_block_nullifiers(Request::new(id.clone())) + .await + .unwrap() + .into_inner(); + let _t: CompactBlock = i.get_block_nullifiers(id).await.unwrap(); +} + +// Proto: GetBlockRange(BlockRange) -> stream CompactBlock +// Trait: get_block_range(BlockRange) -> Streaming +async fn get_block_range(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let range = BlockRange { + start: None, + end: None, + pool_types: vec![], + }; + let _p: tonic::Streaming = c + .get_block_range(Request::new(range.clone())) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_block_range(range).await.unwrap(); +} + +// Proto: GetBlockRangeNullifiers(BlockRange) -> stream CompactBlock [deprecated] +// Trait: get_block_range_nullifiers(BlockRange) -> Streaming +#[allow(deprecated)] +async fn get_block_range_nullifiers(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let range = BlockRange { + start: None, + end: None, + pool_types: vec![], + }; + let _p: tonic::Streaming = c + .get_block_range_nullifiers(Request::new(range.clone())) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_block_range_nullifiers(range).await.unwrap(); +} + +// Proto: GetTransaction(TxFilter) -> RawTransaction +// Trait: get_transaction(TxFilter) -> RawTransaction +async fn get_transaction(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let filter = TxFilter { + block: None, + index: 0, + hash: vec![], + }; + let _p: RawTransaction = c + .get_transaction(Request::new(filter.clone())) + .await + .unwrap() + .into_inner(); + let _t: RawTransaction = i.get_transaction(filter).await.unwrap(); +} + +// Proto: GetMempoolTx(GetMempoolTxRequest) -> stream CompactTx +// Trait: get_mempool_tx(GetMempoolTxRequest) -> Streaming +async fn get_mempool_tx(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let req = GetMempoolTxRequest { + exclude_txid_suffixes: vec![], + pool_types: vec![], + }; + let _p: tonic::Streaming = c + .get_mempool_tx(Request::new(req.clone())) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_mempool_tx(req).await.unwrap(); +} + +// Proto: GetMempoolStream(Empty) -> stream RawTransaction +// Trait: get_mempool_stream() -> Streaming (Empty hidden by impl) +async fn get_mempool_stream(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let _p: tonic::Streaming = c + .get_mempool_stream(Request::new(Empty {})) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_mempool_stream().await.unwrap(); +} + +// Proto: GetLatestTreeState(Empty) -> TreeState +// Trait: get_latest_tree_state() -> TreeState (Empty hidden by impl) +async fn get_latest_tree_state(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let _p: TreeState = c + .get_latest_tree_state(Request::new(Empty {})) + .await + .unwrap() + .into_inner(); + let _t: TreeState = i.get_latest_tree_state().await.unwrap(); +} + +// Proto: GetSubtreeRoots(GetSubtreeRootsArg) -> stream SubtreeRoot +// Trait: get_subtree_roots(GetSubtreeRootsArg) -> Streaming +async fn get_subtree_roots(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let arg = GetSubtreeRootsArg { + start_index: 0, + shielded_protocol: 0, + max_entries: 0, + }; + let _p: tonic::Streaming = c + .get_subtree_roots(Request::new(arg)) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_subtree_roots(arg).await.unwrap(); +} + +// Proto: Ping(Duration) -> PingResponse +// Trait: ping(ProtoDuration) -> PingResponse (aliased to avoid std collision) +#[cfg(feature = "ping-very-insecure")] +async fn ping(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let dur = ProtoDuration { interval_us: 0 }; + let _p: PingResponse = c.ping(Request::new(dur)).await.unwrap().into_inner(); + let _t: PingResponse = i.ping(dur).await.unwrap(); +} + +// ── TransparentIndexer trait ──────────────────────────────────────── + +#[cfg(feature = "globally-public-transparent")] +mod transparent { + use super::*; + use lightwallet_protocol::{ + Address, AddressList, Balance, GetAddressUtxosArg, GetAddressUtxosReply, + GetAddressUtxosReplyList, TransparentAddressBlockFilter, + }; + + // Proto: GetTaddressTxids(TransparentAddressBlockFilter) -> stream RawTransaction [deprecated] + // Trait: get_taddress_txids(TABF) -> Streaming + #[allow(deprecated)] + async fn get_taddress_txids(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let f = TransparentAddressBlockFilter { + address: String::new(), + range: None, + }; + let _p: tonic::Streaming = c + .get_taddress_txids(Request::new(f.clone())) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_taddress_txids(f).await.unwrap(); + } + + // Proto: GetTaddressTransactions(TransparentAddressBlockFilter) -> stream RawTransaction + // Trait: get_taddress_transactions(TABF) -> Streaming + async fn get_taddress_transactions(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let f = TransparentAddressBlockFilter { + address: String::new(), + range: None, + }; + let _p: tonic::Streaming = c + .get_taddress_transactions(Request::new(f.clone())) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = i.get_taddress_transactions(f).await.unwrap(); + } + + // Proto: GetTaddressBalance(AddressList) -> Balance + // Trait: get_taddress_balance(AddressList) -> Balance + async fn get_taddress_balance(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let addrs = AddressList { addresses: vec![] }; + let _p: Balance = c + .get_taddress_balance(Request::new(addrs.clone())) + .await + .unwrap() + .into_inner(); + let _t: Balance = i.get_taddress_balance(addrs).await.unwrap(); + } + + // Proto: GetTaddressBalanceStream(stream Address) -> Balance + // Trait: get_taddress_balance_stream(Vec
) -> Balance (Vec streamed by impl) + async fn get_taddress_balance_stream( + c: &mut CompactTxStreamerClient, + i: &GrpcIndexer, + ) { + let addrs = vec![Address { + address: String::new(), + }]; + let _p: Balance = c + .get_taddress_balance_stream(tokio_stream::iter(addrs.clone())) + .await + .unwrap() + .into_inner(); + let _t: Balance = i.get_taddress_balance_stream(addrs).await.unwrap(); + } + + // Proto: GetAddressUtxos(GetAddressUtxosArg) -> GetAddressUtxosReplyList + // Trait: get_address_utxos(GetAddressUtxosArg) -> GetAddressUtxosReplyList + async fn get_address_utxos(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let arg = GetAddressUtxosArg { + addresses: vec![], + start_height: 0, + max_entries: 0, + }; + let _p: GetAddressUtxosReplyList = c + .get_address_utxos(Request::new(arg.clone())) + .await + .unwrap() + .into_inner(); + let _t: GetAddressUtxosReplyList = i.get_address_utxos(arg).await.unwrap(); + } + + // Proto: GetAddressUtxosStream(GetAddressUtxosArg) -> stream GetAddressUtxosReply + // Trait: get_address_utxos_stream(GetAddressUtxosArg) -> Streaming + async fn get_address_utxos_stream(c: &mut CompactTxStreamerClient, i: &GrpcIndexer) { + let arg = GetAddressUtxosArg { + addresses: vec![], + start_height: 0, + max_entries: 0, + }; + let _p: tonic::Streaming = c + .get_address_utxos_stream(Request::new(arg.clone())) + .await + .unwrap() + .into_inner(); + let _t: tonic::Streaming = + i.get_address_utxos_stream(arg).await.unwrap(); + } +}