ledger_view.rs (2876B)
1 use anyhow::Result; 2 3 use std::collections::BTreeSet; 4 5 use crate::domain::{ 6 BlindedReveal, BlindedTransaction, Block, BurnLeaderRank, Ledger, OutPoint, Transaction, 7 }; 8 9 use super::{NodeCore, helpers::transaction_input_outpoints}; 10 11 impl NodeCore { 12 pub fn ledger(&self) -> &Ledger { 13 &self.ledger 14 } 15 16 pub(crate) fn clone_ledger(&self) -> Ledger { 17 self.ledger.clone() 18 } 19 20 pub fn wallet_view_ledger(&self) -> Result<Ledger> { 21 let mut ledger = self.ledger.clone(); 22 self.queue_local_block_anchor(&mut ledger)?; 23 self.queue_owned_blinded_payloads(&mut ledger)?; 24 Ok(ledger) 25 } 26 27 pub fn wallet_pending_spent_outpoints(&self) -> BTreeSet<OutPoint> { 28 let mut spent = self 29 .ledger 30 .pending() 31 .iter() 32 .flat_map(transaction_input_outpoints) 33 .chain( 34 self.ledger 35 .pending_blinded_transactions() 36 .iter() 37 .flat_map(|transaction| { 38 transaction 39 .inputs 40 .iter() 41 .map(|input| input.outpoint.clone()) 42 }), 43 ) 44 .collect::<BTreeSet<_>>(); 45 if let Some((height, burn)) = &self.local_block_anchor_burn { 46 if *height == self.ledger.height() && !self.ledger.has_transaction(burn.signature()) { 47 spent.extend(transaction_input_outpoints(burn)); 48 } 49 } 50 spent 51 } 52 53 pub fn chain(&self) -> &[Block] { 54 self.ledger.chain() 55 } 56 57 pub fn chain_height(&self) -> u64 { 58 self.ledger.height() 59 } 60 61 pub fn chain_tip_hash(&self) -> String { 62 self.ledger.tip_hash().to_string() 63 } 64 65 pub fn has_real_chain(&self) -> bool { 66 !self.ledger.is_setup_placeholder() 67 } 68 69 pub fn recent_blocks(&self, limit: usize) -> Vec<Block> { 70 self.ledger.recent_blocks(limit) 71 } 72 73 pub fn blocks_before(&self, before_height: u64, limit: usize) -> Vec<Block> { 74 self.ledger.blocks_before(before_height, limit) 75 } 76 77 pub fn burn_leader_ranks_for_block(&self, height: u64) -> Result<Vec<BurnLeaderRank>> { 78 self.ledger.burn_leader_ranks_for_block(height) 79 } 80 81 pub fn pending_transactions(&self) -> Vec<Transaction> { 82 self.ledger.pending().to_vec() 83 } 84 85 pub fn pending_blinded_transactions(&self) -> Vec<BlindedTransaction> { 86 self.ledger.pending_blinded_transactions().to_vec() 87 } 88 89 pub fn pending_blinded_reveals(&self) -> Vec<BlindedReveal> { 90 self.ledger.pending_blinded_reveals().to_vec() 91 } 92 93 pub fn pending_revealed_blinded_transactions( 94 &self, 95 ) -> Vec<crate::domain::RevealedBlindedTransaction> { 96 self.ledger.pending_revealed_blinded_transactions() 97 } 98 }