1use std::sync::Arc;
4
5use zebra_chain::{
6 amount::Amount,
7 block::{self, Block},
8 transaction::Transaction,
9 transparent,
10 value_balance::ValueBalance,
11};
12
13use crate::{
14 request::ContextuallyVerifiedBlock, service::chain_tip::ChainTipBlock,
15 SemanticallyVerifiedBlock,
16};
17
18pub trait Prepare {
20 fn prepare(self) -> SemanticallyVerifiedBlock;
23}
24
25impl Prepare for Arc<Block> {
26 fn prepare(self) -> SemanticallyVerifiedBlock {
27 self.into()
28 }
29}
30
31impl<T> From<T> for ChainTipBlock
32where
33 T: Prepare,
34{
35 fn from(block: T) -> Self {
36 block.prepare().into()
37 }
38}
39
40impl SemanticallyVerifiedBlock {
41 #[cfg(test)]
46 pub fn test_with_zero_spent_utxos(&self) -> ContextuallyVerifiedBlock {
47 ContextuallyVerifiedBlock::test_with_zero_spent_utxos(self)
48 }
49
50 #[cfg(test)]
55 pub fn test_with_zero_chain_pool_change(&self) -> ContextuallyVerifiedBlock {
56 ContextuallyVerifiedBlock::test_with_zero_chain_pool_change(self)
57 }
58}
59
60impl ContextuallyVerifiedBlock {
61 pub fn test_with_zero_spent_utxos(block: impl Into<SemanticallyVerifiedBlock>) -> Self {
66 let block = block.into();
67
68 let zero_output = transparent::Output {
69 value: Amount::zero(),
70 lock_script: transparent::Script::new(&[]),
71 };
72
73 let zero_utxo = transparent::OrderedUtxo::new(zero_output, block::Height(1), 1);
74
75 let zero_spent_utxos = block
76 .block
77 .transactions
78 .iter()
79 .map(AsRef::as_ref)
80 .flat_map(Transaction::inputs)
81 .flat_map(transparent::Input::outpoint)
82 .map(|outpoint| (outpoint, zero_utxo.clone()))
83 .collect();
84
85 ContextuallyVerifiedBlock::with_block_and_spent_utxos(block, zero_spent_utxos)
86 .expect("all UTXOs are provided with zero values")
87 }
88
89 pub fn test_with_zero_chain_pool_change(block: impl Into<SemanticallyVerifiedBlock>) -> Self {
94 let SemanticallyVerifiedBlock {
95 block,
96 hash,
97 height,
98 new_outputs,
99 transaction_hashes,
100 deferred_pool_balance_change: _,
101 } = block.into();
102
103 Self {
104 block,
105 hash,
106 height,
107 new_outputs: new_outputs.clone(),
108 spent_outputs: new_outputs,
112 transaction_hashes,
113 chain_value_pool_change: ValueBalance::zero(),
114 }
115 }
116}