spark_rust/wallet/utils/
transaction.rs

1use crate::wallet::utils::bitcoin::p2tr_script_from_pubkey;
2use bitcoin::{absolute, transaction::Version, Amount, OutPoint, Sequence, Transaction, TxOut};
3
4pub(crate) fn ephemeral_anchor_output() -> bitcoin::TxOut {
5    bitcoin::TxOut {
6        value: bitcoin::Amount::from_sat(0),
7        script_pubkey: bitcoin::ScriptBuf::from_bytes(vec![bitcoin::opcodes::OP_TRUE.to_u8()]),
8    }
9}
10
11pub(crate) fn create_refund_tx(
12    sequence: u32,
13    node_outpoint: OutPoint,
14    amount_sats: bitcoin::Amount,
15    receiving_pubkey: &bitcoin::secp256k1::PublicKey,
16    network: bitcoin::Network,
17) -> Transaction {
18    let mut new_refund_tx = Transaction {
19        version: Version::TWO,
20        lock_time: absolute::LockTime::ZERO,
21        input: vec![],
22        output: vec![],
23    };
24
25    new_refund_tx.input.push(bitcoin::TxIn {
26        previous_output: node_outpoint,
27        script_sig: bitcoin::Script::new().into(),
28        sequence: Sequence(sequence),
29        witness: bitcoin::Witness::new(),
30    });
31
32    let script_pubkey = p2tr_script_from_pubkey(receiving_pubkey, network);
33    new_refund_tx.output.push(bitcoin::TxOut {
34        value: amount_sats,
35        script_pubkey,
36    });
37    new_refund_tx.output.push(ephemeral_anchor_output());
38
39    new_refund_tx
40}
41
42pub(crate) fn create_connector_refund_tx(
43    sequence: u32,
44    node_outpoint: OutPoint,
45    connector_output: OutPoint,
46    amount_sats: u64,
47    receiver_pubkey: &bitcoin::secp256k1::PublicKey,
48    network: bitcoin::Network,
49) -> Transaction {
50    let mut refund_tx = Transaction {
51        version: Version::TWO,
52        lock_time: absolute::LockTime::ZERO,
53        input: vec![],
54        output: vec![],
55    };
56
57    refund_tx.input.push(bitcoin::TxIn {
58        previous_output: node_outpoint,
59        script_sig: Default::default(),
60        sequence: Sequence(sequence),
61        witness: Default::default(),
62    });
63    refund_tx.input.push(bitcoin::TxIn {
64        previous_output: connector_output,
65        script_sig: Default::default(),
66        sequence: Default::default(),
67        witness: Default::default(),
68    });
69
70    let script_pubkey = p2tr_script_from_pubkey(receiver_pubkey, network);
71    refund_tx.output.push(TxOut {
72        value: Amount::from_sat(amount_sats),
73        script_pubkey,
74    });
75
76    // refund_tx.output.push(ephemeral_anchor_output());
77
78    refund_tx
79}