fix: transfer offset

This commit is contained in:
Ludo Galabru
2024-02-06 21:03:57 -05:00
parent a5fee2520c
commit 1c3a5ddae4
4 changed files with 32 additions and 26 deletions

View File

@@ -77,10 +77,12 @@ pub fn resolve_absolute_pointer(inputs: &Vec<u64>, absolute_pointer_value: u64)
}
pub fn compute_next_satpoint_data(
_tx_index: usize,
input_index: usize,
inputs: &Vec<u64>,
outputs: &Vec<u64>,
relative_pointer_value: u64,
_ctx: Option<&Context>,
) -> SatPosition {
let mut absolute_offset_in_inputs = 0;
for (index, input_value) in inputs.iter().enumerate() {
@@ -216,52 +218,52 @@ pub fn should_sync_ordhook_db(
#[test]
fn test_identify_next_output_index_destination() {
assert_eq!(
compute_next_satpoint_data(0, &vec![20, 30, 45], &vec![20, 30, 45], 10),
compute_next_satpoint_data(0,0, &vec![20, 30, 45], &vec![20, 30, 45], 10, None),
SatPosition::Output((0, 10))
);
assert_eq!(
compute_next_satpoint_data(0, &vec![20, 30, 45], &vec![20, 30, 45], 20),
compute_next_satpoint_data(0,0, &vec![20, 30, 45], &vec![20, 30, 45], 20, None),
SatPosition::Output((1, 0))
);
assert_eq!(
compute_next_satpoint_data(1, &vec![20, 30, 45], &vec![20, 30, 45], 25),
compute_next_satpoint_data(0,1, &vec![20, 30, 45], &vec![20, 30, 45], 25, None),
SatPosition::Output((1, 25))
);
assert_eq!(
compute_next_satpoint_data(1, &vec![20, 30, 45], &vec![20, 5, 45], 26),
compute_next_satpoint_data(0,1, &vec![20, 30, 45], &vec![20, 5, 45], 26, None),
SatPosition::Output((2, 21))
);
assert_eq!(
compute_next_satpoint_data(1, &vec![10, 10, 10], &vec![30], 20),
compute_next_satpoint_data(0,1, &vec![10, 10, 10], &vec![30], 20, None),
SatPosition::Fee(0)
);
assert_eq!(
compute_next_satpoint_data(0, &vec![10, 10, 10], &vec![30], 30),
compute_next_satpoint_data(0,0, &vec![10, 10, 10], &vec![30], 30, None),
SatPosition::Fee(0)
);
assert_eq!(
compute_next_satpoint_data(0, &vec![10, 10, 10], &vec![30], 0),
compute_next_satpoint_data(0,0, &vec![10, 10, 10], &vec![30], 0, None),
SatPosition::Output((0, 0))
);
assert_eq!(
compute_next_satpoint_data(2, &vec![20, 30, 45], &vec![20, 30, 45], 95),
compute_next_satpoint_data(0,2, &vec![20, 30, 45], &vec![20, 30, 45], 95, None),
SatPosition::Fee(50)
);
assert_eq!(
compute_next_satpoint_data(
compute_next_satpoint_data(0,
2,
&vec![1000, 600, 546, 63034],
&vec![1600, 10000, 15000],
1600
1600, None
),
SatPosition::Output((1, 1600))
);
assert_eq!(
compute_next_satpoint_data(
compute_next_satpoint_data(0,
3,
&vec![6100, 148660, 103143, 7600],
&vec![81434, 173995],
257903
257903, None
),
SatPosition::Fee(260377)
);

View File

@@ -761,6 +761,7 @@ fn augment_transaction_with_ordinals_inscriptions_data(
let (destination, satpoint_post_transfer, output_value) = compute_satpoint_post_transfer(
&&*tx,
tx_index,
input_index,
relative_offset,
network,
@@ -876,6 +877,7 @@ fn consolidate_transaction_with_pre_computed_inscription_data(
// Compute satpoint_post_inscription
let (destination, satpoint_post_transfer, output_value) = compute_satpoint_post_transfer(
tx,
tx_index,
input_index,
relative_offset,
network,

View File

@@ -68,6 +68,7 @@ pub fn augment_block_with_ordinals_transfer_data(
pub fn compute_satpoint_post_transfer(
tx: &BitcoinTransactionData,
tx_index: usize,
input_index: usize,
relative_pointer_value: u64,
network: &Network,
@@ -85,7 +86,7 @@ pub fn compute_satpoint_post_transfer(
.collect::<_>();
let outputs = tx.metadata.outputs.iter().map(|o| o.value).collect::<_>();
let post_transfer_data =
compute_next_satpoint_data(input_index, &inputs, &outputs, relative_pointer_value);
compute_next_satpoint_data(tx_index, input_index, &inputs, &outputs, relative_pointer_value, Some(ctx));
let (outpoint_post_transfer, offset_post_transfer, destination, post_transfer_output_value) =
match post_transfer_data {
@@ -190,8 +191,9 @@ pub fn augment_transaction_with_ordinals_transfers_data(
let (destination, satpoint_post_transfer, post_transfer_output_value) =
compute_satpoint_post_transfer(
&&*tx,
tx_index,
input_index,
0,
watched_satpoint.offset,
network,
coinbase_txid,
coinbase_subsidy,

View File

@@ -82,27 +82,27 @@ pub fn initialize_ordhook_db(base_dir: &PathBuf, ctx: &Context) -> Connection {
"CREATE INDEX IF NOT EXISTS index_inscriptions_on_ordinal_number ON inscriptions(ordinal_number);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
if let Err(e) = conn.execute(
"CREATE INDEX IF NOT EXISTS index_inscriptions_on_jubilee_inscription_number ON inscriptions(jubilee_inscription_number);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
if let Err(e) = conn.execute(
"CREATE INDEX IF NOT EXISTS index_inscriptions_on_classic_inscription_number ON inscriptions(classic_inscription_number);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
if let Err(e) = conn.execute(
"CREATE INDEX IF NOT EXISTS index_inscriptions_on_block_height ON inscriptions(block_height);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
}
if let Err(e) = conn.execute(
@@ -112,7 +112,7 @@ pub fn initialize_ordhook_db(base_dir: &PathBuf, ctx: &Context) -> Connection {
tx_index INTEGER NOT NULL,
outpoint_to_watch TEXT NOT NULL,
offset INTEGER NOT NULL,
CONSTRAINT ordinal_number_outpoint_to_watch_offset_uniqueness UNIQUE (ordinal_number, outpoint_to_watch, offset)
CONSTRAINT ordinal_number_outpoint_to_watch_offset_uniqueness UNIQUE (ordinal_number, outpoint_to_watch)
)",
[],
) {
@@ -128,19 +128,19 @@ pub fn initialize_ordhook_db(base_dir: &PathBuf, ctx: &Context) -> Connection {
"CREATE INDEX IF NOT EXISTS locations_indexed_on_block_height ON locations(block_height);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
if let Err(e) = conn.execute(
"CREATE INDEX IF NOT EXISTS locations_indexed_on_outpoint_to_watch ON locations(outpoint_to_watch);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
if let Err(e) = conn.execute(
"CREATE INDEX IF NOT EXISTS locations_indexed_on_ordinal_number ON locations(ordinal_number);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
}
@@ -165,7 +165,7 @@ pub fn initialize_ordhook_db(base_dir: &PathBuf, ctx: &Context) -> Connection {
"CREATE INDEX IF NOT EXISTS sequence_metadata_indexed_on_block_height ON sequence_metadata(block_height);",
[],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to create hord.sqlite: {}", e.to_string()));
}
}
@@ -516,7 +516,7 @@ pub fn insert_entry_in_inscriptions(
"INSERT INTO inscriptions (inscription_id, ordinal_number, jubilee_inscription_number, classic_inscription_number, block_height, input_index) VALUES (?1, ?2, ?3, ?4, ?5, ?6)",
rusqlite::params![&inscription_data.inscription_id, &inscription_data.ordinal_number, &inscription_data.inscription_number.jubilee, &inscription_data.inscription_number.classic, &block_identifier.index, &inscription_data.inscription_input_index],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to insert inscription in hord.sqlite: {} - {:?}", e.to_string(), inscription_data));
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
@@ -534,7 +534,7 @@ pub fn insert_inscription_in_locations(
"INSERT INTO locations (ordinal_number, outpoint_to_watch, offset, block_height, tx_index) VALUES (?1, ?2, ?3, ?4, ?5)",
rusqlite::params![&inscription_data.ordinal_number, &outpoint_to_watch, offset, &block_identifier.index, &inscription_data.tx_index],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to insert inscription in location in hord.sqlite: {} ({:?})", e.to_string(), inscription_data));
std::thread::sleep(std::time::Duration::from_secs(1));
}
}
@@ -658,7 +658,7 @@ pub fn insert_transfer_in_locations(
"INSERT INTO locations (ordinal_number, outpoint_to_watch, offset, block_height, tx_index) VALUES (?1, ?2, ?3, ?4, ?5)",
rusqlite::params![&transfer_data.ordinal_number, &outpoint_to_watch, offset, &block_identifier.index, &transfer_data.tx_index],
) {
ctx.try_log(|logger| warn!(logger, "unable to query hord.sqlite: {}", e.to_string()));
ctx.try_log(|logger| warn!(logger, "unable to insert location in hord.sqlite: {} ({:?})", e.to_string(), transfer_data));
std::thread::sleep(std::time::Duration::from_secs(1));
}
}