zebra_consensus/block/
subsidy.rs1use zebra_chain::{
6 block::Height,
7 parameters::{subsidy::*, Network},
8 transparent::{self},
9};
10
11#[cfg(test)]
12mod tests;
13
14fn funding_stream_address_index(
19 height: Height,
20 network: &Network,
21 receiver: FundingStreamReceiver,
22) -> Option<usize> {
23 if receiver == FundingStreamReceiver::Deferred {
24 return None;
25 }
26
27 let funding_streams = network.funding_streams(height)?;
28 let num_addresses = funding_streams.recipient(receiver)?.addresses().len();
29
30 let index = 1u32
31 .checked_add(funding_stream_address_period(height, network))?
32 .checked_sub(funding_stream_address_period(
33 funding_streams.height_range().start,
34 network,
35 ))? as usize;
36
37 assert!(index > 0 && index <= num_addresses);
38 Some(index - 1)
41}
42
43pub fn funding_stream_address(
48 height: Height,
49 network: &Network,
50 receiver: FundingStreamReceiver,
51) -> Option<&transparent::Address> {
52 let index = funding_stream_address_index(height, network, receiver)?;
53 let funding_streams = network.funding_streams(height)?;
54 funding_streams.recipient(receiver)?.addresses().get(index)
55}