Skip to content

Commit faacfc5

Browse files
committed
fix: additional adjustments on pointers
1 parent da05455 commit faacfc5

File tree

6 files changed

+92
-45
lines changed

6 files changed

+92
-45
lines changed

Cargo.lock

+4-4
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

components/ordhook-core/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ serde_json = "1"
1010
serde_derive = "1"
1111
hex = "0.4.3"
1212
rand = "0.8.5"
13-
chainhook-sdk = { version = "=0.12.2", features = ["zeromq"] }
13+
chainhook-sdk = { version = "=0.12.4", features = ["zeromq"] }
1414
# chainhook-sdk = { version = "=0.12.1", path = "../../../chainhook/components/chainhook-sdk", features = ["zeromq"] }
1515
hiro-system-kit = "0.3.1"
1616
reqwest = { version = "0.11", default-features = false, features = [

components/ordhook-core/src/core/mod.rs

+41-27
Original file line numberDiff line numberDiff line change
@@ -56,41 +56,57 @@ pub enum SatPosition {
5656
Fee(u64),
5757
}
5858

59+
pub fn resolve_absolute_pointer(
60+
inputs: &Vec<u64>,
61+
absolute_pointer_value: u64,
62+
) -> (usize, u64) {
63+
let mut selected_index = 0;
64+
let mut cumulated_input_value = 0;
65+
for (index, input_value) in inputs.iter().enumerate() {
66+
if (cumulated_input_value + input_value) > absolute_pointer_value {
67+
selected_index = index;
68+
break;
69+
}
70+
cumulated_input_value += input_value;
71+
}
72+
let relative_pointer_value = absolute_pointer_value - cumulated_input_value;
73+
(selected_index, relative_pointer_value)
74+
}
75+
5976
pub fn compute_next_satpoint_data(
6077
input_index: usize,
61-
offset_intra_input: u64,
6278
inputs: &Vec<u64>,
6379
outputs: &Vec<u64>,
64-
pointer_from_inscription: u64,
80+
relative_pointer_value: u64,
6581
) -> SatPosition {
66-
let mut offset_cross_inputs = 0;
82+
let mut absolute_offset_in_inputs = 0;
6783
for (index, input_value) in inputs.iter().enumerate() {
6884
if index == input_index {
6985
break;
7086
}
71-
offset_cross_inputs += input_value;
72-
}
73-
offset_cross_inputs += offset_intra_input;
74-
offset_cross_inputs += pointer_from_inscription;
87+
absolute_offset_in_inputs += input_value;
88+
}
89+
absolute_offset_in_inputs += relative_pointer_value;
7590

76-
let mut offset_intra_outputs = 0;
77-
let mut output_index = 0;
91+
let mut absolute_offset_of_first_satoshi_in_selected_output = 0;
92+
let mut selected_output_index = 0;
7893
let mut floating_bound = 0;
7994

8095
for (index, output_value) in outputs.iter().enumerate() {
8196
floating_bound += output_value;
82-
output_index = index;
83-
if floating_bound > offset_cross_inputs {
97+
selected_output_index = index;
98+
if floating_bound > absolute_offset_in_inputs {
8499
break;
85100
}
86-
offset_intra_outputs += output_value;
101+
absolute_offset_of_first_satoshi_in_selected_output += output_value;
87102
}
88103

89-
if output_index == (outputs.len() - 1) && offset_cross_inputs >= floating_bound {
104+
if selected_output_index == (outputs.len() - 1) && absolute_offset_in_inputs >= floating_bound {
90105
// Satoshi spent in fees
91-
return SatPosition::Fee(offset_cross_inputs - floating_bound);
106+
return SatPosition::Fee(absolute_offset_in_inputs - floating_bound);
92107
}
93-
SatPosition::Output((output_index, (offset_cross_inputs - offset_intra_outputs)))
108+
let relative_offset_in_selected_output = absolute_offset_in_inputs - absolute_offset_of_first_satoshi_in_selected_output;
109+
SatPosition::Output((selected_output_index, relative_offset_in_selected_output))
94110
}
95111

96112
pub fn should_sync_rocks_db(config: &Config, ctx: &Context) -> Result<Option<(u64, u64)>, String> {
@@ -196,54 +212,52 @@ pub fn should_sync_ordhook_db(
196212
#[test]
197213
fn test_identify_next_output_index_destination() {
198214
assert_eq!(
199-
compute_next_satpoint_data(0, 10, &vec![20, 30, 45], &vec![20, 30, 45], 0),
215+
compute_next_satpoint_data(0, &vec![20, 30, 45], &vec![20, 30, 45], 10),
200216
SatPosition::Output((0, 10))
201217
);
202218
assert_eq!(
203-
compute_next_satpoint_data(0, 20, &vec![20, 30, 45], &vec![20, 30, 45], 0),
219+
compute_next_satpoint_data(0, &vec![20, 30, 45], &vec![20, 30, 45], 20),
204220
SatPosition::Output((1, 0))
205221
);
206222
assert_eq!(
207-
compute_next_satpoint_data(1, 5, &vec![20, 30, 45], &vec![20, 30, 45], 0),
223+
compute_next_satpoint_data(1, &vec![20, 30, 45], &vec![20, 30, 45], 25),
208224
SatPosition::Output((1, 5))
209225
);
210226
assert_eq!(
211-
compute_next_satpoint_data(1, 6, &vec![20, 30, 45], &vec![20, 5, 45], 0),
227+
compute_next_satpoint_data(1, &vec![20, 30, 45], &vec![20, 5, 45], 26),
212228
SatPosition::Output((2, 1))
213229
);
214230
assert_eq!(
215-
compute_next_satpoint_data(1, 10, &vec![10, 10, 10], &vec![30], 0),
231+
compute_next_satpoint_data(1, &vec![10, 10, 10], &vec![30], 20),
216232
SatPosition::Output((0, 20))
217233
);
218234
assert_eq!(
219-
compute_next_satpoint_data(0, 30, &vec![10, 10, 10], &vec![30], 0),
235+
compute_next_satpoint_data(0, &vec![10, 10, 10], &vec![30], 30),
220236
SatPosition::Fee(0)
221237
);
222238
assert_eq!(
223-
compute_next_satpoint_data(0, 0, &vec![10, 10, 10], &vec![30], 0),
239+
compute_next_satpoint_data(0, &vec![10, 10, 10], &vec![30], 0),
224240
SatPosition::Output((0, 0))
225241
);
226242
assert_eq!(
227-
compute_next_satpoint_data(2, 45, &vec![20, 30, 45], &vec![20, 30, 45], 0),
243+
compute_next_satpoint_data(2, &vec![20, 30, 45], &vec![20, 30, 45], 95),
228244
SatPosition::Fee(0)
229245
);
230246
assert_eq!(
231247
compute_next_satpoint_data(
232248
2,
233-
0,
234249
&vec![1000, 600, 546, 63034],
235250
&vec![1600, 10000, 15000],
236-
0
251+
1600
237252
),
238253
SatPosition::Output((1, 0))
239254
);
240255
assert_eq!(
241256
compute_next_satpoint_data(
242257
3,
243-
0,
244258
&vec![6100, 148660, 103143, 7600],
245259
&vec![81434, 173995],
246-
0
260+
257903
247261
),
248262
SatPosition::Fee(2474)
249263
);

components/ordhook-core/src/core/protocol/inscription_parsing.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub fn parse_inscriptions_from_witness(
8383
inscription_input_index: input_index,
8484
tx_index: 0,
8585
inscription_output_value: 0,
86-
inscription_pointer: envelope.payload.pointer().unwrap_or(0),
86+
inscription_pointer: envelope.payload.pointer(),
8787
inscription_fee: 0,
8888
inscription_number: OrdinalInscriptionNumber::zero(),
8989
inscriber_address: None,

components/ordhook-core/src/core/protocol/inscription_sequencing.rs

+44-11
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use fxhash::FxHasher;
1919
use rusqlite::{Connection, Transaction};
2020

2121
use crate::{
22-
core::OrdhookConfig,
22+
core::{resolve_absolute_pointer, OrdhookConfig},
2323
db::{
2424
find_blessed_inscription_with_ordinal_number, find_nth_classic_neg_number_at_block_height,
2525
find_nth_classic_pos_number_at_block_height, find_nth_jubilee_number_at_block_height,
@@ -366,6 +366,8 @@ fn get_transactions_to_process(
366366
find_all_inscriptions_in_block(&block.block_identifier.index, inscriptions_db_tx, ctx);
367367

368368
for tx in block.transactions.iter().skip(1) {
369+
let inputs = tx.metadata.inputs.iter().map(|i| i.previous_output.value).collect::<Vec<u64>>();
370+
369371
// Have a new inscription been revealed, if so, are looking at a re-inscription
370372
for ordinal_event in tx.metadata.ordinal_operations.iter() {
371373
let inscription_data = match ordinal_event {
@@ -374,10 +376,20 @@ fn get_transactions_to_process(
374376
continue;
375377
}
376378
};
379+
380+
let (input_index, relative_offset) = match inscription_data.inscription_pointer {
381+
Some(pointer) => {
382+
resolve_absolute_pointer(&inputs, pointer)
383+
}
384+
None => {
385+
(inscription_data.inscription_input_index, 0)
386+
}
387+
};
388+
377389
let key = (
378390
tx.transaction_identifier.clone(),
379-
inscription_data.inscription_input_index,
380-
inscription_data.inscription_pointer,
391+
input_index,
392+
relative_offset,
381393
);
382394
if cache_l1.contains_key(&key) {
383395
l1_cache_hits.push(key);
@@ -391,8 +403,8 @@ fn get_transactions_to_process(
391403
// Enqueue for traversals
392404
transactions_ids.push((
393405
tx.transaction_identifier.clone(),
394-
inscription_data.inscription_input_index,
395-
inscription_data.inscription_pointer,
406+
input_index,
407+
relative_offset,
396408
));
397409
}
398410
}
@@ -673,6 +685,8 @@ fn augment_transaction_with_ordinals_inscriptions_data(
673685
reinscriptions_data: &mut HashMap<u64, String>,
674686
ctx: &Context,
675687
) -> bool {
688+
let inputs = tx.metadata.inputs.iter().map(|i| i.previous_output.value).collect::<Vec<u64>>();
689+
676690
let any_event = tx.metadata.ordinal_operations.is_empty() == false;
677691
let mut mutated_operations = vec![];
678692
mutated_operations.append(&mut tx.metadata.ordinal_operations);
@@ -685,12 +699,21 @@ fn augment_transaction_with_ordinals_inscriptions_data(
685699
OrdinalOperation::InscriptionTransferred(_) => continue,
686700
};
687701

702+
let (input_index, relative_offset) = match inscription.inscription_pointer {
703+
Some(pointer) => {
704+
resolve_absolute_pointer(&inputs, pointer)
705+
}
706+
None => {
707+
(inscription.inscription_input_index, 0)
708+
}
709+
};
710+
688711
let transaction_identifier = tx.transaction_identifier.clone();
689712
let inscription_id = format_inscription_id(&transaction_identifier, inscription_subindex);
690713
let traversal = match inscriptions_data.get(&(
691714
transaction_identifier,
692-
inscription.inscription_input_index,
693-
inscription.inscription_pointer,
715+
input_index,
716+
relative_offset,
694717
)) {
695718
Some(traversal) => traversal,
696719
None => {
@@ -746,8 +769,8 @@ fn augment_transaction_with_ordinals_inscriptions_data(
746769

747770
let (destination, satpoint_post_transfer, output_value) = compute_satpoint_post_transfer(
748771
&&*tx,
749-
traversal.inscription_input_index,
750-
inscription.inscription_pointer,
772+
input_index,
773+
relative_offset,
751774
network,
752775
coinbase_txid,
753776
coinbase_subsidy,
@@ -825,6 +848,8 @@ fn consolidate_transaction_with_pre_computed_inscription_data(
825848
let mut mutated_operations = vec![];
826849
mutated_operations.append(&mut tx.metadata.ordinal_operations);
827850

851+
let inputs = tx.metadata.inputs.iter().map(|i| i.previous_output.value).collect::<Vec<u64>>();
852+
828853
for operation in mutated_operations.iter_mut() {
829854
let inscription = match operation {
830855
OrdinalOperation::InscriptionRevealed(ref mut inscription) => inscription,
@@ -847,11 +872,19 @@ fn consolidate_transaction_with_pre_computed_inscription_data(
847872
inscription.inscription_fee = tx.metadata.fee;
848873
inscription.tx_index = tx_index;
849874

875+
let (input_index, relative_offset) = match inscription.inscription_pointer {
876+
Some(pointer) => {
877+
resolve_absolute_pointer(&inputs, pointer)
878+
}
879+
None => {
880+
(traversal.inscription_input_index, 0)
881+
}
882+
};
850883
// Compute satpoint_post_inscription
851884
let (destination, satpoint_post_transfer, output_value) = compute_satpoint_post_transfer(
852885
tx,
853-
traversal.inscription_input_index,
854-
inscription.inscription_pointer,
886+
input_index,
887+
relative_offset,
855888
network,
856889
coinbase_txid,
857890
coinbase_subsidy,

components/ordhook-core/src/core/protocol/inscription_tracking.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ pub fn compute_satpoint_post_transfer(
8282
.collect::<_>();
8383
let outputs = tx.metadata.outputs.iter().map(|o| o.value).collect::<_>();
8484
let post_transfer_data =
85-
compute_next_satpoint_data(input_index, 0, &inputs, &outputs, inscription_pointer);
85+
compute_next_satpoint_data(input_index, &inputs, &outputs, inscription_pointer);
8686

8787
let (outpoint_post_transfer, offset_post_transfer, destination, post_transfer_output_value) =
8888
match post_transfer_data {

0 commit comments

Comments
 (0)