From 5441851db7659b9859e4732ef244fb77cdb4670a Mon Sep 17 00:00:00 2001 From: Ludo Galabru Date: Tue, 11 Apr 2023 22:32:35 -0400 Subject: [PATCH] feat: return local result when known --- .../src/hord/db/mod.rs | 34 +++++++++++++++++++ .../chainhook-event-observer/src/hord/mod.rs | 21 +++++++++--- 2 files changed, 50 insertions(+), 5 deletions(-) diff --git a/components/chainhook-event-observer/src/hord/db/mod.rs b/components/chainhook-event-observer/src/hord/db/mod.rs index 2ea1974a..8ce8290f 100644 --- a/components/chainhook-event-observer/src/hord/db/mod.rs +++ b/components/chainhook-event-observer/src/hord/db/mod.rs @@ -549,6 +549,40 @@ pub fn find_inscription_with_ordinal_number( return None; } +pub fn find_inscription_with_id( + inscription_id: &str, + block_hash: &str, + inscriptions_db_conn: &Connection, + _ctx: &Context, +) -> Option { + let args: &[&dyn ToSql] = &[&inscription_id.to_sql().unwrap()]; + let mut stmt = inscriptions_db_conn + .prepare("SELECT inscription_number, ordinal_number, block_height, inscription_id, block_hash FROM inscriptions WHERE inscription_id = ?") + .unwrap(); + let mut rows = stmt.query(args).unwrap(); + while let Ok(Some(row)) = rows.next() { + let inscription_block_hash: String = row.get(4).unwrap(); + if block_hash.eq(&inscription_block_hash) { + let inscription_number: u64 = row.get(0).unwrap(); + let ordinal_number: u64 = row.get(1).unwrap(); + let block_height: u64 = row.get(2).unwrap(); + let transaction_id = { + let inscription_id: String = row.get(3).unwrap(); + TransactionIdentifier { + hash: format!("0x{}", &inscription_id[0..inscription_id.len() - 2]), + } + }; + let traversal = TraversalResult { + inscription_number, + ordinal_number, + transfers: 0, + }; + return Some(traversal); + } + } + return None; +} + pub fn find_all_inscriptions( inscriptions_db_conn: &Connection, ) -> BTreeMap> { diff --git a/components/chainhook-event-observer/src/hord/mod.rs b/components/chainhook-event-observer/src/hord/mod.rs index bfc83482..24495dd3 100644 --- a/components/chainhook-event-observer/src/hord/mod.rs +++ b/components/chainhook-event-observer/src/hord/mod.rs @@ -29,8 +29,8 @@ use crate::{ }; use self::db::{ - open_readonly_hord_db_conn_rocks_db, remove_entry_from_blocks, remove_entry_from_inscriptions, - TraversalResult, WatchedSatpoint, + find_inscription_with_id, open_readonly_hord_db_conn_rocks_db, remove_entry_from_blocks, + remove_entry_from_inscriptions, TraversalResult, WatchedSatpoint, }; pub fn revert_hord_db_with_augmented_bitcoin_block( @@ -102,16 +102,27 @@ pub fn update_hord_db_and_augment_bitcoin_block( } let mut transactions_ids = vec![]; + let mut traversals = HashMap::new(); + for new_tx in new_block.transactions.iter_mut().skip(1) { // Have a new inscription been revealed, if so, are looking at a re-inscription for ordinal_event in new_tx.metadata.ordinal_operations.iter_mut() { - if let OrdinalOperation::InscriptionRevealed(_) = ordinal_event { - transactions_ids.push(new_tx.transaction_identifier.clone()); + if let OrdinalOperation::InscriptionRevealed(inscription_data) = ordinal_event { + if let Some(traversal) = find_inscription_with_id( + &inscription_data.inscription_id, + &new_block.block_identifier.hash, + inscriptions_db_conn_rw, + ctx, + ) { + traversals.insert(new_tx.transaction_identifier.clone(), traversal); + } else { + // Enqueue for traversals + transactions_ids.push(new_tx.transaction_identifier.clone()); + } } } } - let mut traversals = HashMap::new(); if !transactions_ids.is_empty() { let expected_traversals = transactions_ids.len(); let (traversal_tx, traversal_rx) = channel::<(TransactionIdentifier, _)>();