1use std::str::FromStr;
2
3use bitcoin::{Amount, OutPoint, Txid, TxIn, TxOut, Transaction, Witness, ScriptBuf, Sequence};
4use bitcoin::absolute::LockTime;
5use bitcoin::hashes::Hash;
6use bitcoin::transaction::Version;
7use bitcoin::secp256k1::Keypair;
8
9use bitcoin_ext::{BlockHeight, BlockDelta};
10
11use crate::Vtxo;
12use crate::vtxo::Full;
13use crate::board::BoardBuilder;
14
15lazy_static! {
16 pub static ref DUMMY_USER_KEY: Keypair = Keypair::from_str(
17 "76f78cc00278817fe65fd81cb962782d2625834d08b66edbf2cd60f6c520db63",
18 ).unwrap();
19
20 pub static ref DUMMY_SERVER_KEY: Keypair = Keypair::from_str(
21 "f2a9eaeba1cdb8411dfda3c9ca391e4ad29938c4f0b9c0709376fc4a1cbf0e5d",
22 ).unwrap();
23}
24
25pub struct DummyTestVtxoSpec {
29 pub amount: Amount,
30 pub fee: Amount,
31 pub expiry_height: BlockHeight,
32 pub exit_delta: BlockDelta,
33 pub user_keypair: Keypair,
34 pub server_keypair: Keypair,
35}
36
37impl Default for DummyTestVtxoSpec {
38 fn default() -> Self {
39 Self {
40 amount: Amount::ONE_BTC + Amount::from_btc(0.1).unwrap(),
41 fee: Amount::from_btc(0.1).unwrap(),
42 expiry_height: 10_000,
43 exit_delta: 144,
44 user_keypair: *DUMMY_USER_KEY,
45 server_keypair: *DUMMY_SERVER_KEY,
46 }
47 }
48}
49
50impl DummyTestVtxoSpec {
51 pub fn build(&self) -> (Transaction, Vtxo<Full>) {
52 let user_builder = BoardBuilder::new(
54 self.user_keypair.public_key(),
55 self.expiry_height,
56 self.server_keypair.public_key(),
57 self.exit_delta,
58 );
59
60 let funding_tx = Transaction {
61 version: Version(3),
62 lock_time: LockTime::ZERO,
63 input: vec![TxIn {
64 previous_output: OutPoint::null(),
65 script_sig: ScriptBuf::new(),
66 sequence: Sequence::ZERO,
67 witness: Witness::new(),
68 }],
69 output: vec![
70 TxOut {
71 value: self.amount,
72 script_pubkey: user_builder.funding_script_pubkey(),
73 }
74 ],
75 };
76
77 let funding_outpoint = OutPoint::new(funding_tx.compute_txid(), 0);
78
79 let user_builder = user_builder
80 .set_funding_details(self.amount, self.fee, funding_outpoint).unwrap()
81 .generate_user_nonces();
82
83 let user_pub_nonce = user_builder.user_pub_nonce();
84
85 let server_builder = BoardBuilder::new_for_cosign(
87 self.user_keypair.public_key(),
88 self.expiry_height,
89 self.server_keypair.public_key(),
90 self.exit_delta,
91 self.amount,
92 self.fee,
93 funding_outpoint,
94 *user_pub_nonce,
95 );
96
97 let server_cosign_response = server_builder.server_cosign(&self.server_keypair);
98
99 let vtxo = user_builder.build_vtxo(&server_cosign_response, &self.user_keypair).unwrap();
100 (funding_tx, vtxo)
101 }
102}
103
104pub fn random_utxo() -> OutPoint {
105 OutPoint::new(Txid::from_byte_array(rand::random()), rand::random())
106}
107
108#[test]
109fn create_dummy_output() {
110 let board = DummyTestVtxoSpec {
111 amount: Amount::from_sat(1_330),
112 fee: Amount::from_sat(330),
113 expiry_height: 100000,
114 exit_delta: 1000,
115 user_keypair: Keypair::new(&crate::SECP, &mut bitcoin::secp256k1::rand::thread_rng()),
116 server_keypair: Keypair::new(&crate::SECP, &mut bitcoin::secp256k1::rand::thread_rng()),
117 };
118
119 board.build();
120}
121
122#[test]
123fn default_dummy_vtxo() {
124 DummyTestVtxoSpec::default().build();
125}