Skip to main content

zebra_chain/ironwood/
arbitrary.rs

1//! Randomised data generation for Ironwood types.
2
3use proptest::prelude::*;
4
5use crate::{
6    ironwood::{Nullifier, ShieldedData},
7    orchard,
8};
9
10impl Arbitrary for Nullifier {
11    type Parameters = ();
12
13    fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
14        any::<orchard::Nullifier>().prop_map(Nullifier).boxed()
15    }
16
17    type Strategy = BoxedStrategy<Self>;
18}
19
20impl Arbitrary for ShieldedData {
21    type Parameters = ();
22
23    fn arbitrary_with(_args: Self::Parameters) -> Self::Strategy {
24        (any::<orchard::ShieldedData>(), any::<u8>())
25            .prop_map(|(mut shielded_data, flag_bits)| {
26                // The base Orchard strategy only generates the pre-NU6.3 flag bits, because
27                // Orchard-pool bundles (v5 and v6) reserve `enableCrossAddress`. The Ironwood
28                // bundle is the only place that flag is valid, so re-generate the flags over
29                // all three defined bits to exercise the `FlagsV6` codec path.
30                shielded_data.flags = orchard::Flags::from_bits_truncate(flag_bits);
31                Self::new(orchard::ShieldedDataV6::new(shielded_data))
32            })
33            .boxed()
34    }
35
36    type Strategy = BoxedStrategy<Self>;
37}