@@ -5,7 +5,11 @@ use std::{
5
5
} ;
6
6
7
7
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
+ } ,
9
13
utils:: Context ,
10
14
} ;
11
15
use crossbeam_channel:: TryRecvError ;
@@ -16,7 +20,10 @@ use rusqlite::Connection;
16
20
use std:: collections:: HashMap ;
17
21
use std:: hash:: BuildHasherDefault ;
18
22
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
+ } ;
20
27
21
28
use crate :: db:: { LazyBlockTransaction , TraversalResult } ;
22
29
@@ -211,3 +218,83 @@ pub fn process_block(
211
218
ctx,
212
219
)
213
220
}
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