diff --git a/components/chainhook-cli/src/scan/bitcoin.rs b/components/chainhook-cli/src/scan/bitcoin.rs index 06ec9a1c..2ff3974f 100644 --- a/components/chainhook-cli/src/scan/bitcoin.rs +++ b/components/chainhook-cli/src/scan/bitcoin.rs @@ -172,7 +172,10 @@ pub async fn scan_bitcoin_chainstate_via_rpc_using_predicate( None => vec![], }; for (transaction_identifier, traversal_result) in local_traverals.into_iter() { - traversals.insert(transaction_identifier, traversal_result); + traversals.insert( + (transaction_identifier, traversal_result.input_index), + traversal_result, + ); } let _ = update_storage_and_augment_bitcoin_block_with_inscription_reveal_data( diff --git a/components/chainhook-sdk/src/hord/db/mod.rs b/components/chainhook-sdk/src/hord/db/mod.rs index 757dff3e..f1e564b1 100644 --- a/components/chainhook-sdk/src/hord/db/mod.rs +++ b/components/chainhook-sdk/src/hord/db/mod.rs @@ -457,9 +457,11 @@ pub fn find_inscription_with_id( let ordinal_number: u64 = row.get(1).unwrap(); let inscription_offset: u64 = row.get(3).unwrap(); let outpoint_to_watch: String = row.get(4).unwrap(); + let (_, input_index) = parse_inscription_id(inscription_id); let traversal = TraversalResult { inscription_number, ordinal_number, + input_index, inscription_offset, outpoint_to_watch, transfers: 0, @@ -484,7 +486,7 @@ pub fn find_all_inscriptions_in_block( let inscription_number: i64 = row.get(0).unwrap(); let ordinal_number: u64 = row.get(1).unwrap(); let block_height: u64 = row.get(2).unwrap(); - let (transaction_id, _) = { + let (transaction_id, input_index) = { let inscription_id: String = row.get(3).unwrap(); parse_inscription_id(&inscription_id) }; @@ -493,6 +495,7 @@ pub fn find_all_inscriptions_in_block( let traversal = TraversalResult { inscription_number, ordinal_number, + input_index, transfers: 0, inscription_offset, outpoint_to_watch, @@ -847,6 +850,7 @@ pub async fn fetch_and_cache_blocks_in_hord_db( pub struct TraversalResult { pub inscription_number: i64, pub inscription_offset: u64, + pub input_index: usize, pub outpoint_to_watch: String, pub ordinal_number: u64, pub transfers: u32, @@ -1019,6 +1023,7 @@ pub fn retrieve_satoshi_point_using_lazy_storage( ordinal_number: 0, transfers: 0, inscription_offset, + input_index, outpoint_to_watch: format_outpoint_to_watch( &transaction_identifier, inscription_output_index, @@ -1149,6 +1154,7 @@ pub fn retrieve_satoshi_point_using_lazy_storage( ordinal_number: 0, transfers: 0, inscription_offset, + input_index, outpoint_to_watch: format_outpoint_to_watch( &transaction_identifier, inscription_output_index, @@ -1159,13 +1165,14 @@ pub fn retrieve_satoshi_point_using_lazy_storage( } let height = Height(ordinal_block_number.into()); - let ordinal_number = height.starting_sat().0 + ordinal_offset + inscription_offset; + let ordinal_number = height.starting_sat().0 + ordinal_offset; Ok(TraversalResult { inscription_number, ordinal_number, transfers: hops, inscription_offset, + input_index, outpoint_to_watch: format_outpoint_to_watch( &transaction_identifier, inscription_output_index, diff --git a/components/chainhook-sdk/src/hord/mod.rs b/components/chainhook-sdk/src/hord/mod.rs index 44010232..6be69830 100644 --- a/components/chainhook-sdk/src/hord/mod.rs +++ b/components/chainhook-sdk/src/hord/mod.rs @@ -228,7 +228,7 @@ pub fn retrieve_inscribed_satoshi_points_from_block( DashMap<(u32, [u8; 8]), LazyBlockTransaction, BuildHasherDefault>, >, ctx: &Context, -) -> HashMap { +) -> HashMap<(TransactionIdentifier, usize), TraversalResult> { let mut transactions_ids = vec![]; let mut traversals = HashMap::new(); @@ -253,7 +253,13 @@ pub fn retrieve_inscribed_satoshi_points_from_block( inscriptions_db_conn, ctx, ) { - traversals.insert(tx.transaction_identifier.clone(), traversal); + traversals.insert( + ( + tx.transaction_identifier.clone(), + inscription_data.inscription_input_index, + ), + traversal, + ); } else { // Enqueue for traversals transactions_ids.push(( @@ -320,7 +326,7 @@ pub fn retrieve_inscribed_satoshi_points_from_block( traversal.ordinal_number, traversal.get_ordinal_coinbase_height(), traversal.get_ordinal_coinbase_offset(), traversal.transfers ) }); - traversals.insert(transaction_identifier, traversal); + traversals.insert((transaction_identifier, traversal.input_index), traversal); } Err(e) => { ctx.try_log(|logger| { @@ -424,7 +430,7 @@ pub enum Storage<'a> { pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data( block: &mut BitcoinBlockData, storage: &mut Storage, - traversals: &HashMap, + traversals: &HashMap<(TransactionIdentifier, usize), TraversalResult>, inscriptions_db_conn: &Connection, ctx: &Context, ) -> Result { @@ -469,7 +475,10 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data( latest_inscription_number }; - let traversal = match traversals.get(&new_tx.transaction_identifier) { + let transaction_identifier = new_tx.transaction_identifier.clone(); + let traversal = match traversals + .get(&(transaction_identifier, inscription.inscription_input_index)) + { Some(traversal) => traversal, None => { ctx.try_log(|logger| {