From b68f4d85c06a79ed4c1dce0adddbfbcad77c1d13 Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 17:26:55 -0700 Subject: [PATCH 01/10] refactor: default miner address to the ABANDONART fixture, delete keygen regtest-launcher no longer generates keypairs. --miner-address now defaults to zingo_test_vectors::REG_T_ADDR_FROM_ABANDONART, the same fixture the harness has always mined to, whose seed is the public BIP-39 test mnemonic, so default-mined regtest funds are spendable by importing that phrase into any wallet. An org-wide audit found no programmatic consumers of the launcher, and every human user has wallet software that mints addresses. This removes the workspace's entire remaining direct librustzcash surface outside zebra: zcash_keys, zcash_protocol, zcash_transparent, zip32, bip0039, secp256k1, ripemd, and sha2 leave regtest-launcher, and the zcash_keys 0.13/zcash_protocol 0.8/zcash_transparent 0.7 duplicate-version pairs leave the lock. The e2e snapshot is updated by hand for the new output (zainod is not available in this environment); re-run the e2e locally to confirm. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 169 +++--------------- Cargo.toml | 1 - regtest-launcher/Cargo.toml | 9 +- regtest-launcher/README.md | 12 +- regtest-launcher/src/cli.rs | 12 +- regtest-launcher/src/keygen.rs | 46 ----- regtest-launcher/src/main.rs | 28 +-- regtest-launcher/tests/e2e.rs | 9 - .../snapshots/e2e__regtest_first_mine.snap | 8 +- 9 files changed, 47 insertions(+), 247 deletions(-) delete mode 100644 regtest-launcher/src/keygen.rs diff --git a/Cargo.lock b/Cargo.lock index 4921f1a..5a191c2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2458,40 +2458,6 @@ 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" @@ -3293,24 +3259,17 @@ 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]] @@ -5164,20 +5123,6 @@ dependencies = [ "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" @@ -5189,7 +5134,7 @@ dependencies = [ "corez", "f4jumble", "zcash_encoding", - "zcash_protocol 0.9.0", + "zcash_protocol", ] [[package]] @@ -5214,34 +5159,6 @@ dependencies = [ "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" @@ -5257,16 +5174,16 @@ dependencies = [ "group", "memuse", "nonempty", - "orchard 0.14.0", + "orchard", "rand_core 0.6.4", "sapling-crypto", "secrecy", "subtle", "tracing", - "zcash_address 0.12.0", + "zcash_address", "zcash_encoding", - "zcash_protocol 0.9.0", - "zcash_transparent 0.8.0", + "zcash_protocol", + "zcash_transparent", "zip32", ] @@ -5284,7 +5201,7 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "zcash_protocol 0.9.0", + "zcash_protocol", "zebra-chain", "zebra-node-services", "zebra-rpc", @@ -5323,7 +5240,7 @@ dependencies = [ "jubjub", "memuse", "nonempty", - "orchard 0.14.0", + "orchard", "rand_core 0.6.4", "redjubjub", "sapling-crypto", @@ -5331,9 +5248,9 @@ dependencies = [ "sha2 0.10.9", "zcash_encoding", "zcash_note_encryption", - "zcash_protocol 0.9.0", + "zcash_protocol", "zcash_script", - "zcash_transparent 0.8.0", + "zcash_transparent", ] [[package]] @@ -5359,19 +5276,6 @@ dependencies = [ "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" @@ -5411,31 +5315,6 @@ 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" @@ -5453,9 +5332,9 @@ dependencies = [ "secp256k1", "sha2 0.10.9", "subtle", - "zcash_address 0.12.0", + "zcash_address", "zcash_encoding", - "zcash_protocol 0.9.0", + "zcash_protocol", "zcash_script", "zcash_spec", "zip32", @@ -5491,7 +5370,7 @@ dependencies = [ "jubjub", "lazy_static", "num-integer", - "orchard 0.14.0", + "orchard", "primitive-types", "rand_core 0.6.4", "rayon", @@ -5515,14 +5394,14 @@ dependencies = [ "tracing", "uint 0.10.0", "x25519-dalek", - "zcash_address 0.12.0", + "zcash_address", "zcash_encoding", "zcash_history", "zcash_note_encryption", "zcash_primitives", - "zcash_protocol 0.9.0", + "zcash_protocol", "zcash_script", - "zcash_transparent 0.8.0", + "zcash_transparent", ] [[package]] @@ -5545,7 +5424,7 @@ dependencies = [ "metrics", "mset", "once_cell", - "orchard 0.14.0", + "orchard", "rand 0.8.6", "rayon", "sapling-crypto", @@ -5559,9 +5438,9 @@ dependencies = [ "tracing-futures", "zcash_primitives", "zcash_proofs", - "zcash_protocol 0.9.0", + "zcash_protocol", "zcash_script", - "zcash_transparent 0.8.0", + "zcash_transparent", "zebra-chain", "zebra-node-services", "zebra-script", @@ -5645,7 +5524,7 @@ dependencies = [ "metrics", "nix", "openrpsee", - "orchard 0.14.0", + "orchard", "phf", "prost", "rand 0.8.6", @@ -5667,13 +5546,13 @@ dependencies = [ "tower 0.4.13", "tracing", "which", - "zcash_address 0.12.0", - "zcash_keys 0.14.0", + "zcash_address", + "zcash_keys", "zcash_primitives", "zcash_proofs", - "zcash_protocol 0.9.0", + "zcash_protocol", "zcash_script", - "zcash_transparent 0.8.0", + "zcash_transparent", "zebra-chain", "zebra-consensus", "zebra-network", diff --git a/Cargo.toml b/Cargo.toml index 2d2d437..4682424 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ resolver = "2" # workspace zingo_test_vectors = { path = "zingo_test_vectors" } -zcash_local_net = { path = "zcash_local_net" } zingo-consensus = { path = "zingo-consensus" } #zcash diff --git a/regtest-launcher/Cargo.toml b/regtest-launcher/Cargo.toml index f13106a..8ea7918 100644 --- a/regtest-launcher/Cargo.toml +++ b/regtest-launcher/Cargo.toml @@ -9,21 +9,14 @@ 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" +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..e489884 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 @@ -24,7 +28,9 @@ Options: [default: all=1,nu5=2,nu6=2,nu6_1=5,nu6_2=5,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..a0c2713 100644 --- a/regtest-launcher/src/cli.rs +++ b/regtest-launcher/src/cli.rs @@ -23,9 +23,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)] diff --git a/regtest-launcher/src/keygen.rs b/regtest-launcher/src/keygen.rs deleted file mode 100644 index f026948..0000000 --- a/regtest-launcher/src/keygen.rs +++ /dev/null @@ -1,46 +0,0 @@ -use bip0039::{Count, Mnemonic}; -use ripemd::Ripemd160; -use secp256k1::{PublicKey, Secp256k1, SecretKey}; -use sha2::{Digest, Sha256}; - -use zcash_keys::encoding::encode_transparent_address_p; -use zcash_protocol::consensus::TestNetwork; -use zcash_transparent::{ - address::TransparentAddress, - keys::{AccountPrivKey, NonHardenedChildIndex}, -}; -use zip32::AccountId; - -fn hash160(data: &[u8]) -> [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..1c6a0cf 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}, @@ -40,7 +39,7 @@ use zebra_rpc::{ proposal_block_from_template, }; -use crate::{cli::Cli, keygen::generate_regtest_transparent_keypair}; +use crate::cli::Cli; #[tokio::main] async fn main() { @@ -58,13 +57,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 +71,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!(); 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 From b09d9c11afc349a1e7ee18a35e3bae0746b829f0 Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 18:05:20 -0700 Subject: [PATCH 02/10] feat: replace zcash_protocol::PoolType with zingo_consensus::MinerPool The harness's mine-to-pool selector becomes a dedicated vocabulary type beside NetworkType. The borrowed PoolType shape never fit (zebrad panics on its Sapling variant) and consumers only ever passed literals, so the ecosystem-type-identity benefit was theoretical while the cost was chaining zcash_local_net's API to librustzcash's major cadence. zcash_protocol leaves the workspace manifests entirely, along with the unused local-consensus feature; it remains in the lock only where zebra embeds it internally. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 1 - Cargo.toml | 3 -- zcash_local_net/Cargo.toml | 5 +--- zcash_local_net/src/client.rs | 6 ++-- zcash_local_net/src/lib.rs | 7 +++-- zcash_local_net/src/validator.rs | 5 ++-- zcash_local_net/src/validator/zcashd.rs | 40 ++++++++++++------------- zcash_local_net/src/validator/zebrad.rs | 13 ++++---- zcash_local_net/tests/integration.rs | 10 +++---- zingo-consensus/src/lib.rs | 14 +++++++++ 10 files changed, 54 insertions(+), 50 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 5a191c2..eb1b26c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5201,7 +5201,6 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "zcash_protocol", "zebra-chain", "zebra-node-services", "zebra-rpc", diff --git a/Cargo.toml b/Cargo.toml index 4682424..d6cceb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,9 +13,6 @@ resolver = "2" zingo_test_vectors = { path = "zingo_test_vectors" } 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" diff --git a/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index 9a89644..bc66a30 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -17,9 +17,6 @@ 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 } @@ -46,9 +43,9 @@ 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", "reqwest::error::Error", 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/lib.rs b/zcash_local_net/src/lib.rs index c7d673a..b29ebcc 100644 --- a/zcash_local_net/src/lib.rs +++ b/zcash_local_net/src/lib.rs @@ -64,13 +64,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 zingo_consensus::{ + ActivationHeights, ActivationHeightsBuilder, MinerPool, NetworkType, + }; } /// External re-exported types. diff --git a/zcash_local_net/src/validator.rs b/zcash_local_net/src/validator.rs index 6db3aa7..67838dc 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; @@ -271,7 +270,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..e2d3d2a 100644 --- a/zcash_local_net/src/validator/zcashd.rs +++ b/zcash_local_net/src/validator/zcashd.rs @@ -5,9 +5,7 @@ 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 +96,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 +108,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 +123,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; } @@ -558,26 +556,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 +583,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 +597,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 +624,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..0d91be1 100644 --- a/zcash_local_net/src/validator/zebrad.rs +++ b/zcash_local_net/src/validator/zebrad.rs @@ -13,8 +13,7 @@ use crate::{ }, 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, }; @@ -136,15 +135,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(); 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/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 { From 7ae0673fef37ca7aeb0dd1ab9a4461085ae3c8ea Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 19:30:02 -0700 Subject: [PATCH 03/10] refactor: take zebra_chain via zebra-rpc's re-export, declare rpc-client zebra_rpc::client re-exports all of zebra_chain (verified stable through zebra-rpc 11.0.0), so zcash_local_net's three zebra_chain imports move to that path and the direct zebra-chain dependency is removed, dropping a workspace version pin that had to chase zebra releases. zebra-node-services gains an explicit rpc-client feature declaration: the crate imports rpc_client::RpcRequestClient but previously compiled only because zebra-rpc happens to enable that feature, a latent unification bug. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 1 - Cargo.toml | 3 --- zcash_local_net/Cargo.toml | 3 +-- zcash_local_net/src/utils/type_conversions.rs | 2 +- zcash_local_net/src/validator/zebrad.rs | 4 ++-- 5 files changed, 4 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index eb1b26c..973fd12 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5201,7 +5201,6 @@ dependencies = [ "tokio", "tracing", "tracing-subscriber", - "zebra-chain", "zebra-node-services", "zebra-rpc", "zingo-consensus", diff --git a/Cargo.toml b/Cargo.toml index d6cceb7..0016e02 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,9 +12,6 @@ resolver = "2" # workspace zingo_test_vectors = { path = "zingo_test_vectors" } zingo-consensus = { path = "zingo-consensus" } - -# zebra -zebra-chain = "9.0.0" zebra-node-services = "7.0.0" zebra-rpc = "9.0.0" diff --git a/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index bc66a30..cebfc72 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -18,9 +18,8 @@ zingo-consensus = { workspace = true } zingo_test_vectors = { workspace = true } # zebra -zebra-node-services = { workspace = true } +zebra-node-services = { workspace = true, features = ["rpc-client"] } zebra-rpc = { workspace = true } -zebra-chain = { workspace = true } # Community tempfile = { workspace = true } diff --git a/zcash_local_net/src/utils/type_conversions.rs b/zcash_local_net/src/utils/type_conversions.rs index 8b6385b..3ead502 100644 --- a/zcash_local_net/src/utils/type_conversions.rs +++ b/zcash_local_net/src/utils/type_conversions.rs @@ -1,4 +1,4 @@ -use zebra_chain::parameters::testnet::ConfiguredActivationHeights; +use zebra_rpc::client::zebra_chain::parameters::testnet::ConfiguredActivationHeights; use zingo_consensus::ActivationHeights; pub(crate) fn zingo_to_zebra_activation_heights( diff --git a/zcash_local_net/src/validator/zebrad.rs b/zcash_local_net/src/validator/zebrad.rs index 0d91be1..654e0a7 100644 --- a/zcash_local_net/src/validator/zebrad.rs +++ b/zcash_local_net/src/validator/zebrad.rs @@ -26,10 +26,10 @@ use std::{ use getset::{CopyGetters, Getters}; use tempfile::TempDir; -use zebra_chain::serialization::ZcashSerialize as _; use zebra_node_services::rpc_client::RpcRequestClient; +use zebra_rpc::client::zebra_chain::serialization::ZcashSerialize as _; use zebra_rpc::{ - client::{BlockTemplateResponse, BlockTemplateTimeSource}, + client::{BlockTemplateResponse, BlockTemplateTimeSource, zebra_chain}, proposal_block_from_template, }; From 05c7dc9efb8c9165bd74dbcecebb51e4f96214d8 Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 19:40:25 -0700 Subject: [PATCH 04/10] feat: hand-rolled JSON-RPC client, drop zebra-node-services zcash_local_net gains rpc_client::RpcRequestClient, a drop-in replacement for zebra_node_services::rpc_client::RpcRequestClient built on the crate's existing reqwest dependency. Same name, same method surface, same spliced JSON-RPC 2.0 wire format, so all call sites change imports only. Unit tests pin the requirements derived from the seven call sites: wire shape, result payload delivery, error-envelope-to-Err mapping (which readiness polling depends on), transport failures as Err, byte-faithful text passthrough for the submitblock result:null check, and sequential-call soundness. Validated against real zebrad: 15/15 integration and e2e tests pass. zebra-node-services leaves both member manifests and the workspace table, freeing the workspace from tracking its version in lockstep with zebra-rpc (which moves it 7.0.0 -> 9.0.0 at zebra-rpc 11). The external-types allowlist loses its last zebra entry. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 3 +- Cargo.toml | 1 - regtest-launcher/Cargo.toml | 1 - regtest-launcher/src/main.rs | 2 +- zcash_local_net/Cargo.toml | 6 +- zcash_local_net/src/lib.rs | 3 +- zcash_local_net/src/rpc_client.rs | 304 ++++++++++++++++++++++++ zcash_local_net/src/validator/zebrad.rs | 4 +- 8 files changed, 312 insertions(+), 12 deletions(-) create mode 100644 zcash_local_net/src/rpc_client.rs diff --git a/Cargo.lock b/Cargo.lock index 973fd12..49ffe88 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3267,7 +3267,6 @@ dependencies = [ "regex", "tokio", "zcash_local_net", - "zebra-node-services", "zebra-rpc", "zingo_test_vectors", ] @@ -5195,13 +5194,13 @@ dependencies = [ "hex", "json", "reqwest", + "serde", "serde_json", "tempfile", "thiserror 1.0.69", "tokio", "tracing", "tracing-subscriber", - "zebra-node-services", "zebra-rpc", "zingo-consensus", "zingo_test_vectors", diff --git a/Cargo.toml b/Cargo.toml index 0016e02..2c3703b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ resolver = "2" # workspace zingo_test_vectors = { path = "zingo_test_vectors" } zingo-consensus = { path = "zingo-consensus" } -zebra-node-services = "7.0.0" zebra-rpc = "9.0.0" #protocol diff --git a/regtest-launcher/Cargo.toml b/regtest-launcher/Cargo.toml index 8ea7918..d338a77 100644 --- a/regtest-launcher/Cargo.toml +++ b/regtest-launcher/Cargo.toml @@ -14,7 +14,6 @@ hex.workspace = true local-net = { path = "../zcash_local_net", package = "zcash_local_net" } owo-colors = "4.2.3" tokio = { workspace = true, features = ["signal"] } -zebra-node-services = { workspace = true, features = ["rpc-client"] } zebra-rpc.workspace = true zingo_test_vectors.workspace = true diff --git a/regtest-launcher/src/main.rs b/regtest-launcher/src/main.rs index 1c6a0cf..49d8985 100644 --- a/regtest-launcher/src/main.rs +++ b/regtest-launcher/src/main.rs @@ -24,7 +24,7 @@ use owo_colors::OwoColorize; use tokio::{signal::ctrl_c, time::interval}; use local_net::protocol::ActivationHeights; -use zebra_node_services::rpc_client::RpcRequestClient; +use local_net::protocol::RpcRequestClient; use zebra_rpc::{ client::{ BlockTemplateTimeSource, GetBlockTemplateResponse, diff --git a/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index cebfc72..20a4730 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -16,9 +16,6 @@ github = { repository = "zingolabs/infrastructure/services" } # zingo zingo-consensus = { workspace = true } zingo_test_vectors = { workspace = true } - -# zebra -zebra-node-services = { workspace = true, features = ["rpc-client"] } zebra-rpc = { workspace = true } # Community @@ -31,8 +28,10 @@ json = { workspace = true } serde_json = { workspace = true } hex = { workspace = true } tokio = { workspace = true } +serde = "1.0.228" [dev-dependencies] +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "net", "io-util"] } tracing-subscriber = { workspace = true } [build-dependencies] @@ -46,6 +45,5 @@ allowed_external_types = [ "zingo_consensus::ActivationHeightsBuilder", "zingo_consensus::MinerPool", "zingo_consensus::NetworkType", - "zebra_node_services::rpc_client::RpcRequestClient", "reqwest::error::Error", ] diff --git a/zcash_local_net/src/lib.rs b/zcash_local_net/src/lib.rs index b29ebcc..c019e77 100644 --- a/zcash_local_net/src/lib.rs +++ b/zcash_local_net/src/lib.rs @@ -51,6 +51,7 @@ pub mod indexer; pub mod logs; pub mod network; pub mod process; +pub mod rpc_client; pub mod utils; pub mod validator; @@ -68,7 +69,7 @@ pub use zingo_consensus::MinerPool; /// External re-exported zcash types. pub mod protocol { - pub use zebra_node_services::rpc_client::RpcRequestClient; + pub use crate::rpc_client::RpcRequestClient; pub use zingo_consensus::{ ActivationHeights, ActivationHeightsBuilder, MinerPool, NetworkType, }; 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/validator/zebrad.rs b/zcash_local_net/src/validator/zebrad.rs index 654e0a7..a3d5f57 100644 --- a/zcash_local_net/src/validator/zebrad.rs +++ b/zcash_local_net/src/validator/zebrad.rs @@ -24,9 +24,9 @@ use std::{ process::Child, }; +use crate::rpc_client::RpcRequestClient; use getset::{CopyGetters, Getters}; use tempfile::TempDir; -use zebra_node_services::rpc_client::RpcRequestClient; use zebra_rpc::client::zebra_chain::serialization::ZcashSerialize as _; use zebra_rpc::{ client::{BlockTemplateResponse, BlockTemplateTimeSource, zebra_chain}, @@ -357,7 +357,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 From 848422ce6b98e8a574e4e827ac1419683bd3e86a Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 19:49:05 -0700 Subject: [PATCH 05/10] feat: bump zebra-rpc to 11.0, wire nu6.3 through the launcher CLI The workspace's single zebra pin moves 9.0 -> 11.0 (two-component version per manifest convention). zebra 11's ConfiguredActivationHeights gained nu6_3 (ironwood), so the zingo conversion now maps it and the launcher CLI grows the nu6_3 key, off by default like nu7 (the fixture string says so explicitly: cascade semantics would otherwise activate ironwood at the nu6_2 height). RegtestParameters gained should_allow_unshielded_coinbase_spends; None preserves prior behavior. Verified against a pre-ironwood zebrad binary: 42/42 CLI, client, integration, and e2e tests pass, including real mining through zebra 11's template assembly. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 62 ++++++++++--------- Cargo.toml | 2 +- regtest-launcher/README.md | 6 +- regtest-launcher/src/cli.rs | 15 +++-- regtest-launcher/src/main.rs | 3 + zcash_local_net/src/utils/type_conversions.rs | 1 + zcash_local_net/src/validator.rs | 3 +- 7 files changed, 53 insertions(+), 39 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 49ffe88..5bcc0d9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2460,9 +2460,9 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" [[package]] name = "orchard" -version = "0.14.0" +version = "0.15.0-pre.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a54f8d29bfb1e76a9d4e868a1a08cce2e57dd2bdc66232982822ad3114b91ab3" +checksum = "e8e277dd4b46f5d06deae3ffb8af1a951e8622368f028c2a4d6fe59339566403" dependencies = [ "aes", "bitvec", @@ -5124,9 +5124,9 @@ dependencies = [ [[package]] name = "zcash_address" -version = "0.12.0" +version = "0.13.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58342d0aaa8e2fa98849636f52800ac4bf020574c944c974742fc933db58cac2" +checksum = "8cf2918e73eff76388cda87695a6e7398f96a2e3383a0de7b77729a204ec00a0" dependencies = [ "bech32", "bs58", @@ -5149,9 +5149,9 @@ dependencies = [ [[package]] name = "zcash_history" -version = "0.4.0" +version = "0.5.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fde17bf53792f9c756b313730da14880257d7661b5bfc69d0571c3a7c11a76d" +checksum = "82e8634d011026cb181cb67b2a412e601dc344a2827b9c576fe3a727fdebf441" dependencies = [ "blake2b_simd", "byteorder", @@ -5160,9 +5160,9 @@ dependencies = [ [[package]] name = "zcash_keys" -version = "0.14.0" +version = "0.15.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fbcdfbb5c8edb247439d72a397abaae9b7dd14a1c070e7e4fc3536924f9065f" +checksum = "0a0bac3a9e5b0d954684ba1f07386d55b5ae4588b3ba2d93cad05ee09f3e0947" dependencies = [ "bech32", "blake2b_simd", @@ -5221,9 +5221,9 @@ dependencies = [ [[package]] name = "zcash_primitives" -version = "0.28.0" +version = "0.29.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c69e07f5eb3f682a6467b4b08ee4956f1acd1e886d70b21c4766953b3a1beba2" +checksum = "ba7bfe66975658f44dba87d535f9ebb9fb4c9c0c4fecca3f5c40cbe1583dece6" dependencies = [ "blake2b_simd", "block-buffer 0.11.0-rc.3", @@ -5252,9 +5252,9 @@ dependencies = [ [[package]] name = "zcash_proofs" -version = "0.28.0" +version = "0.29.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3de6b0ca82e08a9d38b1121f87c5b180b5feac19fecba074cb582882210d2371" +checksum = "b39b90964ffe6bdc314368c7b849aaa6dcc2b495249a3bf1b9bfbdc92ba4e4f6" dependencies = [ "bellman", "blake2b_simd", @@ -5275,9 +5275,9 @@ dependencies = [ [[package]] name = "zcash_protocol" -version = "0.9.0" +version = "0.10.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5bec496a0bd62dae98c4b26f51c5dab112d0c5350bbc2ccfdfd05bb3454f714d" +checksum = "97f339a9801c7f70295732a5cf822346f194202cea6425fc2fc14a5af679b004" dependencies = [ "corez", "document-features", @@ -5314,9 +5314,9 @@ dependencies = [ [[package]] name = "zcash_transparent" -version = "0.8.0" +version = "0.9.0-pre.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15df1908b428d4edeb7c7caae5692e05e2e92e5c38007a40b20ac098efdffd96" +checksum = "4e941230f67056aad41c8fa9b926f9cc4d9d1a321f32e95c39c0b0e38e85f79b" dependencies = [ "bip32", "bs58", @@ -5339,9 +5339,9 @@ dependencies = [ [[package]] name = "zebra-chain" -version = "9.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed3a4e00e8f0b2197f3d8fd6cad02351a25ddbffcf0a6dc1fe463d7ea4ccfa" +checksum = "600a4c35ee81350384226f8178fab2b088e38d5e0a9f6cb0b1051caba30702d7" dependencies = [ "bech32", "bitflags", @@ -5403,9 +5403,9 @@ dependencies = [ [[package]] name = "zebra-consensus" -version = "8.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15475adf8c271d03de99d18d622a8ae4c512c401e3e29da1f27a0ba62b22057c" +checksum = "0aa2b2678c4ce6d18172bad73a9b72b24a4b3a65af4c2a5e9120a1470c3fc402" dependencies = [ "bellman", "blake2b_simd", @@ -5446,9 +5446,9 @@ dependencies = [ [[package]] name = "zebra-network" -version = "8.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ba4f7dcd795eb84a5a33f5c4f29df60dd4971be363d2cd98d5fba5ce0477f2" +checksum = "36b1e6ca4687bc8d128553ca04bb82cc38701c4dac7107f3e56717b39d4b18da" dependencies = [ "bitflags", "byteorder", @@ -5484,9 +5484,9 @@ dependencies = [ [[package]] name = "zebra-node-services" -version = "7.0.0" +version = "9.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abeece0fb4503a1df00c5ab736754b55c702613968f622f6aa3c2f9842aed2b2" +checksum = "4446db9b576c0de14ff91c7fd7b38a59d340c1969a1604787185a52b8b7f53a6" dependencies = [ "color-eyre", "jsonrpsee-types", @@ -5500,9 +5500,9 @@ dependencies = [ [[package]] name = "zebra-rpc" -version = "9.0.0" +version = "11.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b460869e352c9f1b49a00ed9beaae04ca3e6498381c7189d4b90a79e51c260bd" +checksum = "eb180542f1ffc0f66c20e1cd66c7741662053ccda588e3847a8ed2df8c83dae7" dependencies = [ "base64", "chrono", @@ -5533,6 +5533,7 @@ dependencies = [ "serde_with", "strum", "strum_macros", + "subtle", "thiserror 2.0.18", "tokio", "tokio-stream", @@ -5560,9 +5561,9 @@ dependencies = [ [[package]] name = "zebra-script" -version = "8.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4fc38c19388671df8a77c767e279b135ffaecd5e7df6ed7cd096390c080b4a3" +checksum = "8648c201e3dadb1c95022eb7605d528de4bf94b6c0cebf76537805849aee76c5" dependencies = [ "libzcash_script", "rand 0.8.6", @@ -5574,9 +5575,9 @@ dependencies = [ [[package]] name = "zebra-state" -version = "8.0.0" +version = "10.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57b351fde5047dce0d505c9dc26863ee818b7579e9cf8d8e44489deb9decfbb7" +checksum = "3b95b81181253a46885e3254cc5a20e4d82b5258116c9e43db5c8e9660c6b973" dependencies = [ "bincode", "chrono", @@ -5601,6 +5602,7 @@ dependencies = [ "sapling-crypto", "semver", "serde", + "serde-big-array", "tempfile", "thiserror 2.0.18", "tokio", diff --git a/Cargo.toml b/Cargo.toml index 2c3703b..91be7aa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,7 @@ resolver = "2" # workspace zingo_test_vectors = { path = "zingo_test_vectors" } zingo-consensus = { path = "zingo-consensus" } -zebra-rpc = "9.0.0" +zebra-rpc = "11.0" #protocol bip0039 = "0.12.0" diff --git a/regtest-launcher/README.md b/regtest-launcher/README.md index e489884..36ff0f4 100644 --- a/regtest-launcher/README.md +++ b/regtest-launcher/README.md @@ -21,11 +21,11 @@ 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 Miner address for receiving block rewards diff --git a/regtest-launcher/src/cli.rs b/regtest-launcher/src/cli.rs index a0c2713..33c6b42 100644 --- a/regtest-launcher/src/cli.rs +++ b/regtest-launcher/src/cli.rs @@ -5,9 +5,9 @@ use zebra_rpc::client::zebra_chain::parameters::testnet::ConfiguredActivationHei #[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 @@ -46,10 +46,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, @@ -60,6 +61,7 @@ const UPGRADE_ORDER: [UpgradeKey; 11] = [ UpgradeKey::Nu6, UpgradeKey::Nu6_1, UpgradeKey::Nu6_2, + UpgradeKey::Nu6_3, UpgradeKey::Nu7, ]; @@ -77,6 +79,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, } @@ -94,6 +97,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, } } @@ -128,11 +132,13 @@ fn parse_activation_heights(s: &str) -> Result Result 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. From 8e74e9e1704e272c1f7da4121ad3947ace03c534 Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 20:10:27 -0700 Subject: [PATCH 06/10] feat: mod zebra_rpc with oracle-proven proposal assembly New zcash_local_net::zebra_rpc module: a serde template model for the nine getblocktemplate fields proposal assembly consumes, byte-level block construction equivalent to zebra-rpc's proposal_block_from_template (curtime source, zero nonce, zero 1344-byte solution, Canopy-vs-NU5+ commitment branch driven by zingo_consensus::ActivationHeights), and the display-order block hash. zebra-rpc stays as the oracle for now. Equivalence proof: a live differential test launches zebrad, parses each template with both implementations, asserts byte-for-byte block and hash equality at heights 2-6 (crossing the NU6.1/NU6.2 lockbox activation), and submits OUR bytes so the chain itself accepts them. An offline test covers the Canopy branch by replaying a captured fixture at height 1. Golden fixtures captured from the oracle's outputs (tests/fixtures/zebra_rpc) pin the equivalence in zebra_rpc_golden.rs, which needs no binary and no zebra-rpc, so the regression suite survives the dependency's deletion. Discovered along the way: zebrad parses ZEBRA_* environment variables as configuration, so the capture flag is CAPTURE_PROPOSAL_FIXTURES. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 1 + zcash_local_net/Cargo.toml | 3 +- zcash_local_net/src/lib.rs | 1 + zcash_local_net/src/zebra_rpc.rs | 256 ++++++++++++++++++ .../tests/fixtures/zebra_rpc/block_h2.hex | 1 + .../tests/fixtures/zebra_rpc/block_h5.hex | 1 + .../tests/fixtures/zebra_rpc/hash_h2.txt | 1 + .../tests/fixtures/zebra_rpc/hash_h5.txt | 1 + .../tests/fixtures/zebra_rpc/template_h2.json | 41 +++ .../tests/fixtures/zebra_rpc/template_h5.json | 41 +++ zcash_local_net/tests/zebra_rpc_golden.rs | 47 ++++ zcash_local_net/tests/zebra_rpc_oracle.rs | 186 +++++++++++++ 12 files changed, 579 insertions(+), 1 deletion(-) create mode 100644 zcash_local_net/src/zebra_rpc.rs create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/block_h2.hex create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/block_h5.hex create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/hash_h2.txt create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/hash_h5.txt create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/template_h2.json create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/template_h5.json create mode 100644 zcash_local_net/tests/zebra_rpc_golden.rs create mode 100644 zcash_local_net/tests/zebra_rpc_oracle.rs diff --git a/Cargo.lock b/Cargo.lock index 5bcc0d9..caecb82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5196,6 +5196,7 @@ dependencies = [ "reqwest", "serde", "serde_json", + "sha2 0.10.9", "tempfile", "thiserror 1.0.69", "tokio", diff --git a/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index 20a4730..84f5e78 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -28,7 +28,8 @@ json = { workspace = true } serde_json = { workspace = true } hex = { workspace = true } tokio = { workspace = true } -serde = "1.0.228" +serde = "1.0" +sha2 = "0.10" [dev-dependencies] tokio = { workspace = true, features = ["macros", "rt-multi-thread", "net", "io-util"] } diff --git a/zcash_local_net/src/lib.rs b/zcash_local_net/src/lib.rs index c019e77..fdca590 100644 --- a/zcash_local_net/src/lib.rs +++ b/zcash_local_net/src/lib.rs @@ -54,6 +54,7 @@ pub mod process; pub mod rpc_client; pub mod utils; pub mod validator; +pub mod zebra_rpc; mod launch; mod poll; diff --git a/zcash_local_net/src/zebra_rpc.rs b/zcash_local_net/src/zebra_rpc.rs new file mode 100644 index 0000000..97a7fb7 --- /dev/null +++ b/zcash_local_net/src/zebra_rpc.rs @@ -0,0 +1,256 @@ +//! 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 is proven by oracle tests +//! (`tests/zebra_rpc_oracle.rs`) and pinned by golden fixtures captured from +//! the oracle's outputs. +//! +//! 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_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_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/zebra_rpc_golden.rs b/zcash_local_net/tests/zebra_rpc_golden.rs new file mode 100644 index 0000000..8702730 --- /dev/null +++ b/zcash_local_net/tests/zebra_rpc_golden.rs @@ -0,0 +1,47 @@ +//! 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 (captured by `zebra_rpc_oracle.rs` +//! with `CAPTURE_PROPOSAL_FIXTURES=1`). These tests replay them with no +//! zebrad binary and no zebra-rpc dependency, pinning oracle equivalence +//! after the dependency is gone. Height 2 is a plain NU5+ template; height 5 +//! is the NU6.1/NU6.2 activation block whose coinbase carries the lockbox +//! disbursement outputs. + +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); +} diff --git a/zcash_local_net/tests/zebra_rpc_oracle.rs b/zcash_local_net/tests/zebra_rpc_oracle.rs new file mode 100644 index 0000000..e75352f --- /dev/null +++ b/zcash_local_net/tests/zebra_rpc_oracle.rs @@ -0,0 +1,186 @@ +//! Oracle tests proving `zcash_local_net::zebra_rpc` equivalent to the +//! zebra-rpc dependency for every way this repo uses it. +//! +//! The live differential test launches a real zebrad, and at each height +//! parses the same template with both implementations, asserts byte-for-byte +//! equality of the assembled proposal and its hash, then submits *our* bytes +//! and asserts the chain advances. Heights 1 (Canopy commitment branch) +//! through 6 (NU5+ branch, crossing the NU6.1/NU6.2 lockbox activation at 5) +//! are all exercised. +//! +//! Set `CAPTURE_PROPOSAL_FIXTURES=1` to refresh the committed golden +//! fixtures in `tests/fixtures/zebra_rpc/` from the oracle's outputs; the +//! offline regression test in `zebra_rpc_golden.rs` replays those without +//! zebra-rpc or a zebrad binary. (The variable deliberately avoids the +//! `ZEBRA_` prefix: zebrad parses `ZEBRA_*` environment variables as +//! configuration and refuses to launch on unknown fields.) + +use zcash_local_net::process::Process; +use zcash_local_net::validator::{Validator, regtest_test_activation_heights, zebrad::Zebrad}; +use zcash_local_net::zebra_rpc as local_impl; + +use zebra_rpc::client::zebra_chain::parameters::Network; +use zebra_rpc::client::zebra_chain::parameters::testnet::ConfiguredActivationHeights; +use zebra_rpc::client::zebra_chain::serialization::ZcashSerialize as _; +use zebra_rpc::client::{BlockTemplateResponse, BlockTemplateTimeSource}; +use zebra_rpc::proposal_block_from_template; + +fn oracle_network() -> Network { + let zingo = regtest_test_activation_heights(); + Network::new_regtest( + ConfiguredActivationHeights { + before_overwinter: Some(1), + overwinter: zingo.overwinter(), + sapling: zingo.sapling(), + blossom: zingo.blossom(), + heartwood: zingo.heartwood(), + canopy: zingo.canopy(), + nu5: zingo.nu5(), + nu6: zingo.nu6(), + nu6_1: zingo.nu6_1(), + nu6_2: zingo.nu6_2(), + nu6_3: zingo.nu6_3(), + nu7: zingo.nu7(), + } + .into(), + ) +} + +#[tokio::test(flavor = "multi_thread", worker_threads = 2)] +async fn proposals_match_the_oracle_and_zebrad_accepts_ours() { + let _ = tracing_subscriber::fmt().try_init(); + + let zebrad = Zebrad::launch_default().await.expect("zebrad launches"); + let client = zebrad.client(); + let network = oracle_network(); + let heights = regtest_test_activation_heights(); + + let capture = std::env::var("CAPTURE_PROPOSAL_FIXTURES").is_ok(); + let fixture_dir = + std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/zebra_rpc"); + + // `Zebrad::launch` has already mined block 1 (the height-1, Canopy-branch + // proposal happens inside launch); templates here start at height 2 and + // run past the NU6.1/NU6.2 lockbox activation at height 5. + let start_height = zebrad.get_chain_height().await; + for target_height in (start_height + 1)..=(start_height + 5) { + let envelope: serde_json::Value = serde_json::from_str( + &client + .text_from_call("getblocktemplate", "[]") + .await + .expect("getblocktemplate succeeds"), + ) + .expect("valid envelope"); + let result = envelope + .get("result") + .cloned() + .expect("envelope has result"); + + // Both sides parse the same result payload. + let ours: local_impl::BlockTemplate = + serde_json::from_value(result.clone()).expect("our parser accepts the template"); + let oracle_template: BlockTemplateResponse = + serde_json::from_value(result.clone()).expect("oracle parser accepts the template"); + + assert_eq!(ours.height, target_height, "template height"); + + // Byte-for-byte proposal equivalence. + let our_bytes = + local_impl::proposal_block_bytes(&ours, &heights).expect("our assembly succeeds"); + let oracle_block = proposal_block_from_template( + &oracle_template, + BlockTemplateTimeSource::default(), + &network, + ) + .expect("oracle assembly succeeds"); + let oracle_bytes = oracle_block + .zcash_serialize_to_vec() + .expect("oracle serialization succeeds"); + + assert_eq!( + hex::encode(&our_bytes), + hex::encode(&oracle_bytes), + "serialized proposal differs from the oracle at height {target_height}" + ); + assert_eq!( + local_impl::block_hash_hex(&our_bytes), + oracle_block.hash().to_string(), + "block hash differs from the oracle at height {target_height}" + ); + + if capture && (target_height == 2 || target_height == 5) { + std::fs::create_dir_all(&fixture_dir).expect("fixture dir"); + std::fs::write( + fixture_dir.join(format!("template_h{target_height}.json")), + serde_json::to_string_pretty(&result).expect("serialize fixture"), + ) + .expect("write template fixture"); + std::fs::write( + fixture_dir.join(format!("block_h{target_height}.hex")), + hex::encode(&oracle_bytes), + ) + .expect("write block fixture"); + std::fs::write( + fixture_dir.join(format!("hash_h{target_height}.txt")), + oracle_block.hash().to_string(), + ) + .expect("write hash fixture"); + } + + // The chain must accept OUR bytes, not just match the oracle's. + let block_hex = hex::encode(&our_bytes); + let mut advanced = false; + for _ in 0..30 { + client + .text_from_call("submitblock", format!(r#"["{block_hex}"]"#)) + .await + .expect("submitblock succeeds"); + if zebrad.get_chain_height().await >= target_height { + advanced = true; + break; + } + tokio::time::sleep(std::time::Duration::from_millis(100)).await; + } + assert!( + advanced, + "zebrad did not accept our proposal at height {target_height}" + ); + } +} + +/// Differential coverage for the Canopy commitment branch (height 1, where +/// NU5 is not yet active under the fixture heights). The live test can't +/// observe a height-1 template because `Zebrad::launch` consumes it, so this +/// replays the captured height-2 fixture with the height rewritten to 1; +/// the oracle is a pure function and evaluates it without a node. +#[test] +fn canopy_branch_matches_the_oracle() { + let fixture = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) + .join("tests/fixtures/zebra_rpc/template_h2.json"); + let mut template: serde_json::Value = + serde_json::from_str(&std::fs::read_to_string(fixture).expect("fixture exists")) + .expect("fixture parses"); + template["height"] = serde_json::json!(1); + + let ours: local_impl::BlockTemplate = + serde_json::from_value(template.clone()).expect("our parser"); + let oracle_template: BlockTemplateResponse = + serde_json::from_value(template).expect("oracle parser"); + + let our_bytes = local_impl::proposal_block_bytes(&ours, ®test_test_activation_heights()) + .expect("our assembly"); + let oracle_bytes = proposal_block_from_template( + &oracle_template, + BlockTemplateTimeSource::default(), + &oracle_network(), + ) + .expect("oracle assembly") + .zcash_serialize_to_vec() + .expect("oracle serialization"); + + assert_eq!( + hex::encode(&our_bytes), + hex::encode(&oracle_bytes), + "Canopy-branch proposal differs from the oracle" + ); +} From 029e93ebf50fa00b883fe6bce00e1c0ae049bb2a Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 20:38:06 -0700 Subject: [PATCH 07/10] feat: mine through mod zebra_rpc, demote zebra-rpc to dev-only oracle generate_blocks and the launcher's mining loops now assemble proposals with zcash_local_net::zebra_rpc (proven byte-equivalent to zebra-rpc by the oracle suite and pinned by golden fixtures). The commitment branch takes zingo_consensus::ActivationHeights directly, so the zingo_to_zebra_activation_heights conversion and the launcher's Network/RegtestParameters construction are deleted, and the CLI parses into a small local struct. zebra-rpc leaves every [dependencies] table and survives only as zcash_local_net's dev-dependency, powering the oracle differential test and fixture recapture. The workspace's consumer-facing dependency graph now contains zero zcash*, zebra*, or librustzcash crates, transitively. Removing zebra's feature unification unmasked undeclared requirements of the same class as the earlier rpc-client finding: serde/derive and the real tokio feature sets are now declared explicitly in both members. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 350 ++++++++++++------ Cargo.toml | 4 - regtest-launcher/Cargo.toml | 3 +- regtest-launcher/src/cli.rs | 34 +- regtest-launcher/src/main.rs | 60 +-- zcash_local_net/Cargo.toml | 6 +- zcash_local_net/src/utils.rs | 1 - zcash_local_net/src/utils/type_conversions.rs | 21 -- zcash_local_net/src/validator/zebrad.rs | 25 +- 9 files changed, 297 insertions(+), 207 deletions(-) delete mode 100644 zcash_local_net/src/utils/type_conversions.rs diff --git a/Cargo.lock b/Cargo.lock index caecb82..b4889e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -126,9 +126,9 @@ checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" [[package]] name = "arrayvec" -version = "0.7.6" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" [[package]] name = "assert_cmd" @@ -156,6 +156,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "atomic-polyfill" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" +dependencies = [ + "critical-section", +] + [[package]] name = "atomic-waker" version = "1.1.2" @@ -164,9 +173,9 @@ checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" [[package]] name = "autocfg" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "axum" @@ -226,6 +235,12 @@ dependencies = [ "windows-link", ] +[[package]] +name = "base16ct" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" + [[package]] name = "base64" version = "0.22.1" @@ -290,7 +305,7 @@ dependencies = [ "quote", "regex", "rustc-hash 1.1.0", - "shlex", + "shlex 1.3.0", "syn 2.0.117", ] @@ -307,8 +322,8 @@ dependencies = [ "proc-macro2", "quote", "regex", - "rustc-hash 2.1.2", - "shlex", + "rustc-hash 2.1.3", + "shlex 1.3.0", "syn 2.0.117", ] @@ -360,9 +375,9 @@ dependencies = [ [[package]] name = "bitvec" -version = "1.0.1" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" dependencies = [ "funty", "radium", @@ -499,14 +514,14 @@ dependencies = [ [[package]] name = "cc" -version = "1.2.61" +version = "1.2.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d90359e986641506914ba71350897565610e87ce0ad9e6f28569db3dd5c6d" +checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" dependencies = [ "find-msvc-tools", "jobserver", "libc", - "shlex", + "shlex 2.0.1", ] [[package]] @@ -556,9 +571,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "num-traits", @@ -628,6 +643,15 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" +[[package]] +name = "cobs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" +dependencies = [ + "thiserror 2.0.18", +] + [[package]] name = "color-eyre" version = "0.6.5" @@ -658,6 +682,12 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "const-crc32-nostd" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "808ac43170e95b11dd23d78aa9eaac5bea45776a602955552c4e833f3f0f823d" + [[package]] name = "const-oid" version = "0.9.6" @@ -721,6 +751,12 @@ dependencies = [ "libc", ] +[[package]] +name = "critical-section" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" + [[package]] name = "crossbeam-channel" version = "0.5.15" @@ -859,7 +895,6 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" dependencies = [ - "powerfmt", "serde_core", ] @@ -1016,9 +1051,21 @@ dependencies = [ [[package]] name = "either" -version = "1.15.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" +checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" + +[[package]] +name = "embedded-io" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" + +[[package]] +name = "embedded-io" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" [[package]] name = "encode_unicode" @@ -1170,6 +1217,41 @@ dependencies = [ "num-traits", ] +[[package]] +name = "frost-core" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81ef2787af391c7e8bedc037a3b9ea03dde803fbd93e778e6bb369547800e5cd" +dependencies = [ + "byteorder", + "const-crc32-nostd", + "derive-getters", + "document-features", + "hex", + "itertools 0.14.0", + "postcard", + "rand_core 0.6.4", + "serde", + "serdect", + "thiserror 2.0.18", + "visibility", + "zeroize", + "zeroize_derive", +] + +[[package]] +name = "frost-rerandomized" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f4c5cedd2426728adef2c0b1720f57676354c473836d1ccc50d0f0d1c91942b" +dependencies = [ + "derive-getters", + "document-features", + "frost-core", + "hex", + "rand_core 0.6.4", +] + [[package]] name = "funty" version = "2.0.0" @@ -1363,9 +1445,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.14" +version = "0.4.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "171fefbc92fe4a4de27e0698d6a5b392d6a0e333506bc49133760b3bcf948733" +checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" dependencies = [ "atomic-waker", "bytes", @@ -1435,6 +1517,15 @@ dependencies = [ "tracing", ] +[[package]] +name = "hash32" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +dependencies = [ + "byteorder", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1467,6 +1558,20 @@ version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +[[package]] +name = "heapless" +version = "0.7.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +dependencies = [ + "atomic-polyfill", + "hash32", + "rustc_version", + "serde", + "spin", + "stable_deref_trait", +] + [[package]] name = "heck" version = "0.5.0" @@ -1574,9 +1679,9 @@ checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e" [[package]] name = "humantime" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "135b12329e5e3ce057a9f972339ea52bc954fe1e9358ef27f95e89716fbc5424" +checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" [[package]] name = "humantime-serde" @@ -1974,9 +2079,9 @@ checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" [[package]] name = "jsonrpsee" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e281ae70cc3b98dac15fced3366a880949e65fc66e345ce857a5682d152f3e62" +checksum = "72c4b1f204b655b36b24dc4939af20366c649431d4711863bbbae5c495f3eeb4" dependencies = [ "jsonrpsee-core", "jsonrpsee-server", @@ -1986,9 +2091,9 @@ dependencies = [ [[package]] name = "jsonrpsee-core" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "348ee569eaed52926b5e740aae20863762b16596476e943c9e415a6479021622" +checksum = "f49bfa9334963e1c85866b39dff3ffcc81f1c286eb23334267c5cb97677543a4" dependencies = [ "async-trait", "bytes", @@ -1999,7 +2104,7 @@ dependencies = [ "jsonrpsee-types", "parking_lot", "rand 0.8.6", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "serde", "serde_json", "thiserror 1.0.69", @@ -2009,9 +2114,9 @@ dependencies = [ [[package]] name = "jsonrpsee-proc-macros" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7398cddf5013cca4702862a2692b66c48a3bd6cf6ec681a47453c93d63cf8de5" +checksum = "f5248249c016692f1465a753057ae8347681995dd490c2cb65c48b14b46215a8" dependencies = [ "heck", "proc-macro-crate", @@ -2022,9 +2127,9 @@ dependencies = [ [[package]] name = "jsonrpsee-server" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21429bcdda37dcf2d43b68621b994adede0e28061f816b038b0f18c70c143d51" +checksum = "c625c78b8d545478370b6e7a2a191b0d921f831a9eef38dc1e7efb57e7a5472f" dependencies = [ "futures-util", "http", @@ -2049,9 +2154,9 @@ dependencies = [ [[package]] name = "jsonrpsee-types" -version = "0.24.10" +version = "0.24.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0f05e0028e55b15dbd2107163b3c744cd3bb4474f193f95d9708acbf5677e44" +checksum = "41d86fc943f81dab0ecdd6c0240b6e0f55ad57a2ea9ad8ad7efe8456fb9cc7a4" dependencies = [ "http", "serde", @@ -2142,9 +2247,9 @@ checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" [[package]] name = "libredox" -version = "0.1.16" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e02f3bb43d335493c96bf3fd3a321600bf6bd07ed34bc64118e9293bdffea46c" +checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" dependencies = [ "libc", ] @@ -2166,9 +2271,9 @@ dependencies = [ [[package]] name = "libz-sys" -version = "1.1.28" +version = "1.1.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc3a226e576f50782b3305c5ccf458698f92798987f551c6a02efe8276721e22" +checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" dependencies = [ "cc", "pkg-config", @@ -2178,7 +2283,8 @@ dependencies = [ [[package]] name = "libzcash_script" version = "0.1.0" -source = "git+https://github.com/zancas/zcash_script?branch=fix-bindgen-rust-target#c9f1abd6edd43a3ab03923761ee7ae5f725ac2fa" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f8ce05b56f3cbc65ec7d0908adb308ed91281e022f61c8c3a0c9388b5380b17" dependencies = [ "bindgen 0.72.1", "cc", @@ -2357,9 +2463,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +checksum = "c863e9ab5e7bf9c99ba75e1050f1e4d624ae87ed3532d6238ffbdc7b585dbbe6" dependencies = [ "num-integer", "num-traits", @@ -2367,9 +2473,9 @@ dependencies = [ [[package]] name = "num-conv" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6673768db2d862beb9b39a78fdcb1a69439615d5794a1be50caa9bc92c81967" +checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" [[package]] name = "num-integer" @@ -2677,18 +2783,18 @@ dependencies = [ [[package]] name = "pin-project" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1749c7ed4bcaf4c3d0a3efc28538844fb29bcdd7d2b67b2be7e20ba861ff517" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.11" +version = "1.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9b20ed30f105399776b9c883e68e536ef602a16ae6f596d2c473591d6ad64c6" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" dependencies = [ "proc-macro2", "quote", @@ -2734,6 +2840,19 @@ version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c33a9471896f1c69cecef8d20cbe2f7accd12527ce60845ff44c153bb2a21b49" +[[package]] +name = "postcard" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" +dependencies = [ + "cobs", + "embedded-io 0.4.0", + "embedded-io 0.6.1", + "heapless", + "serde", +] + [[package]] name = "potential_utf" version = "0.1.5" @@ -2848,9 +2967,9 @@ dependencies = [ [[package]] name = "prost" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2ea70524a2f82d518bce41317d0fae74151505651af45faf1ffbd6fd33f0568" +checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" dependencies = [ "bytes", "prost-derive", @@ -2858,9 +2977,9 @@ dependencies = [ [[package]] name = "prost-build" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343d3bd7056eda839b03204e68deff7d1b13aba7af2b2fd16890697274262ee7" +checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", "itertools 0.14.0", @@ -2879,9 +2998,9 @@ dependencies = [ [[package]] name = "prost-derive" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "27c6023962132f4b30eb4c172c91ce92d933da334c59c23cddee82358ddafb0b" +checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", "itertools 0.14.0", @@ -2892,18 +3011,18 @@ dependencies = [ [[package]] name = "prost-types" -version = "0.14.3" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8991c4cbdb8bc5b11f0b074ffe286c30e523de90fee5ba8132f1399f23cb3dd7" +checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" dependencies = [ "prost", ] [[package]] name = "pulldown-cmark" -version = "0.13.3" +version = "0.13.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c3a14896dfa883796f1cb410461aef38810ea05f2b2c33c5aded3649095fdad" +checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" dependencies = [ "bitflags", "memchr", @@ -2944,16 +3063,16 @@ dependencies = [ [[package]] name = "quinn" -version = "0.11.9" +version = "0.11.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" +checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" dependencies = [ "bytes", "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "rustls", "socket2", "thiserror 2.0.18", @@ -2964,16 +3083,16 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.14" +version = "0.11.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098" +checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" dependencies = [ "bytes", "getrandom 0.3.4", "lru-slab", "rand 0.9.4", "ring", - "rustc-hash 2.1.2", + "rustc-hash 2.1.3", "rustls", "rustls-pki-types", "slab", @@ -3126,9 +3245,9 @@ dependencies = [ [[package]] name = "rapidhash" -version = "4.4.1" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e48930979c155e2f33aa36ab3119b5ee81332beb6482199a8ecd6029b80b59" +checksum = "32b266a82f4aa99bb5c25e28d11cc44ace63d91adbcbcee4d323e2ae3d49ef37" dependencies = [ "rustversion", ] @@ -3155,19 +3274,20 @@ dependencies = [ [[package]] name = "reddsa" -version = "0.5.1" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78a5191930e84973293aa5f532b513404460cd2216c1cfb76d08748c15b40b02" +checksum = "4784b85c8bfd17b36b86e664e6e504ecdb586001086ee23749e4a633bbb84832" dependencies = [ "blake2b_simd", "byteorder", + "frost-rerandomized", "group", "hex", "jubjub", "pasta_curves", "rand_core 0.6.4", "serde", - "thiserror 1.0.69", + "thiserror 2.0.18", "zeroize", ] @@ -3267,7 +3387,6 @@ dependencies = [ "regex", "tokio", "zcash_local_net", - "zebra-rpc", "zingo_test_vectors", ] @@ -3380,9 +3499,9 @@ checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" [[package]] name = "rustc-hash" -version = "2.1.2" +version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94300abf3f1ae2e2b8ffb7b58043de3d399c73fa6f4b73826402a5c457614dbe" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" [[package]] name = "rustc-hex" @@ -3414,9 +3533,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.40" +version = "0.23.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef86cd5876211988985292b91c96a8f2d298df24e75989a43a3c73f2d4d8168b" +checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" dependencies = [ "once_cell", "ring", @@ -3428,9 +3547,9 @@ dependencies = [ [[package]] name = "rustls-pki-types" -version = "1.14.1" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a7197ae7eb376e574fe940d068c30fe0462554a3ddbe4eca7838e049c937a9" +checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" dependencies = [ "web-time", "zeroize", @@ -3646,11 +3765,12 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.19.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05839ce67618e14a09b286535c0d9c94e85ef25469b0e13cb4f844e5593eb19" +checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" dependencies = [ "base64", + "bs58", "chrono", "hex", "indexmap 1.9.3", @@ -3665,9 +3785,9 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.19.0" +version = "3.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2ebbe86054f9b45bc3881e865683ccfaccce97b9b4cb53f3039d67f355a334" +checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" dependencies = [ "darling", "proc-macro2", @@ -3675,6 +3795,16 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "serdect" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha1" version = "0.10.6" @@ -3723,6 +3853,12 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + [[package]] name = "signal-hook-registry" version = "1.4.8" @@ -3808,6 +3944,9 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] [[package]] name = "spki" @@ -3982,12 +4121,11 @@ dependencies = [ [[package]] name = "time" -version = "0.3.47" +version = "0.3.53" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "743bd48c283afc0388f9b8827b976905fb217ad9e647fae3a379a9283c4def2c" +checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" dependencies = [ "deranged", - "itoa", "num-conv", "powerfmt", "serde_core", @@ -3997,15 +4135,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694e1cfe791f8d31026952abf09c69ca6f6fa4e1a1229e18988f06a04a12dca" +checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" [[package]] name = "time-macros" -version = "0.2.27" +version = "0.2.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e70e4c5a0e0a8a4823ad65dfe1a6930e4f4d756dcd9dd7939022b5e8c501215" +checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" dependencies = [ "num-conv", "time-core", @@ -4111,9 +4249,9 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.25.11+spec-1.1.0" +version = "0.25.12+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b59c4d22ed448339746c59b905d24568fcbb3ab65a500494f7b8c3e97739f2b" +checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" dependencies = [ "indexmap 2.14.0", "toml_datetime", @@ -4132,9 +4270,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fec7c61a0695dc1887c1b53952990f3ad2e3a31453e1f49f10e75424943a93ec" +checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" dependencies = [ "async-trait", "axum", @@ -4161,9 +4299,9 @@ dependencies = [ [[package]] name = "tonic-build" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1882ac3bf5ef12877d7ed57aad87e75154c11931c2ba7e6cde5e22d63522c734" +checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" dependencies = [ "prettyplease", "proc-macro2", @@ -4173,9 +4311,9 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55376a0bbaa4975a3f10d009ad763d8f4108f067c7c2e74f3001fb49778d309" +checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" dependencies = [ "bytes", "prost", @@ -4184,9 +4322,9 @@ dependencies = [ [[package]] name = "tonic-prost-build" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3144df636917574672e93d0f56d7edec49f90305749c668df5101751bb8f95a" +checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" dependencies = [ "prettyplease", "proc-macro2", @@ -4200,9 +4338,9 @@ dependencies = [ [[package]] name = "tonic-reflection" -version = "0.14.5" +version = "0.14.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aaf0685a51e6d02b502ba0764002e766b7f3042aed13d9234925b6ffbfa3fca7" +checksum = "acccd136a4bf19810a1fde9c74edc6129b42a66b44d0c1c8aaa67aeb49a146a7" dependencies = [ "prost", "prost-types", @@ -4444,9 +4582,9 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.13.2" +version = "1.13.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9629274872b2bfaf8d66f5f15725007f635594914870f65218920345aa11aa8c" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" [[package]] name = "unicode-xid" @@ -4732,18 +4870,18 @@ dependencies = [ [[package]] name = "webpki-roots" -version = "1.0.7" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52f5ee44c96cf55f1b349600768e3ece3a8f26010c05265ab73f945bb1a2eb9d" +checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" dependencies = [ "rustls-pki-types", ] [[package]] name = "which" -version = "8.0.2" +version = "8.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81995fafaaaf6ae47a7d0cc83c67caf92aeb7e5331650ae6ff856f7c0c60c459" +checksum = "48d7cd18d4acb58fb3cdfe9ea54e6cd96a4e7d4cc45c56338b236e82dad47248" dependencies = [ "libc", ] @@ -4965,9 +5103,9 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ee1708bef14716a11bae175f579062d4554d95be2c6829f518df847b7b3fdd0" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" dependencies = [ "memchr", ] @@ -5665,9 +5803,9 @@ dependencies = [ [[package]] name = "zeroize_derive" -version = "1.4.3" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a5b4158499876c763cb03bc4e49185d3cccbabb15b33c627f7884f43db852e" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" dependencies = [ "proc-macro2", "quote", diff --git a/Cargo.toml b/Cargo.toml index 91be7aa..757d6b8 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,6 @@ resolver = "2" # workspace zingo_test_vectors = { path = "zingo_test_vectors" } zingo-consensus = { path = "zingo-consensus" } -zebra-rpc = "11.0" #protocol bip0039 = "0.12.0" @@ -31,6 +30,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/regtest-launcher/Cargo.toml b/regtest-launcher/Cargo.toml index d338a77..b7ecc51 100644 --- a/regtest-launcher/Cargo.toml +++ b/regtest-launcher/Cargo.toml @@ -13,8 +13,7 @@ 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" -tokio = { workspace = true, features = ["signal"] } -zebra-rpc.workspace = true +tokio = { workspace = true, features = ["macros", "rt-multi-thread", "signal", "time"] } zingo_test_vectors.workspace = true [dev-dependencies] diff --git a/regtest-launcher/src/cli.rs b/regtest-launcher/src/cli.rs index 33c6b42..922d5ad 100644 --- a/regtest-launcher/src/cli.rs +++ b/regtest-launcher/src/cli.rs @@ -1,6 +1,38 @@ 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 { diff --git a/regtest-launcher/src/main.rs b/regtest-launcher/src/main.rs index b9756e7..edba243 100644 --- a/regtest-launcher/src/main.rs +++ b/regtest-launcher/src/main.rs @@ -25,19 +25,7 @@ use tokio::{signal::ctrl_c, time::interval}; use local_net::protocol::ActivationHeights; use local_net::protocol::RpcRequestClient; -use zebra_rpc::{ - client::{ - BlockTemplateTimeSource, GetBlockTemplateResponse, - zebra_chain::{ - parameters::{ - Network, - testnet::{Parameters, RegtestParameters}, - }, - serialization::ZcashSerialize, - }, - }, - proposal_block_from_template, -}; +use local_net::zebra_rpc::{BlockTemplate, block_hash_hex, proposal_block_bytes}; use crate::cli::Cli; @@ -82,20 +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, - // Preserves pre-zebra-11 behavior (zcashd's - // fCoinbaseMustBeShielded default). - should_allow_unshielded_coinbase_spends: None, - }) - .unwrap(), - )); - let running = Arc::new(AtomicBool::new(true)); let running_miner = running.clone(); @@ -109,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 @@ -145,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 @@ -180,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/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index 84f5e78..c953964 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -16,7 +16,6 @@ github = { repository = "zingolabs/infrastructure/services" } # zingo zingo-consensus = { workspace = true } zingo_test_vectors = { workspace = true } -zebra-rpc = { workspace = true } # Community tempfile = { workspace = true } @@ -27,13 +26,14 @@ getset = { workspace = true } json = { workspace = true } serde_json = { workspace = true } hex = { workspace = true } -tokio = { workspace = true } -serde = "1.0" +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 } +zebra-rpc = "11.0" [build-dependencies] hex = { workspace = true } 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 65bc5b7..0000000 --- a/zcash_local_net/src/utils/type_conversions.rs +++ /dev/null @@ -1,21 +0,0 @@ -use zebra_rpc::client::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(), - nu6_3: value.nu6_3(), - nu7: value.nu7(), - } -} diff --git a/zcash_local_net/src/validator/zebrad.rs b/zcash_local_net/src/validator/zebrad.rs index a3d5f57..3e2c129 100644 --- a/zcash_local_net/src/validator/zebrad.rs +++ b/zcash_local_net/src/validator/zebrad.rs @@ -7,10 +7,7 @@ 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 zingo_consensus::{ActivationHeights, MinerPool, NetworkType}; @@ -27,11 +24,6 @@ use std::{ use crate::rpc_client::RpcRequestClient; use getset::{CopyGetters, Getters}; use tempfile::TempDir; -use zebra_rpc::client::zebra_chain::serialization::ZcashSerialize as _; -use zebra_rpc::{ - client::{BlockTemplateResponse, BlockTemplateTimeSource, zebra_chain}, - proposal_block_from_template, -}; /// Zebrad configuration /// @@ -507,9 +499,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 @@ -525,7 +514,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 @@ -534,14 +523,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 From 116bd5a0a984d2b7cb53351d9cea77ca49bbac5f Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 21:03:21 -0700 Subject: [PATCH 08/10] fix: allowlist the new public API's external types The rpc_client and zebra_rpc modules expose reqwest's Response/Result, serde_json's Error/Value, and serde's deserialization traits in their public signatures; the External Types CI job flagged all six. Co-Authored-By: Claude Fable 5 --- zcash_local_net/Cargo.toml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index c953964..4ba59fe 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -33,7 +33,6 @@ sha2 = "0.10" [dev-dependencies] tokio = { workspace = true, features = ["macros", "rt-multi-thread", "net", "io-util"] } tracing-subscriber = { workspace = true } -zebra-rpc = "11.0" [build-dependencies] hex = { workspace = true } @@ -46,5 +45,14 @@ allowed_external_types = [ "zingo_consensus::ActivationHeightsBuilder", "zingo_consensus::MinerPool", "zingo_consensus::NetworkType", + # 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", ] From 477504b2947b55affab7032f54de8721f1b499ed Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 21:03:21 -0700 Subject: [PATCH 09/10] feat: delete the zebra-rpc oracle, zero zebra/zcash deps of any kind The oracle differential suite served its purpose (live byte-for-byte equivalence proven against real zebrad) and leaves with the zebra-rpc dev-dependency. Before deletion, a Canopy-branch golden fixture was captured from the oracle, so all three commitment-branch cases (NU5+, lockbox activation, Canopy) are pinned offline by zebra_rpc_golden.rs with no dependency and no binary. Recapture machinery lives in git history. The lock file now contains zero zebra or librustzcash entries: the entire tree is gone for this repo's own builds, not just consumers. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 5694 +++-------------- zcash_local_net/src/zebra_rpc.rs | 8 +- .../fixtures/zebra_rpc/block_h1_canopy.hex | 1 + .../fixtures/zebra_rpc/hash_h1_canopy.txt | 1 + zcash_local_net/tests/zebra_rpc_golden.rs | 42 +- zcash_local_net/tests/zebra_rpc_oracle.rs | 186 - 6 files changed, 893 insertions(+), 5039 deletions(-) create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/block_h1_canopy.hex create mode 100644 zcash_local_net/tests/fixtures/zebra_rpc/hash_h1_canopy.txt delete mode 100644 zcash_local_net/tests/zebra_rpc_oracle.rs diff --git a/Cargo.lock b/Cargo.lock index b4889e3..ac9a5ef 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.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" - [[package]] name = "assert_cmd" version = "2.2.1" @@ -145,102 +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-polyfill" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2bce30dfe09ef0bfaef228b9d414faaf7e563035494d7fe092dba54b300f4" -dependencies = [ - "critical-section", -] - [[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.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" - -[[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 = "base16ct" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" - [[package]] name = "base64" version = "0.22.1" @@ -253,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 1.3.0", - "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.3", - "shlex 1.3.0", - "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.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ddcec3d12c579d40898fe0a9a358a803c23e9c52ca3c425707f81c9436211837" -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" @@ -416,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" @@ -475,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.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e228eec9be7c17ccb640b59b36a5cd805ea2a564a4c5e162c2f659fea30d3b96" -dependencies = [ - "find-msvc-tools", - "jobserver", - "libc", - "shlex 2.0.1", -] - -[[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" @@ -545,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.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" -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" @@ -634,7 +195,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -644,30 +205,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8d4a3bb8b1e0c1050499d1815f5ab16d04f0959b233085fb31653fbfc9d98f9" [[package]] -name = "cobs" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa961b519f0b462e3a3b4a34b64d119eeaca1d59af726fe450bbba07a9fc0a1" -dependencies = [ - "thiserror 2.0.18", -] - -[[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" +name = "colorchoice" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" @@ -679,4435 +218,1427 @@ checksum = "d64e8af5551369d19cf50138de61f1c42074ab970f74e99be916646777f8fc87" dependencies = [ "encode_unicode", "libc", - "windows-sys 0.61.2", + "windows-sys", ] [[package]] -name = "const-crc32-nostd" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808ac43170e95b11dd23d78aa9eaac5bea45776a602955552c4e833f3f0f823d" - -[[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" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] [[package]] -name = "const_format" -version = "0.2.36" +name = "crypto-common" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4481a617ad9a412be3b97c5d403fef8ed023103368908b9c50af598ff467cc1e" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" dependencies = [ - "const_format_proc_macros", - "konst", + "generic-array", + "typenum", ] [[package]] -name = "const_format_proc_macros" -version = "0.2.34" +name = "difflib" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d57c2eccfb16dbac1f4e61e206105db5820c9d26c3c472bc17c774259ef7744" -dependencies = [ - "proc-macro2", - "quote", - "unicode-xid", -] +checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" [[package]] -name = "constant_time_eq" -version = "0.4.2" +name = "digest" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d52eff69cd5e647efe296129160853a42795992097e8af39800e1060caeea9b" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", + "subtle", +] [[package]] -name = "convert_case" -version = "0.8.0" +name = "displaydoc" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baaaa0ecca5b51987b9423ccdc971514dd8b0bb7b4060b983d3664dad3f1f89f" +checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ - "unicode-segmentation", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "core-foundation-sys" -version = "0.8.7" +name = "encode_unicode" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] -name = "corez" -version = "0.1.1" +name = "equivalent" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4df6f98652d30167eaeea34d77b730e07c8caba6df17bd4551842b9b8da01deb" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] -name = "cpufeatures" -version = "0.2.17" +name = "errno" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", + "windows-sys", ] [[package]] -name = "critical-section" -version = "1.2.0" +name = "fastrand" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b" +checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" [[package]] -name = "crossbeam-channel" -version = "0.5.15" +name = "foldhash" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" -dependencies = [ - "crossbeam-utils", -] +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] -name = "crossbeam-deque" -version = "0.8.6" +name = "form_urlencoded" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ - "crossbeam-epoch", - "crossbeam-utils", + "percent-encoding", ] [[package]] -name = "crossbeam-epoch" -version = "0.9.18" +name = "futures-channel" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" dependencies = [ - "crossbeam-utils", + "futures-core", ] [[package]] -name = "crossbeam-utils" -version = "0.8.21" +name = "futures-core" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" +checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" [[package]] -name = "crunchy" -version = "0.2.4" +name = "futures-task" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" +checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" [[package]] -name = "crypto-common" -version = "0.1.7" +name = "futures-util" +version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" dependencies = [ - "generic-array", - "typenum", + "futures-core", + "futures-task", + "pin-project-lite", + "slab", ] [[package]] -name = "crypto-common" -version = "0.2.0-rc.1" +name = "generic-array" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0b8ce8218c97789f16356e7896b3714f26c2ee1079b79c0b7ae7064bb9089fa" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" dependencies = [ - "hybrid-array", + "typenum", + "version_check", ] [[package]] -name = "curve25519-dalek" -version = "4.1.3" +name = "getrandom" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97fb8b7c4503de7d6ae7b42ab72a5a59857b4c937ec27a3d4539dba95b5ab2be" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" dependencies = [ "cfg-if", - "cpufeatures", - "curve25519-dalek-derive", - "digest 0.10.7", - "fiat-crypto", - "rustc_version", - "serde", - "subtle", - "zeroize", -] - -[[package]] -name = "curve25519-dalek-derive" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "libc", + "wasi", ] [[package]] -name = "darling" -version = "0.23.0" +name = "getrandom" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25ae13da2f202d56bd7f91c25fba009e7717a1e4a1cc98a76d844b65ae912e9d" +checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" dependencies = [ - "darling_core", - "darling_macro", + "cfg-if", + "libc", + "r-efi", + "wasip2", + "wasip3", ] [[package]] -name = "darling_core" -version = "0.23.0" +name = "getset" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9865a50f7c335f53564bb694ef660825eb8610e0a53d3e11bf1b0d3df31e03b0" +checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" dependencies = [ - "ident_case", + "proc-macro-error2", "proc-macro2", "quote", - "strsim", - "syn 2.0.117", + "syn", ] [[package]] -name = "darling_macro" -version = "0.23.0" +name = "hashbrown" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3984ec7bd6cfa798e62b4a642426a5be0e68f9401cfc2a01e3fa9ea2fcdb8d" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "darling_core", - "quote", - "syn 2.0.117", + "foldhash", ] [[package]] -name = "der" -version = "0.7.10" +name = "hashbrown" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb" -dependencies = [ - "const-oid", - "pem-rfc7468", - "zeroize", -] +checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" [[package]] -name = "deranged" -version = "0.5.8" +name = "heck" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd812cc2bc1d69d4764bd80df88b4317eaef9e773c75226407d9bc0876b211c" -dependencies = [ - "serde_core", -] +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" [[package]] -name = "derive-getters" -version = "0.5.0" +name = "hex" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74ef43543e701c01ad77d3a5922755c6a1d71b22d942cb8042be4994b380caff" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] -name = "derive-new" -version = "0.5.9" +name = "hmac" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", + "digest", ] [[package]] -name = "difflib" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8" - -[[package]] -name = "digest" -version = "0.10.7" +name = "http" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +checksum = "e3ba2a386d7f85a81f119ad7498ebe444d2e22c2af0b86b069416ace48b3311a" dependencies = [ - "block-buffer 0.10.4", - "crypto-common 0.1.7", - "subtle", + "bytes", + "itoa", ] [[package]] -name = "digest" -version = "0.11.0-pre.9" +name = "http-body" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf2e3d6615d99707295a9673e889bf363a04b2a466bd320c65a72536f7577379" +checksum = "1efedce1fb8e6913f23e0c92de8e62cd5b772a67e7b3946df930a62566c93184" dependencies = [ - "block-buffer 0.11.0-rc.3", - "crypto-common 0.2.0-rc.1", - "subtle", + "bytes", + "http", ] [[package]] -name = "dirs" -version = "6.0.0" +name = "http-body-util" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +checksum = "b021d93e26becf5dc7e1b75b1bed1fd93124b374ceb73f43d4d4eafec896a64a" dependencies = [ - "dirs-sys", + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", ] [[package]] -name = "dirs-sys" -version = "0.5.0" +name = "httparse" +version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" -dependencies = [ - "libc", - "option-ext", - "redox_users", - "windows-sys 0.61.2", -] +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" [[package]] -name = "displaydoc" -version = "0.2.5" +name = "hyper" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" +checksum = "6299f016b246a94207e63da54dbe807655bf9e00044f73ded42c3ac5305fbcca" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", ] [[package]] -name = "document-features" -version = "0.2.12" +name = "hyper-util" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" +checksum = "96547c2556ec9d12fb1578c4eaf448b04993e7fb79cbaad930a656880a6bdfa0" dependencies = [ - "litrs", + "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" -version = "0.9.2" +name = "icu_collections" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed6b3e31251e87acd1b74911aed84071c8364fc9087972748ade2f1094ccce34" +checksum = "2984d1cd16c883d7935b9e07e44071dca8d917fd52ecc02c04d5fa0b5a3f191c" dependencies = [ - "documented-macros", - "phf", - "thiserror 2.0.18", + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", ] [[package]] -name = "documented-macros" -version = "0.9.2" +name = "icu_locale_core" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1149cf7462e5e79e17a3c05fd5b1f9055092bbfa95e04c319395c3beacc9370f" +checksum = "92219b62b3e2b4d88ac5119f8904c10f8f61bf7e95b640d25ba3075e6cac2c29" dependencies = [ - "convert_case", - "itertools 0.14.0", - "optfield", - "proc-macro2", - "quote", - "strum", - "syn 2.0.117", + "displaydoc", + "litemap", + "tinystr", + "writeable", + "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_normalizer" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53" +checksum = "c56e5ee99d6e3d33bd91c5d85458b6005a22140021cc324cea84dd0e72cff3b4" dependencies = [ - "pkcs8", - "serde", - "signature", + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", ] [[package]] -name = "ed25519-zebra" -version = "4.2.0" +name = "icu_normalizer_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "775765289f7c6336c18d3d66127527820dd45ffd9eb3b6b8ee4708590e6c20f5" -dependencies = [ - "curve25519-dalek", - "ed25519", - "hashbrown 0.16.1", - "pkcs8", - "rand_core 0.6.4", - "serde", - "sha2 0.10.9", - "subtle", - "zeroize", -] +checksum = "da3be0ae77ea334f4da67c12f149704f19f81d1adf7c51cf482943e84a2bad38" [[package]] -name = "either" -version = "1.16.0" +name = "icu_properties" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91622ff5e7162018101f2fea40d6ebf4a78bbe5a49736a2020649edf9693679e" +checksum = "bee3b67d0ea5c2cca5003417989af8996f8604e34fb9ddf96208a033901e70de" +dependencies = [ + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] [[package]] -name = "embedded-io" -version = "0.4.0" +name = "icu_properties_data" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef1a6892d9eef45c8fa6b9e0086428a2cca8491aca8f787c534a3d6d0bcb3ced" +checksum = "8e2bbb201e0c04f7b4b3e14382af113e17ba4f63e2c9d2ee626b720cbce54a14" [[package]] -name = "embedded-io" -version = "0.6.1" +name = "icu_provider" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd0f118536f44f5ccd48bcb8b111bdc3de888b58c74639dfb034a357d0f206d" +checksum = "139c4cf31c8b5f33d7e199446eff9c1e02decfc2f0eec2c8d71f65befa45b421" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] [[package]] -name = "encode_unicode" -version = "1.0.0" +name = "id-arena" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" +checksum = "3d3067d79b975e8844ca9eb072e16b31c3c1c36928edf9c6789548c524d0d954" [[package]] -name = "env_logger" -version = "0.7.1" +name = "idna" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44533bbbb3bb3c1fa17d9f2e4e38bbbaf8396ba82193c4cb1b6445d711445d36" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ - "log", - "regex", + "idna_adapter", + "smallvec", + "utf8_iter", ] [[package]] -name = "equihash" -version = "0.3.0" +name = "idna_adapter" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "306286e8dcc39ab3dfceb74c792ce8baffdab90591321d3ffaae64829734c37f" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" dependencies = [ - "blake2b_simd", - "corez", - "document-features", + "icu_normalizer", + "icu_properties", ] [[package]] -name = "equivalent" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" - -[[package]] -name = "errno" -version = "0.3.14" +name = "indexmap" +version = "2.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +checksum = "d466e9454f08e4a911e14806c24e16fba1b4c121d1ea474396f396069cf949d9" dependencies = [ - "libc", - "windows-sys 0.61.2", + "equivalent", + "hashbrown 0.17.0", + "serde", + "serde_core", ] [[package]] -name = "eyre" -version = "0.6.12" +name = "insta" +version = "1.47.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec" +checksum = "7b4a6248eb93a4401ed2f37dfe8ea592d3cf05b7cf4f8efa867b6895af7e094e" dependencies = [ - "indenter", + "console", "once_cell", + "similar", + "tempfile", ] [[package]] -name = "f4jumble" -version = "0.1.1" +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 = "0d42773cb15447644d170be20231a3268600e0c4cea8987d013b93ac973d3cf7" +checksum = "25e659a4bb38e810ebc252e53b5814ff908a8c58c2a9ce2fae1bbec24cbf4e20" dependencies = [ - "blake2b_simd", + "memchr", + "serde", ] [[package]] -name = "fastrand" -version = "2.4.1" +name = "is_terminal_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f1f227452a390804cdb637b74a86990f2a7d7ba4b7d5693aac9b4dd6defd8d6" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] -name = "ff" -version = "0.13.1" +name = "js-sys" +version = "0.3.97" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0b50bfb653653f9ca9095b427bed08ab8d75a137839d9ad64eb11810d5b6393" +checksum = "a1840c94c045fbcf8ba2812c95db44499f7c64910a912551aaaa541decebcacf" dependencies = [ - "bitvec", - "rand_core 0.6.4", - "subtle", + "cfg-if", + "futures-util", + "once_cell", + "wasm-bindgen", ] [[package]] -name = "fiat-crypto" -version = "0.2.9" +name = "json" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "078e285eafdfb6c4b434e0d31e8cfcb5115b651496faca5749b88fafd4f23bfd" + +[[package]] +name = "lazy_static" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] -name = "find-msvc-tools" -version = "0.1.9" +name = "leb128fmt" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5baebc0774151f905a1a2cc41989300b1e6fbb29aff0ceffa1064fdd3088d582" +checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2" [[package]] -name = "fixed-hash" -version = "0.8.0" +name = "libc" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" -dependencies = [ - "byteorder", - "rand 0.8.6", - "rustc-hex", - "static_assertions", -] +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] -name = "fixedbitset" -version = "0.5.7" +name = "linux-raw-sys" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" [[package]] -name = "fnv" -version = "1.0.7" +name = "litemap" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +checksum = "92daf443525c4cce67b150400bc2316076100ce0b3686209eb8cf3c31612e6f0" [[package]] -name = "foldhash" -version = "0.1.5" +name = "log" +version = "0.4.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" [[package]] -name = "foldhash" -version = "0.2.0" +name = "memchr" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" [[package]] -name = "form_urlencoded" -version = "1.2.2" +name = "mio" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +checksum = "50b7e5b27aa02a74bac8c3f23f448f8d87ff11f92d3aac1a6ed369ee08cc56c1" dependencies = [ - "percent-encoding", + "libc", + "wasi", + "windows-sys", ] [[package]] -name = "fpe" -version = "0.6.1" +name = "nix" +version = "0.30.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26c4b37de5ae15812a764c958297cfc50f5c010438f60c6ce75d11b802abd404" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" dependencies = [ - "cbc", - "cipher", - "libm", - "num-bigint", - "num-integer", - "num-traits", + "bitflags", + "cfg-if", + "cfg_aliases", + "libc", ] [[package]] -name = "frost-core" -version = "3.0.0" +name = "nu-ansi-term" +version = "0.50.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ef2787af391c7e8bedc037a3b9ea03dde803fbd93e778e6bb369547800e5cd" +checksum = "7957b9740744892f114936ab4a57b3f487491bbeafaf8083688b16841a4240e5" dependencies = [ - "byteorder", - "const-crc32-nostd", - "derive-getters", - "document-features", - "hex", - "itertools 0.14.0", - "postcard", - "rand_core 0.6.4", - "serde", - "serdect", - "thiserror 2.0.18", - "visibility", - "zeroize", - "zeroize_derive", + "windows-sys", ] [[package]] -name = "frost-rerandomized" -version = "3.0.0" +name = "once_cell" +version = "1.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4c5cedd2426728adef2c0b1720f57676354c473836d1ccc50d0f0d1c91942b" -dependencies = [ - "derive-getters", - "document-features", - "frost-core", - "hex", - "rand_core 0.6.4", -] +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" [[package]] -name = "funty" -version = "2.0.0" +name = "once_cell_polyfill" +version = "1.70.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" [[package]] -name = "futures" -version = "0.3.32" +name = "owo-colors" +version = "4.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d211803b9b6b570f68772237e415a029d5a50c65d382910b879fb19d3271f94d" + +[[package]] +name = "password-hash" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b147ee9d1f6d097cef9ce628cd2ee62288d963e16fb287bd9286455b241382d" +checksum = "346f04948ba92c43e8469c1ee6736c7563d71012b17d40745260fe106aac2166" dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", + "base64ct", + "rand_core", + "subtle", ] [[package]] -name = "futures-channel" -version = "0.3.32" +name = "pbkdf2" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07bbe89c50d7a535e539b8c17bc0b49bdb77747034daa8087407d655f3f7cc1d" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" dependencies = [ - "futures-core", - "futures-sink", + "digest", + "password-hash", ] [[package]] -name = "futures-core" -version = "0.3.32" +name = "percent-encoding" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e3450815272ef58cec6d564423f6e755e25379b217b0bc688e295ba24df6b1d" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] -name = "futures-executor" -version = "0.3.32" +name = "pin-project-lite" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf29c38818342a3b26b5b923639e7b1f4a61fc5e76102d4b1981c6dc7a7579d" -dependencies = [ - "futures-core", - "futures-task", - "futures-util", -] +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" [[package]] -name = "futures-io" -version = "0.3.32" +name = "potential_utf" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "zerovec", +] [[package]] -name = "futures-macro" -version = "0.3.32" +name = "ppv-lite86" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e835b70203e41293343137df5c0664546da5745f82ec9b84d40be8336958447b" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "zerocopy", ] [[package]] -name = "futures-sink" -version = "0.3.32" +name = "predicates" +version = "3.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c39754e157331b013978ec91992bde1ac089843443c49cbc7f46150b0fad0893" +checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" +dependencies = [ + "anstyle", + "difflib", + "predicates-core", +] [[package]] -name = "futures-task" -version = "0.3.32" +name = "predicates-core" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711b3d59c33004d3856fbdc83b99d4ff37a24768fa1be9ce3538a1cde4393" +checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" [[package]] -name = "futures-util" -version = "0.3.32" +name = "predicates-tree" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "389ca41296e6190b48053de0321d02a77f32f8a5d2461dd38762c0593805c6d6" +checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" dependencies = [ - "futures-channel", - "futures-core", - "futures-io", - "futures-macro", - "futures-sink", - "futures-task", - "memchr", - "pin-project-lite", - "slab", + "predicates-core", + "termtree", ] [[package]] -name = "generic-array" -version = "0.14.7" +name = "prettyplease" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ - "typenum", - "version_check", + "proc-macro2", + "syn", ] [[package]] -name = "getrandom" -version = "0.1.16" +name = "proc-macro-error-attr2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" dependencies = [ - "cfg-if", - "libc", - "wasi 0.9.0+wasi-snapshot-preview1", + "proc-macro2", + "quote", ] [[package]] -name = "getrandom" -version = "0.2.17" +name = "proc-macro-error2" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "wasi 0.11.1+wasi-snapshot-preview1", - "wasm-bindgen", + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "getrandom" -version = "0.3.4" +name = "proc-macro2" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" dependencies = [ - "cfg-if", - "js-sys", - "libc", - "r-efi 5.3.0", - "wasip2", - "wasm-bindgen", + "unicode-ident", ] [[package]] -name = "getrandom" -version = "0.4.2" +name = "quote" +version = "1.0.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555" +checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" dependencies = [ - "cfg-if", - "libc", - "r-efi 6.0.0", - "wasip2", - "wasip3", + "proc-macro2", ] [[package]] -name = "getset" -version = "0.1.6" +name = "r-efi" +version = "6.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf0fc11e47561d47397154977bc219f4cf809b2974facc3ccb3b89e2436f912" -dependencies = [ - "proc-macro-error2", - "proc-macro2", - "quote", - "syn 2.0.117", -] +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" [[package]] -name = "gimli" -version = "0.32.3" +name = "rand" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] [[package]] -name = "glob" -version = "0.3.3" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] [[package]] -name = "group" -version = "0.13.0" +name = "rand_core" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "ff", - "memuse", - "rand_core 0.6.4", - "subtle", + "getrandom 0.2.17", ] [[package]] -name = "h2" -version = "0.4.15" +name = "regex" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cb093c84e8bd9b188d4c4a8cb6579fc016968d14c99882163cd3ff402a4f155" +checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" dependencies = [ - "atomic-waker", - "bytes", - "fnv", - "futures-core", - "futures-sink", - "http", - "indexmap 2.14.0", - "slab", - "tokio", - "tokio-util", - "tracing", + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", ] [[package]] -name = "halo2_gadgets" -version = "0.5.0" +name = "regex-automata" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb2a697cad929f706b7987fe804ad57d43622cd37463ba7e4d662a926fdcfea3" +checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" dependencies = [ - "arrayvec", - "bitvec", - "ff", - "group", - "halo2_poseidon", - "halo2_proofs", - "lazy_static", - "pasta_curves", - "rand 0.8.6", - "sinsemilla", - "subtle", - "uint 0.9.5", + "aho-corasick", + "memchr", + "regex-syntax", ] [[package]] -name = "halo2_legacy_pdqsort" -version = "0.1.0" +name = "regex-syntax" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47716fe1ae67969c5e0b2ef826f32db8c3be72be325e1aa3c1951d06b5575ec5" +checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" [[package]] -name = "halo2_poseidon" +name = "regtest-launcher" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fa3da60b81f02f9b33ebc6252d766f843291fb4d2247a07ae73d20b791fc56f" dependencies = [ - "bitvec", - "ff", - "group", - "pasta_curves", + "anyhow", + "assert_cmd", + "clap", + "hex", + "insta", + "nix", + "owo-colors", + "regex", + "tokio", + "zcash_local_net", + "zingo_test_vectors", ] [[package]] -name = "halo2_proofs" -version = "0.3.2" +name = "reqwest" +version = "0.12.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05713f117155643ce10975e0bee44a274bcda2f4bb5ef29a999ad67c1fa8d4d3" +checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" dependencies = [ - "blake2b_simd", - "ff", - "group", - "halo2_legacy_pdqsort", - "indexmap 1.9.3", - "maybe-rayon", - "pasta_curves", - "rand_core 0.6.4", - "tracing", + "base64", + "bytes", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-util", + "js-sys", + "log", + "percent-encoding", + "pin-project-lite", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", ] [[package]] -name = "hash32" -version = "0.2.1" +name = "rustix" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c35f58762feb77d74ebe43bdbc3210f09be9fe6742234d573bacc26ed92b67" +checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" dependencies = [ - "byteorder", + "bitflags", + "errno", + "libc", + "linux-raw-sys", + "windows-sys", ] [[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" +name = "rustversion" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" -dependencies = [ - "foldhash 0.1.5", -] +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] -name = "hashbrown" -version = "0.16.1" +name = "ryu" +version = "1.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" -dependencies = [ - "allocator-api2", - "equivalent", - "foldhash 0.2.0", -] +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" [[package]] -name = "hashbrown" -version = "0.17.0" +name = "semver" +version = "1.0.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" [[package]] -name = "heapless" -version = "0.7.17" +name = "serde" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdc6457c0eb62c71aac4bc17216026d8410337c4126773b9c5daba343f17964f" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ - "atomic-polyfill", - "hash32", - "rustc_version", - "serde", - "spin", - "stable_deref_trait", + "serde_core", + "serde_derive", ] [[package]] -name = "heck" -version = "0.5.0" +name = "serde_core" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", +] [[package]] -name = "hermit-abi" -version = "0.5.2" +name = "serde_derive" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] [[package]] -name = "hex" -version = "0.4.3" +name = "serde_json" +version = "1.0.149" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" dependencies = [ + "itoa", + "memchr", "serde", + "serde_core", + "zmij", ] [[package]] -name = "hex-literal" -version = "0.4.1" +name = "serde_urlencoded" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] [[package]] -name = "hmac" -version = "0.12.1" +name = "sha2" +version = "0.10.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" dependencies = [ - "digest 0.10.7", + "cfg-if", + "cpufeatures", + "digest", ] [[package]] -name = "hmac" -version = "0.13.0-pre.4" +name = "sharded-slab" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4b1fb14e4df79f9406b434b60acef9f45c26c50062cccf1346c6103b8c47d58" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" dependencies = [ - "digest 0.11.0-pre.9", + "lazy_static", ] [[package]] -name = "home" -version = "0.5.12" +name = "signal-hook-registry" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ - "windows-sys 0.61.2", + "errno", + "libc", ] [[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.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15cdd26707701c53297e2fa6afb323d55fbc1d0810c3aec078ae3ef0424c3c15" - -[[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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72c4b1f204b655b36b24dc4939af20366c649431d4711863bbbae5c495f3eeb4" -dependencies = [ - "jsonrpsee-core", - "jsonrpsee-server", - "jsonrpsee-types", - "tokio", -] - -[[package]] -name = "jsonrpsee-core" -version = "0.24.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f49bfa9334963e1c85866b39dff3ffcc81f1c286eb23334267c5cb97677543a4" -dependencies = [ - "async-trait", - "bytes", - "futures-util", - "http", - "http-body", - "http-body-util", - "jsonrpsee-types", - "parking_lot", - "rand 0.8.6", - "rustc-hash 2.1.3", - "serde", - "serde_json", - "thiserror 1.0.69", - "tokio", - "tracing", -] - -[[package]] -name = "jsonrpsee-proc-macros" -version = "0.24.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5248249c016692f1465a753057ae8347681995dd490c2cb65c48b14b46215a8" -dependencies = [ - "heck", - "proc-macro-crate", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "jsonrpsee-server" -version = "0.24.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c625c78b8d545478370b6e7a2a191b0d921f831a9eef38dc1e7efb57e7a5472f" -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.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d86fc943f81dab0ecdd6c0240b6e0f55ad57a2ea9ad8ad7efe8456fb9cc7a4" -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.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c943259e342f1e06ff2da7a83eabdfe7f92ce10262688dbf1895ff0b3e6e4652" -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.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85bc9657773828b90eeb625adff10eeac83cc21bbfd8e23a03eaa8a33c9e28d9" -dependencies = [ - "cc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "libzcash_script" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8ce05b56f3cbc65ec7d0908adb308ed91281e022f61c8c3a0c9388b5380b17" -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.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c863e9ab5e7bf9c99ba75e1050f1e4d624ae87ed3532d6238ffbdc7b585dbbe6" -dependencies = [ - "num-integer", - "num-traits", -] - -[[package]] -name = "num-conv" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "521739c6d2bac4aa25192232afe6841231376b2b26d4d9fae5ecf8ca5772e441" - -[[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.15.0-pre.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8e277dd4b46f5d06deae3ffb8af1a951e8622368f028c2a4d6fe59339566403" -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.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.1.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" -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 = "postcard" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6764c3b5dd454e283a30e6dfe78e9b31096d9e32036b5d1eaac7a6119ccb9a24" -dependencies = [ - "cobs", - "embedded-io 0.4.0", - "embedded-io 0.6.1", - "heapless", - "serde", -] - -[[package]] -name = "potential_utf" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" -dependencies = [ - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy", -] - -[[package]] -name = "predicates" -version = "3.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ada8f2932f28a27ee7b70dd6c1c39ea0675c55a36879ab92f3a715eaa1e63cfe" -dependencies = [ - "anstyle", - "difflib", - "predicates-core", -] - -[[package]] -name = "predicates-core" -version = "1.0.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cad38746f3166b4031b1a0d39ad9f954dd291e7854fcc0eed52ee41a0b50d144" - -[[package]] -name = "predicates-tree" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0de1b847b39c8131db0467e9df1ff60e6d0562ab8e9a16e568ad0fdb372e2f2" -dependencies = [ - "predicates-core", - "termtree", -] - -[[package]] -name = "prettyplease" -version = "0.2.37" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" -dependencies = [ - "proc-macro2", - "syn 2.0.117", -] - -[[package]] -name = "primitive-types" -version = "0.12.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" -dependencies = [ - "fixed-hash", - "impl-codec", - "uint 0.9.5", -] - -[[package]] -name = "proc-macro-crate" -version = "3.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" -dependencies = [ - "toml_edit", -] - -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "proc-macro2" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fd00f0bb2e90d81d1044c2b32617f68fcb9fa3bb7640c23e9c748e53fb30934" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "prost" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528ac67416ff8646872a3c02cad9cc4ee5dc9f9540c9b10771855c95cb2e5ae1" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" -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", -] - -[[package]] -name = "prost-derive" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" -dependencies = [ - "anyhow", - "itertools 0.14.0", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "prost-types" -version = "0.14.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f94967dc7688f3054c7fac87473ffae4cc4c3904800e2d9f5b857246d8963b0a" -dependencies = [ - "prost", -] - -[[package]] -name = "pulldown-cmark" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9f068eba8e7071c5f9511831b44f32c740d5adf574e990f946ddb53db2f314e" -dependencies = [ - "bitflags", - "memchr", - "unicase", -] - -[[package]] -name = "pulldown-cmark-to-cmark" -version = "22.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50793def1b900256624a709439404384204a5dc3a6ec580281bfaac35e882e90" -dependencies = [ - "pulldown-cmark", -] - -[[package]] -name = "quickcheck" -version = "0.9.2" -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", -] - -[[package]] -name = "quickcheck_macros" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608c156fd8e97febc07dc9c2e2c80bf74cfc6ef26893eae3daf8bc2bc94a4b7f" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "quinn" -version = "0.11.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c1a41e437b6bbd489372cd4971de128e85c855f56c57f283d20ff016cf7c0a8" -dependencies = [ - "bytes", - "cfg_aliases", - "pin-project-lite", - "quinn-proto", - "quinn-udp", - "rustc-hash 2.1.3", - "rustls", - "socket2", - "thiserror 2.0.18", - "tokio", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-proto" -version = "0.11.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fcb935c5bec503c2f0e306bdd3e58bb9029dcb14fa8d9ac76e3a5256ac0763e" -dependencies = [ - "bytes", - "getrandom 0.3.4", - "lru-slab", - "rand 0.9.4", - "ring", - "rustc-hash 2.1.3", - "rustls", - "rustls-pki-types", - "slab", - "thiserror 2.0.18", - "tinyvec", - "tracing", - "web-time", -] - -[[package]] -name = "quinn-udp" -version = "0.5.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" -dependencies = [ - "cfg_aliases", - "libc", - "once_cell", - "socket2", - "tracing", - "windows-sys 0.60.2", -] - -[[package]] -name = "quote" -version = "1.0.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41f2619966050689382d2b44f664f4bc593e129785a36d6ee376ddf37259b924" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" - -[[package]] -name = "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" -dependencies = [ - "getrandom 0.1.16", - "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc", -] - -[[package]] -name = "rand" -version = "0.8.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca0ecfa931c29007047d1bc58e623ab12e5590e8c7cc53200d5202b69266d8a" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.4", -] - -[[package]] -name = "rand" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea" -dependencies = [ - "rand_chacha 0.9.0", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_chacha" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" -dependencies = [ - "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.4", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core 0.9.5", -] - -[[package]] -name = "rand_core" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" -dependencies = [ - "getrandom 0.1.16", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom 0.2.17", -] - -[[package]] -name = "rand_core" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" -dependencies = [ - "getrandom 0.3.4", -] - -[[package]] -name = "rand_hc" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" -dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rapidhash" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32b266a82f4aa99bb5c25e28d11cc44ace63d91adbcbcee4d323e2ae3d49ef37" -dependencies = [ - "rustversion", -] - -[[package]] -name = "rayon" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" -dependencies = [ - "crossbeam-deque", - "crossbeam-utils", -] - -[[package]] -name = "reddsa" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4784b85c8bfd17b36b86e664e6e504ecdb586001086ee23749e4a633bbb84832" -dependencies = [ - "blake2b_simd", - "byteorder", - "frost-rerandomized", - "group", - "hex", - "jubjub", - "pasta_curves", - "rand_core 0.6.4", - "serde", - "thiserror 2.0.18", - "zeroize", -] - -[[package]] -name = "redjubjub" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b0ac1bc6bb3696d2c6f52cff8fba57238b81da8c0214ee6cd146eb8fde364e" -dependencies = [ - "rand_core 0.6.4", - "reddsa", - "serde", - "thiserror 1.0.69", - "zeroize", -] - -[[package]] -name = "redox_syscall" -version = "0.5.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" -dependencies = [ - "bitflags", -] - -[[package]] -name = "redox_users" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" -dependencies = [ - "getrandom 0.2.17", - "libredox", - "thiserror 2.0.18", -] - -[[package]] -name = "ref-cast" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" -dependencies = [ - "ref-cast-impl", -] - -[[package]] -name = "ref-cast-impl" -version = "1.0.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "regex" -version = "1.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e10754a14b9137dd7b1e3e5b0493cc9171fdd105e0ab477f51b72e7f3ac0e276" -dependencies = [ - "aho-corasick", - "memchr", - "regex-automata", - "regex-syntax", -] - -[[package]] -name = "regex-automata" -version = "0.4.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e1dd4122fc1595e8162618945476892eefca7b88c52820e74af6262213cae8f" -dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", -] - -[[package]] -name = "regex-syntax" -version = "0.8.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc897dd8d9e8bd1ed8cdad82b5966c3e0ecae09fb1907d58efaa013543185d0a" - -[[package]] -name = "regtest-launcher" -version = "0.1.0" -dependencies = [ - "anyhow", - "assert_cmd", - "clap", - "hex", - "insta", - "nix", - "owo-colors", - "regex", - "tokio", - "zcash_local_net", - "zingo_test_vectors", -] - -[[package]] -name = "reqwest" -version = "0.12.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eddd3ca559203180a307f12d114c268abf583f59b03cb906fd0b3ff8646c1147" -dependencies = [ - "base64", - "bytes", - "futures-core", - "http", - "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-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.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" - -[[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]] -name = "rustix" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" -dependencies = [ - "bitflags", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.61.2", -] - -[[package]] -name = "rustls" -version = "0.23.41" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b92b125634d9b795e7beca796cc790df15a7fb38323bf3196fda83292d06b1f" -dependencies = [ - "once_cell", - "ring", - "rustls-pki-types", - "rustls-webpki", - "subtle", - "zeroize", -] - -[[package]] -name = "rustls-pki-types" -version = "1.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "764899a24af3980067ee14bc143654f297b22eaebfe3c7b6b211920a5a59b046" -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", -] - -[[package]] -name = "rustversion" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" - -[[package]] -name = "ryu" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" - -[[package]] -name = "serde" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" -dependencies = [ - "serde_core", - "serde_derive", -] - -[[package]] -name = "serde-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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.228" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serde_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", -] - -[[package]] -name = "serde_json" -version = "1.0.149" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83fc039473c5595ace860d8c4fafa220ff474b3fc6bfdb4293327f1a37e94d86" -dependencies = [ - "itoa", - "memchr", - "serde", - "serde_core", - "zmij", -] - -[[package]] -name = "serde_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.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76a5c54c7310e7b8b9577c286d7e399ddd876c3e12b3ed917a8aabc4b96e9e8c" -dependencies = [ - "base64", - "bs58", - "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.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "84d57bc0c8b9a17920c178daa6bb924850d54a9c97ab45194bb8c17ad66bb660" -dependencies = [ - "darling", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "serdect" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a84f14a19e9a014bb9f4512488d9829a68e04ecabffb0f9904cd1ace94598177" -dependencies = [ - "base16ct", - "serde", -] - -[[package]] -name = "sha1" -version = "0.10.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.10.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.10.7", -] - -[[package]] -name = "sha2" -version = "0.11.0-pre.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "540c0893cce56cdbcfebcec191ec8e0f470dd1889b6e7a0b503e310a94a168f5" -dependencies = [ - "cfg-if", - "cpufeatures", - "digest 0.11.0-pre.9", -] - -[[package]] -name = "sharded-slab" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "shlex" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" - -[[package]] -name = "shlex" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" - -[[package]] -name = "signal-hook-registry" -version = "1.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" -dependencies = [ - "errno", - "libc", -] - -[[package]] -name = "signature" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" -dependencies = [ - "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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" - -[[package]] -name = "smallvec" -version = "1.15.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" - -[[package]] -name = "socket2" -version = "0.6.3" -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" -dependencies = [ - "lock_api", -] - -[[package]] -name = "spki" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d" -dependencies = [ - "base64ct", - "der", -] - -[[package]] -name = "stable_deref_trait" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "sync_wrapper" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -dependencies = [ - "futures-core", -] - -[[package]] -name = "synstructure" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" -dependencies = [ - "fastrand", - "getrandom 0.4.2", - "once_cell", - "rustix", - "windows-sys 0.61.2", -] - -[[package]] -name = "termtree" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" - -[[package]] -name = "thiserror" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" -dependencies = [ - "thiserror-impl 1.0.69", -] - -[[package]] -name = "thiserror" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4288b5bcbc7920c07a1149a35cf9590a2aa808e0bc1eafaade0b80947865fbc4" -dependencies = [ - "thiserror-impl 2.0.18", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "thiserror-impl" -version = "2.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "thread_local" -version = "1.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" -dependencies = [ - "cfg-if", -] - -[[package]] -name = "time" -version = "0.3.53" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18dfaaeddcb932337b5e7866ee7d0ce9b76d2fd092997146f187ec09b4558a50" -dependencies = [ - "deranged", - "num-conv", - "powerfmt", - "serde_core", - "time-core", - "time-macros", -] - -[[package]] -name = "time-core" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1c906769ad99c88eaa54e728060edef082f8e358ff32030cb7c7d315e81109" - -[[package]] -name = "time-macros" -version = "0.2.31" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c431b87111666e491a90baa837f914fb45cd5dc3c268591b0220ff5057f2085f" -dependencies = [ - "num-conv", - "time-core", -] - -[[package]] -name = "tinystr" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" -dependencies = [ - "displaydoc", - "zerovec", -] - -[[package]] -name = "tinyvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.52.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" -dependencies = [ - "bytes", - "libc", - "mio", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "tracing", - "windows-sys 0.61.2", -] - -[[package]] -name = "tokio-macros" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -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.12+spec-1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2153edc6955a6c354fad8f5efd38b6a8769bdccf9fe50f8e1329f81b0baa5d7" -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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac2a5518c70fa84342385732db33fb3f44bc4cc748936eb5833d2df34d6445ef" -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.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f61875ac5293cf72e6c8cf0158086428c82c37229e98c840878f1706b0322" -dependencies = [ - "prettyplease", - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "tonic-prost" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50849f68853be452acf590cde0b146665b8d507b3b8af17261df47e02c209ea0" -dependencies = [ - "bytes", - "prost", - "tonic", -] - -[[package]] -name = "tonic-prost-build" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "654e5643eff75d7f8c99197ce1440ed19a3474eada74c12bbac488b2cafdae27" -dependencies = [ - "prettyplease", - "proc-macro2", - "prost-build", - "prost-types", - "quote", - "syn 2.0.117", - "tempfile", - "tonic-build", -] - -[[package]] -name = "tonic-reflection" -version = "0.14.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acccd136a4bf19810a1fde9c74edc6129b42a66b44d0c1c8aaa67aeb49a146a7" -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", -] - -[[package]] -name = "tower" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -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]] -name = "tower-http" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" -dependencies = [ - "bitflags", - "bytes", - "futures-util", - "http", - "http-body", - "iri-string", - "pin-project-lite", - "tower 0.5.3", - "tower-layer", - "tower-service", -] - -[[package]] -name = "tower-layer" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" - -[[package]] -name = "tower-service" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" - -[[package]] -name = "tracing" -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", -] - -[[package]] -name = "tracing-attributes" -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", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - -[[package]] -name = "tracing-log" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" -dependencies = [ - "log", - "once_cell", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.3.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" -dependencies = [ - "nu-ansi-term", - "sharded-slab", - "smallvec", - "thread_local", - "tracing-core", - "tracing-log", -] - -[[package]] -name = "try-lock" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" - -[[package]] -name = "typenum" -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" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" - -[[package]] -name = "unicode-normalization" -version = "0.1.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-segmentation" -version = "1.13.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" - -[[package]] -name = "unicode-xid" -version = "0.2.6" +name = "similar" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" +checksum = "bbbb5d9659141646ae647b42fe094daf6c6192d1620870b449d9557f748b2daa" [[package]] -name = "universal-hash" -version = "0.5.1" +name = "slab" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common 0.1.7", - "subtle", -] +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" [[package]] -name = "untrusted" -version = "0.9.0" +name = "smallvec" +version = "1.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" +checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] -name = "url" -version = "2.5.8" +name = "socket2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +checksum = "3a766e1110788c36f4fa1c2b71b387a7815aa65f88ce0229841826633d93723e" dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", + "libc", + "windows-sys", ] [[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - -[[package]] -name = "utf8parse" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" - -[[package]] -name = "valuable" -version = "0.1.1" +name = "stable_deref_trait" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] -name = "vcpkg" -version = "0.2.15" +name = "strsim" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" [[package]] -name = "version_check" -version = "0.9.5" +name = "subtle" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" [[package]] -name = "visibility" -version = "0.1.1" +name = "syn" +version = "2.0.117" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" +checksum = "e665b8803e7b1d2a727f4023456bbbbe74da67099c585258af0ad9c5013b9b99" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "unicode-ident", ] [[package]] -name = "wagyu-zcash-parameters" -version = "0.2.0" +name = "sync_wrapper" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61c904628658374e651288f000934c33ef738b2d8b3e65d4100b70b395dbe2bb" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" 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", + "futures-core", ] [[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" +name = "synstructure" +version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ - "libc", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "want" -version = "0.3.1" +name = "tempfile" +version = "3.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" dependencies = [ - "try-lock", + "fastrand", + "getrandom 0.4.2", + "once_cell", + "rustix", + "windows-sys", ] [[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" +name = "termtree" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +checksum = "8f50febec83f5ee1df3015341d8bd429f2d1cc62bcba7ea2076759d315084683" [[package]] -name = "wasip2" -version = "1.0.3+wasi-0.2.9" +name = "thiserror" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" dependencies = [ - "wit-bindgen 0.57.1", + "thiserror-impl", ] [[package]] -name = "wasip3" -version = "0.4.0+wasi-0.3.0-rc-2026-01-06" +name = "thiserror-impl" +version = "1.0.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ - "wit-bindgen 0.51.0", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "wasm-bindgen" -version = "0.2.120" +name = "thread_local" +version = "1.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" dependencies = [ "cfg-if", - "once_cell", - "rustversion", - "wasm-bindgen-macro", - "wasm-bindgen-shared", ] [[package]] -name = "wasm-bindgen-futures" -version = "0.4.70" +name = "tinystr" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" +checksum = "c8323304221c2a851516f22236c5722a72eaa19749016521d6dff0824447d96d" dependencies = [ - "js-sys", - "wasm-bindgen", + "displaydoc", + "zerovec", ] [[package]] -name = "wasm-bindgen-macro" -version = "0.2.120" +name = "tinyvec" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +checksum = "3e61e67053d25a4e82c844e8424039d9745781b3fc4f32b8d55ed50f5f667ef3" dependencies = [ - "quote", - "wasm-bindgen-macro-support", + "tinyvec_macros", ] [[package]] -name = "wasm-bindgen-macro-support" -version = "0.2.120" +name = "tinyvec_macros" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" -dependencies = [ - "bumpalo", - "proc-macro2", - "quote", - "syn 2.0.117", - "wasm-bindgen-shared", -] +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] -name = "wasm-bindgen-shared" -version = "0.2.120" +name = "tokio" +version = "1.52.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49757b3c82ebf16c57d69365a142940b384176c24df52a087fb748e2085359ea" +checksum = "110a78583f19d5cdb2c5ccf321d1290344e71313c6c37d43520d386027d18386" dependencies = [ - "unicode-ident", + "bytes", + "libc", + "mio", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys", ] [[package]] -name = "wasm-encoder" -version = "0.244.0" +name = "tokio-macros" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "990065f2fe63003fe337b932cfb5e3b80e0b4d0f5ff650e6985b1048f62c8319" +checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ - "leb128fmt", - "wasmparser", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "wasm-metadata" -version = "0.244.0" +name = "tower" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb0e353e6a2fbdc176932bbaab493762eb1255a7900fe0fea1a2f96c296cc909" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" dependencies = [ - "anyhow", - "indexmap 2.14.0", - "wasm-encoder", - "wasmparser", + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", ] [[package]] -name = "wasmparser" -version = "0.244.0" +name = "tower-http" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" +checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "bitflags", - "hashbrown 0.15.5", - "indexmap 2.14.0", - "semver", + "bytes", + "futures-util", + "http", + "http-body", + "iri-string", + "pin-project-lite", + "tower", + "tower-layer", + "tower-service", ] [[package]] -name = "web-sys" -version = "0.3.97" +name = "tower-layer" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eadbac71025cd7b0834f20d1fe8472e8495821b4e9801eb0a60bd1f19827602" -dependencies = [ - "js-sys", - "wasm-bindgen", -] +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" [[package]] -name = "web-time" -version = "1.1.0" +name = "tower-service" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" -dependencies = [ - "js-sys", - "wasm-bindgen", -] +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] -name = "webpki-roots" -version = "1.0.8" +name = "tracing" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf85cb06032201fa7c6f829d7db5a7e5aa45bcc0655327713065f6f0576731bf" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" dependencies = [ - "rustls-pki-types", + "pin-project-lite", + "tracing-attributes", + "tracing-core", ] [[package]] -name = "which" -version = "8.0.4" +name = "tracing-attributes" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48d7cd18d4acb58fb3cdfe9ea54e6cd96a4e7d4cc45c56338b236e82dad47248" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ - "libc", + "proc-macro2", + "quote", + "syn", ] [[package]] -name = "windows-core" -version = "0.62.2" +name = "tracing-core" +version = "0.1.36" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" dependencies = [ - "windows-implement", - "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "once_cell", + "valuable", ] [[package]] -name = "windows-implement" -version = "0.60.2" +name = "tracing-log" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "log", + "once_cell", + "tracing-core", ] [[package]] -name = "windows-interface" -version = "0.59.3" +name = "tracing-subscriber" +version = "0.3.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +checksum = "cb7f578e5945fb242538965c2d0b04418d38ec25c79d160cd279bf0731c8d319" dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", ] [[package]] -name = "windows-link" -version = "0.2.1" +name = "try-lock" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] -name = "windows-result" -version = "0.4.1" +name = "typenum" +version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" -dependencies = [ - "windows-link", -] +checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" [[package]] -name = "windows-strings" -version = "0.5.1" +name = "unicode-ident" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" -dependencies = [ - "windows-link", -] +checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] -name = "windows-sys" -version = "0.52.0" +name = "unicode-normalization" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +checksum = "5fd4f6878c9cb28d874b009da9e8d183b5abc80117c40bbd187a1fde336be6e8" dependencies = [ - "windows-targets 0.52.6", + "tinyvec", ] [[package]] -name = "windows-sys" -version = "0.60.2" +name = "unicode-xid" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" -dependencies = [ - "windows-targets 0.53.5", -] +checksum = "ebc1c04c71510c7f702b52b7c350734c9ff1295c464a03335b00bb84fc54f853" [[package]] -name = "windows-sys" -version = "0.61.2" +name = "url" +version = "2.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" dependencies = [ - "windows-link", + "form_urlencoded", + "idna", + "percent-encoding", + "serde", ] [[package]] -name = "windows-targets" -version = "0.52.6" +name = "utf8_iter" +version = "1.0.4" 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", -] +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" [[package]] -name = "windows-targets" -version = "0.53.5" +name = "utf8parse" +version = "0.2.2" 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", -] +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "valuable" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.52.6" +name = "version_check" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" [[package]] -name = "windows_aarch64_gnullvm" -version = "0.53.1" +name = "wait-timeout" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" +checksum = "09ac3b126d3914f9849036f826e054cbabdc8519970b8998ddaf3b5bd3c65f11" +dependencies = [ + "libc", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.52.6" +name = "want" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] [[package]] -name = "windows_aarch64_msvc" -version = "0.53.1" +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] -name = "windows_i686_gnu" -version = "0.52.6" +name = "wasip2" +version = "1.0.3+wasi-0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" +checksum = "20064672db26d7cdc89c7798c48a0fdfac8213434a1186e5ef29fd560ae223d6" +dependencies = [ + "wit-bindgen 0.57.1", +] [[package]] -name = "windows_i686_gnu" -version = "0.53.1" +name = "wasip3" +version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" +checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" +dependencies = [ + "wit-bindgen 0.51.0", +] [[package]] -name = "windows_i686_gnullvm" -version = "0.52.6" +name = "wasm-bindgen" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" +checksum = "df52b6d9b87e0c74c9edfa1eb2d9bf85e5d63515474513aa50fa181b3c4f5db1" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] [[package]] -name = "windows_i686_gnullvm" -version = "0.53.1" +name = "wasm-bindgen-futures" +version = "0.4.70" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" +checksum = "af934872acec734c2d80e6617bbb5ff4f12b052dd8e6332b0817bce889516084" +dependencies = [ + "js-sys", + "wasm-bindgen", +] [[package]] -name = "windows_i686_msvc" -version = "0.52.6" +name = "wasm-bindgen-macro" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" +checksum = "78b1041f495fb322e64aca85f5756b2172e35cd459376e67f2a6c9dffcedb103" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] [[package]] -name = "windows_i686_msvc" -version = "0.53.1" +name = "wasm-bindgen-macro-support" +version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" +checksum = "9dcd0ff20416988a18ac686d4d4d0f6aae9ebf08a389ff5d29012b05af2a1b41" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "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.3" +name = "windows-sys" +version = "0.61.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" dependencies = [ - "memchr", + "windows-link", ] [[package]] @@ -5144,9 +1675,9 @@ checksum = "b7c566e0f4b284dd6561c786d9cb0142da491f46a9fbed79ea69cdad5db17f21" dependencies = [ "anyhow", "heck", - "indexmap 2.14.0", + "indexmap", "prettyplease", - "syn 2.0.117", + "syn", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -5162,7 +1693,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn 2.0.117", + "syn", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -5175,7 +1706,7 @@ checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", "bitflags", - "indexmap 2.14.0", + "indexmap", "log", "serde", "serde_derive", @@ -5194,7 +1725,7 @@ checksum = "ecc8ac4bc1dc3381b7f59c34f00b67e18f910c2c0f50015669dde7def656a736" dependencies = [ "anyhow", "id-arena", - "indexmap 2.14.0", + "indexmap", "log", "semver", "serde", @@ -5210,33 +1741,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" @@ -5256,74 +1760,10 @@ checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] -[[package]] -name = "zcash_address" -version = "0.13.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2918e73eff76388cda87695a6e7398f96a2e3383a0de7b77729a204ec00a0" -dependencies = [ - "bech32", - "bs58", - "corez", - "f4jumble", - "zcash_encoding", - "zcash_protocol", -] - -[[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.5.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e8634d011026cb181cb67b2a412e601dc344a2827b9c576fe3a727fdebf441" -dependencies = [ - "blake2b_simd", - "byteorder", - "primitive-types", -] - -[[package]] -name = "zcash_keys" -version = "0.15.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a0bac3a9e5b0d954684ba1f07386d55b5ae4588b3ba2d93cad05ee09f3e0947" -dependencies = [ - "bech32", - "blake2b_simd", - "bls12_381", - "bs58", - "corez", - "document-features", - "group", - "memuse", - "nonempty", - "orchard", - "rand_core 0.6.4", - "sapling-crypto", - "secrecy", - "subtle", - "tracing", - "zcash_address", - "zcash_encoding", - "zcash_protocol", - "zcash_transparent", - "zip32", -] - [[package]] name = "zcash_local_net" version = "0.6.0" @@ -5334,423 +1774,16 @@ dependencies = [ "reqwest", "serde", "serde_json", - "sha2 0.10.9", + "sha2", "tempfile", - "thiserror 1.0.69", + "thiserror", "tokio", "tracing", "tracing-subscriber", - "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.29.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba7bfe66975658f44dba87d535f9ebb9fb4c9c0c4fecca3f5c40cbe1583dece6" -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", - "rand_core 0.6.4", - "redjubjub", - "sapling-crypto", - "secp256k1", - "sha2 0.10.9", - "zcash_encoding", - "zcash_note_encryption", - "zcash_protocol", - "zcash_script", - "zcash_transparent", -] - -[[package]] -name = "zcash_proofs" -version = "0.29.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b39b90964ffe6bdc314368c7b849aaa6dcc2b495249a3bf1b9bfbdc92ba4e4f6" -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.10.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97f339a9801c7f70295732a5cf822346f194202cea6425fc2fc14a5af679b004" -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.9.0-pre.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e941230f67056aad41c8fa9b926f9cc4d9d1a321f32e95c39c0b0e38e85f79b" -dependencies = [ - "bip32", - "bs58", - "corez", - "document-features", - "getset", - "hex", - "nonempty", - "ripemd 0.1.3", - "secp256k1", - "sha2 0.10.9", - "subtle", - "zcash_address", - "zcash_encoding", - "zcash_protocol", - "zcash_script", - "zcash_spec", - "zip32", -] - -[[package]] -name = "zebra-chain" -version = "11.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "600a4c35ee81350384226f8178fab2b088e38d5e0a9f6cb0b1051caba30702d7" -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", - "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", - "zcash_encoding", - "zcash_history", - "zcash_note_encryption", - "zcash_primitives", - "zcash_protocol", - "zcash_script", - "zcash_transparent", -] - -[[package]] -name = "zebra-consensus" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0aa2b2678c4ce6d18172bad73a9b72b24a4b3a65af4c2a5e9120a1470c3fc402" -dependencies = [ - "bellman", - "blake2b_simd", - "bls12_381", - "chrono", - "derive-getters", - "futures", - "futures-util", - "halo2_proofs", - "jubjub", - "lazy_static", - "libzcash_script", - "metrics", - "mset", - "once_cell", - "orchard", - "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", - "zcash_script", - "zcash_transparent", - "zebra-chain", - "zebra-node-services", - "zebra-script", - "zebra-state", -] - -[[package]] -name = "zebra-network" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36b1e6ca4687bc8d128553ca04bb82cc38701c4dac7107f3e56717b39d4b18da" -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 = "9.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4446db9b576c0de14ff91c7fd7b38a59d340c1969a1604787185a52b8b7f53a6" -dependencies = [ - "color-eyre", - "jsonrpsee-types", - "reqwest", - "serde", - "serde_json", - "tokio", - "tower 0.4.13", - "zebra-chain", -] - -[[package]] -name = "zebra-rpc" -version = "11.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb180542f1ffc0f66c20e1cd66c7741662053ccda588e3847a8ed2df8c83dae7" -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", - "phf", - "prost", - "rand 0.8.6", - "sapling-crypto", - "schemars 1.2.1", - "semver", - "serde", - "serde_json", - "serde_with", - "strum", - "strum_macros", - "subtle", - "thiserror 2.0.18", - "tokio", - "tokio-stream", - "tonic", - "tonic-prost", - "tonic-prost-build", - "tonic-reflection", - "tower 0.4.13", - "tracing", - "which", - "zcash_address", - "zcash_keys", - "zcash_primitives", - "zcash_proofs", - "zcash_protocol", - "zcash_script", - "zcash_transparent", - "zebra-chain", - "zebra-consensus", - "zebra-network", - "zebra-node-services", - "zebra-script", - "zebra-state", -] - -[[package]] -name = "zebra-script" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8648c201e3dadb1c95022eb7605d528de4bf94b6c0cebf76537805849aee76c5" -dependencies = [ - "libzcash_script", - "rand 0.8.6", - "thiserror 2.0.18", - "zcash_primitives", - "zcash_script", - "zebra-chain", -] - -[[package]] -name = "zebra-state" -version = "10.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b95b81181253a46885e3254cc5a20e4d82b5258116c9e43db5c8e9660c6b973" -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", - "serde-big-array", - "tempfile", - "thiserror 2.0.18", - "tokio", - "tower 0.4.13", - "tracing", - "zebra-chain", - "zebra-node-services", -] - [[package]] name = "zerocopy" version = "0.8.48" @@ -5768,7 +1801,7 @@ checksum = "70e3cd084b1788766f53af483dd21f93881ff30d7320490ec3ef7526d203bad4" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5788,7 +1821,7 @@ checksum = "11532158c46691caf0f2593ea8358fed6bbf68a0315e80aae9bd41fbade684a1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", "synstructure", ] @@ -5797,20 +1830,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.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] [[package]] name = "zerotrie" @@ -5842,7 +1861,7 @@ checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" dependencies = [ "proc-macro2", "quote", - "syn 2.0.117", + "syn", ] [[package]] @@ -5856,19 +1875,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/zcash_local_net/src/zebra_rpc.rs b/zcash_local_net/src/zebra_rpc.rs index 97a7fb7..a776fd0 100644 --- a/zcash_local_net/src/zebra_rpc.rs +++ b/zcash_local_net/src/zebra_rpc.rs @@ -4,9 +4,11 @@ //! `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 is proven by oracle tests -//! (`tests/zebra_rpc_oracle.rs`) and pinned by golden fixtures captured from -//! the oracle's outputs. +//! 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; 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/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/zebra_rpc_golden.rs b/zcash_local_net/tests/zebra_rpc_golden.rs index 8702730..b81340e 100644 --- a/zcash_local_net/tests/zebra_rpc_golden.rs +++ b/zcash_local_net/tests/zebra_rpc_golden.rs @@ -2,12 +2,17 @@ //! //! 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 (captured by `zebra_rpc_oracle.rs` -//! with `CAPTURE_PROPOSAL_FIXTURES=1`). These tests replay them with no -//! zebrad binary and no zebra-rpc dependency, pinning oracle equivalence -//! after the dependency is gone. Height 2 is a plain NU5+ template; height 5 -//! is the NU6.1/NU6.2 activation block whose coinbase carries the lockbox -//! disbursement outputs. +//! 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}; @@ -45,3 +50,28 @@ fn golden_nu5_plus_template_reproduces_oracle_output() { 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/zcash_local_net/tests/zebra_rpc_oracle.rs b/zcash_local_net/tests/zebra_rpc_oracle.rs deleted file mode 100644 index e75352f..0000000 --- a/zcash_local_net/tests/zebra_rpc_oracle.rs +++ /dev/null @@ -1,186 +0,0 @@ -//! Oracle tests proving `zcash_local_net::zebra_rpc` equivalent to the -//! zebra-rpc dependency for every way this repo uses it. -//! -//! The live differential test launches a real zebrad, and at each height -//! parses the same template with both implementations, asserts byte-for-byte -//! equality of the assembled proposal and its hash, then submits *our* bytes -//! and asserts the chain advances. Heights 1 (Canopy commitment branch) -//! through 6 (NU5+ branch, crossing the NU6.1/NU6.2 lockbox activation at 5) -//! are all exercised. -//! -//! Set `CAPTURE_PROPOSAL_FIXTURES=1` to refresh the committed golden -//! fixtures in `tests/fixtures/zebra_rpc/` from the oracle's outputs; the -//! offline regression test in `zebra_rpc_golden.rs` replays those without -//! zebra-rpc or a zebrad binary. (The variable deliberately avoids the -//! `ZEBRA_` prefix: zebrad parses `ZEBRA_*` environment variables as -//! configuration and refuses to launch on unknown fields.) - -use zcash_local_net::process::Process; -use zcash_local_net::validator::{Validator, regtest_test_activation_heights, zebrad::Zebrad}; -use zcash_local_net::zebra_rpc as local_impl; - -use zebra_rpc::client::zebra_chain::parameters::Network; -use zebra_rpc::client::zebra_chain::parameters::testnet::ConfiguredActivationHeights; -use zebra_rpc::client::zebra_chain::serialization::ZcashSerialize as _; -use zebra_rpc::client::{BlockTemplateResponse, BlockTemplateTimeSource}; -use zebra_rpc::proposal_block_from_template; - -fn oracle_network() -> Network { - let zingo = regtest_test_activation_heights(); - Network::new_regtest( - ConfiguredActivationHeights { - before_overwinter: Some(1), - overwinter: zingo.overwinter(), - sapling: zingo.sapling(), - blossom: zingo.blossom(), - heartwood: zingo.heartwood(), - canopy: zingo.canopy(), - nu5: zingo.nu5(), - nu6: zingo.nu6(), - nu6_1: zingo.nu6_1(), - nu6_2: zingo.nu6_2(), - nu6_3: zingo.nu6_3(), - nu7: zingo.nu7(), - } - .into(), - ) -} - -#[tokio::test(flavor = "multi_thread", worker_threads = 2)] -async fn proposals_match_the_oracle_and_zebrad_accepts_ours() { - let _ = tracing_subscriber::fmt().try_init(); - - let zebrad = Zebrad::launch_default().await.expect("zebrad launches"); - let client = zebrad.client(); - let network = oracle_network(); - let heights = regtest_test_activation_heights(); - - let capture = std::env::var("CAPTURE_PROPOSAL_FIXTURES").is_ok(); - let fixture_dir = - std::path::Path::new(env!("CARGO_MANIFEST_DIR")).join("tests/fixtures/zebra_rpc"); - - // `Zebrad::launch` has already mined block 1 (the height-1, Canopy-branch - // proposal happens inside launch); templates here start at height 2 and - // run past the NU6.1/NU6.2 lockbox activation at height 5. - let start_height = zebrad.get_chain_height().await; - for target_height in (start_height + 1)..=(start_height + 5) { - let envelope: serde_json::Value = serde_json::from_str( - &client - .text_from_call("getblocktemplate", "[]") - .await - .expect("getblocktemplate succeeds"), - ) - .expect("valid envelope"); - let result = envelope - .get("result") - .cloned() - .expect("envelope has result"); - - // Both sides parse the same result payload. - let ours: local_impl::BlockTemplate = - serde_json::from_value(result.clone()).expect("our parser accepts the template"); - let oracle_template: BlockTemplateResponse = - serde_json::from_value(result.clone()).expect("oracle parser accepts the template"); - - assert_eq!(ours.height, target_height, "template height"); - - // Byte-for-byte proposal equivalence. - let our_bytes = - local_impl::proposal_block_bytes(&ours, &heights).expect("our assembly succeeds"); - let oracle_block = proposal_block_from_template( - &oracle_template, - BlockTemplateTimeSource::default(), - &network, - ) - .expect("oracle assembly succeeds"); - let oracle_bytes = oracle_block - .zcash_serialize_to_vec() - .expect("oracle serialization succeeds"); - - assert_eq!( - hex::encode(&our_bytes), - hex::encode(&oracle_bytes), - "serialized proposal differs from the oracle at height {target_height}" - ); - assert_eq!( - local_impl::block_hash_hex(&our_bytes), - oracle_block.hash().to_string(), - "block hash differs from the oracle at height {target_height}" - ); - - if capture && (target_height == 2 || target_height == 5) { - std::fs::create_dir_all(&fixture_dir).expect("fixture dir"); - std::fs::write( - fixture_dir.join(format!("template_h{target_height}.json")), - serde_json::to_string_pretty(&result).expect("serialize fixture"), - ) - .expect("write template fixture"); - std::fs::write( - fixture_dir.join(format!("block_h{target_height}.hex")), - hex::encode(&oracle_bytes), - ) - .expect("write block fixture"); - std::fs::write( - fixture_dir.join(format!("hash_h{target_height}.txt")), - oracle_block.hash().to_string(), - ) - .expect("write hash fixture"); - } - - // The chain must accept OUR bytes, not just match the oracle's. - let block_hex = hex::encode(&our_bytes); - let mut advanced = false; - for _ in 0..30 { - client - .text_from_call("submitblock", format!(r#"["{block_hex}"]"#)) - .await - .expect("submitblock succeeds"); - if zebrad.get_chain_height().await >= target_height { - advanced = true; - break; - } - tokio::time::sleep(std::time::Duration::from_millis(100)).await; - } - assert!( - advanced, - "zebrad did not accept our proposal at height {target_height}" - ); - } -} - -/// Differential coverage for the Canopy commitment branch (height 1, where -/// NU5 is not yet active under the fixture heights). The live test can't -/// observe a height-1 template because `Zebrad::launch` consumes it, so this -/// replays the captured height-2 fixture with the height rewritten to 1; -/// the oracle is a pure function and evaluates it without a node. -#[test] -fn canopy_branch_matches_the_oracle() { - let fixture = std::path::Path::new(env!("CARGO_MANIFEST_DIR")) - .join("tests/fixtures/zebra_rpc/template_h2.json"); - let mut template: serde_json::Value = - serde_json::from_str(&std::fs::read_to_string(fixture).expect("fixture exists")) - .expect("fixture parses"); - template["height"] = serde_json::json!(1); - - let ours: local_impl::BlockTemplate = - serde_json::from_value(template.clone()).expect("our parser"); - let oracle_template: BlockTemplateResponse = - serde_json::from_value(template).expect("oracle parser"); - - let our_bytes = local_impl::proposal_block_bytes(&ours, ®test_test_activation_heights()) - .expect("our assembly"); - let oracle_bytes = proposal_block_from_template( - &oracle_template, - BlockTemplateTimeSource::default(), - &oracle_network(), - ) - .expect("oracle assembly") - .zcash_serialize_to_vec() - .expect("oracle serialization"); - - assert_eq!( - hex::encode(&our_bytes), - hex::encode(&oracle_bytes), - "Canopy-branch proposal differs from the oracle" - ); -} From 232cf9fb02f3de2c1c6bd0247c875e85296ea566 Mon Sep 17 00:00:00 2001 From: zancas Date: Thu, 2 Jul 2026 21:10:25 -0700 Subject: [PATCH 10/10] refactor: replace getset derives with hand-written accessors The six Getters/CopyGetters structs (Zebrad, Zcashd, Zainod, Lightwalletd, Empty, ZcashDevtool) get explicit accessor impls with identical names and signatures, except Lightwalletd's never-callable _data_dir() getter, which is not reproduced. With the zebra tree already gone, removing the direct getset dependency erases getset and the unmaintained proc-macro-error2 from the lock entirely, so the RUSTSEC-2026-0173 deny ignore is deleted and cargo deny passes with no advisories ignored at all. Co-Authored-By: Claude Fable 5 --- Cargo.lock | 35 ----------- Cargo.toml | 3 - deny.toml | 9 --- zcash_local_net/Cargo.toml | 1 - zcash_local_net/src/client/zcash_devtool.rs | 21 ++++++- zcash_local_net/src/indexer/empty.rs | 16 +++++- zcash_local_net/src/indexer/lightwalletd.rs | 28 +++++++-- zcash_local_net/src/indexer/zainod.rs | 28 +++++++-- zcash_local_net/src/validator/zcashd.rs | 33 +++++++++-- zcash_local_net/src/validator/zebrad.rs | 64 +++++++++++++++++---- 10 files changed, 158 insertions(+), 80 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ac9a5ef..0491da0 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -378,18 +378,6 @@ dependencies = [ "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", -] - [[package]] name = "hashbrown" version = "0.15.5" @@ -867,28 +855,6 @@ dependencies = [ "syn", ] -[[package]] -name = "proc-macro-error-attr2" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" -dependencies = [ - "proc-macro2", - "quote", -] - -[[package]] -name = "proc-macro-error2" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" -dependencies = [ - "proc-macro-error-attr2", - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "proc-macro2" version = "1.0.106" @@ -1768,7 +1734,6 @@ dependencies = [ name = "zcash_local_net" version = "0.6.0" dependencies = [ - "getset", "hex", "json", "reqwest", diff --git a/Cargo.toml b/Cargo.toml index 757d6b8..dffe6c5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,9 +15,6 @@ zingo-consensus = { path = "zingo-consensus" } #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 } 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/zcash_local_net/Cargo.toml b/zcash_local_net/Cargo.toml index 4ba59fe..0a4cddb 100644 --- a/zcash_local_net/Cargo.toml +++ b/zcash_local_net/Cargo.toml @@ -22,7 +22,6 @@ 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 } 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/validator/zcashd.rs b/zcash_local_net/src/validator/zcashd.rs index e2d3d2a..bbfc9ae 100644 --- a/zcash_local_net/src/validator/zcashd.rs +++ b/zcash_local_net/src/validator/zcashd.rs @@ -2,7 +2,6 @@ use std::{path::PathBuf, process::Child}; -use getset::{CopyGetters, Getters}; use tempfile::TempDir; use zingo_consensus::{ActivationHeights, MinerPool, NetworkType}; @@ -131,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, @@ -148,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 { diff --git a/zcash_local_net/src/validator/zebrad.rs b/zcash_local_net/src/validator/zebrad.rs index 3e2c129..ccfa2b5 100644 --- a/zcash_local_net/src/validator/zebrad.rs +++ b/zcash_local_net/src/validator/zebrad.rs @@ -22,7 +22,6 @@ use std::{ }; use crate::rpc_client::RpcRequestClient; -use getset::{CopyGetters, Getters}; use tempfile::TempDir; /// Zebrad configuration @@ -145,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, @@ -178,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