ark/test_util/
dummy.rs

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
25/// Just a utility to write unit tests
26/// It can quickly create a vtxo that matches
27/// some desired parameters
28pub 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		// The board-builder that is used by the user
53		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		// The server builder
86		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}