diff --git a/Cargo.lock b/Cargo.lock index 4921f1a..0491da0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,42 +2,6 @@ # It is not intended for manual editing. version = 4 -[[package]] -name = "addr2line" -version = "0.25.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common 0.1.7", - "generic-array", -] - -[[package]] -name = "aes" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - [[package]] name = "aho-corasick" version = "1.1.4" @@ -47,21 +11,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "allocator-api2" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" - -[[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 = "anstream" version = "1.0.0" @@ -98,7 +47,7 @@ version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" dependencies = [ - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -109,7 +58,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" dependencies = [ "anstyle", "once_cell_polyfill", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -118,18 +67,6 @@ version = "1.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a4385e2e34eb35d6b3efe798b9eb88096925d87726c0798709bf56d9ed84af3" -[[package]] -name = "arrayref" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" - -[[package]] -name = "arrayvec" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" - [[package]] name = "assert_cmd" version = "2.2.1" @@ -145,87 +82,12 @@ dependencies = [ "wait-timeout", ] -[[package]] -name = "async-trait" -version = "0.1.89" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "atomic-waker" version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" -[[package]] -name = "autocfg" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" - -[[package]] -name = "axum" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31b698c5f9a010f6573133b09e0de5408834d0c82f8d7475a89fc1867a71cd90" -dependencies = [ - "axum-core", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "itoa", - "matchit", - "memchr", - "mime", - "percent-encoding", - "pin-project-lite", - "serde_core", - "sync_wrapper", - "tower 0.5.3", - "tower-layer", - "tower-service", -] - -[[package]] -name = "axum-core" -version = "0.5.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08c78f31d7b1291f7ee735c1c6780ccde7785daae9a9206026862dab7d8792d1" -dependencies = [ - "bytes", - "futures-core", - "http", - "http-body", - "http-body-util", - "mime", - "pin-project-lite", - "sync_wrapper", - "tower-layer", - "tower-service", -] - -[[package]] -name = "backtrace" -version = "0.3.76" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" -dependencies = [ - "addr2line", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", - "windows-link", -] - [[package]] name = "base64" version = "0.22.1" @@ -238,160 +100,26 @@ version = "1.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2af50177e190e07a26ab74f8b1efbfe2ef87da2116221318cb1c2e82baf7de06" -[[package]] -name = "bech32" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" - -[[package]] -name = "bellman" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afceed28bac7f9f5a508bca8aeeff51cdfa4770c0b967ac55c621e2ddfd6171" -dependencies = [ - "bitvec", - "blake2s_simd", - "byteorder", - "crossbeam-channel", - "ff", - "group", - "lazy_static", - "log", - "num_cpus", - "pairing", - "rand_core 0.6.4", - "rayon", - "subtle", -] - -[[package]] -name = "bincode" -version = "1.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] - -[[package]] -name = "bindgen" -version = "0.69.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", - "proc-macro2", - "quote", - "regex", - "rustc-hash 1.1.0", - "shlex", - "syn 2.0.117", -] - -[[package]] -name = "bindgen" -version = "0.72.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" -dependencies = [ - "bitflags", - "cexpr", - "clang-sys", - "itertools 0.13.0", - "proc-macro2", - "quote", - "regex", - "rustc-hash 2.1.2", - "shlex", - "syn 2.0.117", -] - [[package]] name = "bip0039" version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "568b6890865156d9043af490d4c4081c385dd68ea10acd6ca15733d511e6b51c" dependencies = [ - "hmac 0.12.1", + "hmac", "pbkdf2", - "rand 0.8.6", - "sha2 0.10.9", + "rand", + "sha2", "unicode-normalization", "zeroize", ] -[[package]] -name = "bip32" -version = "0.6.0-pre.1" -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", - "ripemd 0.2.0-pre.4", - "secp256k1", - "sha2 0.11.0-pre.4", - "subtle", - "zeroize", -] - [[package]] name = "bitflags" version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" -[[package]] -name = "bitflags-serde-legacy" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b64e60c28b6d25ad92e8b367801ff9aa12b41d05fc8798055d296bace4a60cc" -dependencies = [ - "bitflags", - "serde", -] - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "blake2b_simd" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b79834656f71332577234b50bfc009996f7449e0c056884e6a02492ded0ca2f3" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - -[[package]] -name = "blake2s_simd" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee29928bad1e3f94c9d1528da29e07a1d3d04817ae8332de1e8b846c8439f4b3" -dependencies = [ - "arrayref", - "arrayvec", - "constant_time_eq", -] - [[package]] name = "block-buffer" version = "0.10.4" @@ -401,48 +129,6 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-buffer" -version = "0.11.0-rc.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fd016a0ddc7cb13661bf5576073ce07330a693f8608a1320b4e20561cc12cdc" -dependencies = [ - "hybrid-array", -] - -[[package]] -name = "bls12_381" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" -dependencies = [ - "ff", - "group", - "pairing", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "bounded-vec" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dc0086e469182132244e9b8d313a0742e1132da43a08c24b9dd3c18e0faf3a" -dependencies = [ - "serde", - "thiserror 2.0.18", -] - -[[package]] -name = "bs58" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88ba1141d185c399bee5288d850d63b8369520c1eafc32a0430b5b6c287bf4" -dependencies = [ - "sha2 0.10.9", - "tinyvec", -] - [[package]] name = "bstr" version = "1.12.1" @@ -460,64 +146,12 @@ version = "3.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d20789868f4b01b2f2caec9f5c4e0213b41e3e5702a50157d699ae31ced2fcb" -[[package]] -name = "byte-slice-cast" -version = "1.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7575182f7272186991736b70173b0ea045398f984bf5ebbb3804736ce1330c9d" - -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" -[[package]] -name = "bzip2-sys" -version = "0.1.13+1.0.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225bff33b2141874fe80d71e07d6eec4f85c5c216453dd96388240f96e1acc14" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "cbc" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" -dependencies = [ - "cipher", -] - -[[package]] -name = "cc" -version = "1.2.61" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex", -] - -[[package]] -name = "cexpr" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" -dependencies = [ - "nom", -] - [[package]] name = "cfg-if" version = "1.0.4" @@ -530,64 +164,6 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "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", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common 0.1.7", - "inout", - "zeroize", -] - -[[package]] -name = "clang-sys" -version = "1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" -dependencies = [ - "glob", - "libc", - "libloading", -] - [[package]] name = "clap" version = "4.6.1" @@ -619,7 +195,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -628,19 +204,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" -[[package]] -name = "color-eyre" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5920befb47832a6d61ee3a3a846565cfa39b331331e68a3b1d1116630f2f26d" -dependencies = [ - "backtrace", - "eyre", - "indenter", - "once_cell", - "owo-colors", -] - [[package]] name = "colorchoice" version = "1.0.5" @@ -655,2607 +218,695 @@ checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] -name = "const-oid" -version = "0.9.6" +name = "cpufeatures" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8" - -[[package]] -name = "const_format" -version = "0.2.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" dependencies = [ - "const_format_proc_macros", - "konst", + "libc", ] [[package]] -name = "const_format_proc_macros" -version = "0.2.34" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", + "generic-array", + "typenum", ] [[package]] -name = "constant_time_eq" -version = "0.4.2" +name = "difflib" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] -name = "convert_case" -version = "0.8.0" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ - "unicode-segmentation", + "block-buffer", + "crypto-common", + "subtle", ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" - -[[package]] -name = "corez" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df6f98652d30167eaeea34d77b730e07c8caba6df17bd4551842b9b8da01deb" - -[[package]] -name = "cpufeatures" -version = "0.2.17" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "libc", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "crossbeam-channel" -version = "0.5.15" +name = "encode_unicode" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" -dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", -] +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ - "crossbeam-utils", + "libc", + "windows-sys", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "fastrand" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] -name = "crunchy" -version = "0.2.4" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "crypto-common" -version = "0.1.7" +name = "form_urlencoded" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "generic-array", - "typenum", + "percent-encoding", ] [[package]] -name = "crypto-common" -version = "0.2.0-rc.1" +name = "futures-channel" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ - "hybrid-array", + "futures-core", ] [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "futures-core" +version = "0.3.32" 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", - "serde", - "subtle", - "zeroize", -] +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" +name = "futures-task" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] -name = "darling" -version = "0.23.0" +name = "futures-util" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "darling_core", - "darling_macro", + "futures-core", + "futures-task", + "pin-project-lite", + "slab", ] [[package]] -name = "darling_core" -version = "0.23.0" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "ident_case", - "proc-macro2", - "quote", - "strsim", - "syn 2.0.117", + "typenum", + "version_check", ] [[package]] -name = "darling_macro" -version = "0.23.0" +name = "getrandom" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ - "darling_core", - "quote", - "syn 2.0.117", + "cfg-if", + "libc", + "wasi", ] [[package]] -name = "der" -version = "0.7.10" +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", ] [[package]] -name = "deranged" -version = "0.5.8" +name = "hashbrown" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "powerfmt", - "serde_core", + "foldhash", ] [[package]] -name = "derive-getters" -version = "0.5.0" +name = "hashbrown" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] -name = "derive-new" -version = "0.5.9" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "difflib" -version = "0.4.0" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "digest" -version = "0.10.7" +name = "hmac" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", - "subtle", + "digest", ] [[package]] -name = "digest" -version = "0.11.0-pre.9" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "block-buffer 0.11.0-rc.3", - "crypto-common 0.2.0-rc.1", - "subtle", + "bytes", + "itoa", ] [[package]] -name = "dirs" -version = "6.0.0" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "dirs-sys", + "bytes", + "http", ] [[package]] -name = "dirs-sys" -version = "0.5.0" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", ] [[package]] -name = "displaydoc" -version = "0.2.5" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "document-features" -version = "0.2.12" +name = "hyper" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ - "litrs", + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", ] [[package]] -name = "documented" -version = "0.9.2" +name = "hyper-util" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6b3e31251e87acd1b74911aed84071c8364fc9087972748ade2f1094ccce34" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "documented-macros", - "phf", - "thiserror 2.0.18", + "base64", + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "hyper", + "ipnet", + "libc", + "percent-encoding", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", ] [[package]] -name = "documented-macros" -version = "0.9.2" +name = "icu_collections" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1149cf7462e5e79e17a3c05fd5b1f9055092bbfa95e04c319395c3beacc9370f" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ - "convert_case", - "itertools 0.14.0", - "optfield", - "proc-macro2", - "quote", - "strum", - "syn 2.0.117", + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "dyn-clone" -version = "1.0.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" - -[[package]] -name = "ed25519" -version = "2.2.3" +name = "icu_locale_core" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ - "pkcs8", - "serde", - "signature", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", ] [[package]] -name = "ed25519-zebra" -version = "4.2.0" +name = "icu_normalizer" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775765289f7c6336c18d3d66127527820dd45ffd9eb3b6b8ee4708590e6c20f5" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "curve25519-dalek", - "ed25519", - "hashbrown 0.16.1", - "pkcs8", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] -name = "either" -version = "1.15.0" +name = "icu_normalizer_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] -name = "encode_unicode" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" - -[[package]] -name = "env_logger" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" -dependencies = [ - "log", - "regex", -] - -[[package]] -name = "equihash" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306286e8dcc39ab3dfceb74c792ce8baffdab90591321d3ffaae64829734c37f" -dependencies = [ - "blake2b_simd", - "corez", - "document-features", -] - -[[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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" -dependencies = [ - "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "eyre" -version = "0.6.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" -dependencies = [ - "indenter", - "once_cell", -] - -[[package]] -name = "f4jumble" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d42773cb15447644d170be20231a3268600e0c4cea8987d013b93ac973d3cf7" -dependencies = [ - "blake2b_simd", -] - -[[package]] -name = "fastrand" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" - -[[package]] -name = "ff" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" -dependencies = [ - "bitvec", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "fiat-crypto" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" - -[[package]] -name = "find-msvc-tools" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" - -[[package]] -name = "fixed-hash" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.6", - "rustc-hex", - "static_assertions", -] - -[[package]] -name = "fixedbitset" -version = "0.5.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "foldhash" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" - -[[package]] -name = "foldhash" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" - -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "fpe" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c4b37de5ae15812a764c958297cfc50f5c010438f60c6ce75d11b802abd404" -dependencies = [ - "cbc", - "cipher", - "libm", - "num-bigint", - "num-integer", - "num-traits", -] - -[[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" -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", -] - -[[package]] -name = "futures-channel" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" -dependencies = [ - "futures-core", - "futures-sink", -] - -[[package]] -name = "futures-core" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" - -[[package]] -name = "futures-executor" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] - -[[package]] -name = "futures-io" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" - -[[package]] -name = "futures-macro" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "futures-sink" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" - -[[package]] -name = "futures-task" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" - -[[package]] -name = "futures-util" -version = "0.3.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.1.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" -dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", -] - -[[package]] -name = "getrandom" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" -dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", - "wasip2", - "wasip3", -] - -[[package]] -name = "getset" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "gimli" -version = "0.32.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" - -[[package]] -name = "glob" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" - -[[package]] -name = "group" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" -dependencies = [ - "ff", - "memuse", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "h2" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" -dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.14.0", - "slab", - "tokio", - "tokio-util", - "tracing", -] - -[[package]] -name = "halo2_gadgets" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2a697cad929f706b7987fe804ad57d43622cd37463ba7e4d662a926fdcfea3" -dependencies = [ - "arrayvec", - "bitvec", - "ff", - "group", - "halo2_poseidon", - "halo2_proofs", - "lazy_static", - "pasta_curves", - "rand 0.8.6", - "sinsemilla", - "subtle", - "uint 0.9.5", -] - -[[package]] -name = "halo2_legacy_pdqsort" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47716fe1ae67969c5e0b2ef826f32db8c3be72be325e1aa3c1951d06b5575ec5" - -[[package]] -name = "halo2_poseidon" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa3da60b81f02f9b33ebc6252d766f843291fb4d2247a07ae73d20b791fc56f" -dependencies = [ - "bitvec", - "ff", - "group", - "pasta_curves", -] - -[[package]] -name = "halo2_proofs" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05713f117155643ce10975e0bee44a274bcda2f4bb5ef29a999ad67c1fa8d4d3" -dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_legacy_pdqsort", - "indexmap 1.9.3", - "maybe-rayon", - "pasta_curves", - "rand_core 0.6.4", - "tracing", -] - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" - -[[package]] -name = "hashbrown" -version = "0.15.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] - -[[package]] -name = "hashbrown" -version = "0.16.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", -] - -[[package]] -name = "hashbrown" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" - -[[package]] -name = "heck" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" - -[[package]] -name = "hermit-abi" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" -dependencies = [ - "serde", -] - -[[package]] -name = "hex-literal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" - -[[package]] -name = "hmac" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" -dependencies = [ - "digest 0.10.7", -] - -[[package]] -name = "hmac" -version = "0.13.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" -dependencies = [ - "digest 0.11.0-pre.9", -] - -[[package]] -name = "home" -version = "0.5.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "http" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" -dependencies = [ - "bytes", - "itoa", -] - -[[package]] -name = "http-body" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" -dependencies = [ - "bytes", - "http", -] - -[[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 = "human_bytes" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" - -[[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.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" -dependencies = [ - "atomic-waker", - "bytes", - "futures-channel", - "futures-core", - "h2", - "http", - "http-body", - "httparse", - "httpdate", - "itoa", - "pin-project-lite", - "smallvec", - "tokio", - "want", -] - -[[package]] -name = "hyper-rustls" -version = "0.27.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ca68d021ef39cf6463ab54c1d0f5daf03377b70561305bb89a8f83aab66e0f" -dependencies = [ - "http", - "hyper", - "hyper-util", - "rustls", - "tokio", - "tokio-rustls", - "tower-service", - "webpki-roots", -] - -[[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 = [ - "base64", - "bytes", - "futures-channel", - "futures-util", - "http", - "http-body", - "hyper", - "ipnet", - "libc", - "percent-encoding", - "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", -] - -[[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 = "icu_collections" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" -dependencies = [ - "displaydoc", - "potential_utf", - "utf8_iter", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" - -[[package]] -name = "icu_properties" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" - -[[package]] -name = "icu_provider" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[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 = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - -[[package]] -name = "impl-codec" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" -dependencies = [ - "parity-scale-codec", -] - -[[package]] -name = "impl-trait-for-tuples" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "incrementalmerkletree" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30821f91f0fa8660edca547918dc59812893b497d07c1144f326f07fdd94aba9" -dependencies = [ - "either", -] - -[[package]] -name = "indenter" -version = "0.3.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "964de6e86d545b246d84badc0fef527924ace5134f30641c203ef52ba83f58d5" - -[[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.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" -dependencies = [ - "equivalent", - "hashbrown 0.17.0", - "serde", - "serde_core", -] - -[[package]] -name = "inout" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" -dependencies = [ - "generic-array", -] - -[[package]] -name = "insta" -version = "1.47.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" -dependencies = [ - "console", - "once_cell", - "similar", - "tempfile", -] - -[[package]] -name = "ipnet" -version = "2.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" - -[[package]] -name = "iri-string" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" -dependencies = [ - "memchr", - "serde", -] - -[[package]] -name = "is_terminal_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" - -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - -[[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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" - -[[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.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" -dependencies = [ - "cfg-if", - "futures-util", - "once_cell", - "wasm-bindgen", -] - -[[package]] -name = "json" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" - -[[package]] -name = "jsonrpsee" -version = "0.24.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e281ae70cc3b98dac15fced3366a880949e65fc66e345ce857a5682d152f3e62" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-server", - "jsonrpsee-types", - "tokio", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.24.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348ee569eaed52926b5e740aae20863762b16596476e943c9e415a6479021622" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "jsonrpsee-types", - "parking_lot", - "rand 0.8.6", - "rustc-hash 2.1.2", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.24.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7398cddf5013cca4702862a2692b66c48a3bd6cf6ec681a47453c93d63cf8de5" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.24.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21429bcdda37dcf2d43b68621b994adede0e28061f816b038b0f18c70c143d51" -dependencies = [ - "futures-util", - "http", - "http-body", - "http-body-util", - "hyper", - "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", - "pin-project", - "route-recognizer", - "serde", - "serde_json", - "soketto", - "thiserror 1.0.69", - "tokio", - "tokio-stream", - "tokio-util", - "tower 0.4.13", - "tracing", -] - -[[package]] -name = "jsonrpsee-types" -version = "0.24.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f05e0028e55b15dbd2107163b3c744cd3bb4474f193f95d9708acbf5677e44" -dependencies = [ - "http", - "serde", - "serde_json", - "thiserror 1.0.69", -] - -[[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 = "known-folders" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a1886916523694cd6ea3d175f03a1e5010699a2a4cc13696d83d7bea1d80638" -dependencies = [ - "windows-sys 0.61.2", -] - -[[package]] -name = "konst" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "128133ed7824fcd73d6e7b17957c5eb7bacb885649bd8c69708b2331a10bcefb" -dependencies = [ - "konst_macro_rules", -] - -[[package]] -name = "konst_macro_rules" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4933f3f57a8e9d9da04db23fb153356ecaf00cbd14aee46279c33dc80925c37" - -[[package]] -name = "lazy_static" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" -dependencies = [ - "spin", -] - -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - -[[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.186" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" - -[[package]] -name = "libloading" -version = "0.8.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" -dependencies = [ - "cfg-if", - "windows-link", -] - -[[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.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" -dependencies = [ - "libc", -] - -[[package]] -name = "librocksdb-sys" -version = "0.16.0+8.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce3d60bc059831dc1c83903fb45c103f75db65c5a7bf22272764d9cc683e348c" -dependencies = [ - "bindgen 0.69.5", - "bzip2-sys", - "cc", - "glob", - "libc", - "libz-sys", - "lz4-sys", -] - -[[package]] -name = "libz-sys" -version = "1.1.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libzcash_script" -version = "0.1.0" -source = "git+https://github.com/zancas/zcash_script?branch=fix-bindgen-rust-target#c9f1abd6edd43a3ab03923761ee7ae5f725ac2fa" -dependencies = [ - "bindgen 0.72.1", - "cc", - "thiserror 2.0.18", - "tracing", - "zcash_script", -] - -[[package]] -name = "linux-raw-sys" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" - -[[package]] -name = "litemap" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" - -[[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 = "lru-slab" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "112b39cec0b298b6c1999fee3e31427f74f676e4cb9879ed1a121b43661a4154" - -[[package]] -name = "lz4-sys" -version = "1.11.1+lz4-1.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd8c0d6c6ed0cd30b3652886bb8711dc4bb01d637a68105a3d5158039b418e6" -dependencies = [ - "cc", - "libc", -] - -[[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", - "rayon", -] - -[[package]] -name = "memchr" -version = "2.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" - -[[package]] -name = "memuse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d97bbf43eb4f088f8ca469930cde17fa036207c9a5e02ccc5107c4e8b17c964" - -[[package]] -name = "metrics" -version = "0.24.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89550ee9f79e88fef3119de263694973a8adb26c21d75322164fb8c493039fe2" -dependencies = [ - "portable-atomic", - "rapidhash", -] - -[[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", -] - -[[package]] -name = "mio" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" -dependencies = [ - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "windows-sys 0.61.2", -] - -[[package]] -name = "mset" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c4d16a3d2b0e89ec6e7d509cf791545fcb48cbc8fc2fb2e96a492defda9140" - -[[package]] -name = "multimap" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d87ecb2933e8aeadb3e3a02b828fed80a7528047e68b4f424523a0981a3a084" - -[[package]] -name = "nix" -version = "0.30.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" -dependencies = [ - "bitflags", - "cfg-if", - "cfg_aliases", - "libc", -] - -[[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 = "nonempty" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "549e471b99ccaf2f89101bec68f4d244457d5a95a9c3d0672e9564124397741d" - -[[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-conv" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" - -[[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-traits" -version = "0.2.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.37.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" - -[[package]] -name = "once_cell_polyfill" -version = "1.70.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" - -[[package]] -name = "opaque-debug" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" - -[[package]] -name = "openrpsee" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "faeb689cfe5fad5e7285f87b00c903366b307d97f41de53e894ec608968ca3a1" -dependencies = [ - "documented", - "jsonrpsee", - "quote", - "schemars 1.2.1", - "serde", - "serde_json", - "syn 2.0.117", -] - -[[package]] -name = "optfield" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969ccca8ffc4fb105bd131a228107d5c9dd89d9d627edf3295cbe979156f9712" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[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.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497e74492624a1d1cc8c9675a7afb17b430d32fd9efc171513d0840140b5f0c7" -dependencies = [ - "aes", - "bitvec", - "blake2b_simd", - "corez", - "ff", - "fpe", - "getset", - "group", - "halo2_poseidon", - "hex", - "incrementalmerkletree", - "lazy_static", - "memuse", - "nonempty", - "pasta_curves", - "rand 0.8.6", - "rand_core 0.6.4", - "reddsa", - "serde", - "sinsemilla", - "subtle", - "tracing", - "visibility", - "zcash_note_encryption", - "zcash_spec", - "zip32", -] - -[[package]] -name = "orchard" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a54f8d29bfb1e76a9d4e868a1a08cce2e57dd2bdc66232982822ad3114b91ab3" -dependencies = [ - "aes", - "bitvec", - "blake2b_simd", - "corez", - "ff", - "fpe", - "getset", - "group", - "halo2_gadgets", - "halo2_poseidon", - "halo2_proofs", - "hex", - "incrementalmerkletree", - "lazy_static", - "memuse", - "nonempty", - "pasta_curves", - "rand 0.8.6", - "rand_core 0.6.4", - "reddsa", - "serde", - "sinsemilla", - "subtle", - "tracing", - "visibility", - "zcash_note_encryption", - "zcash_spec", - "zip32", -] - -[[package]] -name = "ordered-map" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ac8f4a4a06c811aa24b151dbb3fe19f687cb52e0d5cca0493671ed88f973970" -dependencies = [ - "quickcheck", - "quickcheck_macros", -] - -[[package]] -name = "owo-colors" -version = "4.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" - -[[package]] -name = "pairing" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" -dependencies = [ - "group", -] - -[[package]] -name = "parity-scale-codec" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "799781ae679d79a948e13d4824a40970bfa500058d245760dd857301059810fa" -dependencies = [ - "arrayvec", - "bitvec", - "byte-slice-cast", - "const_format", - "impl-trait-for-tuples", - "parity-scale-codec-derive", - "rustversion", - "serde", -] - -[[package]] -name = "parity-scale-codec-derive" -version = "3.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34b4653168b563151153c9e4c08ebed57fb8262bebfa79711552fa983c623e7a" -dependencies = [ - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[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", - "smallvec", - "windows-link", -] - -[[package]] -name = "password-hash" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" -dependencies = [ - "base64ct", - "rand_core 0.6.4", - "subtle", -] - -[[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.6", - "static_assertions", - "subtle", -] - -[[package]] -name = "pbkdf2" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" -dependencies = [ - "digest 0.10.7", - "password-hash", -] - -[[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.14.0", -] - -[[package]] -name = "phf" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "913273894cec178f401a31ec4b656318d95473527be05c0752cc41cdc32be8b7" -dependencies = [ - "phf_macros", - "phf_shared", - "serde", -] - -[[package]] -name = "phf_generator" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cbb1126afed61dd6368748dae63b1ee7dc480191c6262a3b4ff1e29d86a6c5b" -dependencies = [ - "fastrand", - "phf_shared", -] - -[[package]] -name = "phf_macros" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d713258393a82f091ead52047ca779d37e5766226d009de21696c4e667044368" -dependencies = [ - "phf_generator", - "phf_shared", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "phf_shared" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06005508882fb681fd97892ecff4b7fd0fee13ef1aa569f8695dae7ab9099981" -dependencies = [ - "siphasher", -] - -[[package]] -name = "pin-project" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "pin-project-lite" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" - -[[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.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19f132c84eca552bf34cab8ec81f1c1dcc229b811638f9d283dceabe58c5569e" - -[[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 = "portable-atomic" -version = "1.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" - -[[package]] -name = "potential_utf" -version = "0.1.5" +name = "icu_properties" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", "zerovec", ] [[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" +name = "icu_properties_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] -name = "predicates" -version = "3.1.4" +name = "icu_provider" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" dependencies = [ - "anstyle", - "difflib", - "predicates-core", + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", ] [[package]] -name = "predicates-core" -version = "1.0.10" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] -name = "predicates-tree" -version = "1.0.13" +name = "idna" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "predicates-core", - "termtree", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "prettyplease" -version = "0.2.37" +name = "idna_adapter" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ - "proc-macro2", - "syn 2.0.117", + "icu_normalizer", + "icu_properties", ] [[package]] -name = "primitive-types" -version = "0.12.2" +name = "indexmap" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ - "fixed-hash", - "impl-codec", - "uint 0.9.5", + "equivalent", + "hashbrown 0.17.0", + "serde", + "serde_core", ] [[package]] -name = "proc-macro-crate" -version = "3.5.0" +name = "insta" +version = "1.47.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" dependencies = [ - "toml_edit", + "console", + "once_cell", + "similar", + "tempfile", ] [[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" +name = "ipnet" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] +checksum = "d98f6fed1fde3f8c21bc40a1abb88dd75e67924f9cffc3ef95607bad8017f8e2" [[package]] -name = "proc-macro-error2" -version = "2.0.1" +name = "iri-string" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.117", + "memchr", + "serde", ] [[package]] -name = "proc-macro2" -version = "1.0.106" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" [[package]] -name = "prost" -version = "0.14.3" +name = "itoa" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" -dependencies = [ - "bytes", - "prost-derive", -] +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "prost-build" -version = "0.14.3" +name = "js-sys" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ - "heck", - "itertools 0.14.0", - "log", - "multimap", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "pulldown-cmark", - "pulldown-cmark-to-cmark", - "regex", - "syn 2.0.117", - "tempfile", + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "prost-derive" -version = "0.14.3" +name = "json" +version = "0.12.4" 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", -] +checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" [[package]] -name = "prost-types" -version = "0.14.3" +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" -dependencies = [ - "prost", -] +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "pulldown-cmark" -version = "0.13.3" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] -name = "pulldown-cmark-to-cmark" -version = "22.0.0" +name = "libc" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" -dependencies = [ - "pulldown-cmark", -] +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] -name = "quickcheck" -version = "0.9.2" +name = "linux-raw-sys" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a44883e74aa97ad63db83c4bf8ca490f02b2fc02f92575e720c8551e843c945f" -dependencies = [ - "env_logger", - "log", - "rand 0.7.3", - "rand_core 0.5.1", -] +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "quickcheck_macros" -version = "0.9.1" +name = "litemap" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608c156fd8e97febc07dc9c2e2c80bf74cfc6ef26893eae3daf8bc2bc94a4b7f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] -name = "quinn" -version = "0.11.9" +name = "log" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.2", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "quinn-proto" -version = "0.11.14" +name = "memchr" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.4", - "ring", - "rustc-hash 2.1.2", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] -name = "quinn-udp" -version = "0.5.14" +name = "mio" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ - "cfg_aliases", "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", + "wasi", + "windows-sys", ] [[package]] -name = "quote" -version = "1.0.45" +name = "nix" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "proc-macro2", + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", ] [[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "r-efi" -version = "6.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.7.3" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", + "windows-sys", ] [[package]] -name = "rand" -version = "0.8.6" +name = "once_cell" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] -name = "rand" -version = "0.9.4" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] -name = "rand_chacha" -version = "0.2.2" +name = "owo-colors" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" [[package]] -name = "rand_chacha" -version = "0.3.1" +name = "password-hash" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", + "base64ct", + "rand_core", + "subtle", ] [[package]] -name = "rand_chacha" -version = "0.9.0" +name = "pbkdf2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", + "digest", + "password-hash", ] [[package]] -name = "rand_core" -version = "0.5.1" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "rand_core" -version = "0.6.4" +name = "pin-project-lite" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "rand_core" -version = "0.9.5" +name = "potential_utf" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" dependencies = [ - "getrandom 0.3.4", + "zerovec", ] [[package]] -name = "rand_hc" -version = "0.2.0" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "rand_core 0.5.1", + "zerocopy", ] [[package]] -name = "rapidhash" -version = "4.4.1" +name = "predicates" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" dependencies = [ - "rustversion", + "anstyle", + "difflib", + "predicates-core", ] [[package]] -name = "rayon" -version = "1.12.0" +name = "predicates-core" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" [[package]] -name = "rayon-core" -version = "1.13.0" +name = "predicates-tree" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" dependencies = [ - "crossbeam-deque", - "crossbeam-utils", + "predicates-core", + "termtree", ] [[package]] -name = "reddsa" -version = "0.5.1" +name = "prettyplease" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a5191930e84973293aa5f532b513404460cd2216c1cfb76d08748c15b40b02" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ - "blake2b_simd", - "byteorder", - "group", - "hex", - "jubjub", - "pasta_curves", - "rand_core 0.6.4", - "serde", - "thiserror 1.0.69", - "zeroize", + "proc-macro2", + "syn", ] [[package]] -name = "redjubjub" -version = "0.8.0" +name = "proc-macro2" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b0ac1bc6bb3696d2c6f52cff8fba57238b81da8c0214ee6cd146eb8fde364e" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ - "rand_core 0.6.4", - "reddsa", - "serde", - "thiserror 1.0.69", - "zeroize", + "unicode-ident", ] [[package]] -name = "redox_syscall" -version = "0.5.18" +name = "quote" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ - "bitflags", + "proc-macro2", ] [[package]] -name = "redox_users" -version = "0.5.2" +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", + "libc", + "rand_chacha", + "rand_core", ] [[package]] -name = "ref-cast" -version = "1.0.25" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "ref-cast-impl", + "ppv-lite86", + "rand_core", ] [[package]] -name = "ref-cast-impl" -version = "1.0.25" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "getrandom 0.2.17", ] [[package]] @@ -3293,24 +944,15 @@ version = "0.1.0" dependencies = [ "anyhow", "assert_cmd", - "bip0039", "clap", "hex", "insta", "nix", "owo-colors", "regex", - "ripemd 0.1.3", - "secp256k1", - "sha2 0.10.9", "tokio", - "zcash_keys 0.13.0", "zcash_local_net", - "zcash_protocol 0.8.0", - "zcash_transparent 0.7.0", - "zebra-node-services", - "zebra-rpc", - "zip32", + "zingo_test_vectors", ] [[package]] @@ -3326,119 +968,23 @@ dependencies = [ "http-body", "http-body-util", "hyper", - "hyper-rustls", "hyper-util", "js-sys", "log", "percent-encoding", "pin-project-lite", - "quinn", - "rustls", - "rustls-pki-types", "serde", "serde_json", "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-rustls", - "tower 0.5.3", + "tower", "tower-http", "tower-service", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "webpki-roots", -] - -[[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 = "rlimit" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" -dependencies = [ - "libc", -] - -[[package]] -name = "rocksdb" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bd13e55d6d7b8cd0ea569161127567cd587676c99f4472f779a0279aa60a7a7" -dependencies = [ - "libc", - "librocksdb-sys", -] - -[[package]] -name = "route-recognizer" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afab94fb28594581f62d981211a9a4d53cc8130bbcbbb89a0440d9b8e81a7746" - -[[package]] -name = "rustc-demangle" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b50b8869d9fc858ce7266cce0194bd74df58b9d0e3f6df3a9fc8eb470d95c09d" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustc-hash" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" - -[[package]] -name = "rustc-hex" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" - -[[package]] -name = "rustc_version" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" -dependencies = [ - "semver", ] [[package]] @@ -3451,42 +997,7 @@ dependencies = [ "errno", "libc", "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" -dependencies = [ - "web-time", - "zeroize", -] - -[[package]] -name = "rustls-webpki" -version = "0.103.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e" -dependencies = [ - "ring", - "rustls-pki-types", - "untrusted", + "windows-sys", ] [[package]] @@ -3501,110 +1012,6 @@ version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" -[[package]] -name = "sapling-crypto" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d70756ede56b5e4dd417979777bd87ddb83dfcbd0815dbf8175a9920537f8a0" -dependencies = [ - "aes", - "bellman", - "bitvec", - "blake2b_simd", - "blake2s_simd", - "bls12_381", - "corez", - "document-features", - "ff", - "fpe", - "getset", - "group", - "hex", - "incrementalmerkletree", - "jubjub", - "lazy_static", - "memuse", - "rand 0.8.6", - "rand_core 0.6.4", - "redjubjub", - "subtle", - "tracing", - "zcash_note_encryption", - "zcash_spec", - "zip32", -] - -[[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", - "schemars_derive", - "serde", - "serde_json", -] - -[[package]] -name = "schemars_derive" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d115b50f4aaeea07e79c1912f645c7513d81715d0420f8bc77a18c6260b307f" -dependencies = [ - "proc-macro2", - "quote", - "serde_derive_internals", - "syn 2.0.117", -] - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "secp256k1" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9465315bc9d4566e1724f0fffcbcc446268cb522e60f9a27bcded6b19c108113" -dependencies = [ - "secp256k1-sys", - "serde", -] - -[[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 = "semver" version = "1.0.28" @@ -3621,15 +1028,6 @@ dependencies = [ "serde_derive", ] -[[package]] -name = "serde-big-array" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11fc7cc2c76d73e0f27ee52abbd64eec84d46f370c88371120433196934e4b7f" -dependencies = [ - "serde", -] - [[package]] name = "serde_core" version = "1.0.228" @@ -3647,18 +1045,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_derive_internals" -version = "0.29.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -3670,62 +1057,20 @@ dependencies = [ "itoa", "memchr", "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_urlencoded" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" -dependencies = [ - "form_urlencoded", - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "serde_with" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05839ce67618e14a09b286535c0d9c94e85ef25469b0e13cb4f844e5593eb19" -dependencies = [ - "base64", - "chrono", - "hex", - "indexmap 1.9.3", - "indexmap 2.14.0", - "schemars 0.9.0", - "schemars 1.2.1", - "serde_core", - "serde_json", - "serde_with_macros", - "time", -] - -[[package]] -name = "serde_with_macros" -version = "3.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2ebbe86054f9b45bc3881e865683ccfaccce97b9b4cb53f3039d67f355a334" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.117", + "serde_core", + "zmij", ] [[package]] -name = "sha1" -version = "0.10.6" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", + "form_urlencoded", + "itoa", + "ryu", + "serde", ] [[package]] @@ -3736,18 +1081,7 @@ 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", + "digest", ] [[package]] @@ -3759,12 +1093,6 @@ dependencies = [ "lazy_static", ] -[[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" @@ -3775,38 +1103,12 @@ dependencies = [ "libc", ] -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "rand_core 0.6.4", -] - [[package]] name = "similar" version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" -[[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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" - [[package]] name = "slab" version = "0.4.12" @@ -3826,39 +1128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ "libc", - "windows-sys 0.61.2", -] - -[[package]] -name = "soketto" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e859df029d160cb88608f5d7df7fb4753fd20fdfb4de5644f3d8b8440841721" -dependencies = [ - "base64", - "bytes", - "futures", - "http", - "httparse", - "log", - "rand 0.8.6", - "sha1", -] - -[[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", + "windows-sys", ] [[package]] @@ -3867,56 +1137,18 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" -[[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.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" @@ -3945,15 +1177,9 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] -[[package]] -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" @@ -3964,7 +1190,7 @@ dependencies = [ "getrandom 0.4.2", "once_cell", "rustix", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -3979,16 +1205,7 @@ 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", + "thiserror-impl", ] [[package]] @@ -3999,18 +1216,7 @@ 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", + "syn", ] [[package]] @@ -4022,37 +1228,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "time" -version = "0.3.47" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" -dependencies = [ - "deranged", - "itoa", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" - -[[package]] -name = "time-macros" -version = "0.2.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" -dependencies = [ - "num-conv", - "time-core", -] - [[package]] name = "tinystr" version = "0.8.3" @@ -4091,8 +1266,7 @@ dependencies = [ "signal-hook-registry", "socket2", "tokio-macros", - "tracing", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] @@ -4103,172 +1277,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", -] - -[[package]] -name = "tokio-rustls" -version = "0.26.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" -dependencies = [ - "rustls", - "tokio", -] - -[[package]] -name = "tokio-stream" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32da49809aab5c3bc678af03902d4ccddea2a87d028d86392a4b1560c6906c70" -dependencies = [ - "futures-core", - "pin-project-lite", - "tokio", - "tokio-util", -] - -[[package]] -name = "tokio-util" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ae9cec805b01e8fc3fd2fe289f89149a9b66dd16786abd8b19cfa7b48cb0098" -dependencies = [ - "bytes", - "futures-core", - "futures-io", - "futures-sink", - "pin-project-lite", - "tokio", -] - -[[package]] -name = "toml_datetime" -version = "1.1.1+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" -dependencies = [ - "serde_core", -] - -[[package]] -name = "toml_edit" -version = "0.25.11+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" -dependencies = [ - "indexmap 2.14.0", - "toml_datetime", - "toml_parser", - "winnow", -] - -[[package]] -name = "toml_parser" -version = "1.1.2+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2abe9b86193656635d2411dc43050282ca48aa31c2451210f4202550afb7526" -dependencies = [ - "winnow", -] - -[[package]] -name = "tonic" -version = "0.14.5" -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-stream", - "tower 0.5.3", - "tower-layer", - "tower-service", - "tracing", -] - -[[package]] -name = "tonic-build" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" -dependencies = [ - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tonic-prost" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" -dependencies = [ - "bytes", - "prost", - "tonic", -] - -[[package]] -name = "tonic-prost-build" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.117", - "tempfile", - "tonic-build", -] - -[[package]] -name = "tonic-reflection" -version = "0.14.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf0685a51e6d02b502ba0764002e766b7f3042aed13d9234925b6ffbfa3fca7" -dependencies = [ - "prost", - "prost-types", - "tokio", - "tokio-stream", - "tonic", - "tonic-prost", -] - -[[package]] -name = "tower" -version = "0.4.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" -dependencies = [ - "futures-core", - "futures-util", - "pin-project", - "pin-project-lite", - "tokio", - "tokio-util", - "tower-layer", - "tower-service", - "tracing", + "syn", ] [[package]] @@ -4279,44 +1288,11 @@ checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ "futures-core", "futures-util", - "indexmap 2.14.0", "pin-project-lite", - "slab", "sync_wrapper", "tokio", - "tokio-util", "tower-layer", "tower-service", - "tracing", -] - -[[package]] -name = "tower-batch-control" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e6cf52578f98b4da47335c26c4f883f7993b1a9b9d2f5420eb8dbfd5dd19a28" -dependencies = [ - "futures", - "futures-core", - "pin-project", - "rayon", - "tokio", - "tokio-util", - "tower 0.4.13", - "tracing", - "tracing-futures", -] - -[[package]] -name = "tower-fallback" -version = "0.2.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4434e19ee996ee5c6aa42f11463a355138452592e5c5b5b73b6f0f19534556af" -dependencies = [ - "futures-core", - "pin-project", - "tower 0.4.13", - "tracing", ] [[package]] @@ -4332,7 +1308,7 @@ dependencies = [ "http-body", "iri-string", "pin-project-lite", - "tower 0.5.3", + "tower", "tower-layer", "tower-service", ] @@ -4355,7 +1331,6 @@ version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "log", "pin-project-lite", "tracing-attributes", "tracing-core", @@ -4367,39 +1342,19 @@ version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tracing-core" -version = "0.1.36" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" -dependencies = [ - "once_cell", - "valuable", -] - -[[package]] -name = "tracing-error" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b1581020d7a273442f5b45074a6a57d5757ad0a47dac0e9f0bd57b81936f3db" -dependencies = [ - "tracing", - "tracing-subscriber", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "tracing-futures" -version = "0.2.5" +name = "tracing-core" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ - "pin-project", - "tracing", + "once_cell", + "valuable", ] [[package]] @@ -4439,36 +1394,6 @@ version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" -[[package]] -name = "uint" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "uint" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "909988d098b2f738727b161a106cfc7cab00c539c2687a8836f8e565976fb53e" -dependencies = [ - "byteorder", - "crunchy", - "hex", - "static_assertions", -] - -[[package]] -name = "unicase" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" - [[package]] name = "unicode-ident" version = "1.0.24" @@ -4484,34 +1409,12 @@ dependencies = [ "tinyvec", ] -[[package]] -name = "unicode-segmentation" -version = "1.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" - [[package]] name = "unicode-xid" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" -[[package]] -name = "universal-hash" -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 = "url" version = "2.5.8" @@ -4542,79 +1445,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version_check" version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" -[[package]] -name = "visibility" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "wagyu-zcash-parameters" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c904628658374e651288f000934c33ef738b2d8b3e65d4100b70b395dbe2bb" -dependencies = [ - "wagyu-zcash-parameters-1", - "wagyu-zcash-parameters-2", - "wagyu-zcash-parameters-3", - "wagyu-zcash-parameters-4", - "wagyu-zcash-parameters-5", - "wagyu-zcash-parameters-6", -] - -[[package]] -name = "wagyu-zcash-parameters-1" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bf2e21bb027d3f8428c60d6a720b54a08bf6ce4e6f834ef8e0d38bb5695da8" - -[[package]] -name = "wagyu-zcash-parameters-2" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a616ab2e51e74cc48995d476e94de810fb16fc73815f390bf2941b046cc9ba2c" - -[[package]] -name = "wagyu-zcash-parameters-3" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14da1e2e958ff93c0830ee68e91884069253bf3462a67831b02b367be75d6147" - -[[package]] -name = "wagyu-zcash-parameters-4" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f058aeef03a2070e8666ffb5d1057d8bb10313b204a254a6e6103eb958e9a6d6" - -[[package]] -name = "wagyu-zcash-parameters-5" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ffe916b30e608c032ae1b734f02574a3e12ec19ab5cc5562208d679efe4969d" - -[[package]] -name = "wagyu-zcash-parameters-6" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7b6d5a78adc3e8f198e9cd730f219a695431467f7ec29dcfc63ade885feebe1" - [[package]] name = "wait-timeout" version = "0.2.1" @@ -4633,12 +1469,6 @@ dependencies = [ "try-lock", ] -[[package]] -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" - [[package]] name = "wasi" version = "0.11.1+wasi-snapshot-preview1" @@ -4705,313 +1535,76 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", - "wasm-bindgen-shared", -] - -[[package]] -name = "wasm-bindgen-shared" -version = "0.2.120" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "wasm-encoder" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" -dependencies = [ - "leb128fmt", - "wasmparser", -] - -[[package]] -name = "wasm-metadata" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" -dependencies = [ - "anyhow", - "indexmap 2.14.0", - "wasm-encoder", - "wasmparser", -] - -[[package]] -name = "wasmparser" -version = "0.244.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" -dependencies = [ - "bitflags", - "hashbrown 0.15.5", - "indexmap 2.14.0", - "semver", -] - -[[package]] -name = "web-sys" -version = "0.3.97" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "web-time" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] - -[[package]] -name = "webpki-roots" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" -dependencies = [ - "rustls-pki-types", -] - -[[package]] -name = "which" -version = "8.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" -dependencies = [ - "libc", -] - -[[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", - "windows-result", - "windows-strings", -] - -[[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", -] - -[[package]] -name = "windows-link" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" - -[[package]] -name = "windows-result" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-strings" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] - -[[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", -] - -[[package]] -name = "windows-sys" -version = "0.61.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" -dependencies = [ - "windows-link", -] - -[[package]] -name = "windows-targets" -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", - "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_aarch64_gnullvm" -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" + "syn", + "wasm-bindgen-shared", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.52.6" +name = "wasm-bindgen-shared" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" +checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +dependencies = [ + "unicode-ident", +] [[package]] -name = "windows_x86_64_gnu" -version = "0.53.1" +name = "wasm-encoder" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" +checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +dependencies = [ + "leb128fmt", + "wasmparser", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.52.6" +name = "wasm-metadata" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" +checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder", + "wasmparser", +] [[package]] -name = "windows_x86_64_gnullvm" -version = "0.53.1" +name = "wasmparser" +version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" +checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +dependencies = [ + "bitflags", + "hashbrown 0.15.5", + "indexmap", + "semver", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.52.6" +name = "web-sys" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" +checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] -name = "windows_x86_64_msvc" -version = "0.53.1" +name = "windows-link" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" [[package]] -name = "winnow" -version = "1.0.2" +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "memchr", + "windows-link", ] [[package]] @@ -5048,9 +1641,9 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck", - "indexmap 2.14.0", + "indexmap", "prettyplease", - "syn 2.0.117", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -5066,7 +1659,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -5079,7 +1672,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags", - "indexmap 2.14.0", + "indexmap", "log", "serde", "serde_derive", @@ -5098,7 +1691,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.14.0", + "indexmap", "log", "semver", "serde", @@ -5114,33 +1707,6 @@ version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ffae5123b2d3fc086436f8834ae3ab053a283cfac8fe0a0b8eaae044768a4c4" -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -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 = "xdg" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fb433233f2df9344722454bc7e96465c9d03bff9d77c248f9e7523fe79585b5" - [[package]] name = "yoke" version = "0.8.2" @@ -5160,580 +1726,29 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] -[[package]] -name = "zcash_address" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355f3db1087875052b5ad0f9e7179a7e7794f0ae9cb1d6ab2b7db29f7b9a9b0b" -dependencies = [ - "bech32", - "bs58", - "corez", - "f4jumble", - "zcash_encoding", - "zcash_protocol 0.8.0", -] - -[[package]] -name = "zcash_address" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58342d0aaa8e2fa98849636f52800ac4bf020574c944c974742fc933db58cac2" -dependencies = [ - "bech32", - "bs58", - "corez", - "f4jumble", - "zcash_encoding", - "zcash_protocol 0.9.0", -] - -[[package]] -name = "zcash_encoding" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1440921903cdb86133fb9e2fe800be488015db2939a30bedb413078a1acb0306" -dependencies = [ - "corez", - "hex", - "nonempty", -] - -[[package]] -name = "zcash_history" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fde17bf53792f9c756b313730da14880257d7661b5bfc69d0571c3a7c11a76d" -dependencies = [ - "blake2b_simd", - "byteorder", - "primitive-types", -] - -[[package]] -name = "zcash_keys" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b340e2bc20698c4d784d920dcda1f270d076bef2b0726b732ca9ca7574d61241" -dependencies = [ - "bech32", - "blake2b_simd", - "bls12_381", - "bs58", - "corez", - "document-features", - "group", - "memuse", - "nonempty", - "orchard 0.13.1", - "rand_core 0.6.4", - "sapling-crypto", - "secrecy", - "subtle", - "tracing", - "zcash_address 0.11.0", - "zcash_encoding", - "zcash_protocol 0.8.0", - "zcash_transparent 0.7.0", - "zip32", -] - -[[package]] -name = "zcash_keys" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbcdfbb5c8edb247439d72a397abaae9b7dd14a1c070e7e4fc3536924f9065f" -dependencies = [ - "bech32", - "blake2b_simd", - "bls12_381", - "bs58", - "corez", - "document-features", - "group", - "memuse", - "nonempty", - "orchard 0.14.0", - "rand_core 0.6.4", - "sapling-crypto", - "secrecy", - "subtle", - "tracing", - "zcash_address 0.12.0", - "zcash_encoding", - "zcash_protocol 0.9.0", - "zcash_transparent 0.8.0", - "zip32", -] - [[package]] name = "zcash_local_net" version = "0.6.0" dependencies = [ - "getset", "hex", "json", "reqwest", + "serde", "serde_json", + "sha2", "tempfile", - "thiserror 1.0.69", + "thiserror", "tokio", "tracing", "tracing-subscriber", - "zcash_protocol 0.9.0", - "zebra-chain", - "zebra-node-services", - "zebra-rpc", "zingo-consensus", "zingo_test_vectors", ] -[[package]] -name = "zcash_note_encryption" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77efec759c3798b6e4d829fcc762070d9b229b0f13338c40bf993b7b609c2272" -dependencies = [ - "chacha20", - "chacha20poly1305", - "cipher", - "rand_core 0.6.4", - "subtle", -] - -[[package]] -name = "zcash_primitives" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69e07f5eb3f682a6467b4b08ee4956f1acd1e886d70b21c4766953b3a1beba2" -dependencies = [ - "blake2b_simd", - "block-buffer 0.11.0-rc.3", - "corez", - "crypto-common 0.2.0-rc.1", - "document-features", - "equihash", - "ff", - "hex", - "incrementalmerkletree", - "jubjub", - "memuse", - "nonempty", - "orchard 0.14.0", - "rand_core 0.6.4", - "redjubjub", - "sapling-crypto", - "secp256k1", - "sha2 0.10.9", - "zcash_encoding", - "zcash_note_encryption", - "zcash_protocol 0.9.0", - "zcash_script", - "zcash_transparent 0.8.0", -] - -[[package]] -name = "zcash_proofs" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de6b0ca82e08a9d38b1121f87c5b180b5feac19fecba074cb582882210d2371" -dependencies = [ - "bellman", - "blake2b_simd", - "bls12_381", - "document-features", - "group", - "home", - "jubjub", - "known-folders", - "rand_core 0.6.4", - "redjubjub", - "sapling-crypto", - "tracing", - "wagyu-zcash-parameters", - "xdg", - "zcash_primitives", -] - -[[package]] -name = "zcash_protocol" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79ef3de16a4464a574591aa3e4ea875116372638307d7ae04415279ec187ba88" -dependencies = [ - "corez", - "document-features", - "hex", - "memuse", - "zcash_encoding", -] - -[[package]] -name = "zcash_protocol" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bec496a0bd62dae98c4b26f51c5dab112d0c5350bbc2ccfdfd05bb3454f714d" -dependencies = [ - "corez", - "document-features", - "hex", - "memuse", - "zcash_encoding", -] - -[[package]] -name = "zcash_script" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f872800287d118be71bdf6fe8c869c6a6ff6fb0a5762f68fb2af54c97edf0f2" -dependencies = [ - "bip32", - "bitflags", - "bounded-vec", - "hex", - "ripemd 0.1.3", - "secp256k1", - "sha1", - "sha2 0.10.9", - "thiserror 2.0.18", -] - -[[package]] -name = "zcash_spec" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded3f58b93486aa79b85acba1001f5298f27a46489859934954d262533ee2915" -dependencies = [ - "blake2b_simd", -] - -[[package]] -name = "zcash_transparent" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9ad72051b49432acd56d44ab301bb6467bd70eb23faab3f35539e4ecf2733d" -dependencies = [ - "bip32", - "bs58", - "corez", - "document-features", - "getset", - "hex", - "nonempty", - "ripemd 0.1.3", - "secp256k1", - "sha2 0.10.9", - "subtle", - "zcash_address 0.11.0", - "zcash_encoding", - "zcash_protocol 0.8.0", - "zcash_script", - "zcash_spec", - "zip32", -] - -[[package]] -name = "zcash_transparent" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15df1908b428d4edeb7c7caae5692e05e2e92e5c38007a40b20ac098efdffd96" -dependencies = [ - "bip32", - "bs58", - "corez", - "document-features", - "getset", - "hex", - "nonempty", - "ripemd 0.1.3", - "secp256k1", - "sha2 0.10.9", - "subtle", - "zcash_address 0.12.0", - "zcash_encoding", - "zcash_protocol 0.9.0", - "zcash_script", - "zcash_spec", - "zip32", -] - -[[package]] -name = "zebra-chain" -version = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed3a4e00e8f0b2197f3d8fd6cad02351a25ddbffcf0a6dc1fe463d7ea4ccfa" -dependencies = [ - "bech32", - "bitflags", - "bitflags-serde-legacy", - "bitvec", - "blake2b_simd", - "blake2s_simd", - "bounded-vec", - "bs58", - "byteorder", - "chrono", - "derive-getters", - "dirs", - "ed25519-zebra", - "equihash", - "futures", - "group", - "halo2_proofs", - "hex", - "humantime", - "incrementalmerkletree", - "itertools 0.14.0", - "jubjub", - "lazy_static", - "num-integer", - "orchard 0.14.0", - "primitive-types", - "rand_core 0.6.4", - "rayon", - "reddsa", - "redjubjub", - "ripemd 0.1.3", - "sapling-crypto", - "schemars 1.2.1", - "secp256k1", - "serde", - "serde-big-array", - "serde_json", - "serde_with", - "sha2 0.10.9", - "sinsemilla", - "static_assertions", - "strum", - "tempfile", - "thiserror 2.0.18", - "tokio", - "tracing", - "uint 0.10.0", - "x25519-dalek", - "zcash_address 0.12.0", - "zcash_encoding", - "zcash_history", - "zcash_note_encryption", - "zcash_primitives", - "zcash_protocol 0.9.0", - "zcash_script", - "zcash_transparent 0.8.0", -] - -[[package]] -name = "zebra-consensus" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15475adf8c271d03de99d18d622a8ae4c512c401e3e29da1f27a0ba62b22057c" -dependencies = [ - "bellman", - "blake2b_simd", - "bls12_381", - "chrono", - "derive-getters", - "futures", - "futures-util", - "halo2_proofs", - "jubjub", - "lazy_static", - "libzcash_script", - "metrics", - "mset", - "once_cell", - "orchard 0.14.0", - "rand 0.8.6", - "rayon", - "sapling-crypto", - "serde", - "thiserror 2.0.18", - "tokio", - "tower 0.4.13", - "tower-batch-control", - "tower-fallback", - "tracing", - "tracing-futures", - "zcash_primitives", - "zcash_proofs", - "zcash_protocol 0.9.0", - "zcash_script", - "zcash_transparent 0.8.0", - "zebra-chain", - "zebra-node-services", - "zebra-script", - "zebra-state", -] - -[[package]] -name = "zebra-network" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ba4f7dcd795eb84a5a33f5c4f29df60dd4971be363d2cd98d5fba5ce0477f2" -dependencies = [ - "bitflags", - "byteorder", - "bytes", - "chrono", - "dirs", - "futures", - "hex", - "humantime-serde", - "indexmap 2.14.0", - "itertools 0.14.0", - "lazy_static", - "metrics", - "num-integer", - "ordered-map", - "pin-project", - "rand 0.8.6", - "rayon", - "regex", - "schemars 1.2.1", - "serde", - "tempfile", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tokio-util", - "tower 0.4.13", - "tracing", - "tracing-error", - "tracing-futures", - "zebra-chain", -] - -[[package]] -name = "zebra-node-services" -version = "7.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abeece0fb4503a1df00c5ab736754b55c702613968f622f6aa3c2f9842aed2b2" -dependencies = [ - "color-eyre", - "jsonrpsee-types", - "reqwest", - "serde", - "serde_json", - "tokio", - "tower 0.4.13", - "zebra-chain", -] - -[[package]] -name = "zebra-rpc" -version = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b460869e352c9f1b49a00ed9beaae04ca3e6498381c7189d4b90a79e51c260bd" -dependencies = [ - "base64", - "chrono", - "color-eyre", - "derive-getters", - "derive-new", - "futures", - "hex", - "http-body-util", - "hyper", - "indexmap 2.14.0", - "jsonrpsee", - "jsonrpsee-proc-macros", - "jsonrpsee-types", - "lazy_static", - "metrics", - "nix", - "openrpsee", - "orchard 0.14.0", - "phf", - "prost", - "rand 0.8.6", - "sapling-crypto", - "schemars 1.2.1", - "semver", - "serde", - "serde_json", - "serde_with", - "strum", - "strum_macros", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tonic", - "tonic-prost", - "tonic-prost-build", - "tonic-reflection", - "tower 0.4.13", - "tracing", - "which", - "zcash_address 0.12.0", - "zcash_keys 0.14.0", - "zcash_primitives", - "zcash_proofs", - "zcash_protocol 0.9.0", - "zcash_script", - "zcash_transparent 0.8.0", - "zebra-chain", - "zebra-consensus", - "zebra-network", - "zebra-node-services", - "zebra-script", - "zebra-state", -] - -[[package]] -name = "zebra-script" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fc38c19388671df8a77c767e279b135ffaecd5e7df6ed7cd096390c080b4a3" -dependencies = [ - "libzcash_script", - "rand 0.8.6", - "thiserror 2.0.18", - "zcash_primitives", - "zcash_script", - "zebra-chain", -] - -[[package]] -name = "zebra-state" -version = "8.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b351fde5047dce0d505c9dc26863ee818b7579e9cf8d8e44489deb9decfbb7" -dependencies = [ - "bincode", - "chrono", - "crossbeam-channel", - "derive-getters", - "derive-new", - "dirs", - "futures", - "hex", - "hex-literal", - "human_bytes", - "humantime-serde", - "indexmap 2.14.0", - "itertools 0.14.0", - "lazy_static", - "metrics", - "mset", - "rayon", - "regex", - "rlimit", - "rocksdb", - "sapling-crypto", - "semver", - "serde", - "tempfile", - "thiserror 2.0.18", - "tokio", - "tower 0.4.13", - "tracing", - "zebra-chain", - "zebra-node-services", -] - [[package]] name = "zerocopy" version = "0.8.48" @@ -5751,7 +1766,7 @@ checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5771,7 +1786,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -5780,20 +1795,6 @@ name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] [[package]] name = "zerotrie" @@ -5825,7 +1826,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5839,19 +1840,6 @@ dependencies = [ "bip0039", ] -[[package]] -name = "zip32" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b64bf5186a8916f7a48f2a98ef599bf9c099e2458b36b819e393db1c0e768c4b" -dependencies = [ - "bech32", - "blake2b_simd", - "memuse", - "subtle", - "zcash_spec", -] - [[package]] name = "zmij" version = "1.0.21" diff --git a/Cargo.toml b/Cargo.toml index 2d2d437..dffe6c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,22 +11,10 @@ resolver = "2" # workspace zingo_test_vectors = { path = "zingo_test_vectors" } -zcash_local_net = { path = "zcash_local_net" } zingo-consensus = { path = "zingo-consensus" } -#zcash -zcash_protocol = { version = "0.9.0", features = ["local-consensus"] } - -# zebra -zebra-chain = "9.0.0" -zebra-node-services = "7.0.0" -zebra-rpc = "9.0.0" - #protocol bip0039 = "0.12.0" - -# other -getset = "0.1.3" hex = "0.4.3" json = "0.12.4" reqwest = { version = "0.12", default-features = false } @@ -39,6 +27,3 @@ tracing-subscriber = "0.3.15" [profile.dev.package] insta.opt-level = 3 - -[patch.crates-io] -libzcash_script = { git = "https://github.com/zancas/zcash_script", branch = "fix-bindgen-rust-target" } diff --git a/deny.toml b/deny.toml index 2fee97c..5befab6 100644 --- a/deny.toml +++ b/deny.toml @@ -4,15 +4,6 @@ all-features = false no-default-features = false exclude = ["bincode", "json"] -[advisories] -ignore = [ - # proc-macro-error2 (unmaintained) arrives via getset, which orchard 0.14 - # pins inside the zebra-rpc chain, so no local change can remove it from - # the lock. Compile-time-only proc-macro, not runtime code. Remove this - # entry once orchard/zebra drop getset upstream. - { id = "RUSTSEC-2026-0173", reason = "getset -> proc-macro-error2 pinned by orchard 0.14; no upgrade path" }, -] - [bans] multiple-versions = "warn" wildcards = "allow" diff --git a/regtest-launcher/Cargo.toml b/regtest-launcher/Cargo.toml index f13106a..b7ecc51 100644 --- a/regtest-launcher/Cargo.toml +++ b/regtest-launcher/Cargo.toml @@ -9,21 +9,12 @@ repository = "https://github.com/zingolabs/infrastructure" homepage = "https://github.com/zingolabs/infrastructure" [dependencies] -bip0039.workspace = true clap = { version = "4.5.53", features = ["derive"] } hex.workspace = true local-net = { path = "../zcash_local_net", package = "zcash_local_net" } owo-colors = "4.2.3" -ripemd = "0.1.3" -secp256k1 = "0.29.1" -sha2 = "0.10.9" -tokio = { workspace = true, features = ["signal"] } -zcash_keys = "0.13.0" -zcash_protocol = "0.8.0" -zcash_transparent = { version = "0.7.0", features = ["transparent-inputs"] } -zebra-node-services = { workspace = true, features = ["rpc-client"] } -zebra-rpc.workspace = true -zip32 = "0.2.1" +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "signal", "time"] } +zingo_test_vectors.workspace = true [dev-dependencies] anyhow = "1.0.100" diff --git a/regtest-launcher/README.md b/regtest-launcher/README.md index 1441148..36ff0f4 100644 --- a/regtest-launcher/README.md +++ b/regtest-launcher/README.md @@ -5,10 +5,14 @@ Tiny Rust binary that launches a local Zcash regtest network (Zebrad & Zainod) a ## Overview - Starts a local validator + indexer using `zcash_local_net`. -- Uses a provided miner transparent address **or** generates a fresh regtest transparent keypair. +- Mines to a provided transparent address, defaulting to the well-known + ABANDONART fixture address. Its seed is the public BIP-39 test mnemonic + (`abandon` x23, `art`), so default-mined funds are spendable by importing + that phrase into any wallet. Supply `--miner-address` to mine directly to + a wallet you control. - Bootstraps the chain up to height **101**. - Then mines a new block every **5s**. -- Prints indexer port + miner address, if generated. +- Prints indexer port + miner address. ## Usage @@ -17,14 +21,16 @@ Usage: regtest-launcher [OPTIONS] Options: --activation-heights - Comma-separated activation heights, e.g. "all=1,nu5=1000,nu6=off,nu6_1=off,nu6_2=off,nu7=off" + Comma-separated activation heights, e.g. "all=1,nu5=1000,nu6=off,nu6_1=off,nu6_2=off,nu6_3=off,nu7=off" - Keys: before_overwinter, overwinter, sapling, blossom, heartwood, canopy, nu5, nu6, nu6_1, nu6_2, nu7, all Values: u32 or off|none|disable + Keys: before_overwinter, overwinter, sapling, blossom, heartwood, canopy, nu5, nu6, nu6_1, nu6_2, nu6_3, nu7, all Values: u32 or off|none|disable - [default: all=1,nu5=2,nu6=2,nu6_1=5,nu6_2=5,nu7=off] + [default: all=1,nu5=2,nu6=2,nu6_1=5,nu6_2=5,nu6_3=off,nu7=off] --miner-address - Optional miner address for receiving block rewards + Miner address for receiving block rewards + + [default: tmBsTi2xWTjUdEXnuTceL7fecEQKeWaPDJd] -h, --help Print help (see a summary with '-h') diff --git a/regtest-launcher/src/cli.rs b/regtest-launcher/src/cli.rs index 1a9e28f..922d5ad 100644 --- a/regtest-launcher/src/cli.rs +++ b/regtest-launcher/src/cli.rs @@ -1,13 +1,45 @@ use clap::Parser; use local_net::validator::REGTEST_FIXTURE_HEIGHTS_CLI_STRING; -use zebra_rpc::client::zebra_chain::parameters::testnet::ConfiguredActivationHeights; + +/// Activation heights parsed from the CLI. +/// +/// A superset of `zingo_consensus::ActivationHeights`: the CLI also accepts +/// zebra's `before_overwinter` slot, which the zingo type does not model +/// (it is dropped when the parsed heights convert for the harness). +#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)] +pub struct ConfiguredActivationHeights { + /// BeforeOverwinter activation height. + pub before_overwinter: Option, + /// Overwinter activation height. + pub overwinter: Option, + /// Sapling activation height. + pub sapling: Option, + /// Blossom activation height. + pub blossom: Option, + /// Heartwood activation height. + pub heartwood: Option, + /// Canopy activation height. + pub canopy: Option, + /// NU5 activation height. + pub nu5: Option, + /// NU6 activation height. + pub nu6: Option, + /// NU6.1 activation height. + pub nu6_1: Option, + /// NU6.2 activation height. + pub nu6_2: Option, + /// NU6.3 activation height. + pub nu6_3: Option, + /// NU7 activation height. + pub nu7: Option, +} #[derive(Parser, Debug)] pub struct Cli { /// Comma-separated activation heights, e.g. - /// "all=1,nu5=1000,nu6=off,nu6_1=off,nu6_2=off,nu7=off" + /// "all=1,nu5=1000,nu6=off,nu6_1=off,nu6_2=off,nu6_3=off,nu7=off" /// - /// Keys: before_overwinter, overwinter, sapling, blossom, heartwood, canopy, nu5, nu6, nu6_1, nu6_2, nu7, all + /// Keys: before_overwinter, overwinter, sapling, blossom, heartwood, canopy, nu5, nu6, nu6_1, nu6_2, nu6_3, nu7, all /// Values: u32 or off|none|disable /// /// Default comes from @@ -23,9 +55,15 @@ pub struct Cli { )] pub activation_heights: ConfiguredActivationHeights, - /// Optional miner address for receiving block rewards. - #[arg(long)] - pub miner_address: Option, + /// Miner address for receiving block rewards. + /// + /// Defaults to the well-known ABANDONART fixture address + /// ([`zingo_test_vectors::REG_T_ADDR_FROM_ABANDONART`]), whose seed + /// phrase is the public BIP-39 test mnemonic (abandon x23, art), so the + /// mined funds are spendable by importing that phrase into any wallet. + /// Supply your own address to mine directly to a wallet you control. + #[arg(long, default_value = zingo_test_vectors::REG_T_ADDR_FROM_ABANDONART)] + pub miner_address: String, } #[derive(Copy, Clone, Debug, Eq, PartialEq)] @@ -40,10 +78,11 @@ enum UpgradeKey { Nu6, Nu6_1, Nu6_2, + Nu6_3, Nu7, } -const UPGRADE_ORDER: [UpgradeKey; 11] = [ +const UPGRADE_ORDER: [UpgradeKey; 12] = [ UpgradeKey::BeforeOverwinter, UpgradeKey::Overwinter, UpgradeKey::Sapling, @@ -54,6 +93,7 @@ const UPGRADE_ORDER: [UpgradeKey; 11] = [ UpgradeKey::Nu6, UpgradeKey::Nu6_1, UpgradeKey::Nu6_2, + UpgradeKey::Nu6_3, UpgradeKey::Nu7, ]; @@ -71,6 +111,7 @@ fn parse_key(k: &str) -> Option { "nu6" => Some(UpgradeKey::Nu6), "nu6_1" | "nu6.1" | "nu61" => Some(UpgradeKey::Nu6_1), "nu6_2" | "nu6.2" | "nu62" => Some(UpgradeKey::Nu6_2), + "nu6_3" | "nu6.3" | "nu63" => Some(UpgradeKey::Nu6_3), "nu7" => Some(UpgradeKey::Nu7), _ => None, } @@ -88,6 +129,7 @@ fn set_field(cfg: &mut ConfiguredActivationHeights, key: UpgradeKey, val: Option UpgradeKey::Nu6 => cfg.nu6 = val, UpgradeKey::Nu6_1 => cfg.nu6_1 = val, UpgradeKey::Nu6_2 => cfg.nu6_2 = val, + UpgradeKey::Nu6_3 => cfg.nu6_3 = val, UpgradeKey::Nu7 => cfg.nu7 = val, } } @@ -122,11 +164,13 @@ fn parse_activation_heights(s: &str) -> Result Result [u8; 20] { - let sha = Sha256::digest(data); - let ripe = Ripemd160::digest(sha); - let mut out = [0u8; 20]; - out.copy_from_slice(&ripe); - out -} - -pub fn generate_regtest_transparent_keypair() -> (Mnemonic, SecretKey, String) { - let params = TestNetwork; - - let mnemonic = Mnemonic::generate(Count::Words24); - - let seed = mnemonic.to_seed(""); - - let account = AccountId::const_from_u32(0); - let acct_sk = AccountPrivKey::from_seed(¶ms, &seed, account).expect("account key"); - - let idx = NonHardenedChildIndex::from_index(0).expect("index"); - let sk = acct_sk - .derive_external_secret_key(idx) - .expect("external secret key"); - - // pubkey -> p2pkh -> t-addr string - let secp = Secp256k1::new(); - let pk = PublicKey::from_secret_key(&secp, &sk); - let pkh = hash160(&pk.serialize()); - - let taddr = TransparentAddress::PublicKeyHash(pkh); - let taddr_str = encode_transparent_address_p(¶ms, &taddr); - - (mnemonic, sk, taddr_str) -} diff --git a/regtest-launcher/src/main.rs b/regtest-launcher/src/main.rs index ab7bad9..edba243 100644 --- a/regtest-launcher/src/main.rs +++ b/regtest-launcher/src/main.rs @@ -1,5 +1,4 @@ mod cli; -mod keygen; use std::{ net::{IpAddr, Ipv4Addr, SocketAddr}, @@ -25,22 +24,10 @@ use owo_colors::OwoColorize; use tokio::{signal::ctrl_c, time::interval}; use local_net::protocol::ActivationHeights; -use zebra_node_services::rpc_client::RpcRequestClient; -use zebra_rpc::{ - client::{ - BlockTemplateTimeSource, GetBlockTemplateResponse, - zebra_chain::{ - parameters::{ - Network, - testnet::{Parameters, RegtestParameters}, - }, - serialization::ZcashSerialize, - }, - }, - proposal_block_from_template, -}; +use local_net::protocol::RpcRequestClient; +use local_net::zebra_rpc::{BlockTemplate, block_hash_hex, proposal_block_bytes}; -use crate::{cli::Cli, keygen::generate_regtest_transparent_keypair}; +use crate::cli::Cli; #[tokio::main] async fn main() { @@ -58,13 +45,7 @@ async fn main() { .set_nu7(cli.activation_heights.nu7) .build(); - let (mnemonic_opt, sk_opt, taddr_str) = match cli.miner_address.as_deref() { - Some(addr) => (None, None, addr.to_string()), - None => { - let (mnemonic, sk, taddr) = generate_regtest_transparent_keypair(); - (Some(mnemonic), Some(sk), taddr) - } - }; + let taddr_str = cli.miner_address.clone(); let zebrad_config = ZebradConfig::default() .with_miner_address(taddr_str.clone()) @@ -78,22 +59,7 @@ async fn main() { println!(); - if let (Some(mnemonic), Some(sk)) = (mnemonic_opt.as_ref(), sk_opt.as_ref()) { - println!("{}:", "Mnemonic".red().bold()); - println!("{}", mnemonic.bold()); - println!(); - - println!("{}:", "Secret Key".red().bold()); - println!("{}", sk.display_secret().bold()); - println!(); - - println!("Transparent Address: {}", taddr_str.bright_green().bold()); - } else { - println!( - "Using provided miner address: {}", - taddr_str.bright_green().bold() - ); - } + println!("Miner address: {}", taddr_str.bright_green().bold()); println!(); println!(); @@ -104,17 +70,6 @@ async fn main() { ); let client = RpcRequestClient::new(SocketAddr::from_str(&rpc_addr.to_string()).unwrap()); - let regtest_network = Network::Testnet(Arc::new( - Parameters::new_regtest(RegtestParameters { - activation_heights: cli.activation_heights, - funding_streams: None, - lockbox_disbursements: None, - checkpoints: None, - extend_funding_stream_addresses_as_required: None, - }) - .unwrap(), - )); - let running = Arc::new(AtomicBool::new(true)); let running_miner = running.clone(); @@ -128,21 +83,16 @@ async fn main() { break; } - let tpl: GetBlockTemplateResponse = client + let tpl: BlockTemplate = client .json_result_from_call("getblocktemplate", "[]".to_string()) .await .expect("getblocktemplate failed"); - let tpl_resp = tpl.try_into_template().unwrap(); - let block = proposal_block_from_template( - &tpl_resp, - BlockTemplateTimeSource::default(), - ®test_network, - ) - .expect("proposal_block_from_template failed"); + let block_bytes = + proposal_block_bytes(&tpl, &heights).expect("proposal_block_bytes failed"); - let submitted_hash = block.hash(); - let block_hex = hex::encode(block.zcash_serialize_to_vec().expect("serialize block")); + let submitted_hash = block_hash_hex(&block_bytes); + let block_hex = hex::encode(&block_bytes); let submit_response = client .text_from_call("submitblock", format!(r#"["{block_hex}"]"#)) .await @@ -164,22 +114,17 @@ async fn main() { while running_miner.load(Ordering::Relaxed) { tick.tick().await; - let tpl: GetBlockTemplateResponse = client + let tpl: BlockTemplate = client .json_result_from_call("getblocktemplate", "[]".to_string()) .await .expect("getblocktemplate failed"); - let tpl_resp = tpl.try_into_template().unwrap(); - let block = proposal_block_from_template( - &tpl_resp, - BlockTemplateTimeSource::default(), - ®test_network, - ) - .expect("proposal_block_from_template failed"); + let block_bytes = + proposal_block_bytes(&tpl, &heights).expect("proposal_block_bytes failed"); - let submitted_hash = block.hash(); + let submitted_hash = block_hash_hex(&block_bytes); - let block_hex = hex::encode(block.zcash_serialize_to_vec().expect("serialize block")); + let block_hex = hex::encode(&block_bytes); let submit_response = client .text_from_call("submitblock", format!(r#"["{block_hex}"]"#)) .await @@ -199,7 +144,7 @@ async fn main() { .expect("getbestblockhash failed"); if last_tip.as_deref() != Some(&tip) { - println!("mined new_tip={tip} height={}", tpl_resp.height()); + println!("mined new_tip={tip} height={}", tpl.height); last_tip = Some(tip); } diff --git a/regtest-launcher/tests/e2e.rs b/regtest-launcher/tests/e2e.rs index 4d104ce..2ae5a27 100644 --- a/regtest-launcher/tests/e2e.rs +++ b/regtest-launcher/tests/e2e.rs @@ -18,11 +18,6 @@ fn normalized_dynamic_values(s: &str) -> String { let regex_localhost_port = Regex::new(r"(127\.0\.0\.1:)\d+").unwrap(); - let regex_mnemonic_line = Regex::new(r"(?m)(^Mnemonic:\s*$\n)([^\n]+)").unwrap(); - let regex_secret_key_line = Regex::new(r"(?m)(^Secret Key:\s*$\n)([^\n]+)").unwrap(); - let regex_taddr_inline = - Regex::new(r"(Transparent Address:\s*)([1-9A-HJ-NP-Za-km-z]{20,})").unwrap(); - let regex_mined_up_to = Regex::new(r"(Mined up to chain height\s+)\d+").unwrap(); let regex_height_inline = Regex::new(r"(height=)\d+").unwrap(); @@ -31,10 +26,6 @@ fn normalized_dynamic_values(s: &str) -> String { let text = regex_ansi.replace_all(s, ""); let text = regex_localhost_port.replace_all(&text, "$1"); - let text = regex_mnemonic_line.replace_all(&text, "$1"); - let text = regex_secret_key_line.replace_all(&text, "$1"); - let text = regex_taddr_inline.replace_all(&text, "$1"); - let text = regex_mined_up_to.replace_all(&text, "$1"); let text = regex_height_inline.replace_all(&text, "$1"); diff --git a/regtest-launcher/tests/snapshots/e2e__regtest_first_mine.snap b/regtest-launcher/tests/snapshots/e2e__regtest_first_mine.snap index 930afb6..c4c7622 100644 --- a/regtest-launcher/tests/snapshots/e2e__regtest_first_mine.snap +++ b/regtest-launcher/tests/snapshots/e2e__regtest_first_mine.snap @@ -4,13 +4,7 @@ expression: normalized_stdout --- Indexer running at: 127.0.0.1: -Mnemonic: - - -Secret Key: - - -Transparent Address: +Miner address: tmBsTi2xWTjUdEXnuTceL7fecEQKeWaPDJd Mined up to chain height diff --git a/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index 9a89644..0a4cddb 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -17,26 +17,20 @@ github = { repository = "zingolabs/infrastructure/services" } zingo-consensus = { workspace = true } zingo_test_vectors = { workspace = true } -# zcash -zcash_protocol = { workspace = true } - -# zebra -zebra-node-services = { workspace = true } -zebra-rpc = { workspace = true } -zebra-chain = { workspace = true } - # Community tempfile = { workspace = true } reqwest = { workspace = true } thiserror = { workspace = true } tracing = { workspace = true } -getset = { workspace = true } json = { workspace = true } serde_json = { workspace = true } hex = { workspace = true } -tokio = { workspace = true } +tokio = { workspace = true, features = ["io-util", "net", "rt", "time", "process"] } +serde = { version = "1.0", features = ["derive"] } +sha2 = "0.10" [dev-dependencies] +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "net", "io-util"] } tracing-subscriber = { workspace = true } [build-dependencies] @@ -46,10 +40,18 @@ tokio = { workspace = true, features = ["macros", "fs", "rt-multi-thread"] } [package.metadata.cargo_check_external_types] allowed_external_types = [ "tempfile::dir::TempDir", - "zcash_protocol::PoolType", "zingo_consensus::ActivationHeights", "zingo_consensus::ActivationHeightsBuilder", + "zingo_consensus::MinerPool", "zingo_consensus::NetworkType", - "zebra_node_services::rpc_client::RpcRequestClient", + # rpc_client speaks reqwest at its transport boundary and serde_json in + # its error type; zebra_rpc's template model is generic over serde + # deserialization. "reqwest::error::Error", + "reqwest::error::Result", + "reqwest::async_impl::response::Response", + "serde_core::de::Deserialize", + "serde_core::de::DeserializeOwned", + "serde_json::error::Error", + "serde_json::value::Value", ] diff --git a/zcash_local_net/src/client.rs b/zcash_local_net/src/client.rs index d80bd4c..242e8c6 100644 --- a/zcash_local_net/src/client.rs +++ b/zcash_local_net/src/client.rs @@ -28,9 +28,9 @@ pub trait ClientConfig: Default + std::fmt::Debug { /// Which receiver of the wallet's unified address to emit from /// [`Client::address`]. /// -/// A dedicated enum rather than [`zcash_protocol::PoolType`], which is -/// `Transparent | Shielded(Sapling | Orchard)` and has no `Unified` -/// variant — the wrong shape for "give me this receiver of my UA". +/// A dedicated enum rather than [`zingo_consensus::MinerPool`], which +/// has no `Unified` variant — the wrong shape for "give me this +/// receiver of my UA". #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub enum AddressReceiver { /// The full unified address (all available receivers). diff --git a/zcash_local_net/src/client/zcash_devtool.rs b/zcash_local_net/src/client/zcash_devtool.rs index 813750a..ca17913 100644 --- a/zcash_local_net/src/client/zcash_devtool.rs +++ b/zcash_local_net/src/client/zcash_devtool.rs @@ -17,7 +17,6 @@ use std::io::Write as _; use std::path::PathBuf; use std::process::{Child, Stdio}; -use getset::Getters; use tempfile::TempDir; use zingo_consensus::NetworkType; @@ -168,8 +167,7 @@ impl ClientConfig for ZcashDevtoolConfig { /// and appends its output to the logs directory. Dropping the struct /// removes the wallet directory (and with it the wallet databases and /// the age identity file). -#[derive(Debug, Getters)] -#[getset(get = "pub")] +#[derive(Debug)] pub struct ZcashDevtool { /// Wallet directory (keys.toml, wallet databases, age identity) wallet_dir: TempDir, @@ -180,6 +178,23 @@ pub struct ZcashDevtool { config: ZcashDevtoolConfig, } +impl ZcashDevtool { + /// Wallet directory (keys.toml, wallet databases, age identity). + pub fn wallet_dir(&self) -> &TempDir { + &self.wallet_dir + } + + /// Logs directory. + pub fn logs_dir(&self) -> &TempDir { + &self.logs_dir + } + + /// Configuration the wallet was launched with. + pub fn config(&self) -> &ZcashDevtoolConfig { + &self.config + } +} + impl LogsToDir for ZcashDevtool { fn logs_dir(&self) -> &TempDir { &self.logs_dir diff --git a/zcash_local_net/src/indexer/empty.rs b/zcash_local_net/src/indexer/empty.rs index 7b08042..659f7ba 100644 --- a/zcash_local_net/src/indexer/empty.rs +++ b/zcash_local_net/src/indexer/empty.rs @@ -1,4 +1,3 @@ -use getset::{CopyGetters, Getters}; use tempfile::TempDir; use crate::{ @@ -28,8 +27,7 @@ impl IndexerConfig for EmptyConfig { /// This struct is used to represent and manage an empty Indexer process. /// /// Dirs are created for integration. -#[derive(Debug, Getters, CopyGetters)] -#[getset(get = "pub")] +#[derive(Debug)] pub struct Empty { /// Logs directory logs_dir: TempDir, @@ -37,6 +35,18 @@ pub struct Empty { config_dir: TempDir, } +impl Empty { + /// Logs directory. + pub fn logs_dir(&self) -> &TempDir { + &self.logs_dir + } + + /// Config directory. + pub fn config_dir(&self) -> &TempDir { + &self.config_dir + } +} + impl LogsToStdoutAndStderr for Empty { fn print_stdout(&self) { tracing::info!("Empty indexer stdout."); diff --git a/zcash_local_net/src/indexer/lightwalletd.rs b/zcash_local_net/src/indexer/lightwalletd.rs index 5d966f2..8d18756 100644 --- a/zcash_local_net/src/indexer/lightwalletd.rs +++ b/zcash_local_net/src/indexer/lightwalletd.rs @@ -1,6 +1,5 @@ use std::{fs::File, path::PathBuf, process::Child}; -use getset::{CopyGetters, Getters}; use tempfile::TempDir; use crate::{ @@ -51,14 +50,11 @@ impl IndexerConfig for LightwalletdConfig { } } /// This struct is used to represent and manage the Lightwalletd process. -#[derive(Debug, Getters, CopyGetters)] -#[getset(get = "pub")] +#[derive(Debug)] pub struct Lightwalletd { /// Child process handle handle: Child, /// RPC Port - #[getset(skip)] - #[getset(get_copy = "pub")] port: u16, /// Data directory _data_dir: TempDir, @@ -68,6 +64,28 @@ pub struct Lightwalletd { config_dir: TempDir, } +impl Lightwalletd { + /// Child process handle. + pub fn handle(&self) -> &Child { + &self.handle + } + + /// RPC port. + pub fn port(&self) -> u16 { + self.port + } + + /// Logs directory. + pub fn logs_dir(&self) -> &TempDir { + &self.logs_dir + } + + /// Config directory. + pub fn config_dir(&self) -> &TempDir { + &self.config_dir + } +} + impl Lightwalletd { /// Prints the stdout log. pub fn print_lwd_log(&self) { diff --git a/zcash_local_net/src/indexer/zainod.rs b/zcash_local_net/src/indexer/zainod.rs index 408a33b..1fa8b43 100644 --- a/zcash_local_net/src/indexer/zainod.rs +++ b/zcash_local_net/src/indexer/zainod.rs @@ -2,7 +2,6 @@ use std::{path::PathBuf, process::Child}; -use getset::{CopyGetters, Getters}; use tempfile::TempDir; use zingo_consensus::NetworkType; @@ -61,14 +60,11 @@ impl IndexerConfig for ZainodConfig { } /// This struct is used to represent and manage the Zainod process. -#[derive(Debug, Getters, CopyGetters)] -#[getset(get = "pub")] +#[derive(Debug)] pub struct Zainod { /// Child process handle handle: Child, /// RPC port - #[getset(skip)] - #[getset(get_copy = "pub")] port: u16, /// Logs directory logs_dir: TempDir, @@ -76,6 +72,28 @@ pub struct Zainod { config_dir: TempDir, } +impl Zainod { + /// Child process handle. + pub fn handle(&self) -> &Child { + &self.handle + } + + /// RPC port. + pub fn port(&self) -> u16 { + self.port + } + + /// Logs directory. + pub fn logs_dir(&self) -> &TempDir { + &self.logs_dir + } + + /// Config directory. + pub fn config_dir(&self) -> &TempDir { + &self.config_dir + } +} + impl LogsToDir for Zainod { fn logs_dir(&self) -> &TempDir { &self.logs_dir diff --git a/zcash_local_net/src/lib.rs b/zcash_local_net/src/lib.rs index c7d673a..fdca590 100644 --- a/zcash_local_net/src/lib.rs +++ b/zcash_local_net/src/lib.rs @@ -51,8 +51,10 @@ pub mod indexer; pub mod logs; pub mod network; pub mod process; +pub mod rpc_client; pub mod utils; pub mod validator; +pub mod zebra_rpc; mod launch; mod poll; @@ -64,13 +66,14 @@ use crate::{ error::LaunchError, indexer::IndexerConfig, logs::LogsToStdoutAndStderr, process::Process, }; -pub use zcash_protocol::PoolType; +pub use zingo_consensus::MinerPool; /// External re-exported zcash types. pub mod protocol { - pub use zcash_protocol::PoolType; - pub use zebra_node_services::rpc_client::RpcRequestClient; - pub use zingo_consensus::{ActivationHeights, ActivationHeightsBuilder, NetworkType}; + pub use crate::rpc_client::RpcRequestClient; + pub use zingo_consensus::{ + ActivationHeights, ActivationHeightsBuilder, MinerPool, NetworkType, + }; } /// External re-exported types. diff --git a/zcash_local_net/src/rpc_client.rs b/zcash_local_net/src/rpc_client.rs new file mode 100644 index 0000000..42f0536 --- /dev/null +++ b/zcash_local_net/src/rpc_client.rs @@ -0,0 +1,304 @@ +//! A minimal JSON-RPC 2.0 client for driving launched node processes. +//! +//! Replaces `zebra_node_services::rpc_client::RpcRequestClient` with an +//! equivalent built on this crate's existing `reqwest` dependency. The wire +//! format and method surface match the zebra client exactly, so callers are +//! unchanged: requests POST a spliced JSON-RPC 2.0 envelope to the node's +//! RPC address, `text_from_call` returns the raw response body, and +//! `json_result_from_call` unwraps the `result` payload or converts a +//! JSON-RPC `error` payload into `Err`. + +use std::net::SocketAddr; + +/// Error from an RPC call: transport failure, a non-envelope response, or a +/// JSON-RPC error payload. +#[derive(Debug, thiserror::Error)] +pub enum RpcClientError { + /// HTTP transport failure (connection refused, timeout, etc.). + #[error(transparent)] + Transport(#[from] reqwest::Error), + /// The response body was not a JSON-RPC envelope. + #[error("invalid JSON-RPC response: {0}")] + InvalidResponse(#[from] serde_json::Error), + /// The server answered with a JSON-RPC error object. + #[error("JSON-RPC error: {0}")] + Rpc(serde_json::Value), +} + +/// An HTTP client for making JSON-RPC requests against a launched node. +#[derive(Clone, Debug)] +pub struct RpcRequestClient { + client: reqwest::Client, + rpc_address: SocketAddr, +} + +impl RpcRequestClient { + /// Creates a new client targeting the given RPC listen address. + pub fn new(rpc_address: SocketAddr) -> Self { + Self { + client: reqwest::Client::new(), + rpc_address, + } + } + + /// Sends the JSON-RPC request and returns the raw HTTP response. + /// + /// `params` is spliced into the request body as literal JSON text + /// (e.g. `"[]"` or `r#"[""]"#`), not serialized. + pub async fn call( + &self, + method: impl AsRef, + params: impl AsRef, + ) -> reqwest::Result { + let method = method.as_ref(); + let params = params.as_ref(); + + self.client + .post(format!("http://{}", self.rpc_address)) + .body(format!( + r#"{{"jsonrpc": "2.0", "method": "{method}", "params": {params}, "id":123 }}"# + )) + .header("Content-Type", "application/json") + .send() + .await + } + + /// Sends the JSON-RPC request and returns the raw response body text, + /// envelope included. Callers inspect the envelope themselves (e.g. the + /// `submitblock` `"result":null` check). + pub async fn text_from_call( + &self, + method: impl AsRef, + params: impl AsRef, + ) -> Result { + Ok(self.call(method, params).await?.text().await?) + } + + /// Sends the JSON-RPC request and deserializes the envelope's `result` + /// payload into `T`. + /// + /// A JSON-RPC `error` payload returns [`RpcClientError::Rpc`] — callers + /// such as readiness polling depend on error envelopes being `Err`, not + /// a successfully-parsed error value. + pub async fn json_result_from_call( + &self, + method: impl AsRef, + params: impl AsRef, + ) -> Result { + let text = self.text_from_call(method, params).await?; + let envelope: serde_json::Value = serde_json::from_str(&text)?; + + if let Some(error) = envelope.get("error").filter(|e| !e.is_null()) { + return Err(RpcClientError::Rpc(error.clone())); + } + let result = envelope + .get("result") + .cloned() + .unwrap_or(serde_json::Value::Null); + + Ok(serde_json::from_value(result)?) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::sync::{Arc, Mutex}; + use tokio::io::{AsyncReadExt, AsyncWriteExt}; + use tokio::net::TcpListener; + + /// Serves one canned HTTP response per entry, capturing each raw request. + async fn serve_canned(responses: Vec<&str>) -> (SocketAddr, Arc>>) { + let listener = TcpListener::bind("127.0.0.1:0").await.unwrap(); + let addr = listener.local_addr().unwrap(); + let captured = Arc::new(Mutex::new(Vec::new())); + let capture_sink = captured.clone(); + let responses: Vec = responses.into_iter().map(String::from).collect(); + + tokio::spawn(async move { + for body in responses { + let (mut stream, _) = listener.accept().await.unwrap(); + let mut buf = vec![0u8; 65536]; + let mut read_total = 0; + loop { + let n = stream.read(&mut buf[read_total..]).await.unwrap(); + if n == 0 { + break; + } + read_total += n; + let text = String::from_utf8_lossy(&buf[..read_total]).to_string(); + if let Some(header_end) = text.find("\r\n\r\n") { + let content_length = text + .lines() + .find_map(|line| { + line.to_ascii_lowercase() + .strip_prefix("content-length:") + .map(|v| v.trim().parse::().unwrap()) + }) + .unwrap_or(0); + if read_total >= header_end + 4 + content_length { + break; + } + } + } + capture_sink + .lock() + .unwrap() + .push(String::from_utf8_lossy(&buf[..read_total]).to_string()); + let response = format!( + "HTTP/1.1 200 OK\r\nContent-Type: application/json\r\nContent-Length: {}\r\nConnection: close\r\n\r\n{}", + body.len(), + body + ); + stream.write_all(response.as_bytes()).await.unwrap(); + stream.flush().await.unwrap(); + } + }); + + (addr, captured) + } + + #[tokio::test] + async fn request_shape_matches_the_zebra_client_wire_format() { + let (addr, captured) = + serve_canned(vec![r#"{"jsonrpc":"2.0","result":null,"id":123}"#]).await; + + RpcRequestClient::new(addr) + .text_from_call("getblocktemplate", "[]") + .await + .unwrap(); + + let request = captured.lock().unwrap().pop().unwrap(); + assert!(request.starts_with("POST / HTTP/1.1")); + assert!( + request + .to_ascii_lowercase() + .contains("content-type: application/json"), + "missing content-type header: {request}" + ); + assert!( + request.contains( + r#"{"jsonrpc": "2.0", "method": "getblocktemplate", "params": [], "id":123 }"# + ), + "body does not match the spliced envelope: {request}" + ); + } + + #[tokio::test] + async fn json_result_delivers_the_result_payload_as_value() { + let (addr, _) = serve_canned(vec![ + r#"{"jsonrpc":"2.0","result":{"blocks":7,"upgrades":{}},"id":123}"#, + ]) + .await; + + let value: serde_json::Value = RpcRequestClient::new(addr) + .json_result_from_call("getblockchaininfo", "[]") + .await + .unwrap(); + + assert_eq!(value.get("blocks").and_then(|b| b.as_u64()), Some(7)); + assert!(value.get("upgrades").unwrap().is_object()); + } + + #[tokio::test] + async fn json_result_deserializes_a_bare_string_result() { + let (addr, _) = + serve_canned(vec![r#"{"jsonrpc":"2.0","result":"00abcdef","id":123}"#]).await; + + let hash: String = RpcRequestClient::new(addr) + .json_result_from_call("getbestblockhash", "[]") + .await + .unwrap(); + + assert_eq!(hash, "00abcdef"); + } + + #[tokio::test] + async fn json_result_maps_an_error_envelope_to_err() { + let (addr, _) = serve_canned(vec![ + r#"{"jsonrpc":"2.0","error":{"code":-32601,"message":"Method not found"},"id":123}"#, + ]) + .await; + + let result: Result = RpcRequestClient::new(addr) + .json_result_from_call("getblocktemplate", "[]") + .await; + + let error = result.unwrap_err(); + assert!( + format!("{error}").contains("Method not found"), + "error should carry the RPC message: {error}" + ); + } + + #[tokio::test] + async fn transport_failure_is_err_not_panic() { + // Bind then immediately drop, so the port is closed. + let addr = TcpListener::bind("127.0.0.1:0") + .await + .unwrap() + .local_addr() + .unwrap(); + + let result: Result = RpcRequestClient::new(addr) + .json_result_from_call("getblocktemplate", "[]") + .await; + + assert!(matches!(result, Err(RpcClientError::Transport(_)))); + } + + #[tokio::test] + async fn text_from_call_passes_the_envelope_through_byte_faithfully() { + let success = r#"{"jsonrpc":"2.0","result":null,"id":123}"#; + let duplicate = r#"{"jsonrpc":"2.0","result":"duplicate","id":123}"#; + let (addr, _) = serve_canned(vec![success, duplicate]).await; + let client = RpcRequestClient::new(addr); + + let first = client + .text_from_call("submitblock", r#"["00"]"#) + .await + .unwrap(); + assert_eq!(first, success); + assert!(first.contains(r#""result":null"#)); + + let second = client + .text_from_call("submitblock", r#"["00"]"#) + .await + .unwrap(); + assert_eq!(second, duplicate); + assert!(!second.contains(r#""result":null"#)); + } + + #[tokio::test] + async fn malformed_response_body_is_err() { + let (addr, _) = serve_canned(vec!["zebrad had a bad day"]).await; + + let result: Result = RpcRequestClient::new(addr) + .json_result_from_call("getblockchaininfo", "[]") + .await; + + assert!(matches!(result, Err(RpcClientError::InvalidResponse(_)))); + } + + #[tokio::test] + async fn sequential_calls_on_one_client_stay_sound() { + let (addr, _) = serve_canned(vec![ + r#"{"jsonrpc":"2.0","result":1,"id":123}"#, + r#"{"jsonrpc":"2.0","error":{"code":-8,"message":"nope"},"id":123}"#, + r#"{"jsonrpc":"2.0","result":3,"id":123}"#, + ]) + .await; + let client = RpcRequestClient::new(addr); + + let first: u32 = client.json_result_from_call("m", "[]").await.unwrap(); + assert_eq!(first, 1); + assert!( + client + .json_result_from_call::("m", "[]") + .await + .is_err() + ); + let third: u32 = client.json_result_from_call("m", "[]").await.unwrap(); + assert_eq!(third, 3); + } +} diff --git a/zcash_local_net/src/utils.rs b/zcash_local_net/src/utils.rs index 5e08a20..b652228 100644 --- a/zcash_local_net/src/utils.rs +++ b/zcash_local_net/src/utils.rs @@ -4,7 +4,6 @@ use std::{env, path::PathBuf}; /// Functions for picking executables from env variables in the global runtime. pub mod executable_finder; -pub(crate) mod type_conversions; /// Returns path to cargo manifest directory (project root) pub(crate) fn cargo_manifest_dir() -> PathBuf { diff --git a/zcash_local_net/src/utils/type_conversions.rs b/zcash_local_net/src/utils/type_conversions.rs deleted file mode 100644 index 8b6385b..0000000 --- a/zcash_local_net/src/utils/type_conversions.rs +++ /dev/null @@ -1,20 +0,0 @@ -use zebra_chain::parameters::testnet::ConfiguredActivationHeights; -use zingo_consensus::ActivationHeights; - -pub(crate) fn zingo_to_zebra_activation_heights( - value: ActivationHeights, -) -> ConfiguredActivationHeights { - ConfiguredActivationHeights { - before_overwinter: Some(1), - overwinter: value.overwinter(), - sapling: value.sapling(), - blossom: value.blossom(), - heartwood: value.heartwood(), - canopy: value.canopy(), - nu5: value.nu5(), - nu6: value.nu6(), - nu6_1: value.nu6_1(), - nu6_2: value.nu6_2(), - nu7: value.nu7(), - } -} diff --git a/zcash_local_net/src/validator.rs b/zcash_local_net/src/validator.rs index 6db3aa7..42642b7 100644 --- a/zcash_local_net/src/validator.rs +++ b/zcash_local_net/src/validator.rs @@ -2,8 +2,7 @@ use std::path::PathBuf; use tempfile::TempDir; -use zcash_protocol::PoolType; -use zingo_consensus::{ActivationHeights, NetworkType}; +use zingo_consensus::{ActivationHeights, MinerPool, NetworkType}; use crate::process::Process; @@ -71,7 +70,8 @@ pub fn regtest_test_activation_heights() -> ActivationHeights { /// unit test in `regtest-launcher::cli::tests`** — the test parses /// this string and verifies the result, after the same conversion /// that `regtest-launcher::main` applies, equals the helper output. -pub const REGTEST_FIXTURE_HEIGHTS_CLI_STRING: &str = "all=1,nu5=2,nu6=2,nu6_1=5,nu6_2=5,nu7=off"; +pub const REGTEST_FIXTURE_HEIGHTS_CLI_STRING: &str = + "all=1,nu5=2,nu6=2,nu6_1=5,nu6_2=5,nu6_3=off,nu7=off"; /// One lockbox disbursement output to inject into Zebra's regtest /// `[network.testnet_parameters]` configuration. @@ -271,7 +271,7 @@ pub trait ValidatorConfig: Default { /// To set the config for common Regtest parameters. fn set_test_parameters( &mut self, - mine_to_pool: PoolType, + mine_to_pool: MinerPool, activation_heights: ActivationHeights, chain_cache: Option, ); diff --git a/zcash_local_net/src/validator/zcashd.rs b/zcash_local_net/src/validator/zcashd.rs index 8efe236..bbfc9ae 100644 --- a/zcash_local_net/src/validator/zcashd.rs +++ b/zcash_local_net/src/validator/zcashd.rs @@ -2,12 +2,9 @@ use std::{path::PathBuf, process::Child}; -use getset::{CopyGetters, Getters}; use tempfile::TempDir; -use zcash_protocol::PoolType; - -use zingo_consensus::{ActivationHeights, NetworkType}; +use zingo_consensus::{ActivationHeights, MinerPool, NetworkType}; use zingo_test_vectors::{ REG_O_ADDR_FROM_ABANDONART, REG_T_ADDR_FROM_ABANDONART, REG_Z_ADDR_FROM_ABANDONART, }; @@ -98,7 +95,7 @@ impl Default for ZcashdConfig { // use the funds — the proving cost was pure overhead. // Tests that need shielded-mined funds opt in via // `ValidatorConfig::set_test_parameters` with - // `PoolType::ORCHARD` or `PoolType::SAPLING`. + // `MinerPool::Orchard` or `MinerPool::Sapling`. miner_address: Some(REG_T_ADDR_FROM_ABANDONART), chain_cache: None, disable_shielded_proving: true, @@ -110,14 +107,14 @@ impl Default for ZcashdConfig { impl ValidatorConfig for ZcashdConfig { fn set_test_parameters( &mut self, - mine_to_pool: PoolType, + mine_to_pool: MinerPool, activation_heights: ActivationHeights, chain_cache: Option, ) { self.miner_address = Some(match mine_to_pool { - PoolType::ORCHARD => REG_O_ADDR_FROM_ABANDONART, - PoolType::SAPLING => REG_Z_ADDR_FROM_ABANDONART, - PoolType::Transparent => REG_T_ADDR_FROM_ABANDONART, + MinerPool::Orchard => REG_O_ADDR_FROM_ABANDONART, + MinerPool::Sapling => REG_Z_ADDR_FROM_ABANDONART, + MinerPool::Transparent => REG_T_ADDR_FROM_ABANDONART, }); self.activation_heights = activation_heights; self.chain_cache = chain_cache; @@ -125,7 +122,7 @@ impl ValidatorConfig for ZcashdConfig { // mineraddress output, and the prover to construct the // shielded output itself. Re-enable both for non-Transparent // pools so callers don't have to know about either default. - if !matches!(mine_to_pool, PoolType::Transparent) { + if !matches!(mine_to_pool, MinerPool::Transparent) { self.disable_wallet = false; self.disable_shielded_proving = false; } @@ -133,14 +130,11 @@ impl ValidatorConfig for ZcashdConfig { } /// This struct is used to represent and manage the Zcashd process. -#[derive(Debug, Getters, CopyGetters)] -#[getset(get = "pub")] +#[derive(Debug)] pub struct Zcashd { /// Child process handle handle: Child, /// RPC port - #[getset(skip)] - #[getset(get_copy = "pub")] port: u16, /// Config directory config_dir: TempDir, @@ -150,6 +144,33 @@ pub struct Zcashd { data_dir: TempDir, } +impl Zcashd { + /// Child process handle. + pub fn handle(&self) -> &Child { + &self.handle + } + + /// RPC port. + pub fn port(&self) -> u16 { + self.port + } + + /// Config directory. + pub fn config_dir(&self) -> &TempDir { + &self.config_dir + } + + /// Logs directory. + pub fn logs_dir(&self) -> &TempDir { + &self.logs_dir + } + + /// Data directory. + pub fn data_dir(&self) -> &TempDir { + &self.data_dir + } +} + impl Zcashd { /// Returns path to config file. fn config_path(&self) -> PathBuf { @@ -558,26 +579,26 @@ mod unit_tests { #[test] fn set_test_parameters_transparent_pool_keeps_wallet_disabled() { let mut config = ZcashdConfig::default(); - config.set_test_parameters(PoolType::Transparent, ActivationHeights::default(), None); + config.set_test_parameters(MinerPool::Transparent, ActivationHeights::default(), None); assert!( config.disable_wallet, "Transparent mining does not need zcashd's wallet to \ materialize coinbase outputs; set_test_parameters must \ preserve the default-true `disable_wallet` for \ - PoolType::Transparent." + MinerPool::Transparent." ); } #[test] fn set_test_parameters_orchard_pool_enables_wallet() { let mut config = ZcashdConfig::default(); - config.set_test_parameters(PoolType::ORCHARD, ActivationHeights::default(), None); + config.set_test_parameters(MinerPool::Orchard, ActivationHeights::default(), None); assert!( !config.disable_wallet, "Orchard mining needs zcashd's wallet to materialize the \ shielded coinbase output from `mineraddress`; \ set_test_parameters must auto-flip `disable_wallet` to \ - false for PoolType::ORCHARD so callers don't have to \ + false for MinerPool::Orchard so callers don't have to \ know about the default." ); } @@ -585,13 +606,13 @@ mod unit_tests { #[test] fn set_test_parameters_sapling_pool_enables_wallet() { let mut config = ZcashdConfig::default(); - config.set_test_parameters(PoolType::SAPLING, ActivationHeights::default(), None); + config.set_test_parameters(MinerPool::Sapling, ActivationHeights::default(), None); assert!( !config.disable_wallet, "Sapling mining needs zcashd's wallet to materialize \ the shielded coinbase output from `mineraddress`; \ set_test_parameters must auto-flip `disable_wallet` to \ - false for PoolType::SAPLING so callers don't have to \ + false for MinerPool::Sapling so callers don't have to \ know about the default." ); } @@ -599,26 +620,26 @@ mod unit_tests { #[test] fn set_test_parameters_transparent_pool_keeps_shielded_proving_disabled() { let mut config = ZcashdConfig::default(); - config.set_test_parameters(PoolType::Transparent, ActivationHeights::default(), None); + config.set_test_parameters(MinerPool::Transparent, ActivationHeights::default(), None); assert!( config.disable_shielded_proving, "Transparent mining does not construct shielded outputs \ and so does not need the prover; set_test_parameters \ must preserve the default-true `disable_shielded_proving` \ - for PoolType::Transparent." + for MinerPool::Transparent." ); } #[test] fn set_test_parameters_orchard_pool_enables_shielded_proving() { let mut config = ZcashdConfig::default(); - config.set_test_parameters(PoolType::ORCHARD, ActivationHeights::default(), None); + config.set_test_parameters(MinerPool::Orchard, ActivationHeights::default(), None); assert!( !config.disable_shielded_proving, "Orchard mining constructs the shielded coinbase output \ and so needs the prover; set_test_parameters must \ auto-flip `disable_shielded_proving` to false for \ - PoolType::ORCHARD so callers don't have to know about \ + MinerPool::Orchard so callers don't have to know about \ the default." ); } @@ -626,13 +647,13 @@ mod unit_tests { #[test] fn set_test_parameters_sapling_pool_enables_shielded_proving() { let mut config = ZcashdConfig::default(); - config.set_test_parameters(PoolType::SAPLING, ActivationHeights::default(), None); + config.set_test_parameters(MinerPool::Sapling, ActivationHeights::default(), None); assert!( !config.disable_shielded_proving, "Sapling mining constructs the shielded coinbase output \ and so needs the prover; set_test_parameters must \ auto-flip `disable_shielded_proving` to false for \ - PoolType::SAPLING so callers don't have to know about \ + MinerPool::Sapling so callers don't have to know about \ the default." ); } diff --git a/zcash_local_net/src/validator/zebrad.rs b/zcash_local_net/src/validator/zebrad.rs index 0b76c7d..ccfa2b5 100644 --- a/zcash_local_net/src/validator/zebrad.rs +++ b/zcash_local_net/src/validator/zebrad.rs @@ -7,14 +7,10 @@ use crate::{ logs::{LogsToDir, LogsToStdoutAndStderr as _}, network, process::Process, - utils::{ - executable_finder::{EXPECT_SPAWN, pick_command, trace_version_and_location}, - type_conversions::zingo_to_zebra_activation_heights, - }, + utils::executable_finder::{EXPECT_SPAWN, pick_command, trace_version_and_location}, validator::{Validator, ValidatorConfig}, }; -use zcash_protocol::PoolType; -use zingo_consensus::{ActivationHeights, NetworkType}; +use zingo_consensus::{ActivationHeights, MinerPool, NetworkType}; use zingo_test_vectors::{ REG_O_ADDR_FROM_ABANDONART, REG_T_ADDR_FROM_ABANDONART, ZEBRAD_DEFAULT_MINER, }; @@ -25,14 +21,8 @@ use std::{ process::Child, }; -use getset::{CopyGetters, Getters}; +use crate::rpc_client::RpcRequestClient; use tempfile::TempDir; -use zebra_chain::serialization::ZcashSerialize as _; -use zebra_node_services::rpc_client::RpcRequestClient; -use zebra_rpc::{ - client::{BlockTemplateResponse, BlockTemplateTimeSource}, - proposal_block_from_template, -}; /// Zebrad configuration /// @@ -136,15 +126,15 @@ impl ZebradConfig { impl ValidatorConfig for ZebradConfig { fn set_test_parameters( &mut self, - mine_to_pool: PoolType, + mine_to_pool: MinerPool, activation_heights: ActivationHeights, chain_cache: Option, ) { self.miner_address = match mine_to_pool { - PoolType::ORCHARD => REG_O_ADDR_FROM_ABANDONART, - PoolType::Transparent => REG_T_ADDR_FROM_ABANDONART, - PoolType::SAPLING => { - panic!("zebrad does not support mining to a Sapling address; use ORCHARD or Transparent") + MinerPool::Orchard => REG_O_ADDR_FROM_ABANDONART, + MinerPool::Transparent => REG_T_ADDR_FROM_ABANDONART, + MinerPool::Sapling => { + panic!("zebrad does not support mining to a Sapling address; use Orchard or Transparent") } } .to_string(); @@ -154,26 +144,17 @@ impl ValidatorConfig for ZebradConfig { } /// This struct is used to represent and manage the Zebrad process. -#[derive(Debug, Getters, CopyGetters)] -#[getset(get = "pub")] +#[derive(Debug)] pub struct Zebrad { /// Child process handle handle: Child, /// network listen port - #[getset(skip)] - #[getset(get_copy = "pub")] network_listen_port: u16, /// json RPC listen port - #[getset(skip)] - #[getset(get_copy = "pub")] rpc_listen_port: u16, /// gRPC listen port - #[getset(skip)] - #[getset(get_copy = "pub")] indexer_listen_port: u16, /// `[health]` HTTP listen port (serves `/healthy` and `/ready`) - #[getset(skip)] - #[getset(get_copy = "pub")] health_listen_port: u16, /// Config directory config_dir: TempDir, @@ -187,6 +168,58 @@ pub struct Zebrad { network: NetworkType, } +impl Zebrad { + /// Child process handle. + pub fn handle(&self) -> &Child { + &self.handle + } + + /// Network listen port. + pub fn network_listen_port(&self) -> u16 { + self.network_listen_port + } + + /// JSON-RPC listen port. + pub fn rpc_listen_port(&self) -> u16 { + self.rpc_listen_port + } + + /// gRPC listen port. + pub fn indexer_listen_port(&self) -> u16 { + self.indexer_listen_port + } + + /// `[health]` HTTP listen port. + pub fn health_listen_port(&self) -> u16 { + self.health_listen_port + } + + /// Config directory. + pub fn config_dir(&self) -> &TempDir { + &self.config_dir + } + + /// Logs directory. + pub fn logs_dir(&self) -> &TempDir { + &self.logs_dir + } + + /// Data directory. + pub fn data_dir(&self) -> &TempDir { + &self.data_dir + } + + /// RPC request client for the launched node. + pub fn client(&self) -> &RpcRequestClient { + &self.client + } + + /// Network type the node was launched with. + pub fn network(&self) -> &NetworkType { + &self.network + } +} + impl LogsToDir for Zebrad { fn logs_dir(&self) -> &TempDir { &self.logs_dir @@ -358,7 +391,7 @@ impl Zebrad { .await?; let rpc_address = SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), rpc_listen_port); - let client = zebra_node_services::rpc_client::RpcRequestClient::new(rpc_address); + let client = RpcRequestClient::new(rpc_address); // Replaces a fixed `std::thread::sleep(5s)`. `launch::wait` already // confirmed via stdout that the RPC listener bound; this confirms it @@ -508,9 +541,6 @@ impl Validator for Zebrad { let NetworkType::Regtest(activation_heights) = self.network() else { panic!("Can only generate blocks on regtest networks!"); }; - let network = zebra_chain::parameters::Network::new_regtest( - zingo_to_zebra_activation_heights(*activation_heights).into(), - ); // Drive the chain forward one block per outer iteration. Success // criterion is *chain advance*, not the RPC response: zebra returns @@ -526,7 +556,7 @@ impl Validator for Zebrad { let mut last_response = String::new(); let mut advanced = false; for _ in 0..MAX_ATTEMPTS { - let block_template: BlockTemplateResponse = self + let block_template: crate::zebra_rpc::BlockTemplate = self .client .json_result_from_call("getblocktemplate", "[]".to_string()) .await @@ -535,14 +565,8 @@ impl Validator for Zebrad { ); let block_data = hex::encode( - proposal_block_from_template( - &block_template, - BlockTemplateTimeSource::default(), - &network, - ) - .unwrap() - .zcash_serialize_to_vec() - .unwrap(), + crate::zebra_rpc::proposal_block_bytes(&block_template, activation_heights) + .unwrap(), ); last_response = self diff --git a/zcash_local_net/src/zebra_rpc.rs b/zcash_local_net/src/zebra_rpc.rs new file mode 100644 index 0000000..a776fd0 --- /dev/null +++ b/zcash_local_net/src/zebra_rpc.rs @@ -0,0 +1,258 @@ +//! Client-side assembly of block proposals from `getblocktemplate` responses. +//! +//! Replaces the zebra-rpc dependency's template types and +//! `proposal_block_from_template` for the ways this repo actually uses them: +//! parse the nine template fields the assembly needs, build the serialized +//! block a regtest zebrad will accept from `submitblock`, and report the +//! block hash. Equivalence with zebra-rpc was proven by a live differential +//! oracle suite (`tests/zebra_rpc_oracle.rs` in git history, deleted along +//! with the zebra-rpc dev-dependency) and is pinned permanently by the +//! golden fixtures in `tests/fixtures/zebra_rpc/`, replayed by +//! `tests/zebra_rpc_golden.rs` with no dependency and no binary. +//! +//! Wire facts inherited from zebra (verified against zebra-chain 11.0.0): +//! all 32-byte hash fields appear in RPC JSON as byte-reversed display hex; +//! `bits` is big-endian display hex written little-endian; proposals use a +//! zero nonce and an all-zero 1344-byte Equihash solution; the header +//! commitment field is the chain history root while Canopy is the current +//! upgrade and the block commitments hash from NU5 onward. + +use zingo_consensus::ActivationHeights; + +/// Serialized length of a block header, including the solution and its +/// 3-byte compactsize prefix. +const HEADER_LEN: usize = 4 + 32 + 32 + 32 + 4 + 4 + 32 + 3 + SOLUTION_LEN; + +/// Length of an Equihash solution for default parameters (n=200, k=9). +const SOLUTION_LEN: usize = 1344; + +/// Error from template parsing or proposal assembly. +#[derive(Debug, thiserror::Error)] +pub enum ZebraRpcError { + /// A hex field failed to decode or had the wrong length. + #[error("invalid hex in template field {field}: {reason}")] + InvalidHex { + /// The template field that failed to decode. + field: &'static str, + /// Why it failed. + reason: String, + }, + /// The template height precedes Canopy activation. + #[error("proposals are not supported before Canopy activation")] + PreCanopy, +} + +/// The subset of a `getblocktemplate` result that proposal assembly consumes. +/// +/// Unknown fields are ignored, so this deserializes from a full zebrad +/// response. +#[derive(Clone, Debug, serde::Deserialize)] +pub struct BlockTemplate { + /// Block format version. + pub version: u32, + /// Height of the block being templated. + pub height: u32, + /// Hash of the current chain tip, display-order hex. + #[serde(rename = "previousblockhash")] + pub previous_block_hash: String, + /// Header roots for the template's transaction set. + #[serde(rename = "defaultroots")] + pub default_roots: DefaultRoots, + /// Compact difficulty target, display-order hex. + pub bits: String, + /// Template creation time, the default header time source. + #[serde(rename = "curtime")] + pub cur_time: u32, + /// The coinbase transaction. + #[serde(rename = "coinbasetxn")] + pub coinbase_txn: TransactionTemplate, + /// The non-coinbase transactions. + pub transactions: Vec, +} + +/// The header roots from a template's `defaultroots` field. +#[derive(Clone, Debug, serde::Deserialize)] +pub struct DefaultRoots { + /// Transaction merkle root, display-order hex. + #[serde(rename = "merkleroot")] + pub merkle_root: String, + /// Chain history root, the header commitment while Canopy is current. + #[serde(rename = "chainhistoryroot")] + pub chain_history_root: String, + /// Block commitments hash, the header commitment from NU5 onward. + #[serde(rename = "blockcommitmentshash")] + pub block_commitments_hash: String, +} + +/// A serialized transaction from a template. +#[derive(Clone, Debug, serde::Deserialize)] +pub struct TransactionTemplate { + /// Raw transaction bytes as hex. + pub data: String, +} + +/// Builds the serialized block proposal a regtest zebrad accepts from +/// `submitblock`, equivalent to zebra-rpc's `proposal_block_from_template` +/// with the default (`curtime`) time source. +/// +/// `activation_heights` selects the header commitment field: the chain +/// history root while Canopy is the current upgrade at the template height, +/// the block commitments hash from NU5 onward. +pub fn proposal_block_bytes( + template: &BlockTemplate, + activation_heights: &ActivationHeights, +) -> Result, ZebraRpcError> { + let nu5_active = activation_heights + .nu5() + .is_some_and(|h| template.height >= h); + let canopy_active = activation_heights + .canopy() + .is_some_and(|h| template.height >= h); + if !canopy_active { + return Err(ZebraRpcError::PreCanopy); + } + let commitment_hex = if nu5_active { + ( + "blockcommitmentshash", + &template.default_roots.block_commitments_hash, + ) + } else { + ( + "chainhistoryroot", + &template.default_roots.chain_history_root, + ) + }; + + let mut block = Vec::with_capacity(HEADER_LEN + 2048); + block.extend_from_slice(&template.version.to_le_bytes()); + block.extend_from_slice(&hash32_from_display_hex( + "previousblockhash", + &template.previous_block_hash, + )?); + block.extend_from_slice(&hash32_from_display_hex( + "merkleroot", + &template.default_roots.merkle_root, + )?); + block.extend_from_slice(&hash32_from_display_hex( + commitment_hex.0, + commitment_hex.1, + )?); + block.extend_from_slice(&template.cur_time.to_le_bytes()); + block.extend_from_slice(&bits_from_display_hex(&template.bits)?); + block.extend_from_slice(&[0u8; 32]); + push_compactsize(&mut block, SOLUTION_LEN as u64); + block.extend_from_slice(&[0u8; SOLUTION_LEN]); + debug_assert_eq!(block.len(), HEADER_LEN); + + push_compactsize(&mut block, 1 + template.transactions.len() as u64); + block.extend_from_slice(&tx_bytes("coinbasetxn.data", &template.coinbase_txn.data)?); + for tx in &template.transactions { + block.extend_from_slice(&tx_bytes("transactions.data", &tx.data)?); + } + + Ok(block) +} + +/// Returns the block hash (double SHA-256 of the header) as display-order +/// hex, matching zebra's `block.hash().to_string()`. +pub fn block_hash_hex(block_bytes: &[u8]) -> String { + use sha2::{Digest, Sha256}; + + let header = &block_bytes[..HEADER_LEN.min(block_bytes.len())]; + let mut hash: [u8; 32] = Sha256::digest(Sha256::digest(header)).into(); + hash.reverse(); + hex::encode(hash) +} + +fn hash32_from_display_hex( + field: &'static str, + display_hex: &str, +) -> Result<[u8; 32], ZebraRpcError> { + let bytes = hex::decode(display_hex).map_err(|e| ZebraRpcError::InvalidHex { + field, + reason: e.to_string(), + })?; + let mut hash: [u8; 32] = bytes.try_into().map_err(|_| ZebraRpcError::InvalidHex { + field, + reason: "expected 32 bytes".to_string(), + })?; + hash.reverse(); + Ok(hash) +} + +fn bits_from_display_hex(display_hex: &str) -> Result<[u8; 4], ZebraRpcError> { + let bytes = hex::decode(display_hex).map_err(|e| ZebraRpcError::InvalidHex { + field: "bits", + reason: e.to_string(), + })?; + let display: [u8; 4] = bytes.try_into().map_err(|_| ZebraRpcError::InvalidHex { + field: "bits", + reason: "expected 4 bytes".to_string(), + })?; + Ok(u32::from_be_bytes(display).to_le_bytes()) +} + +fn tx_bytes(field: &'static str, data_hex: &str) -> Result, ZebraRpcError> { + hex::decode(data_hex).map_err(|e| ZebraRpcError::InvalidHex { + field, + reason: e.to_string(), + }) +} + +fn push_compactsize(out: &mut Vec, n: u64) { + match n { + 0..=0xfc => out.push(n as u8), + 0xfd..=0xffff => { + out.push(0xfd); + out.extend_from_slice(&(n as u16).to_le_bytes()); + } + 0x1_0000..=0xffff_ffff => { + out.push(0xfe); + out.extend_from_slice(&(n as u32).to_le_bytes()); + } + _ => { + out.push(0xff); + out.extend_from_slice(&n.to_le_bytes()); + } + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn compactsize_encodings() { + let mut buf = Vec::new(); + push_compactsize(&mut buf, 3); + assert_eq!(buf, [0x03]); + + buf.clear(); + push_compactsize(&mut buf, 0xfc); + assert_eq!(buf, [0xfc]); + + buf.clear(); + push_compactsize(&mut buf, 0xfd); + assert_eq!(buf, [0xfd, 0xfd, 0x00]); + + buf.clear(); + push_compactsize(&mut buf, SOLUTION_LEN as u64); + assert_eq!(buf, [0xfd, 0x40, 0x05]); + } + + #[test] + fn bits_display_hex_writes_little_endian() { + assert_eq!( + bits_from_display_hex("1f07ffff").unwrap(), + [0xff, 0xff, 0x07, 0x1f] + ); + } + + #[test] + fn hash_fields_reverse_from_display_order() { + let display = format!("ff{}", "00".repeat(31)); + let wire = hash32_from_display_hex("previousblockhash", &display).unwrap(); + assert_eq!(wire[31], 0xff); + assert_eq!(wire[0], 0x00); + } +} diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/block_h1_canopy.hex b/zcash_local_net/tests/fixtures/zebra_rpc/block_h1_canopy.hex new file mode 100644 index 0000000..9babeaa --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/block_h1_canopy.hex @@ -0,0 +1 @@ +04000000e2caba12a4e4273d41ac5dbe94a4b40d334bda51be4374c2fe729a4d0f679560821552611eb3dfbce16c18c54103f8aa2b46fff99eaef7d5cd2dfbba9f01c5dc4c8a5ebd159b2cecc87846625c61c97a32a806bfae7389e231bc9577f64ea77a0a104a4d0f0f0f200000000000000000000000000000000000000000000000000000000000000000fd400500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050000800a27a7265510e7c80000000002000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff013060e124000000001976a91417a95184b6b158dcb8d576fc182d9b7f14377d0488ac000000 \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/block_h2.hex b/zcash_local_net/tests/fixtures/zebra_rpc/block_h2.hex new file mode 100644 index 0000000..d8e3b2b --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/block_h2.hex @@ -0,0 +1 @@ +04000000e2caba12a4e4273d41ac5dbe94a4b40d334bda51be4374c2fe729a4d0f679560821552611eb3dfbce16c18c54103f8aa2b46fff99eaef7d5cd2dfbba9f01c5dc9a4fb3616bb91d6fd16fbbcd40a98b2340fef9e9793da3d45470f3f9b39666180a104a4d0f0f0f200000000000000000000000000000000000000000000000000000000000000000fd400500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050000800a27a7265510e7c80000000002000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff013060e124000000001976a91417a95184b6b158dcb8d576fc182d9b7f14377d0488ac000000 \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/block_h5.hex b/zcash_local_net/tests/fixtures/zebra_rpc/block_h5.hex new file mode 100644 index 0000000..218dc76 --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/block_h5.hex @@ -0,0 +1 @@ +040000008c6f568a26f361ad02fa068d8436ef846a4653f56fe02ca30e807ee2f6a695c1bda40168a0a03f0afc6d5736bd5ad17cbab21cad0bad383f7bd0b29ecf39ee655588540642b3b137dee43dc0e5e05c3b9bcd47db9c5c17609f3515eb0cb9d38c22254a4d0f0f0f200000000000000000000000000000000000000000000000000000000000000000fd400500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001050000800a27a72630f337540000000005000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025500ffffffff023060e124000000001976a91417a95184b6b158dcb8d576fc182d9b7f14377d0488ac010000000000000017a914d2f1b436490d63fc078d8aed2d966bd3e40d79f087000000 \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/hash_h1_canopy.txt b/zcash_local_net/tests/fixtures/zebra_rpc/hash_h1_canopy.txt new file mode 100644 index 0000000..e9b4af6 --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/hash_h1_canopy.txt @@ -0,0 +1 @@ +2c133f2b340221268087a9b7c204f83cd3fb607f9fee06a4042372a2c13bac92 \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/hash_h2.txt b/zcash_local_net/tests/fixtures/zebra_rpc/hash_h2.txt new file mode 100644 index 0000000..acc601d --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/hash_h2.txt @@ -0,0 +1 @@ +5f761d7186acd8fcede16bb1f083021009250ca74223d4b7b429704a5fa83419 \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/hash_h5.txt b/zcash_local_net/tests/fixtures/zebra_rpc/hash_h5.txt new file mode 100644 index 0000000..d148f4d --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/hash_h5.txt @@ -0,0 +1 @@ +620c651fb8a76ade3905bee31dc6e0bc30b4fea712f87e1502ba5a0612c51d68 \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/template_h2.json b/zcash_local_net/tests/fixtures/zebra_rpc/template_h2.json new file mode 100644 index 0000000..a92d310 --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/template_h2.json @@ -0,0 +1,41 @@ +{ + "bits": "200f0f0f", + "blockcommitmentshash": "186696b3f9f37054d4a33d79e9f9fe40238ba940cdbb6fd16f1db96b61b34f9a", + "capabilities": [ + "proposal" + ], + "coinbasetxn": { + "authdigest": "c09ad75e66ac1bc118288751300d83451b473a2a023f9d70f26c692c1b3e32b7", + "data": "050000800a27a7265510e7c80000000002000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025200ffffffff013060e124000000001976a91417a95184b6b158dcb8d576fc182d9b7f14377d0488ac000000", + "depends": [], + "fee": 0, + "hash": "dcc5019fbafb2dcdd5f7ae9ef9ff462baaf80341c5186ce1bcdfb31e61521582", + "required": true, + "sigops": 1 + }, + "curtime": 1296699402, + "defaultroots": { + "authdataroot": "c09ad75e66ac1bc118288751300d83451b473a2a023f9d70f26c692c1b3e32b7", + "blockcommitmentshash": "186696b3f9f37054d4a33d79e9f9fe40238ba940cdbb6fd16f1db96b61b34f9a", + "chainhistoryroot": "7aa74ef67795bc31e28973aebf06a8327ac9615c624678c8ec2c9b15bd5e8a4c", + "merkleroot": "dcc5019fbafb2dcdd5f7ae9ef9ff462baaf80341c5186ce1bcdfb31e61521582" + }, + "finalsaplingroothash": "186696b3f9f37054d4a33d79e9f9fe40238ba940cdbb6fd16f1db96b61b34f9a", + "height": 2, + "lightclientroothash": "186696b3f9f37054d4a33d79e9f9fe40238ba940cdbb6fd16f1db96b61b34f9a", + "longpollid": "000000000122d53bef1296699402000000000000000000", + "maxtime": 1296699402, + "mintime": 1296694003, + "mutable": [ + "time", + "transactions", + "prevblock" + ], + "noncerange": "00000000ffffffff", + "previousblockhash": "6095670f4d9a72fec27443be51da4b330db4a494be5dac413d27e4a412bacae2", + "sigoplimit": 20000, + "sizelimit": 2000000, + "target": "0f0f0f0000000000000000000000000000000000000000000000000000000000", + "transactions": [], + "version": 4 +} \ No newline at end of file diff --git a/zcash_local_net/tests/fixtures/zebra_rpc/template_h5.json b/zcash_local_net/tests/fixtures/zebra_rpc/template_h5.json new file mode 100644 index 0000000..c2a4f2e --- /dev/null +++ b/zcash_local_net/tests/fixtures/zebra_rpc/template_h5.json @@ -0,0 +1,41 @@ +{ + "bits": "200f0f0f", + "blockcommitmentshash": "8cd3b90ceb15359f60175c9cdb47cd9b3b5ce0e5c03de4de37b1b34206548855", + "capabilities": [ + "proposal" + ], + "coinbasetxn": { + "authdigest": "c021b54cced165c78e69d982ea730107d2514f186a55c22c76929b53e0d89b13", + "data": "050000800a27a72630f337540000000005000000010000000000000000000000000000000000000000000000000000000000000000ffffffff025500ffffffff023060e124000000001976a91417a95184b6b158dcb8d576fc182d9b7f14377d0488ac010000000000000017a914d2f1b436490d63fc078d8aed2d966bd3e40d79f087000000", + "depends": [], + "fee": 0, + "hash": "65ee39cf9eb2d07b3f38ad0bad1cb2ba7cd15abd36576dfc0a3fa0a06801a4bd", + "required": true, + "sigops": 1 + }, + "curtime": 1296704802, + "defaultroots": { + "authdataroot": "c021b54cced165c78e69d982ea730107d2514f186a55c22c76929b53e0d89b13", + "blockcommitmentshash": "8cd3b90ceb15359f60175c9cdb47cd9b3b5ce0e5c03de4de37b1b34206548855", + "chainhistoryroot": "447defc77c4b6c22aca358d2095e77984dfa38d02bf22b0a7f664c2f9a7ecedc", + "merkleroot": "65ee39cf9eb2d07b3f38ad0bad1cb2ba7cd15abd36576dfc0a3fa0a06801a4bd" + }, + "finalsaplingroothash": "8cd3b90ceb15359f60175c9cdb47cd9b3b5ce0e5c03de4de37b1b34206548855", + "height": 5, + "lightclientroothash": "8cd3b90ceb15359f60175c9cdb47cd9b3b5ce0e5c03de4de37b1b34206548855", + "longpollid": "00000000045b4ad0d11296704802000000000000000000", + "maxtime": 1296704802, + "mintime": 1296699403, + "mutable": [ + "time", + "transactions", + "prevblock" + ], + "noncerange": "00000000ffffffff", + "previousblockhash": "c195a6f6e27e800ea32ce06ff553466a84ef36848d06fa02ad61f3268a566f8c", + "sigoplimit": 20000, + "sizelimit": 2000000, + "target": "0f0f0f0000000000000000000000000000000000000000000000000000000000", + "transactions": [], + "version": 4 +} \ No newline at end of file diff --git a/zcash_local_net/tests/integration.rs b/zcash_local_net/tests/integration.rs index 937f2eb..74351b5 100644 --- a/zcash_local_net/tests/integration.rs +++ b/zcash_local_net/tests/integration.rs @@ -18,7 +18,7 @@ use zcash_local_net::{ zebrad::{Zebrad, ZebradConfig}, }, }; -use zcash_protocol::PoolType; +use zingo_consensus::MinerPool; async fn launch_default_and_print_all() { let p = P::launch_default().await.expect("Process launching!"); @@ -123,7 +123,7 @@ async fn probe_validator_with_nu6_1_at let activation_heights = regtest_heights_nu6_1_at(nu6_1_height); let mut config = V::Config::default(); - config.set_test_parameters(PoolType::Transparent, activation_heights, None); + config.set_test_parameters(MinerPool::Transparent, activation_heights, None); let validator = V::launch(config).await.unwrap_or_else(|e| { panic!( @@ -376,7 +376,7 @@ async fn launch_zebrad_with_nu6_1_at_height_5_with_disbursements_and_funding_str let activation_heights = regtest_heights_nu6_1_at(5); let mut config = ZebradConfig::default(); - config.set_test_parameters(PoolType::Transparent, activation_heights, None); + config.set_test_parameters(MinerPool::Transparent, activation_heights, None); config.lockbox_disbursements = zcash_local_net::validator::regtest_test_lockbox_disbursements(); config.post_nu6_funding_streams = Some(zcash_local_net::validator::regtest_test_post_nu6_funding_streams()); @@ -405,7 +405,7 @@ async fn launch_zebrad_with_nu6_1_at_height_2_and_dummy_disbursements() { let activation_heights = regtest_heights_nu6_1_at(2); let mut config = ZebradConfig::default(); - config.set_test_parameters(PoolType::Transparent, activation_heights, None); + config.set_test_parameters(MinerPool::Transparent, activation_heights, None); config.lockbox_disbursements = zcash_local_net::validator::regtest_test_lockbox_disbursements(); let zebrad = Zebrad::launch(config) @@ -958,7 +958,7 @@ mod devtool_client { async fn launch_orchard_net() -> LocalNet { let mut validator_config = ZebradConfig::default(); validator_config.set_test_parameters( - PoolType::ORCHARD, + MinerPool::Orchard, supported_regtest_activation_heights(), None, ); diff --git a/zcash_local_net/tests/zebra_rpc_golden.rs b/zcash_local_net/tests/zebra_rpc_golden.rs new file mode 100644 index 0000000..b81340e --- /dev/null +++ b/zcash_local_net/tests/zebra_rpc_golden.rs @@ -0,0 +1,77 @@ +//! Offline golden regression tests for `zcash_local_net::zebra_rpc`. +//! +//! The fixtures in `tests/fixtures/zebra_rpc/` are real zebrad +//! `getblocktemplate` results paired with the block bytes and hashes the +//! zebra-rpc oracle produced for them. They were captured by the oracle +//! differential suite (`tests/zebra_rpc_oracle.rs`, deleted with the +//! zebra-rpc dev-dependency; recover both from git history to recapture) +//! which also proved live equivalence: byte-identical proposals at heights +//! 2 through 6 against a real zebrad, with our bytes accepted by the chain. +//! These tests replay the fixtures with no zebrad binary and no zebra-rpc +//! dependency, pinning that equivalence permanently. Height 2 is a plain +//! NU5+ template; height 5 is the NU6.1/NU6.2 activation block whose +//! coinbase carries the lockbox disbursement outputs; the Canopy case +//! replays the height-2 template at height 1, where the header commitment +//! switches to the chain history root. + +use zcash_local_net::validator::regtest_test_activation_heights; +use zcash_local_net::zebra_rpc::{BlockTemplate, block_hash_hex, proposal_block_bytes}; + +fn assert_fixture_reproduced(height: u32) { + let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/zebra_rpc"); + let read = |name: String| std::fs::read_to_string(dir.join(name)).expect("fixture exists"); + + let template: BlockTemplate = + serde_json::from_str(&read(format!("template_h{height}.json"))).expect("template parses"); + let expected_bytes = read(format!("block_h{height}.hex")); + let expected_hash = read(format!("hash_h{height}.txt")); + + let our_bytes = proposal_block_bytes(&template, ®test_test_activation_heights()) + .expect("assembly succeeds"); + + assert_eq!( + hex::encode(&our_bytes), + expected_bytes.trim(), + "block bytes drifted from the oracle capture at height {height}" + ); + assert_eq!( + block_hash_hex(&our_bytes), + expected_hash.trim(), + "block hash drifted from the oracle capture at height {height}" + ); +} + +#[test] +fn golden_nu5_plus_template_reproduces_oracle_output() { + assert_fixture_reproduced(2); +} + +#[test] +fn golden_lockbox_activation_template_reproduces_oracle_output() { + assert_fixture_reproduced(5); +} + +#[test] +fn golden_canopy_branch_reproduces_oracle_output() { + let dir = std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/zebra_rpc"); + let read = |name: &str| std::fs::read_to_string(dir.join(name)).expect("fixture exists"); + + let mut template: serde_json::Value = + serde_json::from_str(&read("template_h2.json")).expect("template parses"); + template["height"] = serde_json::json!(1); + let template: BlockTemplate = serde_json::from_value(template).expect("template converts"); + + let our_bytes = proposal_block_bytes(&template, ®test_test_activation_heights()) + .expect("assembly succeeds"); + + assert_eq!( + hex::encode(&our_bytes), + read("block_h1_canopy.hex").trim(), + "Canopy-branch block bytes drifted from the oracle capture" + ); + assert_eq!( + block_hash_hex(&our_bytes), + read("hash_h1_canopy.txt").trim(), + "Canopy-branch block hash drifted from the oracle capture" + ); +} diff --git a/zingo-consensus/src/lib.rs b/zingo-consensus/src/lib.rs index a3e834f..5685ab9 100644 --- a/zingo-consensus/src/lib.rs +++ b/zingo-consensus/src/lib.rs @@ -30,6 +30,20 @@ impl std::fmt::Display for NetworkType { } } +/// The pool a validator mines block rewards to. +/// +/// Validator support differs: zcashd can mine to any variant, while zebrad +/// supports only `Transparent` and `Orchard`. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum MinerPool { + /// Mine to a transparent (P2PKH) address. + Transparent, + /// Mine to a Sapling shielded address. Not supported by zebrad. + Sapling, + /// Mine to an Orchard shielded address. + Orchard, +} + /// Network upgrade activation heights for custom testnet and regtest network configuration. #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub struct ActivationHeights {