Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix Edge Cases in Cursed Inscription Numbering Leading to rare Off-by-One-Bug #2209

Merged
merged 16 commits into from
Jun 23, 2023
Prev Previous commit
Next Next commit
make more efficient
  • Loading branch information
raphjaph committed Jun 21, 2023
commit e32a17ff56623cbb5df60412b3ac11246d98f2ca
47 changes: 26 additions & 21 deletions src/index/updater/inscription_updater.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,8 +129,6 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> {
.entry(offset)
.and_modify(|(_id, count)| *count += 1)
.or_insert((inscription_id, 0));

log::info!("{:?}", inscribed_offsets);
}

let offset = input_value;
Expand Down Expand Up @@ -165,6 +163,8 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> {

// if reinscription track it's ordering
if inscribed_offsets.contains_key(&offset) {
log::info!("{:?}", inscribed_offsets);

let seq_num = self
.reinscription_id_to_seq_num
.iter()?
Expand All @@ -174,6 +174,7 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> {
.unwrap_or(0);

log::info!("ID: {inscription_id}\nsequence number: {seq_num}\n");

self
veryordinally marked this conversation as resolved.
Show resolved Hide resolved
.reinscription_id_to_seq_num
.insert(&inscription_id.store(), seq_num)?;
Expand All @@ -198,29 +199,33 @@ impl<'a, 'db, 'tx> InscriptionUpdater<'a, 'db, 'tx> {
}
}

let first_reinscription = inscribed_offsets
.get(&offset)
.and_then(|(_id, count)| Some(count == &0))
.unwrap_or(false);
let cursed = inscription.tx_in_index != 0
|| inscription.tx_in_offset != 0
|| inscribed_offsets.contains_key(&offset);

log::info!("is first reinscription: {first_reinscription}");
let cursed = if cursed {
let first_reinscription = inscribed_offsets
.get(&offset)
.and_then(|(_id, count)| Some(count == &0))
.unwrap_or(false);

let initial_inscription_is_cursed = inscribed_offsets
.get(&offset)
.and_then(|(inscription_id, _count)| {
match self.id_to_entry.get(&inscription_id.store()) {
Ok(option) => option.map(|entry| InscriptionEntry::load(entry.value()).number < 0),
Err(_) => None,
}
})
.unwrap_or(false);
log::info!("is first reinscription: {first_reinscription}");

log::info!("initial inscription cursed: {initial_inscription_is_cursed}");
let initial_inscription_is_cursed = inscribed_offsets
.get(&offset)
.and_then(|(inscription_id, _count)| {
match self.id_to_entry.get(&inscription_id.store()) {
Ok(option) => option.map(|entry| InscriptionEntry::load(entry.value()).number < 0),
Err(_) => None,
}
})
.unwrap_or(false);

let cursed = !(initial_inscription_is_cursed && first_reinscription)
&& (inscription.tx_in_index != 0
|| inscription.tx_in_offset != 0
|| inscribed_offsets.contains_key(&offset));
log::info!("initial inscription cursed: {initial_inscription_is_cursed}");
!(initial_inscription_is_cursed && first_reinscription)
} else {
cursed
};

let unbound = inscription.tx_in_offset != 0 || input_value == 0;
// || inscribed_offsets.contains_key(&offset)
Expand Down