From afbf83c8b0d5c97495e6ceaa39963415edef6911 Mon Sep 17 00:00:00 2001 From: Wei Chen Date: Fri, 1 Sep 2023 17:58:47 +0800 Subject: [PATCH] chain(fix): conflict resolution for txs with same last_seen The tx conflict `Scenario` test for unconfirmed txs with the same last_seen has been amended for its corresponding conflict resolution bug fix. --- crates/chain/src/tx_graph.rs | 6 ++++++ crates/chain/tests/test_tx_graph_conflicts.rs | 12 +++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/crates/chain/src/tx_graph.rs b/crates/chain/src/tx_graph.rs index 1f7bcdb12..6fb1ee4fa 100644 --- a/crates/chain/src/tx_graph.rs +++ b/crates/chain/src/tx_graph.rs @@ -789,6 +789,12 @@ impl TxGraph { if conflicting_tx.last_seen_unconfirmed > tx_last_seen { return Ok(None); } + if conflicting_tx.last_seen_unconfirmed == *last_seen + && conflicting_tx.txid() > tx.txid() + { + // Conflicting tx has priority if txid of conflicting tx > txid of original tx + return Ok(None); + } } } diff --git a/crates/chain/tests/test_tx_graph_conflicts.rs b/crates/chain/tests/test_tx_graph_conflicts.rs index 1794d8452..53a19b022 100644 --- a/crates/chain/tests/test_tx_graph_conflicts.rs +++ b/crates/chain/tests/test_tx_graph_conflicts.rs @@ -50,10 +50,10 @@ fn test_tx_conflict_handling() { tx_templates: &[ TxTemplate { tx_name: "tx1", - inputs: &[TxInTemplate::Bogus], outputs: &[TxOutTemplate::new(40000, Some(0))], anchors: &[block_id!(1, "B")], last_seen: None, + ..Default::default() }, TxTemplate { tx_name: "tx_conflict_1", @@ -70,14 +70,12 @@ fn test_tx_conflict_handling() { ..Default::default() }, ], - // correct output if filtered by fee rate: tx1, tx_conflict_1 - exp_chain_txs: HashSet::from(["tx1", "tx_conflict_1", "tx_conflict_2"]), - exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_1", 0), ("tx_conflict_2", 0)]), - // correct output if filtered by fee rate: tx_conflict_1 - exp_unspents: HashSet::from([("tx_conflict_1", 0), ("tx_conflict_2", 0)]), + exp_chain_txs: HashSet::from(["tx1", "tx_conflict_2"]), + exp_chain_txouts: HashSet::from([("tx1", 0), ("tx_conflict_2", 0)]), + exp_unspents: HashSet::from([("tx_conflict_2", 0)]), exp_balance: Balance { immature: 0, - trusted_pending: 50000, // correct output if filtered by fee rate: 20000 + trusted_pending: 30000, untrusted_pending: 0, confirmed: 0, },