ark/test_util/
vectors.rs

1
2use std::iter;
3use std::collections::HashMap;
4use std::str::FromStr;
5
6use bitcoin::absolute::LockTime;
7use bitcoin::consensus::encode::{deserialize_hex, serialize_hex};
8use bitcoin::hashes::{sha256, Hash};
9use bitcoin::hex::{DisplayHex, FromHex};
10use bitcoin::secp256k1::Keypair;
11use bitcoin::transaction::Version;
12use bitcoin::{Amount, OutPoint, ScriptBuf, Sequence, Transaction, TxIn, TxOut, Witness};
13
14use crate::{musig, Vtxo, VtxoPolicy, VtxoRequest, SECP};
15use crate::arkoor::ArkoorDestination;
16use crate::arkoor::package::ArkoorPackageBuilder;
17use crate::board::BoardBuilder;
18use crate::encode::ProtocolEncoding;
19use crate::lightning::PaymentHash;
20use crate::tree::signed::{UnlockHash, UnlockPreimage, VtxoLeafSpec, VtxoTreeSpec};
21use crate::test_util::encoding_roundtrip;
22use crate::vtxo::{Full, PubkeyVtxoPolicy, ServerHtlcSendVtxoPolicy};
23
24#[allow(unused)]
25#[macro_export]
26macro_rules! assert_eq_vtxos {
27	($v1:expr, $v2:expr) => {
28		let v1 = &$v1;
29		let v2 = &$v2;
30		assert_eq!(
31			v1.serialize().as_hex().to_string(),
32			v2.serialize().as_hex().to_string(),
33			"vtxo {} != {}", v1.id(), v2.id(),
34		);
35	};
36}
37
38#[derive(Debug, PartialEq, Eq)]
39pub struct VtxoTestVectors {
40	pub server_key: Keypair,
41
42	pub anchor_tx: Transaction,
43	pub board_vtxo: Vtxo<Full>,
44
45	pub arkoor_htlc_out_vtxo: Vtxo<Full>,
46	pub arkoor2_vtxo: Vtxo<Full>,
47
48	pub round_tx: Transaction,
49	pub round1_vtxo: Vtxo<Full>,
50	pub round2_vtxo: Vtxo<Full>,
51
52	pub arkoor3_user_key: Keypair,
53	pub arkoor3_vtxo: Vtxo<Full>,
54}
55
56impl VtxoTestVectors {
57	pub fn validate_vtxos(&self) {
58		let err = self.board_vtxo.validate(&self.anchor_tx).err();
59		assert!(err.is_none(), "board_vtxo should validate: {:?}", err);
60		assert!(self.board_vtxo.is_standard(), "board_vtxo should be standard");
61		let err = self.arkoor_htlc_out_vtxo.validate(&self.anchor_tx).err();
62		assert!(err.is_none(), "arkoor_htlc_out_vtxo should validate: {:?}", err);
63		assert!(self.arkoor_htlc_out_vtxo.is_standard(), "arkoor_htlc_out_vtxo should be standard");
64		let err = self.arkoor2_vtxo.validate(&self.anchor_tx).err();
65		assert!(err.is_none(), "arkoor2_vtxo should validate: {:?}", err);
66		assert!(self.arkoor2_vtxo.is_standard(), "arkoor2_vtxo should be standard");
67		let err = self.round1_vtxo.validate(&self.round_tx).err();
68		assert!(err.is_none(), "round1_vtxo should validate: {:?}", err);
69		assert!(self.round1_vtxo.is_standard(), "round1_vtxo should be standard");
70		let err = self.round2_vtxo.validate(&self.round_tx).err();
71		assert!(err.is_none(), "round2_vtxo should validate: {:?}", err);
72		assert!(self.round2_vtxo.is_standard(), "round2_vtxo should be standard");
73		let err = self.arkoor3_vtxo.validate(&self.round_tx).err();
74		assert!(err.is_none(), "arkoor3_vtxo should validate: {:?}", err);
75		assert!(self.arkoor3_vtxo.is_standard(), "arkoor3_vtxo should be standard");
76	}
77}
78
79#[derive(Debug, PartialEq, Eq)]
80pub struct VtxoTestHex {
81	pub server_key: &'static str,
82
83	pub anchor_tx: &'static str,
84	pub board_vtxo: &'static str,
85
86	pub arkoor_htlc_out_vtxo: &'static str,
87	pub arkoor2_vtxo: &'static str,
88
89	pub round_tx: &'static str,
90	pub round1_vtxo: &'static str,
91	pub round2_vtxo: &'static str,
92
93	pub arkoor3_user_key: &'static str,
94	pub arkoor3_vtxo: &'static str,
95}
96
97impl VtxoTestHex {
98	pub fn deserialize_test_vectors(&self) -> VtxoTestVectors {
99		VtxoTestVectors {
100			server_key: Keypair::from_str(self.server_key).expect("server_key should deserialize"),
101			anchor_tx: deserialize_hex(self.anchor_tx).expect("anchor_tx should deserialize"),
102			board_vtxo: ProtocolEncoding::deserialize_hex(self.board_vtxo).expect("board_vtxo should deserialize"),
103			arkoor_htlc_out_vtxo: ProtocolEncoding::deserialize_hex(self.arkoor_htlc_out_vtxo).expect("arkoor_htlc_out_vtxo should deserialize"),
104			arkoor2_vtxo: ProtocolEncoding::deserialize_hex(self.arkoor2_vtxo).expect("arkoor2_vtxo should deserialize"),
105			round_tx: deserialize_hex(self.round_tx).expect("round_tx should deserialize"),
106			round1_vtxo: ProtocolEncoding::deserialize_hex(self.round1_vtxo).expect("round1_vtxo should deserialize"),
107			round2_vtxo: ProtocolEncoding::deserialize_hex(self.round2_vtxo).expect("round2_vtxo should deserialize"),
108			arkoor3_user_key: Keypair::from_str(self.arkoor3_user_key).expect("arkoor3_user_key should deserialize"),
109			arkoor3_vtxo: ProtocolEncoding::deserialize_hex(self.arkoor3_vtxo).expect("arkoor3_vtxo should deserialize"),
110		}
111	}
112}
113
114pub fn generate_vtxo_vectors() -> VtxoTestVectors {
115	let expiry_height = 101_010;
116	let exit_delta = 2016;
117	let server_key = Keypair::from_str("916da686cedaee9a9bfb731b77439f2a3f1df8664e16488fba46b8d2bfe15e92").unwrap();
118	let board_user_key = Keypair::from_str("fab9e598081a3e74b2233d470c4ad87bcc285b6912ed929568e62ac0e9409879").unwrap();
119	let amount = Amount::from_sat(10_330);
120	let fee = Amount::from_sat(330);
121	let builder = BoardBuilder::new(
122		board_user_key.public_key(),
123		expiry_height,
124		server_key.public_key(),
125		exit_delta,
126	);
127	let anchor_tx = Transaction {
128		version: Version::TWO,
129		lock_time: LockTime::ZERO,
130		input: vec![TxIn {
131			previous_output: OutPoint::null(),
132			script_sig: ScriptBuf::new(),
133			sequence: Sequence::ZERO,
134			witness: Witness::new(),
135		}],
136		output: vec![TxOut {
137			value: Amount::from_sat(10_330),
138			script_pubkey: builder.funding_script_pubkey(),
139		}],
140	};
141	println!("chain anchor tx: {}", serialize_hex(&anchor_tx));
142	let anchor_point = OutPoint::new(anchor_tx.compute_txid(), 0);
143	let builder = builder.set_funding_details(amount, fee, anchor_point).unwrap()
144		.generate_user_nonces();
145
146	let board_cosign = {
147		BoardBuilder::new_for_cosign(
148			builder.user_pubkey,
149			builder.expiry_height,
150			builder.server_pubkey,
151			builder.exit_delta,
152			amount,
153			fee,
154			anchor_point,
155			*builder.user_pub_nonce(),
156		).server_cosign(&server_key)
157	};
158
159	assert!(builder.verify_cosign_response(&board_cosign));
160	let board_vtxo = builder.build_vtxo(&board_cosign, &board_user_key).unwrap();
161	encoding_roundtrip(&board_vtxo);
162	println!("board vtxo: {}", board_vtxo.serialize().as_hex());
163
164	// arkoor1: htlc send
165
166	let arkoor_htlc_out_user_key = Keypair::from_str("33b6f3ede430a1a53229f55da7117242d8392cbfc64a57249ba70731dba71408").unwrap();
167	let payment_hash = PaymentHash::from(sha256::Hash::hash("arkoor1".as_bytes()).to_byte_array());
168	let arkoor1_dest1 = ArkoorDestination {
169		total_amount: Amount::from_sat(9000),
170		policy: VtxoPolicy::ServerHtlcSend(ServerHtlcSendVtxoPolicy {
171			user_pubkey: arkoor_htlc_out_user_key.public_key(),
172			payment_hash,
173			htlc_expiry: expiry_height - 1000,
174		}),
175	};
176	let arkoor1_dest2 = ArkoorDestination {
177		total_amount: Amount::from_sat(1000),
178		policy: VtxoPolicy::new_pubkey("0229b7de0ce4d573192d002a6f9fd1109e00f7bae52bf10780d6f6e73e12a8390f".parse().unwrap()),
179	};
180	let builder = ArkoorPackageBuilder::new_with_checkpoints(
181		[board_vtxo.clone()], vec![arkoor1_dest1, arkoor1_dest2],
182	).unwrap().generate_user_nonces(&[board_user_key]).unwrap();
183	let cosign = ArkoorPackageBuilder::from_cosign_request(
184		builder.cosign_request(),
185	).unwrap().server_cosign(&server_key).unwrap().cosign_response();
186	let [arkoor_htlc_out_vtxo, change] = builder.user_cosign(&[board_user_key], cosign).unwrap()
187		.build_signed_vtxos().try_into().unwrap();
188	encoding_roundtrip(&arkoor_htlc_out_vtxo);
189	encoding_roundtrip(&change);
190	println!("arkoor1_vtxo: {}", arkoor_htlc_out_vtxo.serialize().as_hex());
191
192	// arkoor2: regular pubkey
193
194	let arkoor2_user_key = Keypair::from_str("fcc43a4f03356092a945ca1d7218503156bed3f94c2fa224578ce5b158fbf5a6").unwrap();
195	let arkoor2_dest1 = ArkoorDestination {
196		total_amount: Amount::from_sat(8000),
197		policy: VtxoPolicy::new_pubkey(arkoor2_user_key.public_key()),
198	};
199	let arkoor2_dest2 = ArkoorDestination {
200		total_amount: Amount::from_sat(1000),
201		policy: VtxoPolicy::new_pubkey("037039dc4f4b16e78059d2d56eb98d181cb1bdff2675694d39d92c4a2ea08ced88".parse().unwrap()),
202	};
203	let builder = ArkoorPackageBuilder::new_with_checkpoints(
204		[arkoor_htlc_out_vtxo.clone()], vec![arkoor2_dest1, arkoor2_dest2],
205	).unwrap().generate_user_nonces(&[arkoor_htlc_out_user_key]).unwrap();
206	let cosign = ArkoorPackageBuilder::from_cosign_request(
207		builder.cosign_request(),
208	).unwrap().server_cosign(&server_key).unwrap().cosign_response();
209	let [arkoor2_vtxo, change] = builder.user_cosign(&[arkoor_htlc_out_user_key], cosign).unwrap()
210		.build_signed_vtxos().try_into().unwrap();
211	encoding_roundtrip(&arkoor2_vtxo);
212	encoding_roundtrip(&change);
213	println!("arkoor2_vtxo: {}", arkoor2_vtxo.serialize().as_hex());
214
215	// round 1
216
217	//TODO(stevenroose) rename to round htlc in
218	let round1_user_key = Keypair::from_str("0a832e9574070c94b5b078600a18639321c880c830c5ba2f2a96850c7dcc4725").unwrap();
219	let round1_cosign_key = Keypair::from_str("e14bfc3199842c76816eec1d93c9da00b850c4ed19e414e246d07e845e465a2b").unwrap();
220	let round1_unlock_preimage = UnlockPreimage::from_hex("c05bc2f82c8c64e470cd4d87aca42989b46879ca32320cd035db124bb78c4e74").unwrap();
221	let round1_unlock_hash = UnlockHash::hash(&round1_unlock_preimage);
222	println!("round1_cosign_key: {}", round1_cosign_key.public_key());
223	let round1_req = VtxoLeafSpec {
224		vtxo: VtxoRequest {
225			amount: Amount::from_sat(10_000),
226			policy: VtxoPolicy::new_pubkey(round1_user_key.public_key()),
227		},
228		cosign_pubkey: Some(round1_cosign_key.public_key()),
229		unlock_hash: round1_unlock_hash,
230	};
231	let round1_nonces = iter::repeat_with(|| musig::nonce_pair(&round1_cosign_key)).take(5).collect::<Vec<_>>();
232
233	let round2_user_key = Keypair::from_str("c0b645b01cac427717a18b30c7c9238dee2b3885f659930144fbe05061ad6166").unwrap();
234	let round2_cosign_key = Keypair::from_str("628789cd7b7e02766d184ecfecc433798c9640349e41822df7996c66a56fc633").unwrap();
235	let round2_unlock_preimage = UnlockPreimage::from_hex("61050792ef121826fda248a789c8ba75b955844c65acd2c6361950bdd31dae7d").unwrap();
236	let round2_unlock_hash = UnlockHash::hash(&round2_unlock_preimage);
237	println!("round2_cosign_key: {}", round2_cosign_key.public_key());
238	let round2_payment_hash = PaymentHash::from(sha256::Hash::hash("round2".as_bytes()).to_byte_array());
239	let round2_req = VtxoLeafSpec {
240		vtxo: VtxoRequest {
241			amount: Amount::from_sat(10_000),
242			policy: VtxoPolicy::new_server_htlc_recv(
243				round2_user_key.public_key(),
244				round2_payment_hash,
245				expiry_height - 2000,
246				40,
247			),
248		},
249		cosign_pubkey: Some(round2_cosign_key.public_key()),
250		unlock_hash: round2_unlock_hash,
251	};
252	let round2_nonces = iter::repeat_with(|| musig::nonce_pair(&round2_cosign_key)).take(5).collect::<Vec<_>>();
253
254	let others = [
255		"93b376f64ada74f0fbf940be86f888459ac94655dc6a7805cc790b3c95a2a612",
256		"00add86ff531ef53f877780622f0b376669ec6ad7e090131820ff7007e79f529",
257		"775b836f2acf53de4ff9beeba2a17d5475e9b027d82fece72033ef06b954c7cd",
258		"395c2c210481990a5d12d33dca37995e235a34b717c89647a33907c62e32dc09",
259		"8f02f2a7aa1746bbcc92bba607b7166b6a77e9d0efd9d09dae7c2dc3addbdef1",
260	];
261	let mut other_reqs = Vec::new();
262	let mut other_nonces = Vec::new();
263	for k in others {
264		let user_key = Keypair::from_str(k).unwrap();
265		let cosign_key = Keypair::from_seckey_slice(&SECP, &sha256::Hash::hash(k.as_bytes())[..]).unwrap();
266		other_reqs.push(VtxoLeafSpec {
267			vtxo: VtxoRequest {
268				amount: Amount::from_sat(5_000),
269				policy: VtxoPolicy::new_pubkey(user_key.public_key()),
270			},
271			cosign_pubkey: Some(cosign_key.public_key()),
272			unlock_hash: sha256::Hash::hash(k.as_bytes()),
273		});
274		other_nonces.push(iter::repeat_with(|| musig::nonce_pair(&cosign_key)).take(5).collect::<Vec<_>>());
275	}
276
277	let server_cosign_key = Keypair::from_str("4371a4a7989b89ebe1b2582db4cd658cb95070977e6f10601ddc1e9b53edee79").unwrap();
278	let spec = VtxoTreeSpec::new(
279		[&round1_req, &round2_req].into_iter().chain(other_reqs.iter()).cloned().collect(),
280		server_key.public_key(),
281		expiry_height,
282		exit_delta,
283		vec![server_cosign_key.public_key()],
284	);
285	let round_tx = Transaction {
286		version: Version::TWO,
287		lock_time: LockTime::ZERO,
288		input: vec![TxIn {
289			previous_output: OutPoint::null(),
290			script_sig: ScriptBuf::new(),
291			sequence: Sequence::ZERO,
292			witness: Witness::new(),
293		}],
294		output: vec![TxOut {
295			value: Amount::from_sat(45_000),
296			script_pubkey: spec.funding_tx_script_pubkey(),
297		}],
298	};
299	println!("round tx: {}", serialize_hex(&round_tx));
300	let all_nonces = {
301		let mut map = HashMap::new();
302		map.insert(round1_cosign_key.public_key(), round1_nonces.iter().map(|n| n.1).collect::<Vec<_>>());
303		map.insert(round2_cosign_key.public_key(), round2_nonces.iter().map(|n| n.1).collect::<Vec<_>>());
304		for (req, nonces) in other_reqs.iter().zip(other_nonces.iter()) {
305			map.insert(req.cosign_pubkey.unwrap(), nonces.iter().map(|n| n.1).collect::<Vec<_>>());
306		}
307		map
308	};
309	let (server_cosign_sec_nonces, server_cosign_pub_nonces) = iter::repeat_with(|| {
310		musig::nonce_pair(&server_cosign_key)
311	}).take(spec.nb_internal_nodes()).unzip::<_, _, Vec<_>, Vec<_>>();
312	let cosign_agg_nonces = spec.calculate_cosign_agg_nonces(&all_nonces, &[&server_cosign_pub_nonces]).unwrap();
313	let root_point = OutPoint::new(round_tx.compute_txid(), 0);
314	let tree = spec.into_unsigned_tree(root_point);
315	let part_sigs = {
316		let mut map = HashMap::new();
317		map.insert(round1_cosign_key.public_key(), {
318			let secs = round1_nonces.into_iter().map(|(s, _)| s).collect();
319			let r = tree.cosign_branch(&cosign_agg_nonces, 0, &round1_cosign_key, secs).unwrap();
320			r
321		});
322		map.insert(round2_cosign_key.public_key(), {
323			let secs = round2_nonces.into_iter().map(|(s, _)| s).collect();
324			tree.cosign_branch(&cosign_agg_nonces, 1, &round2_cosign_key, secs).unwrap()
325		});
326		for (i, (req, nonces)) in other_reqs.iter().zip(other_nonces.into_iter()).enumerate() {
327			let cosign_key = Keypair::from_seckey_slice(
328				&SECP, &sha256::Hash::hash(others[i].as_bytes())[..],
329			).unwrap();
330			map.insert(req.cosign_pubkey.unwrap(), {
331				let secs = nonces.into_iter().map(|(s, _)| s).collect();
332				tree.cosign_branch(&cosign_agg_nonces, 2 + i, &cosign_key, secs).unwrap()
333			});
334		}
335		map
336	};
337	let server_cosign_sigs = tree.cosign_tree(
338		&cosign_agg_nonces, &server_cosign_key, server_cosign_sec_nonces,
339	);
340	let cosign_sigs = tree.combine_partial_signatures(&cosign_agg_nonces, &part_sigs, &[&server_cosign_sigs]).unwrap();
341	if let Err(pk) = tree.verify_cosign_sigs(&cosign_sigs) {
342		panic!("invalid cosign sig for pk: {}", pk);
343	}
344	let signed = tree.into_signed_tree(cosign_sigs).into_cached_tree();
345	// we don't need forfeits
346	let mut vtxo_iter = signed.output_vtxos();
347	let round1_vtxo = {
348		let mut ret = vtxo_iter.next().unwrap();
349		ret.finalize_hark_leaf(&round1_user_key, &server_key, &round_tx, round1_unlock_preimage);
350		ret
351	};
352	encoding_roundtrip(&round1_vtxo);
353	println!("round1_vtxo: {}", round1_vtxo.serialize().as_hex());
354	let round2_vtxo = {
355		let mut ret = vtxo_iter.next().unwrap();
356		ret.finalize_hark_leaf(&round2_user_key, &server_key, &round_tx, round2_unlock_preimage);
357		ret
358	};
359	encoding_roundtrip(&round2_vtxo);
360	println!("round2_vtxo: {}", round2_vtxo.serialize().as_hex());
361
362	// arkoor3: off from round2's htlc
363
364	let arkoor3_user_key = Keypair::from_str("ad12595bdbdab56cb61d1f60ccc46ff96b11c5d6fe06ae7ba03d3a5f4347440f").unwrap();
365	let arkoor3_dest = ArkoorDestination {
366		total_amount: Amount::from_sat(10_000),
367		policy: VtxoPolicy::Pubkey(PubkeyVtxoPolicy { user_pubkey: arkoor3_user_key.public_key() }),
368	};
369	let builder = ArkoorPackageBuilder::new_with_checkpoints(
370		[round2_vtxo.clone()], vec![arkoor3_dest],
371	).unwrap().generate_user_nonces(&[round2_user_key]).unwrap();
372	let cosign = ArkoorPackageBuilder::from_cosign_request(
373		builder.cosign_request(),
374	).unwrap().server_cosign(&server_key).unwrap().cosign_response();
375	let [arkoor3_vtxo] = builder.user_cosign(&[round2_user_key], cosign).unwrap()
376		.build_signed_vtxos().try_into().unwrap();
377	encoding_roundtrip(&arkoor3_vtxo);
378	println!("arkoor3_vtxo: {}", arkoor3_vtxo.serialize().as_hex());
379
380	VtxoTestVectors {
381		server_key,
382		anchor_tx,
383		board_vtxo,
384		arkoor_htlc_out_vtxo,
385		arkoor2_vtxo,
386		round_tx,
387		round1_vtxo,
388		round2_vtxo,
389		arkoor3_user_key,
390		arkoor3_vtxo,
391	}
392}
393
394lazy_static! {
395	/// A set of deterministically generated and fully correct VTXOs.
396	pub static ref VTXO_VECTORS: VtxoTestVectors = VtxoTestVectors {
397		server_key: Keypair::from_str("916da686cedaee9a9bfb731b77439f2a3f1df8664e16488fba46b8d2bfe15e92").unwrap(),
398		anchor_tx: deserialize_hex("02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000015a28000000000000225120652675904a84ea02e24b57b3d547203d2ce71526113d35bf4d02e0b4efbe9a2d00000000").unwrap(),
399		board_vtxo: ProtocolEncoding::deserialize_hex("02001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e0075111d0df3738fe77c8f05b0f71292ae6ae5eddf911f8d2bb4dbde598fcbe768f00000000010102030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee0365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b629c9c63d9c0f739011368e00c2441d85816c01d637da8d57ac343c95982dd3604d8bf847bcf8a2aac44483d7ea01ec9a99f7720d0694cb3cdd3cbcca97504adaf01004a0100000000000000030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee24e9a421d9018690eea79b11e4e4fe59d36aa8f46d110017e09abe350b5e315600000000").unwrap(),
400		arkoor_htlc_out_vtxo: ProtocolEncoding::deserialize_hex("02002823000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e0075111d0df3738fe77c8f05b0f71292ae6ae5eddf911f8d2bb4dbde598fcbe768f00000000030102030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee0365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b629c9c63d9c0f739011368e00c2441d85816c01d637da8d57ac343c95982dd3604d8bf847bcf8a2aac44483d7ea01ec9a99f7720d0694cb3cdd3cbcca97504adaf01004a010000000000000201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee78b9640f859155786c4923b1d634d20b02663f1c4d061c4411f15e386951a63fe2f726e4b4c230cecadc54e7a04ad378e52fd843e3a9df3f6ea1a97343873cf730b9cb055a52318e76943877ad24040f2b45ec093ba92f6d2a62ded3c8893bc00200e803000000000000225120652675904a84ea02e24b57b3d547203d2ce71526113d35bf4d02e0b4efbe9a2d00000000000000000201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612eea77a828ce5ccaca57a4b78f16499219334c6ee95c9b990ee15918aeb9159300550e104a3308399d278d8cf0b4b40e6dd457eb8bf6cf277c0347977226c1af8ce957187066286c38c23dd9f5723ff474b7febb352264676251f4ef487325a3be6010000000000000000000103eb4570ae385202d4a48f06bdb14126910b90c07f8e42d7dc5e28a860c085e73712358912c950a9a7d04bb9011ee9f6a16b6127a5aab7415803d48c0225f620f5aa860100a37b8eee642c5852a874d183c44c1a439d6dd269d9a9246aaefd6c71007c9b9700000000").unwrap(),
401		arkoor2_vtxo: ProtocolEncoding::deserialize_hex("0200401f000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e0075111d0df3738fe77c8f05b0f71292ae6ae5eddf911f8d2bb4dbde598fcbe768f00000000050102030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee0365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b629c9c63d9c0f739011368e00c2441d85816c01d637da8d57ac343c95982dd3604d8bf847bcf8a2aac44483d7ea01ec9a99f7720d0694cb3cdd3cbcca97504adaf01004a010000000000000201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee78b9640f859155786c4923b1d634d20b02663f1c4d061c4411f15e386951a63fe2f726e4b4c230cecadc54e7a04ad378e52fd843e3a9df3f6ea1a97343873cf730b9cb055a52318e76943877ad24040f2b45ec093ba92f6d2a62ded3c8893bc00200e803000000000000225120652675904a84ea02e24b57b3d547203d2ce71526113d35bf4d02e0b4efbe9a2d00000000000000000201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612eea77a828ce5ccaca57a4b78f16499219334c6ee95c9b990ee15918aeb9159300550e104a3308399d278d8cf0b4b40e6dd457eb8bf6cf277c0347977226c1af8ce957187066286c38c23dd9f5723ff474b7febb352264676251f4ef487325a3be601000000000000000000020103eb4570ae385202d4a48f06bdb14126910b90c07f8e42d7dc5e28a860c085e737474fa0103bd24e02383f053a708ed3b3cb9818aab2410d1828fa3070836fa5e7c9ae5c4c74fc0ef06d70ac16d0ee8d11da27f93aa8fdc64e3458e72f8ff829dc6fc95b8707738285a3eabc34d869ef46422d8fd1b3f6202e07576a11c25bf0090200e80300000000000022512045827da6714a3cadf6646b36f4e18841a8572d7c6f849e8376058be8381941c80000000000000000020103eb4570ae385202d4a48f06bdb14126910b90c07f8e42d7dc5e28a860c085e73771985112b67c902fbaaacfc19801ee5833608e8cb73a84c20dfc541b298dc9abee4a4dd282d39b61a438094d69555bbf237f7ad23ca06a0bb741ad0c2fab8f2ec144eddd8050e2dcaf0631bcde48add5fe21ad6f6ae4e89511cd3df980db6f6801000000000000000000000265cca13271cafd0b90c440e722a1937b7c4faf4ccd7dee0548d152c24ce4b2a82f4fcb80a15b64e92b030a15c1bfca2ff881b543ba9a8c9eeafd6fc94ddf579c00000000").unwrap(),
402		round_tx: deserialize_hex("02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff000000000001c8af000000000000225120649657f65947abfd83ff629ad8a851c795f419ed4d52a2748d3f868cc3e6c94d00000000").unwrap(),
403		round1_vtxo: ProtocolEncoding::deserialize_hex("02001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007a3c23c49874159964c52b95021596d5a22e8f8b6bc7c16aa8303c24498d3d5ab00000000030108039e8a040d9c1fba5a7b0db8485d8f167f8d2590afd8595f9eb9ba7a769347ba2602bd0ad185b18089d37d20dd784b99003914faadcc59f37bbf3273a3b5cd22ed5002568a3a6d25000fc942f0443dc76be4ef688e8c8dc055591de1f2cc1c847b1ed3036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b24274346d25a48ea54ac16fb8520de6b40d74eca2f6afe80eabe92e1da7c6a29c71f7a2180880eaff4ad2fe5c9f61a45929fa02ffc80bcf71a08a94aa42b3389664d30040388130000000000002251205acb7b65f8da14622a055640893e952e20f68e051087b85be4d56e50cdafd4318813000000000000225120973b9be7e6ee51f8851347130113e4001ab1d01252dd1d09713a6c900cb327f2881300000000000022512052cc228fe0f4951032fbaeb45ed8b73163cedb897412407e5b431d740040a95100000000000000000105036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743cdffd77c96988b99b6cfb1f2618c0c90df5404247c1fae7850b0f477277d8c2a0ddf93f8faa1866e3c03cdca21ae8bacf9e9c3b0110db25f57c64121ff36aae104001027000000000000225120e9d56cdf22598ce6c05950b3580e194a19e53f8b887fc6c4111ca2a82a0608a88813000000000000225120c3731a9dc38c67dfa2dd206ee346d6225f1f37b97d77d518c59b9c9a291762288813000000000000225120a4ad17a5f329a164977981f1b7638c7a70b0dd1bed29a85637aed2952dd2e38c0000000000000000030374a3ec37cc4ccd29717388e6dc24f2aa366632f1a36a49e73cd7671b2317929806cc549f68bb77baf6d90cf2e6f8a9be936ecb9fb29cfdfac4be45d9669927217f21396dc1da8ddf456f99375339cd2b67a15795db683828ec597e02001b8b6d00c05bc2f82c8c64e470cd4d87aca42989b46879ca32320cd035db124bb78c4e7401000000000000000000000374a3ec37cc4ccd29717388e6dc24f2aa366632f1a36a49e73cd7671b2317929862d6c4b8e408915af8279d4f14431f517a0c9ecc46fae2e8b0a5f72cfcf506c800000000").unwrap(),
404		round2_vtxo: ProtocolEncoding::deserialize_hex("02001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007a3c23c49874159964c52b95021596d5a22e8f8b6bc7c16aa8303c24498d3d5ab00000000030108039e8a040d9c1fba5a7b0db8485d8f167f8d2590afd8595f9eb9ba7a769347ba2602bd0ad185b18089d37d20dd784b99003914faadcc59f37bbf3273a3b5cd22ed5002568a3a6d25000fc942f0443dc76be4ef688e8c8dc055591de1f2cc1c847b1ed3036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b24274346d25a48ea54ac16fb8520de6b40d74eca2f6afe80eabe92e1da7c6a29c71f7a2180880eaff4ad2fe5c9f61a45929fa02ffc80bcf71a08a94aa42b3389664d30040388130000000000002251205acb7b65f8da14622a055640893e952e20f68e051087b85be4d56e50cdafd4318813000000000000225120973b9be7e6ee51f8851347130113e4001ab1d01252dd1d09713a6c900cb327f2881300000000000022512052cc228fe0f4951032fbaeb45ed8b73163cedb897412407e5b431d740040a95100000000000000000105036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743cdffd77c96988b99b6cfb1f2618c0c90df5404247c1fae7850b0f477277d8c2a0ddf93f8faa1866e3c03cdca21ae8bacf9e9c3b0110db25f57c64121ff36aae1040110270000000000002251202ec5640d3ba147e40c916e8fa9b0ee89557d10465db1d55a49c87edebe53104c8813000000000000225120c3731a9dc38c67dfa2dd206ee346d6225f1f37b97d77d518c59b9c9a291762288813000000000000225120a4ad17a5f329a164977981f1b7638c7a70b0dd1bed29a85637aed2952dd2e38c0000000000000000030256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd1a44d59f2cd4ee5cb7ffd6461101ae2a153575d21af9180d33ec334d01ca45ab640896cfe43c6a12139567bcfdb021a55bfd5ef71d8fcadcc3fde49b30a9fd740061050792ef121826fda248a789c8ba75b955844c65acd2c6361950bdd31dae7d01000000000000000000020256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd9ea50d885c3f66d40d27e779648ba8dc730629663f65a3e6f7749b4a35b6dfecc28201002800ca6a1d9ccb57f92a11eb4383517f0046482462046eeb9090496785f1893b766f00000000").unwrap(),
405		arkoor3_user_key: Keypair::from_str("ad12595bdbdab56cb61d1f60ccc46ff96b11c5d6fe06ae7ba03d3a5f4347440f").unwrap(),
406		arkoor3_vtxo: ProtocolEncoding::deserialize_hex("02001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007a3c23c49874159964c52b95021596d5a22e8f8b6bc7c16aa8303c24498d3d5ab00000000050108039e8a040d9c1fba5a7b0db8485d8f167f8d2590afd8595f9eb9ba7a769347ba2602bd0ad185b18089d37d20dd784b99003914faadcc59f37bbf3273a3b5cd22ed5002568a3a6d25000fc942f0443dc76be4ef688e8c8dc055591de1f2cc1c847b1ed3036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b24274346d25a48ea54ac16fb8520de6b40d74eca2f6afe80eabe92e1da7c6a29c71f7a2180880eaff4ad2fe5c9f61a45929fa02ffc80bcf71a08a94aa42b3389664d30040388130000000000002251205acb7b65f8da14622a055640893e952e20f68e051087b85be4d56e50cdafd4318813000000000000225120973b9be7e6ee51f8851347130113e4001ab1d01252dd1d09713a6c900cb327f2881300000000000022512052cc228fe0f4951032fbaeb45ed8b73163cedb897412407e5b431d740040a95100000000000000000105036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743cdffd77c96988b99b6cfb1f2618c0c90df5404247c1fae7850b0f477277d8c2a0ddf93f8faa1866e3c03cdca21ae8bacf9e9c3b0110db25f57c64121ff36aae1040110270000000000002251202ec5640d3ba147e40c916e8fa9b0ee89557d10465db1d55a49c87edebe53104c8813000000000000225120c3731a9dc38c67dfa2dd206ee346d6225f1f37b97d77d518c59b9c9a291762288813000000000000225120a4ad17a5f329a164977981f1b7638c7a70b0dd1bed29a85637aed2952dd2e38c0000000000000000030256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd1a44d59f2cd4ee5cb7ffd6461101ae2a153575d21af9180d33ec334d01ca45ab640896cfe43c6a12139567bcfdb021a55bfd5ef71d8fcadcc3fde49b30a9fd740061050792ef121826fda248a789c8ba75b955844c65acd2c6361950bdd31dae7d0100000000000000000002010256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecda3f46c1fa220865803e80a3688630644317f8c0a85491d849b4ce7f33d133ccf745a7a1d8a4d36acf8f4f0c28d50c117bca0d4d5c9d922700270f2a64964c2917e012b0dd41f158b358ba37ffe9d1a2934fe4015d0fb0967eef2077992b196990100000000000000000002010256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd565b73d5325e68949a264159ea1da8a7d8ba8788f3f63a202d5f3047d2fe9428f62285e7b77ffb39f787759b2bc1e16fac4ec39bc106e2c3b22d714da7d6a25ee8c83704a28703106e412853255e5f55f58f43583e97da3a958e269bb1a28fc8010000000000000000000002ed1334f116cea9128e1f59f1d5a431cb4f338f0998e2b32f654c310bf7831f97016422a562a4826f26ff351ecb5b1122e0d27958053fd6595a9424a0305fad0700000000").unwrap(),
407	};
408
409	/// A set of hex strings for deterministically generated and fully correct VTXOs with [crate::vtxo::VTXO_NO_FEE_AMOUNT_VERSION] encoding.
410	pub static ref VTXO_NO_FEE_AMOUNT_VERSION_HEXES: VtxoTestHex = VtxoTestHex {
411		server_key: "916da686cedaee9a9bfb731b77439f2a3f1df8664e16488fba46b8d2bfe15e92",
412		anchor_tx: "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0000000000011027000000000000225120652675904a84ea02e24b57b3d547203d2ce71526113d35bf4d02e0b4efbe9a2d00000000",
413		board_vtxo: "01001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007ed4d23932a2625a78fe5c75bded751da3a99e23a297a527c01bd7bc8372128f200000000010102030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee0365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62655d61f465693e1fbf39814e9cb1d57d5eabc49548ed042626cc39c4d5fe5c1836c8c2fb634bceab363212ed4c6a8e78c9ff33884587830ffa2a1cbd84c95e77010000030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee4c99b744ad009b7070f330794bf003fa8e5cd46ea1a6eb854aaf469385e3080000000000",
414		arkoor_htlc_out_vtxo: "01002823000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007ed4d23932a2625a78fe5c75bded751da3a99e23a297a527c01bd7bc8372128f200000000030102030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee0365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62655d61f465693e1fbf39814e9cb1d57d5eabc49548ed042626cc39c4d5fe5c1836c8c2fb634bceab363212ed4c6a8e78c9ff33884587830ffa2a1cbd84c95e7701000201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee78b9640f859155786c4923b1d634d20b02663f1c4d061c4411f15e386951a63f6df2b91823cc3d3a0e18ac32104a9a649d3842245932f87e77fa4402a4c91f14b7b629421b17be09173f277f3ae4f413b294a825188d89834a1e23c9139388240200e803000000000000225120652675904a84ea02e24b57b3d547203d2ce71526113d35bf4d02e0b4efbe9a2d0201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612eea77a828ce5ccaca57a4b78f16499219334c6ee95c9b990ee15918aeb9159300565f82f1a66bc0b197516209817f9b89b6b2d54a640a667dc07021d100ec07b4c684c03fb4cb2442f3cba4ea2b17b460001dc8299e832880685d22c9ef24ce64801000103eb4570ae385202d4a48f06bdb14126910b90c07f8e42d7dc5e28a860c085e73712358912c950a9a7d04bb9011ee9f6a16b6127a5aab7415803d48c0225f620f5aa8601006b46ceafff6c10e1c1d07fa308e79cfdac35e952c1e2ccf3f8c9797c776db17200000000",
415		arkoor2_vtxo: "0100401f000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007ed4d23932a2625a78fe5c75bded751da3a99e23a297a527c01bd7bc8372128f200000000050102030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee0365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62655d61f465693e1fbf39814e9cb1d57d5eabc49548ed042626cc39c4d5fe5c1836c8c2fb634bceab363212ed4c6a8e78c9ff33884587830ffa2a1cbd84c95e7701000201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612ee78b9640f859155786c4923b1d634d20b02663f1c4d061c4411f15e386951a63f6df2b91823cc3d3a0e18ac32104a9a649d3842245932f87e77fa4402a4c91f14b7b629421b17be09173f277f3ae4f413b294a825188d89834a1e23c9139388240200e803000000000000225120652675904a84ea02e24b57b3d547203d2ce71526113d35bf4d02e0b4efbe9a2d0201030a752219f1b94bbdf8994a0a980cdda08c2ad094cb29dd834878db6dee1612eea77a828ce5ccaca57a4b78f16499219334c6ee95c9b990ee15918aeb9159300565f82f1a66bc0b197516209817f9b89b6b2d54a640a667dc07021d100ec07b4c684c03fb4cb2442f3cba4ea2b17b460001dc8299e832880685d22c9ef24ce6480100020103eb4570ae385202d4a48f06bdb14126910b90c07f8e42d7dc5e28a860c085e737474fa0103bd24e02383f053a708ed3b3cb9818aab2410d1828fa3070836fa5e71b2e02e0edbb3c5382a80ad069686debf9ad0e27df88eaaa0a08417271c1fe67a89a3ce8cf1fe5954c867e29a3c9e50892eb0a60bcbe25c4505ff3709554322c0200e80300000000000022512045827da6714a3cadf6646b36f4e18841a8572d7c6f849e8376058be8381941c8020103eb4570ae385202d4a48f06bdb14126910b90c07f8e42d7dc5e28a860c085e73771985112b67c902fbaaacfc19801ee5833608e8cb73a84c20dfc541b298dc9ab5f8ce376bad23d53354c8370d3f9e7e7d1925547c5ef96011c36d5d075644a3af909ef83ee3e16a2c567b2747e56843b526cf9e9690712b8b77933c8b8bb8f490100000265cca13271cafd0b90c440e722a1937b7c4faf4ccd7dee0548d152c24ce4b2a8dca043938fa10d4ea2d54ab3743f9e092b9f671aa30161bcbd3942b46b1b195700000000",
416		round_tx: "02000000010000000000000000000000000000000000000000000000000000000000000000ffffffff000000000001c8af000000000000225120649657f65947abfd83ff629ad8a851c795f419ed4d52a2748d3f868cc3e6c94d00000000",
417		round1_vtxo: "01001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007a3c23c49874159964c52b95021596d5a22e8f8b6bc7c16aa8303c24498d3d5ab00000000030108039e8a040d9c1fba5a7b0db8485d8f167f8d2590afd8595f9eb9ba7a769347ba2602bd0ad185b18089d37d20dd784b99003914faadcc59f37bbf3273a3b5cd22ed5002568a3a6d25000fc942f0443dc76be4ef688e8c8dc055591de1f2cc1c847b1ed3036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743d272c99b53de1036c5d3f381a6d873a759707ffc98414634943e8568ff9ddf3b57e658e0a5e0ad82daf82e783c1863aff6bccded8569199c1213e8c51407c0f6040388130000000000002251205acb7b65f8da14622a055640893e952e20f68e051087b85be4d56e50cdafd4318813000000000000225120973b9be7e6ee51f8851347130113e4001ab1d01252dd1d09713a6c900cb327f2881300000000000022512052cc228fe0f4951032fbaeb45ed8b73163cedb897412407e5b431d740040a9510105036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743b707706c721f8b9172188c3a9fa2709a478d40c9a89537405a4ae21df94e90d8ec24d0caa098db3c31d3d25d5414a5febf0e039da137440fa9dd932d759d364604001027000000000000225120e9d56cdf22598ce6c05950b3580e194a19e53f8b887fc6c4111ca2a82a0608a88813000000000000225120c3731a9dc38c67dfa2dd206ee346d6225f1f37b97d77d518c59b9c9a291762288813000000000000225120a4ad17a5f329a164977981f1b7638c7a70b0dd1bed29a85637aed2952dd2e38c030374a3ec37cc4ccd29717388e6dc24f2aa366632f1a36a49e73cd7671b23179298dda3af54a441d56f83e4a3924efe431b358b5c7ef8f4d92b7554706b5e3d73994ef01aa880c8d6da73fad0600715a266dd67797e2f2034f331f251e9040bbd1c00c05bc2f82c8c64e470cd4d87aca42989b46879ca32320cd035db124bb78c4e740100000374a3ec37cc4ccd29717388e6dc24f2aa366632f1a36a49e73cd7671b2317929862d6c4b8e408915af8279d4f14431f517a0c9ecc46fae2e8b0a5f72cfcf506c800000000",
418		round2_vtxo: "01001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007a3c23c49874159964c52b95021596d5a22e8f8b6bc7c16aa8303c24498d3d5ab00000000030108039e8a040d9c1fba5a7b0db8485d8f167f8d2590afd8595f9eb9ba7a769347ba2602bd0ad185b18089d37d20dd784b99003914faadcc59f37bbf3273a3b5cd22ed5002568a3a6d25000fc942f0443dc76be4ef688e8c8dc055591de1f2cc1c847b1ed3036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743d272c99b53de1036c5d3f381a6d873a759707ffc98414634943e8568ff9ddf3b57e658e0a5e0ad82daf82e783c1863aff6bccded8569199c1213e8c51407c0f6040388130000000000002251205acb7b65f8da14622a055640893e952e20f68e051087b85be4d56e50cdafd4318813000000000000225120973b9be7e6ee51f8851347130113e4001ab1d01252dd1d09713a6c900cb327f2881300000000000022512052cc228fe0f4951032fbaeb45ed8b73163cedb897412407e5b431d740040a9510105036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743b707706c721f8b9172188c3a9fa2709a478d40c9a89537405a4ae21df94e90d8ec24d0caa098db3c31d3d25d5414a5febf0e039da137440fa9dd932d759d3646040110270000000000002251202ec5640d3ba147e40c916e8fa9b0ee89557d10465db1d55a49c87edebe53104c8813000000000000225120c3731a9dc38c67dfa2dd206ee346d6225f1f37b97d77d518c59b9c9a291762288813000000000000225120a4ad17a5f329a164977981f1b7638c7a70b0dd1bed29a85637aed2952dd2e38c030256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd0357ccc0a609082b767909f37a4acdf55d1467bcaab77926b4ffe93edf8f9e8c4ea30a1bb9d23f32ee1c22e12a03c81a58f2c6b0c745e916bcbb2f6b46ca94830061050792ef121826fda248a789c8ba75b955844c65acd2c6361950bdd31dae7d0100020256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd9ea50d885c3f66d40d27e779648ba8dc730629663f65a3e6f7749b4a35b6dfecc28201002800ca6a1d9ccb57f92a11eb4383517f0046482462046eeb9090496785f1893b766f00000000",
419		arkoor3_user_key: "ad12595bdbdab56cb61d1f60ccc46ff96b11c5d6fe06ae7ba03d3a5f4347440f",
420		arkoor3_vtxo: "01001027000000000000928a01000365a81233741893bbe2461b8d479dadc5880594fe6f7479180d5843820af72b62e007a3c23c49874159964c52b95021596d5a22e8f8b6bc7c16aa8303c24498d3d5ab00000000050108039e8a040d9c1fba5a7b0db8485d8f167f8d2590afd8595f9eb9ba7a769347ba2602bd0ad185b18089d37d20dd784b99003914faadcc59f37bbf3273a3b5cd22ed5002568a3a6d25000fc942f0443dc76be4ef688e8c8dc055591de1f2cc1c847b1ed3036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743d272c99b53de1036c5d3f381a6d873a759707ffc98414634943e8568ff9ddf3b57e658e0a5e0ad82daf82e783c1863aff6bccded8569199c1213e8c51407c0f6040388130000000000002251205acb7b65f8da14622a055640893e952e20f68e051087b85be4d56e50cdafd4318813000000000000225120973b9be7e6ee51f8851347130113e4001ab1d01252dd1d09713a6c900cb327f2881300000000000022512052cc228fe0f4951032fbaeb45ed8b73163cedb897412407e5b431d740040a9510105036e64c16a01e3d18908a15b55251a5db74ff2c1142c02abd048222893b2a18a16024ac23c8d3f6e0b1116e34f68ee7c9e4c19eba30213e8fae0925d70faf8d1ecc403932b1b0224e375471c938ea84bd17df7d8295941b2db68a6623610dd959b2eb303d215f5e88aefa7a2a9794771878f3d6caf20e884c1e0ce923cfa9dea261bb4e2024482039ebf3624525061f88aa01d4a02b3f2224eee8b4060ae0cbf036b242743b707706c721f8b9172188c3a9fa2709a478d40c9a89537405a4ae21df94e90d8ec24d0caa098db3c31d3d25d5414a5febf0e039da137440fa9dd932d759d3646040110270000000000002251202ec5640d3ba147e40c916e8fa9b0ee89557d10465db1d55a49c87edebe53104c8813000000000000225120c3731a9dc38c67dfa2dd206ee346d6225f1f37b97d77d518c59b9c9a291762288813000000000000225120a4ad17a5f329a164977981f1b7638c7a70b0dd1bed29a85637aed2952dd2e38c030256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd0357ccc0a609082b767909f37a4acdf55d1467bcaab77926b4ffe93edf8f9e8c4ea30a1bb9d23f32ee1c22e12a03c81a58f2c6b0c745e916bcbb2f6b46ca94830061050792ef121826fda248a789c8ba75b955844c65acd2c6361950bdd31dae7d010002010256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecda3f46c1fa220865803e80a3688630644317f8c0a85491d849b4ce7f33d133ccf093c49954b4028aa6d3765b7d07eb6b92649a81a862f8ad39b97278bdefafff3632ac1f2f353abd646ae7d79707ea9ff0144ba8425762145932daef6bd8855bd010002010256fda20ffb102f6cf8590d27433ce036d29927fb35324d15d9915df888f16ecd565b73d5325e68949a264159ea1da8a7d8ba8788f3f63a202d5f3047d2fe9428e63ea5bd23c4524f59efb7213b3cde26f2fb8279f35e0f5b95d74576daa1d8c827af2054c993ea76819668d9b3d184cd48c521f1254e7a0ebeaa2f1b99a6f15d01000002ed1334f116cea9128e1f59f1d5a431cb4f338f0998e2b32f654c310bf7831f97016422a562a4826f26ff351ecb5b1122e0d27958053fd6595a9424a0305fad0700000000",
421	};
422}