diff --git a/packages/wasm-utxo/docs/zcash-v6-transaction.md b/packages/wasm-utxo/docs/zcash-v6-transaction.md index c45676b3b1d..69b5d9c2468 100644 --- a/packages/wasm-utxo/docs/zcash-v6-transaction.md +++ b/packages/wasm-utxo/docs/zcash-v6-transaction.md @@ -40,6 +40,15 @@ Ironwood: nActionsIronwood(varint) actions[820×n] flags(1) valueBalance(8) // whole block present only if nActionsIronwood > 0 ``` +The `flags` byte: bit 0 `enableSpends`, bit 1 `enableOutputs`, bit 2 +`enableCrossAddress` (Ironwood-only; reserved-and-zero in the Orchard slot). A bundle +built here sets spends/outputs exactly when it carries real spends/outputs — a +shielding build is `0x06` (its one spend per output is the fabricated value-0 dummy), +a deshield is `0x05` (its unpaired output halves are value-0 dummies), and a +shielded transfer is `0x07`. The mined `unshield` and `shield*` goldens predate this and +carry `0x07` (all three enables, as the reference wallet sets). Both forms are valid: +a disabled side only adds a value-0 constraint. + Each Ironwood action is 820 bytes: `cv(32) nullifier(32) rk(32) cmx(32) epk(32) encCiphertext(580) outCiphertext(80)`. This codec supports empty Sapling/Orchard slots plus a populated Ironwood bundle; non-empty Sapling/Orchard are rejected with a diff --git a/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood.rs b/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood.rs index ca370241def..fb49cb91fc9 100644 --- a/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood.rs +++ b/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood.rs @@ -207,7 +207,7 @@ fn build_sign_combine_produces_valid_v6_tx() { #[test] fn combine_ironwood_proof_locally_produces_a_verifying_proof() { use nonempty::NonEmpty; - use orchard::bundle::{Authorized, Bundle as OrchardBundle, BundleVersion}; + use orchard::bundle::{Authorized, Bundle as OrchardBundle, BundleVersion, Flags}; use orchard::circuit::{OrchardCircuitVersion, VerifyingKey}; use orchard::note::{ExtractedNoteCommitment, Nullifier, TransmittedNoteCiphertext}; use orchard::primitives::redpallas::{Binding, Signature, SpendAuth, VerificationKey}; @@ -297,7 +297,7 @@ fn combine_ironwood_proof_locally_produces_a_verifying_proof() { ); let orchard_bundle = OrchardBundle::::try_from_parts( actions, - BundleVersion::ironwood_v3().default_flags(), + Flags::from_byte(bundle.flags, BundleVersion::ironwood_v3()).expect("valid flags"), bundle.value_balance, Option::from(Anchor::from_bytes(bundle.anchor)).expect("valid anchor"), authorization, @@ -2236,7 +2236,7 @@ fn combine_rejects_a_proof_sized_for_a_different_action_count() { #[test] fn multi_spend_multi_output_proves_and_verifies_locally() { use nonempty::NonEmpty; - use orchard::bundle::{Authorized, Bundle as OrchardBundle, BundleVersion}; + use orchard::bundle::{Authorized, Bundle as OrchardBundle, BundleVersion, Flags}; use orchard::circuit::{OrchardCircuitVersion, VerifyingKey}; use orchard::note::{ExtractedNoteCommitment, Nullifier, TransmittedNoteCiphertext}; use orchard::primitives::redpallas::{Binding, Signature, SpendAuth, VerificationKey}; @@ -2292,7 +2292,7 @@ fn multi_spend_multi_output_proves_and_verifies_locally() { ); let orchard_bundle = OrchardBundle::::try_from_parts( actions, - BundleVersion::ironwood_v3().default_flags(), + Flags::from_byte(bundle.flags, BundleVersion::ironwood_v3()).expect("valid flags"), bundle.value_balance, Option::from(orchard::tree::Anchor::from_bytes(bundle.anchor)).expect("valid anchor"), authorization, diff --git a/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood_spend.rs b/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood_spend.rs index edd3b16c80e..eb6082f4ffc 100644 --- a/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood_spend.rs +++ b/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/zcash/tests/ironwood_spend.rs @@ -720,7 +720,7 @@ fn prove_and_verify_locally( n_actions: usize, ) { use nonempty::NonEmpty; - use orchard::bundle::{Authorized, Bundle as OrchardBundle, BundleVersion}; + use orchard::bundle::{Authorized, Bundle as OrchardBundle, BundleVersion, Flags}; use orchard::circuit::{OrchardCircuitVersion, VerifyingKey}; use orchard::note::{ExtractedNoteCommitment, Nullifier, TransmittedNoteCiphertext}; use orchard::primitives::redpallas::{Binding, Signature}; @@ -773,7 +773,7 @@ fn prove_and_verify_locally( ); let orchard_bundle = OrchardBundle::::try_from_parts( actions, - BundleVersion::ironwood_v3().default_flags(), + Flags::from_byte(bundle.flags, BundleVersion::ironwood_v3()).expect("valid flags"), bundle.value_balance, Option::from(orchard::tree::Anchor::from_bytes(bundle.anchor)).expect("valid anchor"), authorization, @@ -1666,7 +1666,9 @@ fn generate_ts_spend_fixtures() { transparent_output, ); let path = dir.join(format!("ironwood_spend_{name}.json")); - std::fs::write(&path, serde_json::to_string_pretty(&fixture).unwrap()).unwrap(); + let mut json = serde_json::to_string_pretty(&fixture).unwrap(); + json.push('\n'); + std::fs::write(&path, json).unwrap(); println!("wrote {}", path.display()); } } diff --git a/packages/wasm-utxo/src/zcash/ironwood_build.rs b/packages/wasm-utxo/src/zcash/ironwood_build.rs index d0ecafa7a6f..f9017f0c60c 100644 --- a/packages/wasm-utxo/src/zcash/ironwood_build.rs +++ b/packages/wasm-utxo/src/zcash/ironwood_build.rs @@ -32,7 +32,7 @@ use rand::{CryptoRng, RngCore}; use orchard::builder::{Builder, BundleType}; -use orchard::bundle::BundleVersion; +use orchard::bundle::{BundleVersion, Flags}; #[cfg(any(test, feature = "orchard-proving"))] use orchard::keys::Scope; use orchard::keys::{FullViewingKey, OutgoingViewingKey}; @@ -326,8 +326,11 @@ pub enum IronwoodVerifyCheck { /// A real spend carries its randomizer `alpha` on the wire: with `rk` it reveals the /// wallet's `ak` (`ak = rk − [alpha]·G`). RandomizerPresent, - /// The bundle is not an Ironwood V3 bundle with the default flags. + /// The bundle is not an Ironwood V3 bundle. BundleVersion, + /// The bundle's flags do not match its contents (spends enabled iff a real spend is + /// present, outputs iff a real output is, cross-address always enabled). + Flags, /// A value-0 (dummy) output is paired with a dummy spend, so the value-based /// accounting cannot distinguish it from a real output. ZeroValueOutput, @@ -371,6 +374,7 @@ impl core::fmt::Display for IronwoodVerifyCheck { Self::ViewingKeyPresent => "viewing key present", Self::RandomizerPresent => "randomizer present", Self::BundleVersion => "bundle version", + Self::Flags => "flags", Self::ZeroValueOutput => "zero-value output", Self::SpendSignature => "spend signature", Self::MissingPlaintext => "missing plaintext", @@ -666,6 +670,27 @@ impl IronwoodActionMap { } } +/// The Ironwood bundle flags for a build with the given real sides: spends are enabled iff the +/// bundle carries real spends, outputs iff it carries real outputs, and cross-address transfers +/// are always enabled (the least-restrictive value the Ironwood V3 version permits). Fabricated +/// value-0 halves — the dummy spends on shielding builds, the dummy outputs on deshields — +/// satisfy the disabled bits: the action circuit only forbids non-zero value on a disabled side. +pub(crate) fn ironwood_flags(has_spends: bool, has_outputs: bool) -> Flags { + // Flag-byte layout (Zcash §7.1): bit 0 enables spends, bit 1 outputs, and bit 2 + // (`enableCrossAddress`) is set on every Ironwood V3 bundle. + let byte = 0b100 | u8::from(has_spends) | (u8::from(has_outputs) << 1); + Flags::from_byte(byte, BundleVersion::ironwood_v3()) + .expect("the Ironwood V3 flag byte is always representable") +} + +/// The wire byte of [`ironwood_flags`]. +pub(crate) fn ironwood_flag_byte(has_spends: bool, has_outputs: bool) -> u8 { + let bundle_version = BundleVersion::ironwood_v3(); + ironwood_flags(has_spends, has_outputs) + .to_byte(bundle_version) + .expect("the Ironwood V3 flag byte is always representable") +} + /// Constructor: build an Ironwood bundle as an orchard PCZT from real spends and/or requested /// outputs — the general Constructor for the shielding (outputs only), unshielding (spends only), /// and shielded-transfer flows. @@ -714,7 +739,7 @@ pub fn construct_spend_pczt_multi( let mut builder = Builder::new( BundleType::UNPADDED, bundle_version, - bundle_version.default_flags(), + ironwood_flags(!spends.is_empty(), !outputs.is_empty()), anchor_root, ) .map_err(|e| IronwoodBuildError::Builder(e.to_string()))?; @@ -846,6 +871,8 @@ fn validate_constructed_out_ciphertexts( /// Constructor: build a transparent → Ironwood shielding bundle (no real spends) as an orchard /// PCZT, for one or more outputs. Each output rides an orchard-`Builder`-fabricated dummy spend /// (`BundleType::UNPADDED`, so exactly one action per output); no key is needed. +/// The bundle's flags disable spends: the fabricated dummy spends are declared dummies, not +/// real spends. /// /// Also the dummy-spend fabricator the keyless spend constructor /// ([`crate::zcash::ironwood_construct::construct_spend_pczt_keyless`]) reuses for surplus @@ -864,7 +891,7 @@ pub fn construct_shield_pczt_multi( let mut builder = Builder::new( BundleType::UNPADDED, bundle_version, - bundle_version.default_flags(), + ironwood_flags(false, true), anchor_root, ) .map_err(|e| IronwoodBuildError::Builder(e.to_string()))?; @@ -1822,8 +1849,9 @@ mod tests { .unwrap(); let data = pczt_action_data(&pczt).unwrap(); assert_eq!(data.actions.len(), 1, "UNPADDED single output ⇒ one action"); - // ironwood_v3 default flags = spends | outputs | cross-address. - assert_eq!(data.flags, 0x07); + // A shielding bundle disables spends (its only spend is the fabricated dummy): + // outputs | cross-address. + assert_eq!(data.flags, 0x06); // A pure output bundle (dummy spend has value 0): value_balance = 0 - amount. assert_eq!(data.value_balance, -(amount as i64)); } @@ -2391,7 +2419,7 @@ mod tests { assert_eq!(bundle.actions.len(), 1); assert_eq!(bundle.spend_auth_sigs.len(), 1); assert_eq!(bundle.proof.len(), Proof::expected_proof_size(1)); - assert_eq!(bundle.flags, 0x07); + assert_eq!(bundle.flags, 0x06); // The action data survived unchanged from build → combine (digests are stable). assert_eq!( @@ -2525,7 +2553,7 @@ mod tests { let orchard_bundle = OrchardBundle::::from_parts( actions, - BundleVersion::ironwood_v3().default_flags(), + Flags::from_byte(bundle.flags, BundleVersion::ironwood_v3()).expect("valid flags"), bundle.value_balance, Option::from(Anchor::from_bytes(bundle.anchor)).expect("valid anchor"), EffectsOnly, @@ -3275,7 +3303,7 @@ mod tests { verify_spend_pczt(&bundle).unwrap(); // Shielding bundle (dummy spend): every check is skipped, the cross-address restriction - // is a no-op under the default flags. + // is a no-op with cross-address enabled. let shield = construct_shield_pczt(&test_recipient(), 1_000, None, &anchor, &[0u8; 512], OsRng) .unwrap(); diff --git a/packages/wasm-utxo/src/zcash/ironwood_construct.rs b/packages/wasm-utxo/src/zcash/ironwood_construct.rs index 463a2cd3bb3..37a2c9f3f32 100644 --- a/packages/wasm-utxo/src/zcash/ironwood_construct.rs +++ b/packages/wasm-utxo/src/zcash/ironwood_construct.rs @@ -101,8 +101,8 @@ struct ActionOrigin { /// and/or requested outputs — the deshield and shielded→shielded Constructor for a build /// service that holds no viewing keys. /// -/// The bundle has `max(spends.len(), outputs.len())` actions (the Ironwood V3 default flags -/// enable cross-address transfers, so a spend and an output share an action): where one side +/// The bundle has `max(spends.len(), outputs.len())` actions (cross-address transfers are +/// enabled in the bundle's flags, so a spend and an output share an action): where one side /// runs out, the missing half is a protocol dummy — a value-0 output to a fresh random address /// for surplus spends, an orchard-`Builder`-fabricated dummy spend for surplus outputs. At /// least one real spend is required: output-only bundles are *shielding* builds @@ -245,7 +245,7 @@ pub fn construct_spend_pczt_keyless( (output_total - spend_total, true) }; - let bundle = assemble_bundle(wires, value_sum, anchor)?; + let bundle = assemble_bundle(wires, value_sum, anchor, !outputs.is_empty())?; // Self-check: the Constructor's own output must pass every key-free // check the client will later run on it — note commitments, value commitments, the @@ -570,16 +570,12 @@ fn assemble_bundle( actions: Vec, value_sum: (u64, bool), anchor: &AnchorBytes, + has_outputs: bool, ) -> Result { - let bundle_version = BundleVersion::ironwood_v3(); - let flags = bundle_version - .default_flags() - .to_byte(bundle_version) - .ok_or_else(|| { - IronwoodBuildError::Builder( - "the Ironwood V3 default flags have no byte encoding".to_string(), - ) - })?; + // The keyless constructor always carries real spends; outputs are enabled iff any were + // requested. The fabricated halves on the surplus side (value-0 dummies) satisfy the + // disabled bit. + let flags = super::ironwood_build::ironwood_flag_byte(true, has_outputs); let wire = super::ironwood_pczt::BundleWire { flags, value_pool: 1, // Ironwood diff --git a/packages/wasm-utxo/src/zcash/ironwood_pczt.rs b/packages/wasm-utxo/src/zcash/ironwood_pczt.rs index 167aab496d0..5070affce11 100644 --- a/packages/wasm-utxo/src/zcash/ironwood_pczt.rs +++ b/packages/wasm-utxo/src/zcash/ironwood_pczt.rs @@ -502,6 +502,17 @@ pub(crate) fn with_output_rseed_for_test( }) } +/// Test-only: replace the bundle's flags byte, producing a PCZT whose declared enables disagree +/// with its actions. Exists to exercise the key-free verifier's flag-consistency rejection +/// ([`IronwoodVerifyCheck::Flags`]). +#[cfg(test)] +pub(crate) fn with_flags_for_test(bytes: &[u8], flags: u8) -> Result, IronwoodPcztError> { + with_patched_wire(bytes, |wire| { + wire.flags = flags; + Ok(()) + }) +} + /// Reconstruct an `orchard` PCZT Ironwood bundle from its wire form. pub fn deserialize_pczt(bytes: &[u8]) -> Result { let (&version, body) = bytes.split_first().ok_or(IronwoodPcztError::Empty)?; @@ -765,6 +776,7 @@ mod tests { use rand::rngs::OsRng; use crate::zcash::ironwood_build::test_field_bytes as field_bytes; + use crate::zcash::ironwood_build::{ironwood_flag_byte, ironwood_flags}; /// Construct a shielding PCZT (one Ironwood output, dummy spend) via the orchard Constructor. fn sample_pczt() -> PcztBundle { @@ -772,11 +784,10 @@ mod tests { let fvk = FullViewingKey::from(&sk); let recipient = fvk.address_at(0u32, Scope::External); let bundle_version = BundleVersion::ironwood_v3(); - let flags = bundle_version.default_flags(); let mut builder = Builder::new( BundleType::UNPADDED, bundle_version, - flags, + ironwood_flags(false, true), Anchor::empty_tree(), ) .unwrap(); @@ -801,14 +812,7 @@ mod tests { // directions, so also assert against sample_pczt()'s known values. let wire: BundleWire = postcard::from_bytes(&bytes[1..]).unwrap(); assert_eq!(wire.anchor, Anchor::empty_tree().to_bytes()); - let bundle_version = BundleVersion::ironwood_v3(); - assert_eq!( - wire.flags, - bundle_version - .default_flags() - .to_byte(bundle_version) - .unwrap() - ); + assert_eq!(wire.flags, ironwood_flag_byte(false, true)); assert_eq!(wire.actions.len(), 1); assert_eq!(wire.value_sum_magnitude, 100_000_000); assert!(wire.value_sum_negative); @@ -946,7 +950,7 @@ mod tests { let mut builder = Builder::new( BundleType::UNPADDED, bundle_version, - bundle_version.default_flags(), + ironwood_flags(false, true), Anchor::empty_tree(), ) .unwrap(); diff --git a/packages/wasm-utxo/src/zcash/ironwood_verify.rs b/packages/wasm-utxo/src/zcash/ironwood_verify.rs index 573d4527cb9..db4bd111605 100644 --- a/packages/wasm-utxo/src/zcash/ironwood_verify.rs +++ b/packages/wasm-utxo/src/zcash/ironwood_verify.rs @@ -16,7 +16,9 @@ //! caller's own `ak` and FROST randomizers, each randomized `rk` is `ak.randomize(alpha)`; //! - `ViewingKeyPresent`: no viewing-key material (`fvk`, ZIP-32 derivation) leaks on a real spend; //! - `RandomizerPresent`: no real spend carries its `alpha`, which with `rk` reveals `ak`; -//! - `BundleVersion`: the bundle is an Ironwood V3 bundle with the default flags; +//! - `BundleVersion`: the bundle is an Ironwood V3 bundle; +//! - `Flags`: the bundle's flags match its contents (spends enabled iff a real spend is +//! present, outputs iff a real output is, cross-address always enabled); //! - `ZeroValueOutput`: value-0 (dummy) outputs only sit on actions with a real spend; //! - `SpendSignature`: every present spend-auth signature verifies against the spend's `rk` over //! the caller's sighash. @@ -39,8 +41,8 @@ use orchard::{ }; use super::ironwood_build::{ - spend_rk_is_placeholder, IronwoodVerifyCheck, IronwoodVerifyError, OrchardAddressBytes, - CMX_PROPRIETARY_KEY, + ironwood_flag_byte, spend_rk_is_placeholder, IronwoodVerifyCheck, IronwoodVerifyError, + OrchardAddressBytes, CMX_PROPRIETARY_KEY, }; use super::ironwood_pczt::PcztSpend; @@ -118,28 +120,16 @@ pub fn verify_bundle_without_keys( bundle: &PcztBundle, ctx: &KeylessVerifyContext, ) -> Result { - // `BundleVersion`: the bundle must be an Ironwood V3 bundle with the default flags — anything - // else changes the flag semantics the accounting below relies on. + // `BundleVersion`: the bundle must be an Ironwood V3 bundle. Its flags are checked against + // the bundle's contents after the action scan below. let ironwood_v3 = BundleVersion::ironwood_v3(); - let expected_flags = ironwood_v3 - .default_flags() - .to_byte(ironwood_v3) - .ok_or_else(|| { - action_error( - 0, - IronwoodVerifyCheck::BundleVersion, - "the Ironwood V3 default flags have no byte encoding".to_string(), - ) - })?; - if *bundle.bundle_version() != ironwood_v3 || bundle.flag_byte() != expected_flags { + if *bundle.bundle_version() != ironwood_v3 { return Err(action_error( 0, IronwoodVerifyCheck::BundleVersion, format!( - "bundle version is {:?} with flag byte {:#04x}, expected Ironwood V3 with {:#04x}", - bundle.bundle_version(), - bundle.flag_byte(), - expected_flags + "bundle version is {:?}, expected Ironwood V3", + bundle.bundle_version() ), )); } @@ -220,6 +210,28 @@ pub fn verify_bundle_without_keys( } } + // `Flags`: the bundle must enable exactly what it carries — the spends flag iff a + // real spend exists, the outputs flag iff a real output exists (cross-address transfers are + // always enabled for Ironwood V3). This is a canonical-form policy, not a value check: a + // disabled flag only adds a value-0 constraint, and the commitment checks above already pin + // every value. Pinning one flag byte per bundle shape keeps every party agreeing on the + // exact bytes (and so the txid) the Constructor produced. + let expected_flags = ironwood_flag_byte(!spends.is_empty(), !outputs.is_empty()); + if bundle.flag_byte() != expected_flags { + return Err(action_error( + 0, + IronwoodVerifyCheck::Flags, + format!( + "flag byte {:#04x} does not match the bundle's contents ({} real spends, {} real \ + outputs; expected {:#04x})", + bundle.flag_byte(), + spends.len(), + outputs.len(), + expected_flags, + ), + )); + } + // Every caller-expected randomizer must land on a real spend: one aimed at a dummy or a // missing action would otherwise be silently ignored. for (action_index, _, _) in &ctx.expected_randomizers { @@ -536,7 +548,7 @@ mod tests { IronwoodSpendSpec, OrchardAddressBytes, WitnessAuthPath, ANCHOR_SIZE, }; use crate::zcash::ironwood_pczt::{ - deserialize_pczt, serialize_pczt, with_action_rewrite_for_test, + deserialize_pczt, serialize_pczt, with_action_rewrite_for_test, with_flags_for_test, with_output_recipient_for_test, with_spend_alpha, with_spend_auth_sig, with_spend_fvk, with_spend_rk, with_spend_value, with_spend_witness_for_test, with_value_sum_for_test, without_output_recipient_for_test, ActionRewriteForTest, @@ -721,6 +733,77 @@ mod tests { assert_eq!(report.value_balance, -1_000); } + /// A spends-only (deshield) bundle in wire form — one real spend, no outputs. + fn test_deshield_bundle() -> Vec { + let (spec, anchor) = test_spend_spec(); + let (bundle, _) = construct_spend_pczt_multi(&[spec], &[], &anchor, OsRng).unwrap(); + serialize_pczt(&bundle).unwrap() + } + + #[test] + fn honest_deshield_bundle_verifies_with_spends_only_flags() { + let bytes = test_deshield_bundle(); + let report = verify_check(&bytes, &ctx()).unwrap(); + assert_eq!(report.spends.len(), 1); + assert!(report.outputs.is_empty()); + // The deshield's flags enable spends but not outputs: spends | cross-address. + assert_eq!(deserialize_pczt(&bytes).unwrap().flag_byte(), 0x05); + } + + /// A flag that lies in either direction fails `Flags`: enabling outputs on an output-free + /// bundle, disabling spends while a real spend is present, or clearing cross-address. + #[test] + fn flags_disagreeing_with_the_real_sides_fail_flags() { + let bytes = test_deshield_bundle(); + for lying_flags in [0x01, 0x04, 0x06, 0x07] { + let patched = with_flags_for_test(&bytes, lying_flags).unwrap(); + assert_eq!( + verify_check(&patched, &ctx()).unwrap_err(), + IronwoodVerifyCheck::Flags, + "flag byte {:#04x} must be rejected", + lying_flags + ); + } + } + + /// A transfer (real spend and real output) must enable both sides, and a shielding bundle + /// (dummy spends only) must leave spends disabled; both keep cross-address enabled. + #[test] + fn transfer_and_shield_flags_must_match_their_real_sides() { + let (transfer, anchor, _) = test_bundle(); + assert_eq!(deserialize_pczt(&transfer).unwrap().flag_byte(), 0x07); + for lying_flags in [0x03, 0x04, 0x05, 0x06] { + let patched = with_flags_for_test(&transfer, lying_flags).unwrap(); + assert_eq!( + verify_check(&patched, &ctx()).unwrap_err(), + IronwoodVerifyCheck::Flags, + "transfer flag byte {:#04x} must be rejected", + lying_flags + ); + } + + let shield = crate::zcash::ironwood_build::construct_shield_pczt( + &test_recipient(), + 1_000, + None, + &anchor, + &[0u8; 512], + OsRng, + ) + .unwrap(); + let shield = serialize_pczt(&shield).unwrap(); + assert_eq!(deserialize_pczt(&shield).unwrap().flag_byte(), 0x06); + for lying_flags in [0x02, 0x04, 0x05, 0x07] { + let patched = with_flags_for_test(&shield, lying_flags).unwrap(); + assert_eq!( + verify_check(&patched, &ctx()).unwrap_err(), + IronwoodVerifyCheck::Flags, + "shield flag byte {:#04x} must be rejected", + lying_flags + ); + } + } + #[test] fn recipient_swapped_at_equal_value_fails_note_commitment() { let (bytes, _anchor, _recipient) = test_bundle(); diff --git a/packages/wasm-utxo/src/zcash/v6.rs b/packages/wasm-utxo/src/zcash/v6.rs index e73622886c9..cdd45dc69d5 100644 --- a/packages/wasm-utxo/src/zcash/v6.rs +++ b/packages/wasm-utxo/src/zcash/v6.rs @@ -224,7 +224,8 @@ impl IronwoodAction { pub struct IronwoodBundle { /// Action array (each 820 bytes on the wire). pub actions: Vec, - /// Flag byte: `0x07` = spends | outputs | cross-address. + /// Flag byte: bit 0 enables spends, bit 1 outputs, bit 2 cross-address + /// (`0x07` = all three). pub flags: u8, /// Net value crossing the Ironwood pool boundary. pub value_balance: i64, diff --git a/packages/wasm-utxo/test/fixtures/zcash/ironwood_spend_deshield.json b/packages/wasm-utxo/test/fixtures/zcash/ironwood_spend_deshield.json index 30062b77d8a..884d1b05abf 100644 --- a/packages/wasm-utxo/test/fixtures/zcash/ironwood_spend_deshield.json +++ b/packages/wasm-utxo/test/fixtures/zcash/ironwood_spend_deshield.json @@ -1,19 +1,19 @@ { "ak": "6ebb833c1d2f8433080abceabe47906097f90678d603f577d0486c9111737b07", "blockHeight": 4134000, - "expectedTxid": "51df7b135bc61af67b00be5cfca8974a31dffdcc57c9e3b2b7a62b6c1d40fc7b", + "expectedTxid": "43543c44cd09b2a55516f2834fa2928c7323b46cfaec823edf9941c03c17bd95", "name": "deshield", "network": "zcashTest", "outCiphertexts": [], "outputActionIndices": [], - "proof": "d0aee040179049da4852613115a2ab16f863ee10d88e18165a2bd47cc98a91175c41d9e266cc6ee85877310ae431abe563f257c67abad464c584bf8c1aec6c87b4237067924eae3ed4f7830ee3cdb3ef1c1bd65d2a90a0f056a89d29bf7bc2967f7580f4a3ca418347bb28628dacbdcb0d639728fe9c46082da03f786494ec3f0f231e56fd2f76ef012aabc4284d6b7612a4409a242c3522629f58de492fde8ee5a3c40a8136b3bb9c082deeece66ad98180815df7db02790659bf4b102bd185389b5be40a59f70c51ff548574ce41430fd7bdb84901344e3f242ee89d53e31a944357dca9e214c306e3ad081c47cfb2796462d21bdb02c89e27fc3937331d251ee98684e494cd37bc53e19bfe4fe3207f6c35262a981d003a08b6c076776895f56fe0dc2ab203f366e7c9fa4dc9b4d6ebc7a7f7a9b366023fce01ffde6bbe35c7be475afe8efb64c3957681395882ed719d6ec95c2e8d5dcad7469a2015040b1235a35424e1a6595d3306fc5412bf665432f2c399402ca3dd081bad520a2085edf93e702d64404b6c1e9e19edeabc354374548f63a5c0797f19f5f4cc80ef0e02f74be06dd8505b2b4ebba54da5d5cc9f1a06e1eca81b4430cdc0ee11415c950d599aa3859106654ce62b25d6f8ba31e8f8841d0da49606f6a6da8bf422d22441adf9bb5c41a94462d6c8047b92fd385efba02dacfb0a83075870ce48d5a7bf0660bb3f560cdc5a8732cdf75afb4f0931fb4e4c66bc40bfd176d01ecc88de39b375e6a81e8cbebd0f80229aa55c40f13f89288c79de369993b484320ea9991c58f0439bd874296fb67d3b046478d0ed2525113d4221bcdd526a5b66895e4baa360fb24332217a9c920cc7397a1db92d265abe36a3ea3d1e2c8cc0e617228390772e704aa011b6b148e68d5518e46760a32996638d220efbbae50682b6ea9ba9fc955262a789ccf5e2844070aa30a399c66df596fe5db295e18707790842c93f37710e27992976b214dfeb67f2712d88ccdede8bcfebc3cc69bf6f4e4c13b0a35e1ed9c6c2e0a123026676cf80b26d7aa5dc72bc26e94478729170530b009781e7e714f4a29a05339b8aee027bfb513a8947b4251c6d96d76a4fc0f1d7fd0bae8282681826be79eeca0b2fde3bfa759551d0b8291f846ddac02e57a7958df6907cce16c0f1e254d1943e9a3d48a419231464f567ec0077ebec96f8ab0c3c9018f7c89c57be881f21f5b05f7031de0376fba4429978afaede720719bf85073438a4409a76cd5cabf123d1bfd4a2af42188e5d232610de1102a970d5d231f8ba14d3d7bdf5a01f01235b8e577fb9505c747a59d6d5f816756e1e3fdf44a7c85b32b9ef3d0e73d0e0457cac85c6c806f876388313c28bfcb5d477c6bf08d28b76b533d8e62ec6a577c6a49ef2fc74cdb1f049222cb3b807ad8fd7f5f418b104bf265a0da25656ca7714d6ab255928c8b6bb291a1497218e1d05055cffb76c57a1354d70203d188b167067a27da225ee963b96d7a7c1bc31523dd8e76df1b91a0b343baf4499bf4098bd57cbd60e8a452742afde2194aee314d91d928980bfb68f0a6f45b4fee7cbd7d15fe62ddb6f6d5716b92ede3920cfc48262b1fa4a939aa32b65d0ff306f3fcaa13e7a11b5ad3da1de7a33501e34612d76120bf81b3f084b0f12daa9a4b8f3ac45a2b13a23f1ea816364a5ae67ce10813879c8ac27abda4304256fa591fddc71903cf2d031c186070d4917a9f87c61b62a7f7c16fc8867451cf93a10019bdbf15fac3b2b5455f3399f8e9b92d678701f9447a41e7af7797335b601aaa7c7a02e5258adb3abaf35c3689a2a270137b80533fe0e5fd668582738cb2b6a9c8a0d75925f3ffc37e221060cded3a738f5d05869fa857790a2761b1e3fc72fe42d0a72bc162c9c18c4a23c889f9d0da463dfbcc5ee094830479f482ee168b8ad8d3007ed126bcd1849053ce071c94ee1af4e7c88c4eb36c0fc28950072c024b113e107d5fc1911aebfc3027010fc36cf22227b1fdd157635734c332b5ed11eb686b0932b27061510a6332f7983bdb87bd3bbcd6971928e66ff32dc3dfa2aff9c761393f28ee296c8ca5293243090ddc67d5706a50a17bebe87beb817e1a7697c2930bffc554fc803bc8a86202a7019479bd96595e3f2476984161c2b5f0d5602af889cfcb3b067c49e62345cecbd7ad1cae9242d90549ade6a6fde1be20e1e73d665c5441f8a4a41afaf316f1ff33e548359d13fcb96f907c443d51664a963d63dd2b2d0883e0f283cc71ca3c65b1c9546a42ce224b4c172c1546f03836737753df67375eddc31883e0be855bcd44ebc015fb770f6e6fa9210d11a2aaae6ba59bbe527080c751d6f8bccf8b3e41a4b9543fec87765a04d35f2503010d9957ca82c820a19240e94f7ced26b515b42ca47c44336fc325246e5a8eb5916cf5c30e7e3fe34b3d195888f3e72c06bd44c645c74589a9d655a0ed05a2464014c87f617d76fb3476a431e2e5c7315f7bad710fad4799267327c31b74cabdf067438d2606c869b12e26e77e7efdc3903ab0b73386d2adde18a0f5e72c98ee518408f9d7ae6d299a6eef27b47e7da65ff71d04d8c9b928f4ef5d2b168f1b8c515763c64a8fd18df448663edbdebb51aebf0dbb043ad950faea7a76af672517a285af57c80a47412e7f73988144fd67a730f35aa9e9fbd8cfe33d6020d95181339dd9a010c67942e43e0cd3d1b506201136f7955f834bed22dd6198220ff13590687dde388739458a2c6034e3911ed2e13b26ea5e61d0ecfab70217aee86f3b3284355550fa68f4b07b2cdf8aa304c0b3520ea316bc518d0ef6cb543d8e5de551970df62ec1e9b7a8cfc8e32b365fed5509bef7f7f69a167d8061322ae2d2702130a348a3ab2df94380d1e71c7f9e3c4e3df276a64cfc4890be49a5c4a4d3cfa397225377cb9cdd94a58822045493020209d68a3fc15fdedae624d66225e1e5414758e24f5da97d5a1fb5b9a3ce65fbebb3c19dd5f8b131cc8444160e08fa85a278a5541b62c860dc09871c4bdffa33e6055969323d93c080b0cb9e1d154950c0fd6d1aef3bd6ac66df433c5e9acf263d60b431529db6ca8357cf322241e709800c1bdd122327f7b39cb7d7547d4744ae712d1128eac2126a4f99f1a4f8f27a837016066be6e3ada2bb55f3446707bfdfea120ca8a183d255198d7f314b1a9330ccdb801d11d0e2706554eef6a76e36d79b35c91f277eb21ddf9045e82137afb22bc8b905eda7fdf9d928987c441da084cc2fd6b9ed49f27dde6c42aa4bcec240b6b0660d38238dffdeddc67b4ddbebe316f9b3522677c0c5a594dab5aafa0433f314e120dd46c5f82f1e03ff8e00ab5796e34ba29588617c974c3b4c70142e9122d0f873f6706a48864b88c58b27a65b3e4c30dae92699f169b049e91220ae41657c6436436408feb6d1b16314bc76f934c55d539b70636c3bacd292f1623d8002abb88d7e159d6ce3f32291c8fcbd74c757e54d5ad413f8d377aa2c72d65051bccf922386f1d21a0d9892f4944ab8c69860766df5dcb4c311b335835c1f1640d95ea8a79e59661aab5b29c18f0d6d2fd0f2bca722dfa2a8b14c4bf9717e64333a82c10bef31185ab8fcc7baf610610ac159d3f8327a6c59c5215a24454f35704801bf0bb01ebfbbb011c90e594ddc72266598ac60e23bf1c652d38bd043e2510a48b18762a5153a50921f8a74588cc6e9c3ad0d373ab76f27bc600df50f73d2d35d1278b96acbf1064a8fcbd7d5289945db88a2d92334a9b47862e6ec624a706276edc86c829059e7fe86813c2be8456d10b97acdfb60f2f909254a31f246c0fa52eada955e6267a086aff5adcf9ae6168ab1e78fb1e52c1f2b73e6b260bc517df22c5e7c00104066c5821b05f560818242af4538277afcf70a83d4ffcb06038ea5a706febf8890023b69da7a2f40433b5e1ea63206677446428d0469a822f305a23e534363165d6f7a1dc2694e543e60898b1957660675c3ef645a7c2f40a0aa321ddee52aa8d59a3b5972fbe36f73367457057e7ecda3b36181cb92a9092221f4296817401f822649ec0fb5200cce497cc8102444acfc704c42162d8b12436129d19558d0cfa3a757d4056d75a3f2f9993a7b124b16239010d6a217bbde809d25eb4804d8158942ff10c7ba259f4cf014f63be8334ec0d090d505944133a3dd0343f89235a6c71a1f2f1dba44596726d33d1cfd942776f148c730e6bfe982f6fdc1e522720c449b819975a2fda0b018ae717baefffec23be9982aea8c6602e2ab03c37596a8f20ebb276d10d0aef5756982b732a4722de1b64867a54adcb0bc433979100bb7b067e384d3b629299751584d2b063d0451e55aaf101629e1822ce337c9c67667eb8320dec2ad4311d7e9a6df848c8a124f5690282e6a6d4fb305efcd43bbaafd34f56f780d33892ce243c43082db2204d9920886e09671e5c1c6d41d98753b67a3ca69ad0042276cf974fb91da391e3125d5a0bef77cadfd73dc4e530d8a77b6199dd56fda5ce228c0d6c163b0027e6528fb3d029e11fdc103a7a7289ad2dd66a79d326342c39f94a9cdbba8bf3767478447faeaab41a9faf178fc36d6dc4132bcf9035c1a94a519f3b0e476aa8b67d7ea4a7029a7a2ccfd33cca00a184c9990391e0683a2e9780d99d70de181b452108e22fc13720b183b8080471238028f5084b98d03c85f36f6505214420abb2ffeaf8e625c4ddd7c2403a55d633a7c38fdb6dc42514e0f4ab4774e0cf8ec159f9df44dc31ee60336dc90e8b06ef7b060c2d9ec41170c80998daf003ba4419830fa00b60bafd7b33d6d819338843d9bfa39e940bc425f38f9e402807df3e1faf9ded4f55b25b72c184be3a7e5199b8083fa59ed21cd6df5b91740e504ca9b0395024dd0ad3f7a1062d6d33ec6141e2f76cd701d8f71c196f9d8e4c307ff02921d50cc785d3afdc8014603f05f67d947ea9d1d418e77fd242b24f3d5f20656164f78b05ca9dd90cd141e5010be205fcb0394d4c5c5c778487764318a3e7cdf9a2c327ec6c180d913c2f6d2fedf6d5235a6f7b8971c40ce2d25d31f79d76269f8deeaf3dc4a93f852ad2d31d5e6f7f08f3dcbb4af7f62c6e0ef540d1d2868e2816648628347c6172ece00827a56a828e3dbf7e32bd35810ab3f8e1d3179e85bbb4f7e34386d219dad3c2501cad31ef775c2925c6270e3b70f59d8f0839c4eb38985934611269d932eacfa332af602f9e0b12d60512e1e2c3e27037c17eec03b496a9ec711e7998c088df63116d149c46ba89b71115a1624c6e9b3d94c7b502ceb4d4c8e701d83b789244f02a8e443e1292c5c468534ad0579825bc466afddfcacb5bdfa99409988de4c951197d43aff2d91b0eaba844fa3513c8a6b3f384474e88c1d1690092786c52c76639dd8ac1448a46abe88d42d4b9e8fad99c80263748f1ff454d41dbdbdd216d1c0f5f3384ad19c1aa33343463913c4549427025f370cb986633f86d5ca4a7320036ca833f23a7ab40f3aa6323925ab1df3560f45fe3ca51f3a18ea9a0804d6dd032bfb2f97442b7a6da94c32196bbea37c83c64a394a516a82628d249f5bd43cc3c0bc94e04620c2bb13d0717b47b4f3d82d8bd3276252ca419d6d491f7aadf181411b2dcd5b3d50a640580eafcecd11c0c53c3c4187c3917a29738b784888b122f75b6aa90bd861d83687adc7815b59f5006ab35018bf7aa625185768bd8341123c50c1f2438a07047f98dd4c1e46197314a5b3b30630341a0ac321b28417cfc3c0da7e9c87496fa9bde9ffa1dc004e53e4f40ffeedfef8f905028dff09df1722b6d023b5981861ef3604ad7fe9b6e63a9200821af2b50f583f3e61783637fcd010dad5e5c1c6b84ef3b31b514d69012e4e314db0796dcae2ae27abbd60c997b10795df9b5a6797fbcf625506e04fd089a6ba7a46a00725ed878ccf9f713ac131c12a0fe2221fe1541f7c4e1264521d18a8a9fc4da203217e833874835ee616b0e9ed733441402772fcc1bdf29e71208a4395491d4c14be5fc7e8e7af38fe087863a110ffdc2aa950c5ccf595f192d02541d2f9926b055fe6f3299834dcafdf121bae3995e632543edf18197b117bf1d02ea377902bb29a17b4a09ee71a144439eb465c767a38130949b7ee38af95154fb94b2b79f6b24ea76f806f93a1c617108bd9bf3deac1f2f75414527a7fbc6966c5482d5d9dfa9951b7daedaeea2aa353ad3e44ea481154dacc5183d0ddd7b45f413a11d72741d8b67948c81ba5ba089bb096032fd080998fb7db43f7b5453887262afea4e92599c4b489adbd7d80b7e3b8fa3b202b5d4de9cc3bd5c399862bbc069b709e2edcea3b9191313cabbd9f6b409543e7c567320491842b53aac5314168f9ac8d17f3780ba2860986204174ebf1c1680d1872afc5ebe447f7b8a96dc55c22c2fd3ae0ffd0ef56f3387170d5312263fa398f154b8715af41a6b636f4281f8fee6c8d8e4dab90b9fb88b74ee70231ed4d38cd0a5d824af99012b01586e02a7a8a5c84a16485336ac1d05dd4948b4c7a9bf04025ebdfff0771fc568fd1622bb293d66ed24a209e093c2754f8d52050da41b0f978c91175102369bbab7eefc4b402dbbc42178741e95ceae3417b7ae16b012ed865b30a64ab5829071d9b528dbcdf2f1868b84162fd3c56f4aa5e4094c89d662bf7b68e18e81e5a355625f52c568aa7b0c605007a3dfc74c5697b53cb96b744e2acb4dc0f492fc35352fbcfe3c6eca6a3d23a9016515521d8500eba1f426ed08c4bc2b3f817b5b29266bccfb18e63a40df6cca9cfd331f4a3791b4b5ca2fabaef2e75f769cf1ad9afca35423635285d954c0bd01a6437e3a80b2d6a7fcc349b02e64decb6b71e26286e920fc0aa579e81d7ac63accbacd1f1ea408bdaf26489496fa4b0b61a55dc98c40a84386efe57e53398e3016497ec6031eb3158858eeade1b7d56ba3462b8cad320afdde38f36caa3e5c6c9799d39fd7d8c110e672af249206bd65892c9e6feb756f70fff48cadd3f5361d969b4aa70411003e", - "proofRequest": "0207010280c2d72f00277302f645a4c6b7ea56fc199ba39f31721d42d2dd08813bddb57bcfeb5e2c2d00000168e39d0541994980d79b8c84d64cf1f9bb1f0f3216b69187055bac214b27ae24018459eb1e67434b5809d95d3803f5efafdd11095ea5f7cdaee176c7e259cdda31621c8910e2a41c7959bd4f2e685a9a917b94fb0ed734ba906c1af5ad75abfe0ce38293336c6d2a106793a2542e6638080a973471224e5bd83ca7b9025441c19e01406d0f3ec99e881e292f0c697c6f2fda28062f7d81621b82a4df6917fa6ed91d146139d215faff299f68c82d19c87c6fcace681243d15f1d43adac460f07b29908012b4559029c0b5dbf941c5ad181a5fe8f45b34630f29d0c8dd8dc1cc3573386f416cb324133156d723df5e62d0180c2d72f01c8000000000000000000000000000000000000000000000000000000000000000134343434343434343434343434343434343434343434343434343434343434340001002033190bdef16c2df1b0f6d41903142f52660fde345f45b9c94d87e61a9f78851602000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000102155e64c5f669fc519dfd352928ebb830ee1f28a0a171510de4ac85d68de239000103636d782038fe5156c36c78da72290b6d81ccade9932a4a83500aa8962f04a6fd593bd30c09ddea739d31c50fac4e3dd513fd8373b6ec331e0336f2083b7dc1e177f5a1296dc429a6526aa55c363046e2ab79ce094b12755536462e7c197717d13217840fc404fbe2652c49eebe461dbf9730ae5a5e677adef0e31e51fc6f341d8e6316a1ee2233bbaf7b876fb196a1b65a652b74fe476fa0cfaf63e5491afed2b2be25787e412f110fdf477ed771ab29d2474ce14e050619b1d9418d1329961c085e29be7728f60f752595c238055291bccd0bc317addcc4e9be713c71757b5ead8bc8fccd9e9f5e9f3e3329499907213bc9033f68a6d34581e537625948975aad5d206973b83af128ff8f7932a7a9c95e5e72068364f769724de47c74d8805523ed8765ceee4f0e222074ec19c4b86afb185bd01b10832a858175b3720ba8b11bd1dd46e0c4fb77e544f521779e04140b2420926d44ade37e1a2964d55dddbbfffe8f94957e6678fe4bdca2e6595dbb7861c29fabb5d7b6d718bea3165c7d7e6743056c792ecfecd6255fecdfef80030e57fccab24705cb4bcc63ea6adf0f93c57d4f7d21f2dde126a117f24c6c4b666082c293e7a037b4660a4a721217c399277b6737dad209e5d78f51820c45b1befa9fd69cba99b6041af3b6509f0575f017adbc2f6ccce4ec144560c84784cc51e64428683cd1fd4e82bfed0cfc7e20275825da17fe8b6372af32e25a945c5d356c1f9eddaa9b86921b192d1d61f03fe50a026345d6e4e4ac32a60cfc703037ba41e08d7a6f8cd54f2ce5617fb29e403d448e60933b2bd0ef5364cee1e41b26129570aebb17443c7d4d2dd94fc94071186d05b983f14135fc0c65fa99c56ca2d8b0ca41c4375988e8c90424251b4be15d522e8e0d7797d333337b12696502c7d3b74ad31504d7a23f34011419515267a1298e6668fd8b6e2242dc50fb77afec31a23f407abb6856ba24b6315b0ba369b463b794d8a82591e7ef6dbc691a5b3ab4191cd3735d2d81084c82ae378fd040c81cc5955205a3f46f1ae6de443711e39a28b1d52a54262e22cff670012bda898b3c55aca6f9c941f20efb5fe0c9642d2626af5a84d36cacc2ccdf2b189b54817aca800c2a80653ab0010001aeb543d0e65d68a26a449389f07c4afca6943a79960b6aee840eb2595d07a6d2000000", - "psbt": "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", + "proof": "ee010bcd9fa00c55b79c0b03208628a91bee363e167b803fe06f91f88f008981b9340cdb30685825a32a34e80a7b229166626cb89b00ac4c6ae7bdf03f243016f53116d811af567c858cc89734a9fe6ebdf791fb3fd31bb53f5d562fdf29349db3f1b671b7307089c6b0854aaf31061cc944516c2de5f4fe92a5e9e703e8108642d505692eac88a8428ab937db083bf002d88db7ae0f68c92710c73840023d2a6ad2a10418dd98d3e755868e7ab94b98eb2d6485038c9262b54dfc902c752836de915b119d1059f715d09b7b40f3f8292dddd143c0b4ad9a2b5913824be6d80a2f47d6de501abc49fde663f934a9fe73f3cb8d19a4406f6959f8a61ce2191a1cda87faf2e88b5635caa1b2fd00ef5d69367cbc81cefdd83431e7f1818d3eaaba75cd3dad4f7e7832b140d83aebd7e3cbfeeac4f6ee87c8105c9c18a74379f6a389813f3cc548a6c2f162438d2e702d5a09cde82af5cbe10d7efd0ce8ca7305b6763da08e62cda01fea340dbebf385e82cb270d1b1ee6fb145094cee1fc9ef7adbacca80cbae3aeb56089731eeb15116cc23ab4280a7f0679b1e573c00d270923a5683d03407724d4b88bf24a55be349634743cb952f6a6ca214a58674665a91d9a34234024e4edb2e84761bfc8644fede66e54e01aa0cd6b37467f905abd6f09c5bb65fdf7446ed645408978720aeb0f5ccb691e3471f893374a2a2595f53fb625a673d3077f3e227510f12e532ec7383f7ea701575d2d6901518e4018cb5200e6a52efc1b5f3b714e840b7f260fdb89e2bd1d67729740fda38cf7c289a0662af4668f48cd15957685b62ed33ecb27dbf4e35709eb1a280fb8133d38fbd42393d63f203808fa0975d55968cb9819c204e744f104df585ae0271642a03543c2ae25d637e7bbe940da3cabd5ede7080146f700daae8f286263ad1405b1c9c651b04d107ba813ab8a6c36dd2fdd203f739db3129be8f993bdd15d18f3b9af1a7c14f653801043d958566a8a7635e0cfb8d416081b6f877b18a2880977be3d8ad68d65a002cf07ef7ad5b46dfcb7d981befc208f4f45c172c771c18b703fe3c19fba57ac9d4731d3c6c0fad2530574bc9f935d2edd0745f6b7283008026ddaa9f09304dc2ce8be41cbd19f17bf9741cbd5f7d58b6646abba7ea2baf2e87c765959378a280f50b0c4435820bb0012d8723e10c3133b9d99f92a8cb20165066bfd1f970e61920c3cf1b731f57e3913963779d954acf1918377680aacb5dac62e56833c933494d35f5afc2255598a60653a049277c9dbf86a39522ff5c3cf089e6a7889d46d8b0309f586031da5914e77fa409f611fa99f1e520a8538801eca81dcdea6325ccb2babf17dd31c07afc24392bfe99c3da8fb4fcf5f1c18bdc6dc5400b004b4cddc450f6ac7040257d4c3397f4363ad65795a8e64598cb5bcfcd2a82e7003b5cf7a3b75d8058bea0d75c551e9c8056aa824920c0dff7f453773eab9d05931e71860e3fbe8b9fed1f12d481686f16295cbb8ffb64dc9440305a123b8997d19bf2853984e4db706d5958cc634de69c308e5bac4532057ed7d5b624e59fa7d0ebd5404d36a5608cb44ae970f55e2f8df4d4999d210579106a6a0a57a879a6f33fa3f80ce678483405932b44e7df36cbcd8656cd14db8976ecd92401b72fdd53e94f4990d616f4c709c70a138736a2db64645fdbee615e99b6d8aeb67e248652f1c8ee9aaf6047be7441416268e0b32280ff827c89b600b2719b276225b85ac18a51346522d35a4a8245381ca7a1a34e95e7e303c2402cde70a0918b736a25d0eb5e9f55828b1126ee9669bda08414fd3079adce2f3f057979da410244f973131bcb058101d4618f42fa38588d6f1a814402088707cebeace3fd010666b49a111c3a7f763e10b1a4962d24c2c773625d5ee9675d8f0a5c8d78222fc0a2ba5503a64df67345d1a7d4bd79916949e40d993ed17c108e329f786458e47e92782cc23c06b5396077ee50264daf4e322360aa24de12deeb8ec38f6d27e52710e632b2e7f1dbff41e6afb1dfa503620a1d389398d5a81471e4b0bf0fcfe2ad0df16ea39cbdf68b8295c3aead11290b1efb0e83221c4d801e4926493ad0013ff28d8c316cd8bf48aa50a8a70e628f361db86de15b913d140d1c7645a5af914690800aa090c06f4b5ea804d1cc7e0fea66a94a6cc61e46cfcc6ac0f2c63945c1b841c7b0b971bfffa85d739df667e2b55cd82a35901a80019e116830830ce5b8de06abe3ea36dcd72e7cf9ed251621fdda0a5f65e5482df1082967fd2a65a5c33e301a72a1531c11a5c35df26d706fe45f1c347e7195af2ae197cf0ae18bf250fed5e08381e60a08f43a9f86fccc58c2bd015a357d69c9109f5c11619b4306ee9e401083f9ad52925cbfab88a6cf2cbe2c995212af7509cb88e39767e171e68525f05dd150666b92a91162fb66560b047a7e9a384ff0dd2897caacc8ea179d388fb848f2b6170f943e612e027faf120d22389403bcec1e79fec8741b5335962624cee48280a0b36213d0a390313b1dd1ad1b27cd1ef8e8b96ad27ee4deedb2a009cfdbb0c5e842bd5b2969c021d6d2c2d28e152298538863196a4b27c977a28407d01e43b0243baf04fe8493e69a4c0cbee1bed45387b0e1220b11aa16ee998af9aae3831d187f310e6c6040731490346548e960daa18e294f51df47ad5f1b6494704e210e5998a114ab368785ec2bebab11e9a024a9f695b9dc391b3148b79ecefe7ae288a93b1e97b482f898fd9ef94c99b57aa7e1166fd8baf849588bd4873eec99e37848b776e5988cf1a7833111cf44a01da02677f09aee85f389000554ed78bfd00a3e48854c1ee59577b6da798f4b035861dfa42390ed18fbaea1a7ddc28d1a30f7651dbb719d788e71ee198fb785c035f3e5601ff27a5692433bc1598bf65fb315657a920f7a69b4914cbf1eeed14ad8186387881b1c473cc14b702ac6230a831d082b05497630cf0f26dcd7879294487585aa5c2f11919d76cb8c8c62aa1121854451777d5dc9df3d57a867078a8a9f52cb70f50d75b40d48f2e49ee7768211d7f876885ddc2521f2c9b61ab15c95210a5acb9ac60410b716b74c8036ecb1633840ad60301b11a0b478262586bee0d72b93bba057c71e18f76691af2fe9770354cdf8fec26818d680438c1800d721dd523e17b177ca226f6c6037f4a8c014f1f289bd3d815816aa5e00edd883e687de423cc0a26b74968a9beed9ddd3f90fd23d6f9b8a589a1ba97c59f2b9e0217dab1f9a1dd669cada4fc4d3bd6e6572aaf2e955c376115ab849c44300ebe40fef0ab91803d069f4c97d32cd69b7347dbe51d60d1faacc8910af854bdad19e4076e408bed8e3c3581c9de1a7f9b7b6d88dd0eb1add1e439a0a9daac317743e2c1db3941edd75534f9b45df95fc85261f534347de8074159d2fd08907018855b71c379f620cc76cc9eb6696ff411fab32afd017de1a0f950b67eb52494d44b9b70e971efb4d66cdcb4148b5fc11941ea95e13c626c0b7915cd2edf5eb0d7fa6521315d656be0edf0ffc9a2b3a1985cba96de02ebbf27fc561f8536dcbae2a3e3c3b98abf0078e5f8c4f258652ddbeee63c9f07d57b47fcfab3bf77f8c5040cdb1dda64c40c952a19a8060faec5786cb7d5410bf4d1a7dd9b06ecd0966bfec3e7806e93056560dbe353c2039baa08a2a60bca0e1a180f69afb1dd633bfbb44b160d065a94817d887a4fbdb636191bbe0d464c1351edac8720bc7d1911a36ee17f79cdc42ddefce4ed1430a4b05e53efe692a01962f2c57f7fcee40f49b1f4e2411837e8a265ef0455d885e4748f1468bcc2f32f298b9dba40ca71bbc7f0872b2ea5ab8b5e6e0bfa20b00d1c227dc2763ec86624fe62cb047cd0aca940aa5a9aa0d6230e7e28ee46122f9b9c071704d15ead7439544f54eaf575f809d24fbb4edf3971bf272687a57e4764f75877af322a6d4837b8440341c07d05e8ec103560637b80c93efe558d8ca27e62e7fc6f3208dcd63cfc84a493495aa67b4df9a3a6e792125653287583075b2d924df9a11eecb177198660994264967ca18327c0465d965ab5c4a921f622b113e2e922f0317e4ac40479688ac3c272014f7e746c9d5e113129bbb5668733c8c101f4ee01052c82891ce397a678c0acfe68ebb0ce589d22b7ba19a8ec9c4ac7849fef7912e9b44c351dbb23f6b41a83cb6ff27ec009266ee1be821ccf77017d48a4b8bda39628203d1ac4e5cea56c275f9a616ca794886d42b47fbf9ac6025f78bc35964776706949275ae006b720de9bc7475e08f2a305e4e0b1716bb597f3f9d799bd392fe0e16d25507204608f588a8e9f4ddf0e0f807142af7781e4a1d96b973cc74b436f4df30d9f56af861394113df206a8dfb24e77af7fd4f2bfeeccc7b5af5def6ddef23d24febcc7984b0806681a2213a83b6b248c8abbe013487bd9a8c4171ef76d47b9361cbcd9296f0f3fa8bdc0e3940a30312fb75989172f5675d75678b5f7f0fc662a3156bdbf9cd7ffa705ef9810f47346a8142ed6522b886d53d4b13d7f7268ec1876ac484318050de1c175f966051c0570511053834eb3b82d23bb53d927ceab256aa73209eef7ee64bd14dfa48aa9e9392d7c3ad308552f77ba6322a65e05d0096d9ca4e75e75f650429e7d0ce20853fb93f807682245b421cc636e4ec447583b7b8ddf47092577da7af224a5dbef8b56c77408517100b14b6b53ba2ade7b9106c49a8d2da123ebb47ef7d2fc6a4aaeb56d0a5a084514acaf5cf9b9a4e4ae0124dad9b6d6e8d65f6d5e2b3a343e90068afa3fdc080fae31ec90b9e97891cec51cf4c67ebb00447289f6fa64bd73b80373dee36515a0846c1ee232aa2936f5b212dc05e71e71d42e31a705ba7f50053b96d64576192581dbddf600d2f44d2a26337da1c5c79bf85507df72a30fdcf01e0cbbac4130ae6430f6a9f90031d4543112560ec28b270ef90a3a4dab7e6e06659655444a412038727edb9802851a80733420373487eb34a51610ab5ffe17970511cf878f35b09724a03f618176fe78691a754fb6c17ce8d60ddcfcbfc1889c01f6a8aa322145958318eefe9fb9c16a701edb730c1d11f8caa5afe95a2b00eab11d2a6c3b17ac340f452d66748b44c2f204025f686ef262c9bfa382a8fb628ed6ffb7d56c539e3291aa3adaf3bc5152ed081c02abd65df9aa5f7f05067a1119b371eac46024c87cd8db12da45654b1ab01e24cdb0f1c18bbaf6a2bdd2409cb79ae744387723ea0874a91e35acb93d619531e428a2f1a46cdfabb170c9a1bc9e641f0ea084885710bb24a23bc328fa321338d317c523f9e773154b6d251092fcb9f5ba486bb4d2265e6dcaabf2b5d47b0c3589f9f912b73e4aad46f9fb89fe06562d11b7b05ccff4d1a6fbf8c32cc0a80106b1a3e48cc08c0670676bba78f08796cde8118f986103e46bcc80f5984b3e7e1c8be57d1cca5a8cd1e8dc0e3c922b63c07e883428937505c7c0dc5bb7f385d72a0712f99fd2f63618998103776f1e80e43f65eefbc2755ad61b44ed4935213815a19203adf151419ce265614500f75f5099c615e72345ba5513686ad1ee5a2f35aaa6fba666e91cc22f734b3a0efb39e48f559a22b2c388cf867f5fd28b4a73369aa62bb2dd5495a16a3d41c32d3665ee963137857b9ef879f9fbaa6b3585c4827a3b3eb910c2858ec893b27b37b56090d71d927e0b19cd994b8ddbd8bbc4fb233876aa0d59838f3cdf27a4b43c721dcd2fa489e6ef392b278deb5d84f93ae73fb3086be73b0f2115a7515b94d74663aef3763978700627d4898e7d2a6ae936114f159dab6b2cc6434b1e243690301822c9bb0fd63fc70bb88f5b18d72365c01168d48f27e7115d210ca19b51113031bed544b67aba5ab169a0fe37f8cf821730369ac7b7c9095c3871049df6ca9b1ee97d5ebc4e8119f9d19f796819bc7d6989bdcc851352ebf6fea8c16b44bef0677402eb376ca2d51246f1c53fdf948dd38c9b3d8598241bd77c0fa5c63df63d0db720fdd7fa63b3162dfb19b7c95c739f0ebbd9ff44a3c0d4deef425c910b795da153497a04506176869722ad89a8534d85af1bf708ac0d978f61267e1a10fd3e4bde66bda2772278784440907b1743acaedf61faa90ec45a2ff6d0a365f0cec4e103565ffee3a373e3ce2a14e4db810512d2d4b182ed3dc09a44d8eba85e580637e5e9a5733f414e7e81f2a369bfc808bbff0e85299916a320651ae58d7a57c736ed619aab18270fdd2ae0de7bdf1e19adf451d380c3033a6593c7c1512aff00f51cbb9f14a3695b016711d9910d450704342715b71f5a15a695e793eb58539b77a47469a91e7dab61f5c8ba3e6530e9a7918de7524e7d2a59f014b960806ad532d52d6f883b82f4e67d58d55a27f15107667affa7fc49965e8840285f1227a721498ad7a543e162c1977f76a69507619b027d49c56acae2874ff2ad483fbc44ec1f2d138f91f0f266ce628d1ee2c7a229bb31233c5c04635fdff5b7989539ddf5189eff813a067b61d4608d8b43415c9a787d392245eb98e90287ed6833e73709434d7f0c0c40c447fd2a879893dd72af6cacac3b2f4d145e847aff3a8836204222237a26004f59df2fac8b339c3ba692e0f06212a2e7e040a207c18608fe485464a717dc9e43a13189c30a053496d00582c8c01632b7e3e5cff8cc5da72655e7efc1a981968db7ff3e4a2e8858240395cb1e12e3702a7d51040bc6a70b5eac7069f6cc4e8c62f076f10db290e00e37184a42d33a5f6ca9a0aa360294fa0876b9ff63ae575e3234ab5ef6cdcec7bc3e88ac86cbd56e7eb4be6ee5f6d720e7f1af24bcd009c102da3a436c5b529d1ce58acf69813d48ef5801b0e7b9581cf323bf032a0dd3e1d67dad4ef40e4eb8f8bd0911f65e365aa6dbb18bfcd9eae64dd7234002c8a7a749ab57251c4bd3382a67197cdb480b535ea46742d9f4487826956d30e4c399480465b9e866f2cde6e80701dd5b7f548b696b3f7af6390b665bab66ca3edeb555e1627116f171f2135c682d", + "proofRequest": "0205010280c2d72f00277302f645a4c6b7ea56fc199ba39f31721d42d2dd08813bddb57bcfeb5e2c2d00000168e39d0541994980d79b8c84d64cf1f9bb1f0f3216b69187055bac214b27ae24018459eb1e67434b5809d95d3803f5efafdd11095ea5f7cdaee176c7e259cdda31621c8910e2a41c7959bd4f2e685a9a917b94fb0ed734ba906c1af5ad75abfe0cf3469824455da85b6f7f7de6ac2405d2914acfe5e171a0e0f6e45214e1a655b20140fe506e354589ed4036c2b82d7ed73b64568db57ad031a3ca4f4110980aa1f1a3c183d98483de005ee5ec6d9415bc4aee9c990d6305bdb8fe5679f9897c75160c012b4559029c0b5dbf941c5ad181a5fe8f45b34630f29d0c8dd8dc1cc3573386f416cb324133156d723df5e62d0180c2d72f01c8000000000000000000000000000000000000000000000000000000000000000134343434343434343434343434343434343434343434343434343434343434340001002033190bdef16c2df1b0f6d41903142f52660fde345f45b9c94d87e61a9f7885160200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000018850e92dd08f1ae7f04877a95f295e13bee31468898894ea1bdddf55c403c232000103636d782038fe5156c36c78da72290b6d81ccade9932a4a83500aa8962f04a6fd593bd30c09ddea739d31c50fac4e3dd513fd8373b6ec331e0336f2083b7dc1e177f5a1296dc429a6526aa55c363046e2ab79ce094b12755536462e7c197717d13217840fc404fbe2652c49eebe461dbf9730ae5a5e677adef0e31e51fc6f341d8e6316a1ee2233bbaf7b876fb196a1b65a652b74fe476fa0cfaf63e5491afed2b2be25787e412f110fdf477ed771ab29d2474ce14e050619b1d9418d1329961c085e29be7728f60f752595c238055291bccd0bc317addcc4e9be713c71757b5ead8bc8fccd9e9f5e9f3e3329499907213bc9033f68a6d34581e537625948975aad5d206973b83af128ff8f7932a7a9c95e5e72068364f769724de47c74d8805523ed8765ceee4f0e222074ec19c4b86afb185bd01b10832a858175b3720ba8b11bd1dd46e0c4fb77e544f521779e04140b2420926d44ade37e1a2964d55dddbbfffe8f94957e6678fe4bdca2e6595dbb7861c29fabb5d7b6d718bea3165c7d7e6743056c792ecfecd6255fecdfef80030e57fccab24705cb4bcc63ea6adf0f93c57d4f7d21f2dde126a117f24c6c4b666082c293e7a037b4660a4a721217c399277b6737dad209e5d78f51820c45b1befa9fd69cba99b6041af3b6509f0575f017adbc2f6ccce4ec144560c84784cc51e64428683cd1fd4e82bfed0cfc7e20275825da17fe8b6372af32e25a945c5d356c1f9eddaa9b86921b192d1d61f03fe50a026345d6e4e4ac32a60cfc703037ba41e08d7a6f8cd54f2ce5617fb29e403d448e60933b2bd0ef5364cee1e41b26129570aebb17443c7d4d2dd94fc94071186d05b983f14135fc0c65fa99c56ca2d8b0ca41c4375988e8c90424251b4be15d522e8e0d7797d333337b12696502c7d3b74ad31504d7a23f34011419515267a1298e6668fd8b6e2242dc50fb77afec31a23f407abb6856ba24b6315b0ba369b463b794d8a82591e7ef6dbc691a5b3ab4191cd3735d2d81084c82ae378fd040c81cc5955205a3f46f1ae6de443711e39a28b1d52a54262e22cff670012bda898b3c55aca6f9c941f20efb5fe0c9642d2626af5a84d36cacc2ccdf2b189b54817aca800c2a80653ab0010001aeb543d0e65d68a26a449389f07c4afca6943a79960b6aee840eb2595d07a6d2000000", + "psbt": "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", "randomizers": [ { "actionIndex": 0, - "alpha": "02155e64c5f669fc519dfd352928ebb830ee1f28a0a171510de4ac85d68de239", - "rk": "e38293336c6d2a106793a2542e6638080a973471224e5bd83ca7b9025441c19e" + "alpha": "8850e92dd08f1ae7f04877a95f295e13bee31468898894ea1bdddf55c403c232", + "rk": "f3469824455da85b6f7f7de6ac2405d2914acfe5e171a0e0f6e45214e1a655b2" } ], "request": { @@ -71,11 +71,11 @@ "value": "99990000" } }, - "sighash": "7bfc401d6c2ba6b7b2e3c957ccfddf314a97a8fc5cbe007bf61ac65b137bdf51", + "sighash": "95bd173cc04199df3e82ecfa6cb423738c92a24f83f21655a5b209cd443c5443", "signatures": [ { "actionIndex": 0, - "signature": "6d0f3ec99e881e292f0c697c6f2fda28062f7d81621b82a4df6917fa6ed91d146139d215faff299f68c82d19c87c6fcace681243d15f1d43adac460f07b29908" + "signature": "fe506e354589ed4036c2b82d7ed73b64568db57ad031a3ca4f4110980aa1f1a3c183d98483de005ee5ec6d9415bc4aee9c990d6305bdb8fe5679f9897c75160c" } ], "spendActionIndices": [0], diff --git a/packages/wasm-utxo/test/fixtures/zcash/ironwood_tampered_recipient.hex b/packages/wasm-utxo/test/fixtures/zcash/ironwood_tampered_recipient.hex index 6b403f920e7..26d4a4b72d1 100644 --- a/packages/wasm-utxo/test/fixtures/zcash/ironwood_tampered_recipient.hex +++ b/packages/wasm-utxo/test/fixtures/zcash/ironwood_tampered_recipient.hex @@ -1 +1 @@ -70736274ff010053060000000133333333333333333333333333333333333333333333333333333333333333330000000000feffffff01605af4050000000017a9143539800d0f9b0c807b3fb6b1fe712e9e08805a9f87000000004f01043587cf0000000000000000001b845efbe91912961b5bbd3219d70b566d94382aaf788777044e8c6fa39a1b82022a3fa771d80d1ebc0e2303e5341babde6a885335e97a1d94a233ca3e86595db10424cb7ad34f01043587cf000000000000000000a5298c4ad25993bc75e8b77c489c96e4aa58390ee4d4ef7cea2629392efa1aca030406c399d98f83d1cd346a55e02cc8ae63dec8c3b9da485e9a694708f4436614048fe9bf4b4f01043587cf000000000000000000803367cad8fd045fbbf575fa5a856fc51653edad08d89044bd4d5e1221f240b0036ac882403521ed161e58836234a8ae4385bcd2c24ff4b95c9f069712be885be8040934c8db08fc05424954474f00045b16a5370ffc0c424954474f2f5a45432f563600045b16a5370ffc0c424954474f2f5a45432f563601fdf8080207010280c2d72f01ae2935f1dfd8a24aed7c70df7de3a668eb7a49b1319880dde2bbd9031ae5d82f00000141e97f642386c4ddef1a673d21398ed87b93322cb5fc3ed9e2a69d171bd13821015366be88eeeeef552948b0026d9b177f8d40acba99c86b706e2db3997695861e3c3ba72ec765986063c94fee39a3f06ac03450ead3a4c2529e3bce45c8fd2c23ea1235792f1a839a04098d1905f257e96b3892e44e56e994dcea662f7f4f942500012becd5713a1f39b09dfa421e0ac2c60957ca24ee7f46e4f14ab27f232f6239fa18531028be417b1bb964f2ab010001bf67087c1147b7efbc333f147d6d85952429fd3a2e154fb98cc6689f8613302c01e1405e9a7f0edc450fc25951ce8d360fb99f734ca406e1add1693d9a84535ea1016033849020fb04dd1e17dd671f6c4cb9dc897dec973a3d2b0b2ffae30150617b2c5500b73ef7436094e9d0aebf1a4f880253a893d6ba56431fec32cfb56f95ad17750abb575c91c1032fb7e4fd8a0d17676f42f6a88755a29b2951f3b43f743f1301eaf1dfa30620ad034b34a045d6d2520c408e5ca99d86a94523c399d02c90c197b88d3552d20d0b4b64cfd6df7769d461f4b065da2a6fdd540e52f6ab4c78538aa6ca2e308d2562d8e396d8e8f43f6499c17b2b58f461da49c16544f0068af49014aaf79ac51cf0be97cdaf464fde3bfa83285b5213f039f124bdf1f7a1c0ca0c57971421ca24defcef94269e21ae551b854ceb669d481668391c08e718c5b7315d013dd9e0099db2a4a9c803a6b8bf16d7069dec977b74f214699377bc5b11ec130ad505e3120898b3f9cd827e383d7f18a2797a315280f67671360891afe3c8588157058e2373d08a438d7a2ba6914e8f8fe561125b45172982090884397d8bee41443134241daed9b768e3a2094954031d670d1c9bc9d3e4f382a07759818009da4e4af923f78d2b5175fd3fba3358ff0bbeb1daff2ccb8b485b15c778337f02f15355d332ec160fec46613b6a0715f08284c74f69cade99879b6d3594b0d9a5146f36a33e4e751e0b35b7dbc22133d83933b7f5cae2c54028d139319867377b95e8d0e222ccae22a2ad0db528b3732c62b64564d60b1bfde88f57a02c191e29fa07b3da05db1ea7ea4ab3defdac4e31a51c0504c52db583e980776ab1e59e635839565535e456e83768df130f54767bc75d8aaa84cd498c330c54739906d1798ecce09a156e0f2f01440a5ee18fefad2669b0e3798d0abc154b97b5e49f749a230701231a919eca827c3378fe34638124710f962b40f25000611b29c63386f199129a7f15c189e253fc751e23f01c8ed300a2a675bae17e40845e0f994c8ebb3cd743963c9439d9b03ce7b1a3726371583700455e4087124dbfd60253c8f873e6d50b700267f6a594151017c3e3cfbd1f384ac2b3505041cc3057c76a3a7416da4d30192e07cae2e6ee80ca1aef8905e8528d49bce2c169cdc7e9974b091a6919917917072b67f2a231e80d99855a58172c5de809c20b38c9cb933be25d57bf54aac3fa2f0651af000ccab00172996197b37995c85dd9d79e983bd5e3e604969ab6b0662f76a4f55610f6ffce633d127445041dd2dc4994ed13e8993f9ce8798bd8b4f2227966ab75ba485b4b772c288fe9f29815e263e3470bc3fa232a76b08a1f8f9c3756c153c89009e4d37721418f2348887c4fd1ba9392648106c43fe290098bb717a6aed4a568ed5ea3500cb31ac27fbc54f14d2c67faec4b42aea1881b347c5e39de5e2245a68b29ae9a05b918b8ea29ee9c4957f13cc7ed7ee7d66e22a0c17c00f559c384ce06b8c6a82b6bef382b982df0507e97c20382f092f790b269959a245542c84c87b3420d6d33ac983f4894c92ac72f403d77ce9bb81242af68ac4504a283c9154c7b970829888a82ac7cdc0b5b601341d0afef96c11bc4b050385820d28de0a4896ed4f28ea94266b051204925c9085cdf21ca0c64514e57c120e0240145b8edeccf30229b9fb333e33c1c53914fd506ab23b3ff2394fab3f698d21d20010cf1ea5f51c32d63cb2e3e189c101433131ba24b72a0436141888c9ed57ac1300081d5d6bb408fbac4eddf14cff89f22284ac1d0d76c991501eef1a25a460753113d7669713b21985bea04efdab397a5228890761ffbb1aa0af076337d0ed1b3a7c4042149200e2e4a58b78544583e2b14aa5ab6f9d313193533a8dad5b3edf531e868ef8334551e873d65245751dd39b706c71d742f5072b16bbc38cd408eca159ce9d0d83b533380196eb4856c02d3d2f9381e8b3e500eacd27b41685b7da95df0a726d10868ac8be9393d9d3ab73e053c908403cf7052762e46516264046bfe0d00e23858df6e27ae9cd340661fe16b1021d2e2be87339077d49e05f361a2e10bc0c8c8fbab782d87f7836220740229714de7e884093a14475d7ef0c01dc8e55cf5f2de7bad342fa5085cdb8fda092915d525ab6ba469138aa0d418fa6ab5d6c0b092e8354b240aa3ab198ea90bf3a337c66b79cbc2f261b3c59d4e9313d3a56721cb59eaccf2fb47713a34ee7fbf795519c00af0547e8779efe627812509b16c6ed5a206d0b580fea601cc57b8c33355dcfeb47453301a4ec2a1987a7be2053d62ef859b349e10d007c1b8ed72375e637dd675c1c976efdcf93036cf68dc2d5ac2e779aabb2903fd7360f7b12b8aaa9a9e9487334bca869c7e4db095406116ae0ccadd5f50ce40597fe7df5562eecf7eea21fb094dbe291e2616aa001dd1e137f60bb91f8fc75567814bcf1c09d3f68879e1799390038f0367cba71e3ee4065a9094b82f51ecb3374291fb16bda3ea287cc6a165aaac65b0e97c44c04c1d71d91146ed02f8c427b7444127da28a16b080924d6887b5887a5ea0b0167ceabeb8dfc10aa3e6d32730a67777d39127aa0ea906cfa914cb522041ce09455d5fd09b391acecbb8abbbad810b13ca3fb95acb30592e6fa84c589ab06a61763250290ec5a83671c6b507eb694d153210feaf1c2a4bad697942e340fb4b5285622d9dd9f4ee83ca3e4f7e4fb354d7b83fc4831944ec5855b600ec404413292b27689d5dc0c7385ca7a273c345a71bd258b7ffeee67f4cfc328fd012ba1e18d3f521fe43ae227d846d508c0157a7290e48901b07fbfa1b51ddf26fe9f801b8072ee80d163201d350180c2d72f01a34c2ed594af84410448d25d1154541b186549b5215143256e837228a59450d90000000ffc0c424954474f2f5a45432f5636020498b684d80ffc0c424954474f2f5a45432f56360304000000000001012000c2eb0b0000000017a914a6501f49ca2a3fcfffa4305390d652aa4228d1df8701030401000000010469522102dc096ed5a904b2b44d13da435fff01638102a0bb138660f49f2965032213ec2e210306424d7dc076a4c4b8f0ad767990802f8a7c8d0ce4bd19a5c463aa7b023ce03c2102db27fe95a09f5b5a94c70f9310ac2e63a8d67ffdb1092a10180279bdc4cf0f3d53ae220602db27fe95a09f5b5a94c70f9310ac2e63a8d67ffdb1092a10180279bdc4cf0f3d1424cb7ad300000000000000000000000000000000220602dc096ed5a904b2b44d13da435fff01638102a0bb138660f49f2965032213ec2e140934c8db0000000000000000000000000000000022060306424d7dc076a4c4b8f0ad767990802f8a7c8d0ce4bd19a5c463aa7b023ce03c148fe9bf4b0000000000000000000000000000000000010069522102e13b65040a5908f2837fc699899542e79c858efaa7a87878d64fcfc36d2b0edf21025e3bde51e74dfa995b6370ad7d636f2e7448e85a4a1588a1f5078cddcbb904852103674dc406d6a13957aad5ed3713e6d5583500b4d86145eb12a4b9f23fe3a9bef353ae2202025e3bde51e74dfa995b6370ad7d636f2e7448e85a4a1588a1f5078cddcbb90485148fe9bf4b00000000000000000000000001000000220202e13b65040a5908f2837fc699899542e79c858efaa7a87878d64fcfc36d2b0edf140934c8db00000000000000000000000001000000220203674dc406d6a13957aad5ed3713e6d5583500b4d86145eb12a4b9f23fe3a9bef31424cb7ad30000000000000000000000000100000000 \ No newline at end of file +70736274ff010053060000000133333333333333333333333333333333333333333333333333333333333333330000000000feffffff01605af4050000000017a9143539800d0f9b0c807b3fb6b1fe712e9e08805a9f87000000004f01043587cf0000000000000000001b845efbe91912961b5bbd3219d70b566d94382aaf788777044e8c6fa39a1b82022a3fa771d80d1ebc0e2303e5341babde6a885335e97a1d94a233ca3e86595db10424cb7ad34f01043587cf000000000000000000a5298c4ad25993bc75e8b77c489c96e4aa58390ee4d4ef7cea2629392efa1aca030406c399d98f83d1cd346a55e02cc8ae63dec8c3b9da485e9a694708f4436614048fe9bf4b4f01043587cf000000000000000000803367cad8fd045fbbf575fa5a856fc51653edad08d89044bd4d5e1221f240b0036ac882403521ed161e58836234a8ae4385bcd2c24ff4b95c9f069712be885be8040934c8db08fc05424954474f00045b16a5370ffc0c424954474f2f5a45432f563600045b16a5370ffc0c424954474f2f5a45432f563601fdf8080206010280c2d72f01ae2935f1dfd8a24aed7c70df7de3a668eb7a49b1319880dde2bbd9031ae5d82f0000012847193b86f7c570a48de500ea97441607c4e745b132ba080d3f46704b1b4a0601a35f5997231ceee656fc7ed9ba00ad89f22b70b784b894f8478ba3fc9910151e0eef3744517a269147e6b6a940c4c66407cd94ce782ec04c5555dc3c55137f3beca51534824020f2646d9edc5134f04a2b9951612f83bc68c8efa1e15e56afa200012bbd4bf0715c84265878a9b4a68cb69ab343d1c0730b5bc5e73aaf9c26658809a9b7ffc56d4d196844a5958801000102eadfb9074731f2bda3376672ee9b9fc3a5c50b5facc954d3d65260cc29ae1f016d4721a4b69c05eaa8d46db9cb4e4cb5a9f7463c332987a87a69d5976f36db7a01604b42c5181ed6a47ec6bf3893edc0f9bf0e28d947505541443cbdb6128a1f0214215043fcd07b110c20d3d377f645108c8e4ec5f85d73a4107e395ffc8c17a5297de3de243aaebdbc1ec871b11b0124ead7a101bded9f8c1d9fcf4355089bc70201b7c5d9a40f2096b3944d704538c354c2807634f36463d553da8d77c00ef62bbab43c7f663a3421766ff8ad08195870a73be2691c278e351d3930e092c2e80e4db890bb3604205ebdc8e94dc3dc0fe22a8b9ff2f944b7c07959e0ca431270433c0b1fa58b7c2c9fb96fc4e1f5ec9c8dbd2a58a1001c8dda8ae608d7d6fb2438c62ae98a780c002bb6eafd0ca088f4e361b4ac9b2effd3f13eaf23393ccc6d8590e166a911f43d578d2d2cddd3154430ef0ff9f068e72107db58bce422051f19a087c6c05e7b20bdefc81b79d113b25e6c38835ab9567b68da185e5e0bdd7aac54085d271604355dd6765fdb7ed94b4cfadf6f34f0662c2e330c06ba36efbb9419eb20b67392137f18149e5ea940d6bfb912efe5558f6a3827ececeaa219eb8158ecab8885e704bbf22351752d1cdaceecb4cf4b5818416e0c6c003ec4fb0c762700e191d2921dc0acf14b5ef1c3dbb1209f2850830632de9456d8eb1c241c04f13293282b05072ca3bbb762b9af2897c255a66245f74628e0c56d5d0f64e721231bd16935bd19444e4fda2760c9fc71031bc52ca6424870895df5a0a941c2dc04734847daf827e4cbc41cda9af7e1c4c683cb452efb83cc59e8c43de391e9cffe35f69b00ca14e03d00dc35a3917d479eb348d2b4dd394804265e1c5c1962949de03c05d0b809d6d413eb41d5dafc5f04d206e2781576520beeb7b4c024f2e89406618ab3262763b1a9435d218879a68dcb5b35a03ff960eea0f71cf02271ee88a97320ad6c2d0974fc7f0ecaf21df7d4aad23856d9eb57495c751b27111850038312ffbedc39c07b02c6a01b0f37495013157db47b5ee43307ecd770a4d046766564b717a52f2fd3fbbf26cbed6a8025276c3d669eae5a5d2df36332c705906cf3589d5f7d091866a5f466c049fd0cf72eb3ebd9464f54b18d5016cd1efacd9911488f31d92ceb674653aadb186d66f0f1626d81f2a249123b9b61a44acbff5cff1392f9430ee4c20f37557acd77c98a219ab7184b5ebdafad69c2e3ff823f0e8b46e12b5a3a9ce67978618e9ab6ac3180c85fbaf138928bcc3a4d8bc7c8b2830bcd43938201405fb0fb714d6e5cf641c187170c1fa62ad0b9b988d3fddd4e227ddf6aae172329307a3e44ea360b9696d057849217da30fc0d462febad8bcad26deaa7ce7002235095faaac415445652eeb0c44063455426b29ccb43abd73711324cfb593d35289bed837f25873b0eb8983c557f5e6cf557a49936db3bc607fc3b9a15dbfd2995f539de27af947d885240410389fecce9985e61047cffa1b11505ffc5488515edbb3026273bb696a4b10775d91700447f939829706b3c582409cf1345b9d011053666f74525149807962834973c4c8392f23c27c8a09602ab5c5e259a3a7f1f6c552bd88face64fc891bd0fe8fb52a81fa7a7eadf873705d0acee164569e20e017f89df54fa43a72e099f92e054823db435454f77f4e487a4ef37d1f0f4df690001273b3e0cf26642b7537b3e71e5b1469e6563da7b5c43a3d01335afaf2ecc3938007851d9f85d9fa140e6e9e7e3fa8ea7aa2e93d054cf78c4d302a4ad51f6e42c39416d7733bdecb36bbc5811beaf4bac9ac497bc799ec94ba185da5c206743023fc4043d48b1b8b619edf42da3b1a9575e739142ba7c8514c82ba00f6ce4e5c81f2a7a4499310f90b70adecc7cbffbf8487cee51d3917bd556677cae49deaf94755c61d60ca65e1a9547cce7fa03791436db33f8661d6a62fb77c8ad03d16d9bd5160ba2716abe7a0f1e7b2ba38aba8ed08fc911b353178cf702f7348cec5ab54c36e0b68c180dc3ea6b507876136dac2a5d3894b87ba6559a95cf655dcd381aa48157dbae71a0ef92b036f35aa5b49ad4574f305b024bc397b281e6e5890c0f53b867324ca918486b94a8bcd7fa5ef555978743d19c1c21961a1bef02e1c00e5683a1b9d57a32934e7ff17d5e115349ca80fe93d5a3e6a722de7cd4460aece01ae911a6067419b7a844a37306e76f22627e68951f4d2a05b47e39c9316f3febfb7093447d3d2d4192c9b0a2a8c64708cc8cac5d53d37b9123f65b5e0d73249c664c3e732e66a18afbd05f216cb04276000c5297065326e1ae8ca00cc580b71fd0e5db99819c127d8f5e12a5e4c7bb8d18e12f2c8808e77147c466ac25b84d8ceb1fecbd1a2016eee58e3523fd62876ddd45262ff6720c39528a48f86d4eb2fc2d3deb072bf3ac94c547f0bd8eb8f9031803c9ce24800183aa342f8f005d1ab6590e31228f2551c5c4bc5b3fa7af1a3c31319cde624de8f672ccfadd948562b4dade4cc5f985ddd26e54f60723936a46a0df0625124389f49257e6f3a970c9cde0f058e756d69303cc0b38fc5af74072d7e17395bd9027fadfd138a247c1b990cb2523af232fd6a8b107d4b8c412079dd0cc480974404ee04e78603c5c60048f30686483bc246a50d1cceaf542aec0f47a8f7f6c5b6a2cfb80c7022ec550e9593f253d4e7bfc4b8b6cba67e3664c6439fd33638060d74ad03aa368b864cc4551b6a401ac60c51f2d4525b95f8138ddc16c304279bffcd0c8012ba1e18d3f521fe43ae227d846d508c0157a7290e48901b07fbfa1b51ddf26fe9f801b8072ee80d163201d350180c2d72f01ddf985e461c3af39426190d47f05b1ee5072ebc549db91ff63d6a3b0813773180000000ffc0c424954474f2f5a45432f5636020498b684d80ffc0c424954474f2f5a45432f56360304000000000001012000c2eb0b0000000017a914a6501f49ca2a3fcfffa4305390d652aa4228d1df8701030401000000010469522102dc096ed5a904b2b44d13da435fff01638102a0bb138660f49f2965032213ec2e210306424d7dc076a4c4b8f0ad767990802f8a7c8d0ce4bd19a5c463aa7b023ce03c2102db27fe95a09f5b5a94c70f9310ac2e63a8d67ffdb1092a10180279bdc4cf0f3d53ae220602db27fe95a09f5b5a94c70f9310ac2e63a8d67ffdb1092a10180279bdc4cf0f3d1424cb7ad300000000000000000000000000000000220602dc096ed5a904b2b44d13da435fff01638102a0bb138660f49f2965032213ec2e140934c8db0000000000000000000000000000000022060306424d7dc076a4c4b8f0ad767990802f8a7c8d0ce4bd19a5c463aa7b023ce03c148fe9bf4b0000000000000000000000000000000000010069522102e13b65040a5908f2837fc699899542e79c858efaa7a87878d64fcfc36d2b0edf21025e3bde51e74dfa995b6370ad7d636f2e7448e85a4a1588a1f5078cddcbb904852103674dc406d6a13957aad5ed3713e6d5583500b4d86145eb12a4b9f23fe3a9bef353ae2202025e3bde51e74dfa995b6370ad7d636f2e7448e85a4a1588a1f5078cddcbb90485148fe9bf4b00000000000000000000000001000000220202e13b65040a5908f2837fc699899542e79c858efaa7a87878d64fcfc36d2b0edf140934c8db00000000000000000000000001000000220203674dc406d6a13957aad5ed3713e6d5583500b4d86145eb12a4b9f23fe3a9bef31424cb7ad30000000000000000000000000100000000 \ No newline at end of file diff --git a/packages/wasm-utxo/test/fixtures/zcash/v6_unshield_details.json b/packages/wasm-utxo/test/fixtures/zcash/v6_unshield_details.json index 000dae7ff81..f545396e25a 100644 --- a/packages/wasm-utxo/test/fixtures/zcash/v6_unshield_details.json +++ b/packages/wasm-utxo/test/fixtures/zcash/v6_unshield_details.json @@ -1,5 +1,5 @@ { - "description": "Ironwood -> transparent deshielding transaction (v6, ironwood_v3, PostNu6_3 circuit). Built and signed with this codebase's CLI (one Ironwood spend, one transparent P2PKH payout), proven locally with the orchard-proving feature, broadcast to a live Zcash testnet zebrad node via sendrawtransaction and mined at block 4532255 under the NU7 consensus branch.", + "description": "Ironwood -> transparent deshielding transaction (v6, ironwood_v3, PostNu6_3 circuit). Built and signed with this codebase's CLI (one Ironwood spend, one transparent P2PKH payout), proven locally with the orchard-proving feature, broadcast to a live Zcash testnet zebrad node via sendrawtransaction and mined at block 4532255 under the NU7 consensus branch. Built before the Constructor switched to content-matched flags: it carries 0x07, where the current code would emit 0x05 (spends | cross-address) for this spends-only bundle.", "network": "test", "txid": "93b98b4a68527e10246b577bef45edee65a7d6e8d27acc0e82abc8836f26ed54", "block_height": 4532255,