Skip to content

Commit 9e9b8b6

Browse files
fix: mismatched tms db state (#7131)
Description --- Somehow the TMS db for completed transactions loses its mined height, but keeps its mined_confirmed status. The outputs are correctly marked with mined_heights in the OMS. This tries to correct the fields and update them <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit - **Bug Fixes** - Improved detection and retrieval of transactions with mismatched mined status, ensuring more accurate reporting of unconfirmed transactions in the wallet. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
1 parent 7867d12 commit 9e9b8b6

File tree

1 file changed

+46
-0
lines changed
  • base_layer/wallet/src/transaction_service/storage

1 file changed

+46
-0
lines changed

base_layer/wallet/src/transaction_service/storage/sqlite_db.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1045,6 +1045,15 @@ impl TransactionBackend for TransactionServiceSqliteDatabase {
10451045
})
10461046
.collect::<Result<Vec<CompletedTransaction>, TransactionStorageError>>()?;
10471047
coinbases.append(&mut one_sided);
1048+
1049+
let mut mismatched_tx =
1050+
CompletedTransactionSql::fetch_transactions_with_mismatched_mined_status(false, &mut conn)?
1051+
.into_iter()
1052+
.map(|ct: CompletedTransactionSql| {
1053+
CompletedTransaction::try_from(ct, &cipher).map_err(TransactionStorageError::from)
1054+
})
1055+
.collect::<Result<Vec<CompletedTransaction>, TransactionStorageError>>()?;
1056+
coinbases.append(&mut mismatched_tx);
10481057
Ok(coinbases)
10491058
}
10501059

@@ -1820,6 +1829,43 @@ impl CompletedTransactionSql {
18201829
.load::<CompletedTransactionSql>(conn)?)
18211830
}
18221831

1832+
/// Fetches completed transactions that have a mismatched mined status.
1833+
///
1834+
/// This method finds transactions that have been marked as confirmed or unconfirmed
1835+
/// but are missing their mined height information, indicating a mismatch between
1836+
/// the transaction status and mining data.
1837+
///
1838+
/// # Arguments
1839+
/// * `cancelled` - Whether to fetch cancelled (true) or non-cancelled (false) transactions
1840+
/// * `conn` - Database connection
1841+
///
1842+
/// # Returns
1843+
/// Vector of transactions with mismatched mined status
1844+
pub fn fetch_transactions_with_mismatched_mined_status(
1845+
cancelled: bool,
1846+
conn: &mut SqliteConnection,
1847+
) -> Result<Vec<CompletedTransactionSql>, TransactionStorageError> {
1848+
let mut query = completed_transactions::table.into_boxed();
1849+
query = if cancelled {
1850+
query.filter(completed_transactions::cancelled.is_not_null())
1851+
} else {
1852+
query.filter(completed_transactions::cancelled.is_null())
1853+
};
1854+
1855+
Ok(query
1856+
.filter(
1857+
completed_transactions::status
1858+
// Include transactions with confirmed/unconfirmed statuses that may have mismatched mined data
1859+
.eq(TransactionStatus::Imported as i32)
1860+
.or(completed_transactions::status.eq(TransactionStatus::OneSidedUnconfirmed as i32))
1861+
.or(completed_transactions::status.eq(TransactionStatus::OneSidedConfirmed as i32))
1862+
.or(completed_transactions::status.eq(TransactionStatus::CoinbaseUnconfirmed as i32))
1863+
.or(completed_transactions::status.eq(TransactionStatus::CoinbaseConfirmed as i32)),
1864+
)
1865+
.filter(completed_transactions::mined_height.eq::<Option<i64>>(None))
1866+
.load::<CompletedTransactionSql>(conn)?)
1867+
}
1868+
18231869
pub fn find(tx_id: TxId, conn: &mut SqliteConnection) -> Result<CompletedTransactionSql, TransactionStorageError> {
18241870
Ok(completed_transactions::table
18251871
.filter(completed_transactions::tx_id.eq(tx_id.as_u64() as i64))

0 commit comments

Comments
 (0)