mirror of
https://github.com/alexgo-io/bitcoin-indexer.git
synced 2026-06-13 16:19:01 +08:00
feat: better handling of blessed inscription turning cursed
This commit is contained in:
@@ -1639,6 +1639,8 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
|
||||
|
||||
for (tx_index, new_tx) in block.transactions.iter_mut().skip(1).enumerate() {
|
||||
let mut ordinals_events_indexes_to_discard = VecDeque::new();
|
||||
let mut ordinals_events_indexes_to_curse = VecDeque::new();
|
||||
|
||||
// Have a new inscription been revealed, if so, are looking at a re-inscription
|
||||
for (ordinal_event_index, ordinal_event) in
|
||||
new_tx.metadata.ordinal_operations.iter_mut().enumerate()
|
||||
@@ -1649,7 +1651,7 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
|
||||
OrdinalOperation::InscriptionTransferred(_) => continue,
|
||||
};
|
||||
|
||||
let inscription_number = if is_cursed {
|
||||
let mut inscription_number = if is_cursed {
|
||||
latest_cursed_inscription_number = if !latest_cursed_inscription_loaded {
|
||||
latest_cursed_inscription_loaded = true;
|
||||
match find_latest_cursed_inscription_number_at_block_height(
|
||||
@@ -1749,7 +1751,7 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
|
||||
find_inscription_with_ordinal_number(&traversal.ordinal_number, &transaction, &ctx)
|
||||
{
|
||||
ctx.try_log(|logger| {
|
||||
slog::warn!(
|
||||
info!(
|
||||
logger,
|
||||
"Transaction {} in block {} is overriding an existing inscription {}",
|
||||
new_tx.transaction_identifier.hash,
|
||||
@@ -1757,8 +1759,27 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
|
||||
traversal.ordinal_number
|
||||
);
|
||||
});
|
||||
ordinals_events_indexes_to_discard.push_front(ordinal_event_index);
|
||||
continue;
|
||||
|
||||
inscription_number = if !latest_cursed_inscription_loaded {
|
||||
latest_cursed_inscription_loaded = true;
|
||||
match find_latest_cursed_inscription_number_at_block_height(
|
||||
&block.block_identifier.index,
|
||||
&inscription_height_hint.cursed,
|
||||
&transaction,
|
||||
&ctx,
|
||||
)? {
|
||||
None => -1,
|
||||
Some(inscription_number) => inscription_number - 1,
|
||||
}
|
||||
} else {
|
||||
latest_cursed_inscription_number - 1
|
||||
};
|
||||
inscription.curse_type = Some(OrdinalInscriptionCurseType::Reinscription);
|
||||
|
||||
if !is_cursed {
|
||||
ordinals_events_indexes_to_curse.push_front(ordinal_event_index);
|
||||
latest_blessed_inscription_number += 1;
|
||||
}
|
||||
}
|
||||
|
||||
inscription.inscription_number = inscription_number;
|
||||
@@ -1782,6 +1803,27 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
|
||||
storage_updated = true;
|
||||
}
|
||||
|
||||
for index in ordinals_events_indexes_to_curse.into_iter() {
|
||||
match new_tx.metadata.ordinal_operations.remove(index) {
|
||||
OrdinalOperation::InscriptionRevealed(inscription_data)
|
||||
| OrdinalOperation::CursedInscriptionRevealed(inscription_data) => {
|
||||
ctx.try_log(|logger| {
|
||||
slog::info!(
|
||||
logger,
|
||||
"Inscription {} (#{}) transitioned from blessed to cursed",
|
||||
inscription_data.inscription_id,
|
||||
inscription_data.inscription_number,
|
||||
);
|
||||
});
|
||||
new_tx.metadata.ordinal_operations.insert(
|
||||
index,
|
||||
OrdinalOperation::CursedInscriptionRevealed(inscription_data),
|
||||
);
|
||||
}
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
for index in ordinals_events_indexes_to_discard.into_iter() {
|
||||
new_tx.metadata.ordinal_operations.remove(index);
|
||||
}
|
||||
|
||||
@@ -4,9 +4,10 @@ mod runloops;
|
||||
use crate::cli::fetch_and_standardize_block;
|
||||
use crate::config::{Config, PredicatesApi, PredicatesApiConfig};
|
||||
use crate::db::{
|
||||
find_all_inscriptions_in_block, format_satpoint_to_watch, insert_entry_in_locations,
|
||||
open_readwrite_hord_db_conn, open_readwrite_hord_dbs, parse_satpoint_to_watch,
|
||||
rebuild_rocks_db, remove_entries_from_locations_at_block_height, open_readwrite_hord_db_conn_rocks_db, delete_data_in_hord_db,
|
||||
delete_data_in_hord_db, find_all_inscriptions_in_block, format_satpoint_to_watch,
|
||||
insert_entry_in_locations, open_readwrite_hord_db_conn, open_readwrite_hord_db_conn_rocks_db,
|
||||
open_readwrite_hord_dbs, parse_satpoint_to_watch, rebuild_rocks_db,
|
||||
remove_entries_from_locations_at_block_height,
|
||||
};
|
||||
use crate::hord::ordinals::start_ordinals_number_processor;
|
||||
use crate::hord::{
|
||||
@@ -67,8 +68,10 @@ impl Service {
|
||||
|
||||
// Force rebuild
|
||||
{
|
||||
let blocks_db =
|
||||
open_readwrite_hord_db_conn_rocks_db(&self.config.expected_cache_path(), &self.ctx)?;
|
||||
let blocks_db = open_readwrite_hord_db_conn_rocks_db(
|
||||
&self.config.expected_cache_path(),
|
||||
&self.ctx,
|
||||
)?;
|
||||
let inscriptions_db_conn_rw =
|
||||
open_readwrite_hord_db_conn(&self.config.expected_cache_path(), &self.ctx)?;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user