mirror of
https://github.com/alexgo-io/bitcoin-indexer.git
synced 2026-01-12 22:43:06 +08:00
fix: transfer offset
This commit is contained in:
@@ -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)
|
||||
);
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user