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 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 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 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 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 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 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 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}