use bitcoin::{ScriptBuf, absolute::LockTime, hashes::Hash, transaction::Version};
use brk_types::{
MempoolEntryInfo, RawLockTime, Sats, SigOps, Timestamp, Transaction, TxIn, TxOut, TxStatus,
TxVersionRaw, Txid, VSize, Vout, Weight, Witness,
};
pub fn fake_txid(seed: u8) -> Txid {
let mut bytes = [0u8; 32];
bytes[0] = seed;
Txid::from(bitcoin::Txid::from_byte_array(bytes))
}
pub fn p2wpkh_script(seed: u8) -> ScriptBuf {
let mut bytes = [0u8; 20];
bytes[0] = seed;
ScriptBuf::new_p2wpkh(&bitcoin::WPubkeyHash::from_byte_array(bytes))
}
pub fn fake_tx(seed: u8, prevouts: &[Option<TxOut>], outputs: &[(ScriptBuf, u64)]) -> Transaction {
let input = prevouts
.iter()
.enumerate()
.map(|(i, p)| TxIn {
is_coinbase: false,
prevout: p.clone(),
txid: fake_txid(seed.wrapping_add(100 + i as u8)),
vout: Vout::ZERO,
script_sig: ScriptBuf::new(),
script_sig_asm: (),
witness: Witness::default(),
sequence: 0xffff_fffe,
inner_redeem_script_asm: (),
inner_witness_script_asm: (),
})
.collect();
let output = outputs
.iter()
.map(|(script, value)| TxOut::from((script.clone(), Sats::from(*value))))
.collect();
let mut tx = Transaction {
index: None,
txid: fake_txid(seed),
version: TxVersionRaw::from(Version::TWO),
lock_time: RawLockTime::from(LockTime::ZERO),
input,
output,
total_size: 200,
weight: Weight::from(800u64),
total_sigop_cost: SigOps::ZERO,
fee: Sats::ZERO,
status: TxStatus::UNCONFIRMED,
};
tx.refresh_sigops();
tx
}
pub fn fake_entry_info(txid: Txid, fee: u64, vsize: u64) -> MempoolEntryInfo {
MempoolEntryInfo {
txid,
vsize: VSize::from(vsize),
weight: Weight::from(vsize * 4),
fee: Sats::from(fee),
first_seen: Timestamp::from(0u32),
depends: vec![],
}
}
pub fn fake_bitcoin_tx(
prev_txid_seed: u8,
outputs: &[(ScriptBuf, u64)],
) -> bitcoin::Transaction {
let input = vec![bitcoin::TxIn {
previous_output: bitcoin::OutPoint {
txid: bitcoin::Txid::from_byte_array({
let mut b = [0u8; 32];
b[0] = prev_txid_seed;
b
}),
vout: 0,
},
script_sig: ScriptBuf::new(),
sequence: bitcoin::Sequence(0xffff_fffe),
witness: bitcoin::Witness::new(),
}];
let output = outputs
.iter()
.map(|(script, value)| bitcoin::TxOut {
value: bitcoin::Amount::from_sat(*value),
script_pubkey: script.clone(),
})
.collect();
bitcoin::Transaction {
version: Version::TWO,
lock_time: LockTime::ZERO,
input,
output,
}
}