From a39d70bf3165f3e59b4a3acede3c34ce5a414ea3 Mon Sep 17 00:00:00 2001 From: Ignacio Pulice Donatto Date: Tue, 10 Feb 2026 10:35:08 -0300 Subject: [PATCH 1/3] Refactor transaction handling to ensure safe access. Updated instances to unwrap transactions safely --- examples/cardinal/lockservice.rs | 7 +- src/program/protocols/cardinal/lock.rs | 2 +- src/program/protocols/cardinal/slot.rs | 26 +++--- src/program/protocols/dispute/tx_news.rs | 88 +++++++++++++++++--- src/program/protocols/union/accept_pegin.rs | 8 +- src/program/protocols/union/advance_funds.rs | 9 +- src/program/protocols/union/dispute_core.rs | 8 +- src/program/protocols/union/reject_pegin.rs | 2 +- 8 files changed, 121 insertions(+), 29 deletions(-) diff --git a/examples/cardinal/lockservice.rs b/examples/cardinal/lockservice.rs index 820e1941..2de65ca9 100644 --- a/examples/cardinal/lockservice.rs +++ b/examples/cardinal/lockservice.rs @@ -444,11 +444,14 @@ pub fn lockservice(channel: LocalChannel, identifier: Identifier) _ => panic!("Expected Transaction message"), }; - info!("Received message from channel: {:?}", status.tx_id); + info!( + "Received message from channel: {:?}", + status.tx.as_ref().unwrap().compute_txid() + ); info!("happy path secret: {}", fake_secret); info!("happy path public: {}", aggregated_happy_path); - let msg = serde_json::to_string(&(status.tx_id, fake_secret))?; + let msg = serde_json::to_string(&(status.tx.unwrap().compute_txid(), fake_secret))?; channel.send(&identifier, msg)?; } diff --git a/src/program/protocols/cardinal/lock.rs b/src/program/protocols/cardinal/lock.rs index afeb6e7f..a688b7d4 100644 --- a/src/program/protocols/cardinal/lock.rs +++ b/src/program/protocols/cardinal/lock.rs @@ -114,7 +114,7 @@ impl ProtocolHandler for LockProtocol { ); } if name == LOCK_TX && tx_status.confirmations == 1 { - let witness = tx_status.tx.input[0].witness.clone(); + let witness = tx_status.tx.unwrap().input[0].witness.clone(); info!( "secret witness {:?}", String::from_utf8(witness[1].to_vec()) diff --git a/src/program/protocols/cardinal/slot.rs b/src/program/protocols/cardinal/slot.rs index 366e0f2a..115d4fda 100644 --- a/src/program/protocols/cardinal/slot.rs +++ b/src/program/protocols/cardinal/slot.rs @@ -231,15 +231,13 @@ impl ProtocolHandler for SlotProtocol { .parse::()?; info!("Operator {} has sent a certificate hash", operator); - self.decode_witness_for_tx( - &name, - 0, - program_context, - &tx_status.tx, - Some(0), - None, - None, - )?; + let tx = tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; + self.decode_witness_for_tx(&name, 0, program_context, tx, Some(0), None, None)?; // after sending the certificate hash, the operator should send the group id if self.ctx.my_idx == operator as usize { @@ -285,7 +283,7 @@ impl ProtocolHandler for SlotProtocol { .unwrap() .number()?; - let txid = tx_status.tx_id; + let txid = tx_status.tx_id(); //notify when the stops are consumed for i in 0..total_operators - 1 { @@ -463,11 +461,17 @@ impl ProtocolHandler for SlotProtocol { .collect(); info!("Operator {} has sent a group id", op_and_id[0]); + let tx = tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; self.decode_witness_for_tx( &name, 0, program_context, - &tx_status.tx, + tx, Some(op_and_id[1]), None, None, diff --git a/src/program/protocols/dispute/tx_news.rs b/src/program/protocols/dispute/tx_news.rs index 2b5a5dcb..db2d3b49 100644 --- a/src/program/protocols/dispute/tx_news.rs +++ b/src/program/protocols/dispute/tx_news.rs @@ -723,7 +723,13 @@ pub fn handle_tx_news( match vout { Some(vout) => { - let transaction = &tx_status.tx; + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; let input_index = drp.find_prevout(tx_id, vout, transaction)?; let witness = transaction.input[input_index as usize].witness.clone(); @@ -768,12 +774,19 @@ pub fn handle_tx_news( // decode the witness if owner != drp.role().to_string() { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; unify_witnesses(&drp.ctx.id, program_context, idx as usize)?; @@ -860,12 +873,19 @@ pub fn handle_tx_news( } if name == COMMITMENT && drp.role() == ParticipantRole::Verifier { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; @@ -935,12 +955,19 @@ pub fn handle_tx_news( .parse::()?; if round == 0 { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; } @@ -979,12 +1006,19 @@ pub fn handle_tx_news( } if name == EXECUTE && drp.role() == ParticipantRole::Verifier { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; let (_, leaf) = drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; @@ -1097,12 +1131,19 @@ pub fn handle_tx_news( } if name == CHALLENGE && drp.role() == ParticipantRole::Prover { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; let (names, leaf) = drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; @@ -1229,12 +1270,19 @@ pub fn handle_tx_news( } if GET_HASHES_AND_STEP == name && drp.role() == ParticipantRole::Verifier { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; let (_, leaf) = drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; @@ -1292,12 +1340,19 @@ pub fn handle_tx_news( if name == CHALLENGE_READ && drp.role() == ParticipantRole::Prover { info!("The challenge has ended after the 2nd n-ary search."); + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; } @@ -1368,12 +1423,19 @@ fn handle_nary_verifier( let decision = if name == prev_name { decision_start_value } else { + let transaction = + tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; drp.decode_witness_from_speedup( tx_id, vout, &name, program_context, - &tx_status.tx, + transaction, None, )?; @@ -1463,8 +1525,14 @@ fn handle_nary_prover( prover_hash: &str, // "prover_hash" nary_search_type: NArySearchType, // ConflictStep ) -> Result<(), BitVMXError> { + let transaction = tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; let (_, leaf) = - drp.decode_witness_from_speedup(tx_id, vout, &name, program_context, &tx_status.tx, None)?; + drp.decode_witness_from_speedup(tx_id, vout, &name, program_context, transaction, None)?; let params = program_context .globals diff --git a/src/program/protocols/union/accept_pegin.rs b/src/program/protocols/union/accept_pegin.rs index 50b03734..a6eb7dd4 100644 --- a/src/program/protocols/union/accept_pegin.rs +++ b/src/program/protocols/union/accept_pegin.rs @@ -371,7 +371,13 @@ impl ProtocolHandler for AcceptPegInProtocol { if operator_index == self.ctx.my_idx { // Both, OPERATOR_TAKE_TX and OPERATOR_WON_TX, have the same output index to reimburse funds to the operator let output_index: u32 = 0; - let amount = tx_status.tx.output[output_index as usize].value.to_sat(); + let tx = tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; + let amount = tx.output[output_index as usize].value.to_sat(); let utxo = ( tx_id, output_index, diff --git a/src/program/protocols/union/advance_funds.rs b/src/program/protocols/union/advance_funds.rs index e2b7362f..7841c3db 100644 --- a/src/program/protocols/union/advance_funds.rs +++ b/src/program/protocols/union/advance_funds.rs @@ -256,8 +256,13 @@ impl ProtocolHandler for AdvanceFundsProtocol { block_height, )?; - let tx = tx_status.tx; - self.update_advance_funds_input(context, &tx)?; + let tx = tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; + self.update_advance_funds_input(context, tx)?; } Ok(()) diff --git a/src/program/protocols/union/dispute_core.rs b/src/program/protocols/union/dispute_core.rs index 2df9193a..dc33cbf2 100644 --- a/src/program/protocols/union/dispute_core.rs +++ b/src/program/protocols/union/dispute_core.rs @@ -2224,11 +2224,17 @@ impl DisputeCoreProtocol { REVEAL_INPUT_TX_REVEAL_LEAF as u32, )?; + let tx = tx_status + .tx + .as_ref() + .ok_or(BitVMXError::InvalidTransactionStatus( + "Missing transaction data in tx_status".to_string(), + ))?; self.decode_witness_for_tx( tx_name, REVEAL_INPUT_TX_REVEAL_INDEX as u32, context, - &tx_status.tx, + tx, Some(REVEAL_INPUT_TX_REVEAL_LEAF as u32), Some(protocol), Some(vec![script]), diff --git a/src/program/protocols/union/reject_pegin.rs b/src/program/protocols/union/reject_pegin.rs index 508c80a3..1372cce9 100644 --- a/src/program/protocols/union/reject_pegin.rs +++ b/src/program/protocols/union/reject_pegin.rs @@ -173,7 +173,7 @@ impl ProtocolHandler for RejectPegInProtocol { tx, speedup, Context::ProgramId(self.ctx.id).to_string()?, - None, // Dispatch immediately + None, // Dispatch immediately self.requested_confirmations(context), )?; From 3dbcd5a6bae4147e27b114d2d646d5c142b5587a Mon Sep 17 00:00:00 2001 From: Ignacio Pulice Donatto Date: Thu, 19 Feb 2026 13:04:10 -0300 Subject: [PATCH 2/3] Fix build errors: add IndexerError mapping and update TransactionStatus usage - Add IndexerError mapping in errors.rs using #[from] attribute - Replace tx_status.tx unwrapping with tx_status.tx_or_err()? in multiple files: - dispute/tx_news.rs - union/accept_pegin.rs - union/advance_funds.rs - union/dispute_core.rs - cardinal/slot.rs - Fix tx_id() method call to use tx.compute_txid() in slot.rs - Replace block_info.unwrap() with block_info_or_err()? to fix ownership issues - Add TransactionStuckInMempool pattern match in bitvmx.rs --- src/bitvmx.rs | 5 ++ src/errors.rs | 5 +- src/program/protocols/cardinal/slot.rs | 19 ++--- src/program/protocols/dispute/tx_news.rs | 90 +++----------------- src/program/protocols/union/accept_pegin.rs | 7 +- src/program/protocols/union/advance_funds.rs | 9 +- src/program/protocols/union/dispute_core.rs | 7 +- 7 files changed, 30 insertions(+), 112 deletions(-) diff --git a/src/bitvmx.rs b/src/bitvmx.rs index 99251b0e..871455a4 100644 --- a/src/bitvmx.rs +++ b/src/bitvmx.rs @@ -762,6 +762,11 @@ impl BitVMX { // TODO: Complete what to do here ack_news = AckNews::Coordinator(AckCoordinatorNews::NetworkError(tx_id)); } + CoordinatorNews::TransactionStuckInMempool(tx_id, _context_data) => { + // TODO: Complete what to do here + ack_news = + AckNews::Coordinator(AckCoordinatorNews::TransactionStuckInMempool(tx_id)); + } } self.program_context diff --git a/src/errors.rs b/src/errors.rs index bb12ba80..ace0d99b 100644 --- a/src/errors.rs +++ b/src/errors.rs @@ -1,5 +1,5 @@ use bitcoin::{consensus::encode::FromHexError, network::ParseNetworkError, Witness}; -use bitcoin_coordinator::errors::BitcoinCoordinatorError; +use bitcoin_coordinator::{errors::BitcoinCoordinatorError, IndexerError}; use bitcoincore_rpc::bitcoin::{key::ParsePublicKeyError, sighash::SighashTypeParseError}; use bitvmx_broker::{identification::errors::IdentificationError, rpc::errors::BrokerError}; use bitvmx_cpu_definitions::challenge::EmulatorResultError; @@ -265,6 +265,9 @@ pub enum BitVMXError { #[error("Failed to use Bitcoin Coordinator: {0}")] BitcoinCoordinatorError(#[from] BitcoinCoordinatorError), + #[error("Indexer error: {0}")] + IndexerError(#[from] IndexerError), + #[error("Invalid transaction name {0}")] InvalidTransactionName(String), diff --git a/src/program/protocols/cardinal/slot.rs b/src/program/protocols/cardinal/slot.rs index 115d4fda..4ccd16dd 100644 --- a/src/program/protocols/cardinal/slot.rs +++ b/src/program/protocols/cardinal/slot.rs @@ -231,12 +231,7 @@ impl ProtocolHandler for SlotProtocol { .parse::()?; info!("Operator {} has sent a certificate hash", operator); - let tx = tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let tx = tx_status.tx_or_err()?; self.decode_witness_for_tx(&name, 0, program_context, tx, Some(0), None, None)?; // after sending the certificate hash, the operator should send the group id @@ -283,7 +278,7 @@ impl ProtocolHandler for SlotProtocol { .unwrap() .number()?; - let txid = tx_status.tx_id(); + let txid = tx.compute_txid(); //notify when the stops are consumed for i in 0..total_operators - 1 { @@ -443,11 +438,12 @@ impl ProtocolHandler for SlotProtocol { 0, )?; let speedup_data = self.get_speedup_data_from_tx(&tx, program_context, None)?; + let block_height = tx_status.block_info_or_err()?.height; program_context.bitcoin_coordinator.dispatch( tx, Some(speedup_data), Context::ProgramId(self.ctx.id).to_string()?, - Some(tx_status.block_info.unwrap().height + timelock_blocks), + Some(block_height + timelock_blocks), self.requested_confirmations(program_context), )?; } @@ -461,12 +457,7 @@ impl ProtocolHandler for SlotProtocol { .collect(); info!("Operator {} has sent a group id", op_and_id[0]); - let tx = tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let tx = tx_status.tx_or_err()?; self.decode_witness_for_tx( &name, 0, diff --git a/src/program/protocols/dispute/tx_news.rs b/src/program/protocols/dispute/tx_news.rs index db2d3b49..aecc38f0 100644 --- a/src/program/protocols/dispute/tx_news.rs +++ b/src/program/protocols/dispute/tx_news.rs @@ -631,15 +631,8 @@ pub fn handle_tx_news( program_context: &ProgramContext, ) -> Result<(), BitVMXError> { let name = drp.get_transaction_name_by_id(tx_id)?; - let current_height = tx_status - .block_info - .as_ref() - .ok_or_else(|| { - BitVMXError::InvalidTransactionStatus( - "TransactionStatus missing block_info".to_string(), - ) - })? - .height; + let current_height = tx_status.block_info_or_err()?.height; + info!( "Program {}: Transaction name: {} id: {}:{:?} has been seen on-chain {}. Height: {}", drp.ctx.id, @@ -723,13 +716,7 @@ pub fn handle_tx_news( match vout { Some(vout) => { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; let input_index = drp.find_prevout(tx_id, vout, transaction)?; let witness = transaction.input[input_index as usize].witness.clone(); @@ -774,13 +761,7 @@ pub fn handle_tx_news( // decode the witness if owner != drp.role().to_string() { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; drp.decode_witness_from_speedup( tx_id, vout, @@ -873,13 +854,7 @@ pub fn handle_tx_news( } if name == COMMITMENT && drp.role() == ParticipantRole::Verifier { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; drp.decode_witness_from_speedup( tx_id, vout, @@ -955,13 +930,7 @@ pub fn handle_tx_news( .parse::()?; if round == 0 { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; drp.decode_witness_from_speedup( tx_id, vout, @@ -1006,13 +975,7 @@ pub fn handle_tx_news( } if name == EXECUTE && drp.role() == ParticipantRole::Verifier { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; let (_, leaf) = drp.decode_witness_from_speedup( tx_id, vout, @@ -1131,13 +1094,7 @@ pub fn handle_tx_news( } if name == CHALLENGE && drp.role() == ParticipantRole::Prover { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; let (names, leaf) = drp.decode_witness_from_speedup( tx_id, vout, @@ -1270,13 +1227,7 @@ pub fn handle_tx_news( } if GET_HASHES_AND_STEP == name && drp.role() == ParticipantRole::Verifier { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; let (_, leaf) = drp.decode_witness_from_speedup( tx_id, vout, @@ -1340,13 +1291,7 @@ pub fn handle_tx_news( if name == CHALLENGE_READ && drp.role() == ParticipantRole::Prover { info!("The challenge has ended after the 2nd n-ary search."); - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; drp.decode_witness_from_speedup( tx_id, vout, @@ -1423,13 +1368,7 @@ fn handle_nary_verifier( let decision = if name == prev_name { decision_start_value } else { - let transaction = - tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; drp.decode_witness_from_speedup( tx_id, vout, @@ -1525,12 +1464,7 @@ fn handle_nary_prover( prover_hash: &str, // "prover_hash" nary_search_type: NArySearchType, // ConflictStep ) -> Result<(), BitVMXError> { - let transaction = tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let transaction = tx_status.tx_or_err()?; let (_, leaf) = drp.decode_witness_from_speedup(tx_id, vout, &name, program_context, transaction, None)?; diff --git a/src/program/protocols/union/accept_pegin.rs b/src/program/protocols/union/accept_pegin.rs index a6eb7dd4..20316b13 100644 --- a/src/program/protocols/union/accept_pegin.rs +++ b/src/program/protocols/union/accept_pegin.rs @@ -371,12 +371,7 @@ impl ProtocolHandler for AcceptPegInProtocol { if operator_index == self.ctx.my_idx { // Both, OPERATOR_TAKE_TX and OPERATOR_WON_TX, have the same output index to reimburse funds to the operator let output_index: u32 = 0; - let tx = tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let tx = tx_status.tx_or_err()?; let amount = tx.output[output_index as usize].value.to_sat(); let utxo = ( tx_id, diff --git a/src/program/protocols/union/advance_funds.rs b/src/program/protocols/union/advance_funds.rs index 7841c3db..e96417a3 100644 --- a/src/program/protocols/union/advance_funds.rs +++ b/src/program/protocols/union/advance_funds.rs @@ -256,12 +256,7 @@ impl ProtocolHandler for AdvanceFundsProtocol { block_height, )?; - let tx = tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let tx = tx_status.tx_or_err()?; self.update_advance_funds_input(context, tx)?; } @@ -411,7 +406,7 @@ impl AdvanceFundsProtocol { tx.clone(), speedup, Context::ProgramId(self.ctx.id).to_string()?, - block_height, // Dispatch immediately + block_height, // Dispatch immediately self.requested_confirmations(context), )?; diff --git a/src/program/protocols/union/dispute_core.rs b/src/program/protocols/union/dispute_core.rs index dc33cbf2..dae62a65 100644 --- a/src/program/protocols/union/dispute_core.rs +++ b/src/program/protocols/union/dispute_core.rs @@ -2224,12 +2224,7 @@ impl DisputeCoreProtocol { REVEAL_INPUT_TX_REVEAL_LEAF as u32, )?; - let tx = tx_status - .tx - .as_ref() - .ok_or(BitVMXError::InvalidTransactionStatus( - "Missing transaction data in tx_status".to_string(), - ))?; + let tx = tx_status.tx_or_err()?; self.decode_witness_for_tx( tx_name, REVEAL_INPUT_TX_REVEAL_INDEX as u32, From b66b0c6019bacbb9d95c160529321b0b4f56286d Mon Sep 17 00:00:00 2001 From: Ignacio Pulice Donatto Date: Thu, 19 Feb 2026 15:24:07 -0300 Subject: [PATCH 3/3] Update lock protocol to use tx_or_err() instead of unwrap() - Replace tx_status.tx.unwrap() with tx_status.tx_or_err()? in lock.rs - Update lockservice.rs example to match the new pattern --- examples/cardinal/lockservice.rs | 3 ++- src/program/protocols/cardinal/lock.rs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/cardinal/lockservice.rs b/examples/cardinal/lockservice.rs index 469edc7b..c7bb25c1 100644 --- a/examples/cardinal/lockservice.rs +++ b/examples/cardinal/lockservice.rs @@ -455,7 +455,8 @@ pub fn lockservice(channel: LocalChannel, identifier: Identifier) info!("happy path secret: {}", fake_secret); info!("happy path public: {}", aggregated_happy_path); - let msg = serde_json::to_string(&(status.tx.unwrap().compute_txid(), fake_secret))?; + let tx = status.tx_or_err()?; + let msg = serde_json::to_string(&(tx.compute_txid(), fake_secret))?; channel.send(&identifier, msg)?; } diff --git a/src/program/protocols/cardinal/lock.rs b/src/program/protocols/cardinal/lock.rs index a688b7d4..cd7044f7 100644 --- a/src/program/protocols/cardinal/lock.rs +++ b/src/program/protocols/cardinal/lock.rs @@ -114,7 +114,8 @@ impl ProtocolHandler for LockProtocol { ); } if name == LOCK_TX && tx_status.confirmations == 1 { - let witness = tx_status.tx.unwrap().input[0].witness.clone(); + let tx = tx_status.tx_or_err()?; + let witness = tx.input[0].witness.clone(); info!( "secret witness {:?}", String::from_utf8(witness[1].to_vec())