use std::collections::HashSet;
use bitcoin::{PublicKey, Transaction};
use crate::util::TxOutWithOutpoint;
pub(crate) fn using_uncompressed_pubkeys(
spending_tx: &Transaction,
prev_outs: &[TxOutWithOutpoint],
) -> bool {
for input in spending_tx.input.iter() {
let prev_out = &prev_outs
.iter()
.find(|txout| txout.outpoint == input.previous_output)
.expect("Previous transaction should always exist")
.txout;
let spk = prev_out.script_pubkey.clone();
if spk.is_p2sh() || spk.is_p2wsh() || spk.is_p2tr() {
return false;
}
if input.witness.is_empty() {
return false;
}
for wit in input.witness.iter() {
match PublicKey::from_slice(wit) {
Ok(_) => {
if wit.starts_with(&[0x04]) {
return true;
}
}
Err(_) => {
continue;
}
}
}
}
true
}
pub(crate) fn is_anti_fee_sniping(tx: &Transaction) -> bool {
if tx.lock_time.to_consensus_u32() == 0 {
return false;
}
true
}
pub(crate) fn signals_rbf(tx: &Transaction) -> bool {
tx.input.iter().any(|input| input.sequence.is_rbf())
}
pub(crate) fn address_reuse(tx: &Transaction, prev_outs: &[TxOutWithOutpoint]) -> bool {
let input_scripts: HashSet<_> = prev_outs
.iter()
.map(|txout| txout.txout.script_pubkey.clone())
.collect();
let output_scripts: HashSet<_> = tx
.output
.iter()
.map(|txout| txout.script_pubkey.clone())
.collect();
!input_scripts.is_disjoint(&output_scripts)
}