self.utxos.remove(&input.previous_output); } for (vout, txout) in tx.output.iter().enumerate() { self.utxos.insert( OutPoint { txid: tx.txid(), vout: vout.try_into().unwrap(), }, Amount::from_sat(txout.value), ); } } self.blocks.insert(block.block_hash(), block.clone()); self.hashes.push(block.block_hash()); self.nonce += 1; block } pub(crate) fn pop_block(&mut self) -> BlockHash { let blockhash = self.hashes.pop().unwrap(); self.blocks.remove(&blockhash); blockhash } pub(crate) fn broadcast_tx(&mut self, template: TransactionTemplate) -> Txid { let mut total_value = 0; let mut input = Vec::new(); for (height, tx, vout, witness) in template.inputs.iter() { let tx = &self.blocks.get(&self.hashes[*height]).unwrap().txdata[*tx]; total_value += tx.output[*vout].value; input.push(TxIn { previous_output: OutPoint::new(tx.txid(), *vout as u32),