spark_rust/wallet/utils/
transaction.rs1use 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
79}