Skip to content

Commit f11509a

Browse files
author
Ludo Galabru
committed
feat: better handling of blessed inscription turning cursed
1 parent f86b184 commit f11509a

File tree

2 files changed

+54
-9
lines changed

2 files changed

+54
-9
lines changed

components/hord-cli/src/hord/mod.rs

+46-4
Original file line numberDiff line numberDiff line change
@@ -1639,6 +1639,8 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
16391639

16401640
for (tx_index, new_tx) in block.transactions.iter_mut().skip(1).enumerate() {
16411641
let mut ordinals_events_indexes_to_discard = VecDeque::new();
1642+
let mut ordinals_events_indexes_to_curse = VecDeque::new();
1643+
16421644
// Have a new inscription been revealed, if so, are looking at a re-inscription
16431645
for (ordinal_event_index, ordinal_event) in
16441646
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(
16491651
OrdinalOperation::InscriptionTransferred(_) => continue,
16501652
};
16511653

1652-
let inscription_number = if is_cursed {
1654+
let mut inscription_number = if is_cursed {
16531655
latest_cursed_inscription_number = if !latest_cursed_inscription_loaded {
16541656
latest_cursed_inscription_loaded = true;
16551657
match find_latest_cursed_inscription_number_at_block_height(
@@ -1749,16 +1751,35 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
17491751
find_inscription_with_ordinal_number(&traversal.ordinal_number, &transaction, &ctx)
17501752
{
17511753
ctx.try_log(|logger| {
1752-
slog::warn!(
1754+
info!(
17531755
logger,
17541756
"Transaction {} in block {} is overriding an existing inscription {}",
17551757
new_tx.transaction_identifier.hash,
17561758
block.block_identifier.index,
17571759
traversal.ordinal_number
17581760
);
17591761
});
1760-
ordinals_events_indexes_to_discard.push_front(ordinal_event_index);
1761-
continue;
1762+
1763+
inscription_number = if !latest_cursed_inscription_loaded {
1764+
latest_cursed_inscription_loaded = true;
1765+
match find_latest_cursed_inscription_number_at_block_height(
1766+
&block.block_identifier.index,
1767+
&inscription_height_hint.cursed,
1768+
&transaction,
1769+
&ctx,
1770+
)? {
1771+
None => -1,
1772+
Some(inscription_number) => inscription_number - 1,
1773+
}
1774+
} else {
1775+
latest_cursed_inscription_number - 1
1776+
};
1777+
inscription.curse_type = Some(OrdinalInscriptionCurseType::Reinscription);
1778+
1779+
if !is_cursed {
1780+
ordinals_events_indexes_to_curse.push_front(ordinal_event_index);
1781+
latest_blessed_inscription_number += 1;
1782+
}
17621783
}
17631784

17641785
inscription.inscription_number = inscription_number;
@@ -1782,6 +1803,27 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data_tx(
17821803
storage_updated = true;
17831804
}
17841805

1806+
for index in ordinals_events_indexes_to_curse.into_iter() {
1807+
match new_tx.metadata.ordinal_operations.remove(index) {
1808+
OrdinalOperation::InscriptionRevealed(inscription_data)
1809+
| OrdinalOperation::CursedInscriptionRevealed(inscription_data) => {
1810+
ctx.try_log(|logger| {
1811+
slog::info!(
1812+
logger,
1813+
"Inscription {} (#{}) transitioned from blessed to cursed",
1814+
inscription_data.inscription_id,
1815+
inscription_data.inscription_number,
1816+
);
1817+
});
1818+
new_tx.metadata.ordinal_operations.insert(
1819+
index,
1820+
OrdinalOperation::CursedInscriptionRevealed(inscription_data),
1821+
);
1822+
}
1823+
_ => unreachable!(),
1824+
}
1825+
}
1826+
17851827
for index in ordinals_events_indexes_to_discard.into_iter() {
17861828
new_tx.metadata.ordinal_operations.remove(index);
17871829
}

components/hord-cli/src/service/mod.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@ mod runloops;
44
use crate::cli::fetch_and_standardize_block;
55
use crate::config::{Config, PredicatesApi, PredicatesApiConfig};
66
use crate::db::{
7-
find_all_inscriptions_in_block, format_satpoint_to_watch, insert_entry_in_locations,
8-
open_readwrite_hord_db_conn, open_readwrite_hord_dbs, parse_satpoint_to_watch,
9-
rebuild_rocks_db, remove_entries_from_locations_at_block_height, open_readwrite_hord_db_conn_rocks_db, delete_data_in_hord_db,
7+
delete_data_in_hord_db, find_all_inscriptions_in_block, format_satpoint_to_watch,
8+
insert_entry_in_locations, open_readwrite_hord_db_conn, open_readwrite_hord_db_conn_rocks_db,
9+
open_readwrite_hord_dbs, parse_satpoint_to_watch, rebuild_rocks_db,
10+
remove_entries_from_locations_at_block_height,
1011
};
1112
use crate::hord::ordinals::start_ordinals_number_processor;
1213
use crate::hord::{
@@ -67,8 +68,10 @@ impl Service {
6768

6869
// Force rebuild
6970
{
70-
let blocks_db =
71-
open_readwrite_hord_db_conn_rocks_db(&self.config.expected_cache_path(), &self.ctx)?;
71+
let blocks_db = open_readwrite_hord_db_conn_rocks_db(
72+
&self.config.expected_cache_path(),
73+
&self.ctx,
74+
)?;
7275
let inscriptions_db_conn_rw =
7376
open_readwrite_hord_db_conn(&self.config.expected_cache_path(), &self.ctx)?;
7477

0 commit comments

Comments
 (0)