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}