Skip to content

Commit f1adca9

Browse files
author
Ludo Galabru
committed
feat: ability to replay inscriptions
1 parent 0236053 commit f1adca9

File tree

1 file changed

+89
-2
lines changed

1 file changed

+89
-2
lines changed

components/hord-cli/src/core/pipeline/processors/inscription_indexing.rs

+89-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ use std::{
55
};
66

77
use chainhook_sdk::{
8-
types::{BitcoinBlockData, TransactionIdentifier},
8+
bitcoincore_rpc_json::bitcoin::{hashes::hex::FromHex, Address, Network, Script},
9+
types::{
10+
BitcoinBlockData, BitcoinNetwork, OrdinalInscriptionCurseType, OrdinalOperation,
11+
TransactionIdentifier, OrdinalInscriptionTransferData,
12+
},
913
utils::Context,
1014
};
1115
use crossbeam_channel::TryRecvError;
@@ -16,7 +20,10 @@ use rusqlite::Connection;
1620
use std::collections::HashMap;
1721
use std::hash::BuildHasherDefault;
1822

19-
use crate::core::{protocol::sequencing::update_hord_db_and_augment_bitcoin_block_v3, HordConfig};
23+
use crate::{
24+
core::{protocol::sequencing::update_hord_db_and_augment_bitcoin_block_v3, HordConfig},
25+
db::{find_all_inscriptions_in_block, find_all_transfers_in_block, format_satpoint_to_watch},
26+
};
2027

2128
use crate::db::{LazyBlockTransaction, TraversalResult};
2229

@@ -211,3 +218,83 @@ pub fn process_block(
211218
ctx,
212219
)
213220
}
221+
222+
pub fn re_augment_block_with_ordinals_operations(
223+
block: &mut BitcoinBlockData,
224+
inscriptions_db_conn: &Connection,
225+
ctx: &Context,
226+
) {
227+
let network = match block.metadata.network {
228+
BitcoinNetwork::Mainnet => Network::Bitcoin,
229+
BitcoinNetwork::Regtest => Network::Regtest,
230+
BitcoinNetwork::Testnet => Network::Testnet,
231+
};
232+
233+
// Restore inscriptions data
234+
let mut inscriptions =
235+
find_all_inscriptions_in_block(&block.block_identifier.index, inscriptions_db_conn, ctx);
236+
237+
let mut should_become_cursed = vec![];
238+
for (tx_index, tx) in block.transactions.iter_mut().enumerate() {
239+
for (op_index, operation) in tx.metadata.ordinal_operations.iter_mut().enumerate() {
240+
let (inscription, is_cursed) = match operation {
241+
OrdinalOperation::CursedInscriptionRevealed(ref mut inscription) => {
242+
(inscription, true)
243+
}
244+
OrdinalOperation::InscriptionRevealed(ref mut inscription) => (inscription, false),
245+
OrdinalOperation::InscriptionTransferred(_) => continue,
246+
};
247+
248+
let Some(traversal) = inscriptions.remove(&(tx.transaction_identifier.clone(), inscription.inscription_input_index)) else {
249+
continue;
250+
};
251+
252+
inscription.ordinal_offset = traversal.get_ordinal_coinbase_offset();
253+
inscription.ordinal_block_height = traversal.get_ordinal_coinbase_height();
254+
inscription.ordinal_number = traversal.ordinal_number;
255+
inscription.inscription_number = traversal.inscription_number;
256+
inscription.transfers_pre_inscription = traversal.transfers;
257+
inscription.inscription_fee = tx.metadata.fee;
258+
inscription.tx_index = tx_index;
259+
inscription.satpoint_post_inscription = format_satpoint_to_watch(
260+
&traversal.transfer_data.transaction_identifier_location,
261+
traversal.transfer_data.output_index,
262+
traversal.transfer_data.inscription_offset_intra_output,
263+
);
264+
265+
let Some(output) = tx.metadata.outputs.get(traversal.transfer_data.output_index) else {
266+
continue;
267+
};
268+
inscription.inscription_output_value = output.value;
269+
inscription.inscriber_address = {
270+
let script_pub_key = output.get_script_pubkey_hex();
271+
match Script::from_hex(&script_pub_key) {
272+
Ok(script) => match Address::from_script(&script, network.clone()) {
273+
Ok(a) => Some(a.to_string()),
274+
_ => None,
275+
},
276+
_ => None,
277+
}
278+
};
279+
280+
if !is_cursed && inscription.inscription_number < 0 {
281+
inscription.curse_type = Some(OrdinalInscriptionCurseType::Reinscription);
282+
should_become_cursed.push((tx_index, op_index));
283+
}
284+
}
285+
}
286+
287+
for (tx_index, op_index) in should_become_cursed.into_iter() {
288+
let Some(tx) = block.transactions.get_mut(tx_index) else {
289+
continue;
290+
};
291+
let OrdinalOperation::InscriptionRevealed(inscription) = tx.metadata.ordinal_operations.remove(op_index) else {
292+
continue;
293+
};
294+
tx.metadata.ordinal_operations.insert(op_index, OrdinalOperation::CursedInscriptionRevealed(inscription));
295+
}
296+
297+
// TODO: Handle transfers
298+
299+
300+
}

0 commit comments

Comments
 (0)