Skip to content

Commit ad48351

Browse files
author
Ludo Galabru
committed
fix: streamline txid handling
1 parent 810407d commit ad48351

File tree

6 files changed

+30
-31
lines changed

6 files changed

+30
-31
lines changed

components/chainhook-sdk/src/chainhooks/bitcoin/mod.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ pub fn serialize_bitcoin_transactions_to_json<'a>(
180180
.iter()
181181
.map(|input| {
182182
json!({
183-
"txin": format!("0x{}", input.previous_output.txid),
183+
"txin": input.previous_output.txid.hash.to_string(),
184184
"vout": input.previous_output.vout,
185185
"sequence": input.sequence,
186186
})
@@ -366,7 +366,7 @@ impl BitcoinPredicateType {
366366
BitcoinPredicateType::Inputs(InputPredicate::Txid(predicate)) => {
367367
// TODO(lgalabru): add support for transaction chainhing, if enabled
368368
for input in tx.metadata.inputs.iter() {
369-
if input.previous_output.txid.eq(&predicate.txid)
369+
if input.previous_output.txid.hash.eq(&predicate.txid)
370370
&& input.previous_output.vout.eq(&predicate.vout)
371371
{
372372
return true;

components/chainhook-sdk/src/hord/db/mod.rs

+4-15
Original file line numberDiff line numberDiff line change
@@ -949,9 +949,7 @@ pub fn format_satpoint_to_watch(
949949

950950
pub fn parse_satpoint_to_watch(outpoint_to_watch: &str) -> (TransactionIdentifier, usize, u64) {
951951
let comps: Vec<&str> = outpoint_to_watch.split(":").collect();
952-
let tx = TransactionIdentifier {
953-
hash: format!("0x{}", comps[0]),
954-
};
952+
let tx = TransactionIdentifier::new(comps[0]);
955953
let output_index = comps[1].to_string().parse::<usize>().unwrap();
956954
let offset = comps[2].to_string().parse::<u64>().unwrap();
957955
(tx, output_index, offset)
@@ -970,18 +968,14 @@ pub fn format_outpoint_to_watch(
970968

971969
pub fn parse_inscription_id(inscription_id: &str) -> (TransactionIdentifier, usize) {
972970
let comps: Vec<&str> = inscription_id.split("i").collect();
973-
let tx = TransactionIdentifier {
974-
hash: format!("0x{}", comps[0]),
975-
};
971+
let tx = TransactionIdentifier::new(&comps[0]);
976972
let output_index = comps[1].to_string().parse::<usize>().unwrap();
977973
(tx, output_index)
978974
}
979975

980976
pub fn parse_outpoint_to_watch(outpoint_to_watch: &str) -> (TransactionIdentifier, usize) {
981977
let comps: Vec<&str> = outpoint_to_watch.split(":").collect();
982-
let tx = TransactionIdentifier {
983-
hash: format!("0x{}", comps[0]),
984-
};
978+
let tx = TransactionIdentifier::new(&comps[0]);
985979
let output_index = comps[1].to_string().parse::<usize>().unwrap();
986980
(tx, output_index)
987981
}
@@ -1552,12 +1546,7 @@ impl LazyBlock {
15521546
// For each transaction input:
15531547
for input in tx.metadata.inputs.iter() {
15541548
// txin - 8 first bytes
1555-
let txin = {
1556-
let txid = hex::decode(&input.previous_output.txid[2..]).unwrap();
1557-
[
1558-
txid[0], txid[1], txid[2], txid[3], txid[4], txid[5], txid[6], txid[7],
1559-
]
1560-
};
1549+
let txin = input.previous_output.txid.get_8_hash_bytes();
15611550
buffer.write_all(&txin)?;
15621551
// txin's block height
15631552
let block_height = input.previous_output.block_height as u32;

components/chainhook-sdk/src/hord/mod.rs

+9-11
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ use crate::{
4141

4242
use self::db::{
4343
find_inscription_with_id, find_latest_cursed_inscription_number_at_block_height,
44-
find_latest_inscription_number_at_block_height, parse_satpoint_to_watch,
45-
remove_entry_from_blocks, remove_entry_from_inscriptions, LazyBlock, LazyBlockTransaction,
46-
TraversalResult, WatchedSatpoint,
44+
find_latest_inscription_number_at_block_height, format_satpoint_to_watch,
45+
parse_satpoint_to_watch, remove_entry_from_blocks, remove_entry_from_inscriptions, LazyBlock,
46+
LazyBlockTransaction, TraversalResult, WatchedSatpoint,
4747
};
4848
use self::inscription::InscriptionParser;
4949
use self::ord::inscription_id::InscriptionId;
@@ -482,11 +482,10 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_reveal_data(
482482
inscription.inscription_number = traversal.inscription_number;
483483
inscription.transfers_pre_inscription = traversal.transfers;
484484
inscription.inscription_fee = new_tx.metadata.fee;
485-
inscription.satpoint_post_inscription = format!(
486-
"{}:{}:{}",
487-
traversal.transaction_identifier.hash,
485+
inscription.satpoint_post_inscription = format_satpoint_to_watch(
486+
&traversal.transaction_identifier,
488487
traversal.output_index,
489-
traversal.inscription_offset_intra_output
488+
traversal.inscription_offset_intra_output,
490489
);
491490
if let Some(output) = new_tx.metadata.outputs.get(traversal.output_index) {
492491
inscription.inscription_output_value = output.value;
@@ -642,10 +641,9 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_transfer_data(
642641

643642
for input in new_tx.metadata.inputs.iter() {
644643
// input.previous_output.txid
645-
let outpoint_pre_transfer = format!(
646-
"{}:{}",
647-
&input.previous_output.txid[2..],
648-
input.previous_output.vout
644+
let outpoint_pre_transfer = format_outpoint_to_watch(
645+
&input.previous_output.txid,
646+
input.previous_output.vout as usize,
649647
);
650648

651649
let entries = match storage {

components/chainhook-sdk/src/indexer/bitcoin/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -387,7 +387,7 @@ pub fn standardize_bitcoin_block(
387387
sats_in += prevout.value.to_sat();
388388
inputs.push(TxIn {
389389
previous_output: OutPoint {
390-
txid: format!("0x{}", txid.to_string()),
390+
txid: TransactionIdentifier::new(&txid.to_string()),
391391
vout,
392392
block_height: prevout.height,
393393
value: prevout.value.to_sat(),

components/chainhook-types-rs/src/bitcoin.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use crate::TransactionIdentifier;
2+
13
/// A transaction input, which defines old coins to be consumed
24
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Debug, Hash, Serialize, Deserialize)]
35
pub struct TxIn {
@@ -32,7 +34,7 @@ pub struct TxOut {
3234
#[derive(Clone, Debug, Eq, Hash, PartialEq, PartialOrd, Ord, Serialize, Deserialize)]
3335
pub struct OutPoint {
3436
/// The referenced transaction's txid.
35-
pub txid: String,
37+
pub txid: TransactionIdentifier,
3638
/// The index of the referenced output in its transaction's vout.
3739
pub vout: u32,
3840
/// The value of the referenced.

components/chainhook-types-rs/src/rosetta.rs

+11-1
Original file line numberDiff line numberDiff line change
@@ -407,14 +407,24 @@ pub struct LockSTXData {
407407

408408
/// The transaction_identifier uniquely identifies a transaction in a particular
409409
/// network and block or in the mempool.
410-
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Hash)]
410+
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize, Hash, PartialOrd, Ord)]
411411
pub struct TransactionIdentifier {
412412
/// Any transactions that are attributable only to a block (ex: a block
413413
/// event) should use the hash of the block as the identifier.
414414
pub hash: String,
415415
}
416416

417417
impl TransactionIdentifier {
418+
pub fn new(txid: &str) -> Self {
419+
let lowercased_txid = txid.to_lowercase();
420+
Self {
421+
hash: match lowercased_txid.starts_with("0x") {
422+
true => lowercased_txid,
423+
false => format!("0x{}", lowercased_txid),
424+
},
425+
}
426+
}
427+
418428
pub fn get_hash_bytes_str(&self) -> &str {
419429
&self.hash[2..]
420430
}

0 commit comments

Comments
 (0)