1#![expect(
4 non_snake_case,
5 reason = "JSON serialization requires non snake-case casing"
6)]
7
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11#[cfg(feature = "epee")]
12use cuprate_epee_encoding::{
13 error,
14 macros::bytes::{Buf, BufMut},
15 EpeeObject, EpeeObjectBuilder,
16};
17
18use cuprate_helper::cast::usize_to_u64;
19use cuprate_hex::Hex;
20
21use monero_oxide::{ringct, transaction};
22
23use crate::json::output::{Output, TaggedKey, Target};
24
25#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
31#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
32#[cfg_attr(feature = "serde", serde(untagged))]
33pub enum Transaction {
34 V1 {
35 #[cfg_attr(feature = "serde", serde(flatten))]
37 prefix: TransactionPrefix,
38 signatures: Vec<Hex<64>>,
39 },
40 V2 {
41 #[cfg_attr(feature = "serde", serde(flatten))]
43 prefix: TransactionPrefix,
44 rct_signatures: RctSignatures,
45 rctsig_prunable: Option<RctSigPrunable>,
48 },
49}
50
51#[cfg(feature = "epee")]
52impl EpeeObjectBuilder<Transaction> for () {
53 fn add_field<B: Buf>(&mut self, _: &str, _: &mut B) -> error::Result<bool> {
54 unreachable!()
55 }
56
57 fn finish(self) -> error::Result<Transaction> {
58 unreachable!()
59 }
60}
61
62#[cfg(feature = "epee")]
63impl EpeeObject for Transaction {
64 type Builder = ();
65
66 fn number_of_fields(&self) -> u64 {
67 unreachable!()
68 }
69
70 fn write_fields<B: BufMut>(self, _: &mut B) -> error::Result<()> {
71 unreachable!()
72 }
73}
74
75impl Default for Transaction {
76 fn default() -> Self {
77 Self::V1 {
78 prefix: Default::default(),
79 signatures: Default::default(),
80 }
81 }
82}
83
84#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
86#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
87pub struct TransactionPrefix {
88 pub version: u8,
89 pub unlock_time: u64,
90 pub vin: Vec<Input>,
91 pub vout: Vec<Output>,
92 pub extra: Vec<u8>,
93}
94
95impl From<transaction::Transaction> for Transaction {
96 fn from(tx: transaction::Transaction) -> Self {
97 fn map_prefix(prefix: transaction::TransactionPrefix, version: u8) -> TransactionPrefix {
98 let mut height = 0;
99
100 let vin = prefix
101 .inputs
102 .into_iter()
103 .filter_map(|input| match input {
104 transaction::Input::ToKey {
105 amount,
106 key_offsets,
107 key_image,
108 } => {
109 let key = Key {
110 amount: amount.unwrap_or(0),
111 key_offsets,
112 k_image: Hex(key_image.to_bytes()),
113 };
114
115 Some(Input { key })
116 }
117 transaction::Input::Gen(h) => {
118 height = usize_to_u64(h);
119 None
120 }
121 })
122 .collect();
123
124 let vout = prefix
125 .outputs
126 .into_iter()
127 .map(|o| {
128 let amount = o.amount.unwrap_or(0);
129
130 let target = match o.view_tag {
131 Some(view_tag) => {
132 let tagged_key = TaggedKey {
133 key: Hex(o.key.to_bytes()),
134 view_tag: Hex([view_tag]),
135 };
136
137 Target::TaggedKey { tagged_key }
138 }
139 None => Target::Key {
140 key: Hex(o.key.to_bytes()),
141 },
142 };
143
144 Output { amount, target }
145 })
146 .collect();
147
148 let unlock_time = match prefix.additional_timelock {
149 transaction::Timelock::None => 0,
150 transaction::Timelock::Block(x) => usize_to_u64(x),
151 transaction::Timelock::Time(x) => x,
152 };
153
154 TransactionPrefix {
155 version,
156 unlock_time,
157 vin,
158 vout,
159 extra: prefix.extra,
160 }
161 }
162
163 #[expect(unused_variables, reason = "TODO: finish impl")]
164 match tx {
165 transaction::Transaction::V1 { prefix, signatures } => Self::V1 {
166 prefix: map_prefix(prefix, 1),
167 signatures: signatures
168 .into_iter()
169 .map(|sig| {
170 let sig_to_64_bytes = |sig| -> Hex<64> { todo!() };
173 sig_to_64_bytes(sig)
174 })
175 .collect(),
176 },
177 transaction::Transaction::V2 { prefix, proofs } => {
178 let prefix = map_prefix(prefix, 2);
179
180 let Some(proofs) = proofs else {
181 return Self::V2 {
182 prefix,
183 rct_signatures: RctSignatures::Coinbase { r#type: 0 },
184 rctsig_prunable: None,
185 };
186 };
187
188 let r#type = match proofs.rct_type() {
189 ringct::RctType::AggregateMlsagBorromean => 1,
190 ringct::RctType::MlsagBorromean => 2,
191 ringct::RctType::MlsagBulletproofs => 3,
192 ringct::RctType::MlsagBulletproofsCompactAmount => 4,
193 ringct::RctType::ClsagBulletproof => 5,
194 ringct::RctType::ClsagBulletproofPlus => 6,
195 };
196
197 let txnFee = proofs.base.fee;
198
199 let ecdhInfo = proofs
200 .base
201 .encrypted_amounts
202 .into_iter()
203 .map(EcdhInfo::from)
204 .collect();
205
206 let outPk = proofs
207 .base
208 .commitments
209 .into_iter()
210 .map(|point| Hex(point.to_bytes()))
211 .collect();
212
213 let rct_signatures = RctSignatures::NonCoinbase {
214 r#type,
215 txnFee,
216 ecdhInfo,
217 outPk,
218 };
219
220 let rctsig_prunable = Some(RctSigPrunable::from(proofs.prunable));
221
222 Self::V2 {
223 prefix,
224 rct_signatures,
225 rctsig_prunable,
226 }
227 }
228 }
229 }
230}
231
232#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
234#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
235#[cfg_attr(feature = "serde", serde(untagged))]
236pub enum RctSignatures {
237 NonCoinbase {
238 r#type: u8,
239 txnFee: u64,
240 ecdhInfo: Vec<EcdhInfo>,
241 outPk: Vec<Hex<32>>,
242 },
243 Coinbase {
244 r#type: u8,
245 },
246}
247
248impl Default for RctSignatures {
249 fn default() -> Self {
250 Self::Coinbase {
251 r#type: Default::default(),
252 }
253 }
254}
255
256#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
258#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
259#[cfg_attr(feature = "serde", serde(untagged))]
260pub enum RctSigPrunable {
261 MlsagBorromean {
264 rangeSigs: Vec<RangeSignature>,
265 MGs: Vec<Mg>,
266 },
267
268 MlsagBulletproofs {
270 nbp: u64,
271 bp: Vec<Bulletproof>,
272 MGs: Vec<Mg>,
273 pseudoOuts: Vec<Hex<32>>,
274 },
275
276 ClsagBulletproofs {
278 nbp: u64,
279 bp: Vec<Bulletproof>,
280 CLSAGs: Vec<Clsag>,
281 pseudoOuts: Vec<Hex<32>>,
282 },
283
284 ClsagBulletproofsPlus {
286 nbp: u64,
287 bpp: Vec<BulletproofPlus>,
288 CLSAGs: Vec<Clsag>,
289 pseudoOuts: Vec<Hex<32>>,
290 },
291}
292
293impl Default for RctSigPrunable {
294 fn default() -> Self {
295 Self::MlsagBorromean {
296 rangeSigs: Default::default(),
297 MGs: Default::default(),
298 }
299 }
300}
301
302#[expect(unused_variables, reason = "TODO: finish impl")]
303impl From<ringct::RctPrunable> for RctSigPrunable {
304 fn from(r: ringct::RctPrunable) -> Self {
305 use ringct::RctPrunable as R;
306
307 match r {
308 R::AggregateMlsagBorromean { mlsag, borromean } => {
309 todo!()
310 }
311 R::MlsagBorromean { mlsags, borromean } => {
312 todo!()
313 }
314 R::MlsagBulletproofs {
315 mlsags,
316 pseudo_outs,
317 bulletproof,
318 } => {
319 todo!()
320 }
321 R::MlsagBulletproofsCompactAmount {
322 mlsags,
323 pseudo_outs,
324 bulletproof,
325 } => {
326 todo!()
327 }
328 R::Clsag {
329 clsags,
330 pseudo_outs,
331 bulletproof,
332 } => {
333 todo!()
334 }
335 }
336 }
337}
338
339#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
341#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
342pub struct RangeSignature {
343 pub asig: String,
346 pub Ci: String,
347}
348
349#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
352#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
353pub struct Mg {
354 pub ss: Vec<[Hex<32>; 2]>,
355 pub cc: Hex<32>,
356}
357
358#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
361#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
362pub struct Bulletproof {
363 pub A: Hex<32>,
364 pub S: Hex<32>,
365 pub T1: Hex<32>,
366 pub T2: Hex<32>,
367 pub taux: Hex<32>,
368 pub mu: Hex<32>,
369 pub L: Vec<Hex<32>>,
370 pub R: Vec<Hex<32>>,
371 pub a: Hex<32>,
372 pub b: Hex<32>,
373 pub t: Hex<32>,
374}
375
376#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
378#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
379pub struct BulletproofPlus {
380 pub A: Hex<32>,
381 pub A1: Hex<32>,
382 pub B: Hex<32>,
383 pub r1: Hex<32>,
384 pub s1: Hex<32>,
385 pub d1: Hex<32>,
386 pub L: Vec<Hex<32>>,
387 pub R: Vec<Hex<32>>,
388}
389
390#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
393#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
394pub struct Clsag {
395 pub s: Vec<Hex<32>>,
396 pub c1: Hex<32>,
397 pub D: Hex<32>,
398}
399
400#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
402#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
403#[cfg_attr(feature = "serde", serde(untagged))]
404#[expect(variant_size_differences)]
405pub enum EcdhInfo {
406 Original { mask: Hex<32>, amount: Hex<32> },
407 Compact { amount: Hex<8> },
408}
409
410impl Default for EcdhInfo {
411 fn default() -> Self {
412 Self::Original {
413 mask: Default::default(),
414 amount: Default::default(),
415 }
416 }
417}
418
419impl From<ringct::EncryptedAmount> for EcdhInfo {
420 fn from(ea: ringct::EncryptedAmount) -> Self {
421 match ea {
422 ringct::EncryptedAmount::Original { amount, mask } => Self::Original {
423 amount: Hex(amount),
424 mask: Hex(mask),
425 },
426 ringct::EncryptedAmount::Compact { amount } => Self::Compact {
427 amount: Hex(amount),
428 },
429 }
430 }
431}
432
433#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
435#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
436pub struct Input {
437 pub key: Key,
438}
439
440#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
442#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
443pub struct Key {
444 pub amount: u64,
445 pub key_offsets: Vec<u64>,
446 pub k_image: Hex<32>,
447}
448
449#[cfg(test)]
450mod test {
451 use hex_literal::hex;
452 use pretty_assertions::assert_eq;
453
454 use super::*;
455
456 #[expect(clippy::needless_pass_by_value)]
457 fn test(tx: Transaction, tx_json: &'static str) {
458 let json = serde_json::from_str::<Transaction>(tx_json).unwrap();
459 assert_eq!(tx, json);
460 let string = serde_json::to_string(&json).unwrap();
461 assert_eq!(tx_json, &string);
462 }
463
464 #[test]
465 fn tx_v1() {
466 const JSON: &str = r#"{"version":1,"unlock_time":0,"vin":[{"key":{"amount":2865950000,"key_offsets":[0],"k_image":"f1b0eeff62493ea78b2b7e843c278d6d5a7b09adf0cbc83560380d1fe397d6f3"}},{"key":{"amount":6000000000000,"key_offsets":[75146],"k_image":"3d289ab83c06e0948a460e836699a33fe9c300b2448c0f2de0e3b40c13d9bd78"}},{"key":{"amount":3000000000000,"key_offsets":[49742],"k_image":"52a32e6ecadcce76c11262eda8f7265c098b3da1f6e27ae8c9656636faf51ae4"}}],"vout":[{"amount":29220020000,"target":{"key":"f9da453f7cd5248e109de3216208eb9ec8617b0739450405de582f09b7e3fc47"}},{"amount":400000000000,"target":{"key":"c31ce6d52fae900ffab9f30b036bbdea0b9442b589cbe24c2e071ddb8291da14"}},{"amount":400000000000,"target":{"key":"bd570e3805c0198c92f9a24d8f12e9dbe88570196efd176b7f186ade904803f4"}},{"amount":1000000000000,"target":{"key":"84d1ba528dfc2e2ff29b3840fc3ae1c87ae5f750e582b78c4161a6bdb6a4717a"}},{"amount":7000000000000,"target":{"key":"993fd478527fd3e790fd3f5a0d9a3a39bebe72598cc81cb9936e08dea7e5fb0f"}}],"extra":[2,33,0,236,254,1,219,138,20,181,240,174,155,149,49,142,23,185,3,251,47,59,239,236,73,246,142,19,181,27,254,76,248,75,191,1,180,204,225,45,175,103,127,119,53,211,168,192,138,14,121,64,19,218,222,27,66,129,115,185,5,113,142,40,157,70,87,62],"signatures":["318755c67c5d3379b0958a047f5439cf43dd251f64b6314c84b2edbf240d950abbeaad13233700e6b6c59bea178c6fbaa246b8fd84b5caf94d1affd520e6770b","a47e6a65e907e49442828db46475ecdf27f3c472f24688423ac97f0efbd8b90b164ed52c070f7a2a95b95398814b19c0befd14a4aab5520963daf3482604df01","fa6981c969c2a1b9d330a8901d2ef7def7f3ade8d9fba444e18e7e349e286a035ae1729a76e01bbbb3ccd010502af6c77049e3167cf108be69706a8674b0c508"]}"#;
467
468 let tx = Transaction::V1 {
469 prefix: TransactionPrefix {
470 version: 1,
471 unlock_time: 0,
472 vin: vec![
473 Input {
474 key: Key {
475 amount: 2865950000,
476 key_offsets: vec![0],
477 k_image: Hex(hex!(
478 "f1b0eeff62493ea78b2b7e843c278d6d5a7b09adf0cbc83560380d1fe397d6f3"
479 )),
480 },
481 },
482 Input {
483 key: Key {
484 amount: 6000000000000,
485 key_offsets: vec![75146],
486 k_image: Hex(hex!(
487 "3d289ab83c06e0948a460e836699a33fe9c300b2448c0f2de0e3b40c13d9bd78"
488 )),
489 },
490 },
491 Input {
492 key: Key {
493 amount: 3000000000000,
494 key_offsets: vec![49742],
495 k_image: Hex(hex!(
496 "52a32e6ecadcce76c11262eda8f7265c098b3da1f6e27ae8c9656636faf51ae4"
497 )),
498 },
499 },
500 ],
501 vout: vec![
502 Output {
503 amount: 29220020000,
504 target: Target::Key {
505 key: Hex(hex!(
506 "f9da453f7cd5248e109de3216208eb9ec8617b0739450405de582f09b7e3fc47"
507 )),
508 },
509 },
510 Output {
511 amount: 400000000000,
512 target: Target::Key {
513 key: Hex(hex!(
514 "c31ce6d52fae900ffab9f30b036bbdea0b9442b589cbe24c2e071ddb8291da14"
515 )),
516 },
517 },
518 Output {
519 amount: 400000000000,
520 target: Target::Key {
521 key: Hex(hex!(
522 "bd570e3805c0198c92f9a24d8f12e9dbe88570196efd176b7f186ade904803f4"
523 )),
524 },
525 },
526 Output {
527 amount: 1000000000000,
528 target: Target::Key {
529 key: Hex(hex!(
530 "84d1ba528dfc2e2ff29b3840fc3ae1c87ae5f750e582b78c4161a6bdb6a4717a"
531 )),
532 },
533 },
534 Output {
535 amount: 7000000000000,
536 target: Target::Key {
537 key: Hex(hex!(
538 "993fd478527fd3e790fd3f5a0d9a3a39bebe72598cc81cb9936e08dea7e5fb0f"
539 )),
540 },
541 },
542 ],
543 extra: vec![
544 2, 33, 0, 236, 254, 1, 219, 138, 20, 181, 240, 174, 155, 149, 49, 142, 23, 185,
545 3, 251, 47, 59, 239, 236, 73, 246, 142, 19, 181, 27, 254, 76, 248, 75, 191, 1,
546 180, 204, 225, 45, 175, 103, 127, 119, 53, 211, 168, 192, 138, 14, 121, 64, 19,
547 218, 222, 27, 66, 129, 115, 185, 5, 113, 142, 40, 157, 70, 87, 62,
548 ],
549 },
550 signatures: vec![
551 Hex(hex!("318755c67c5d3379b0958a047f5439cf43dd251f64b6314c84b2edbf240d950abbeaad13233700e6b6c59bea178c6fbaa246b8fd84b5caf94d1affd520e6770b")),
552 Hex(hex!("a47e6a65e907e49442828db46475ecdf27f3c472f24688423ac97f0efbd8b90b164ed52c070f7a2a95b95398814b19c0befd14a4aab5520963daf3482604df01")),
553 Hex(hex!("fa6981c969c2a1b9d330a8901d2ef7def7f3ade8d9fba444e18e7e349e286a035ae1729a76e01bbbb3ccd010502af6c77049e3167cf108be69706a8674b0c508"))
554 ],
555 };
556
557 test(tx, JSON);
558 }
559
560 #[test]
561 fn tx_rct_3() {
562 const JSON: &str = r#"{"version":2,"unlock_time":0,"vin":[{"key":{"amount":0,"key_offsets":[8608351,301575,15985,56460,28593,9238,1709,170,369,1874,681],"k_image":"86e1cc68d3970757c4a265a7c28c3a39fe230851f2d8a14c5916a6aa60dbc892"}}],"vout":[{"amount":0,"target":{"key":"f21fd68e011df2e544a3d33221172baf921a121c85d1a2190c42e81d5dd1830e"}},{"amount":0,"target":{"key":"64a3e54d80a729f69ae04f85db06dd26a96f3b05674f6927337a755a9cdaefeb"}},{"amount":0,"target":{"key":"ad2ccf74d2c99946af10cedc922a87c30a4b1c0d7a13143e71d31cd788b0c171"}},{"amount":0,"target":{"key":"e03d9b552a50734487ed0da40ba977f718c91a782fe85899debfd2c56ea3e551"}},{"amount":0,"target":{"key":"b312d502c1b71a10d9483fb816e17d27d0508b5b74c462e14dca52395a14a155"}}],"extra":[1,224,97,197,75,148,190,193,227,206,86,37,3,184,209,129,160,202,192,210,43,32,138,51,151,70,119,47,146,57,223,154,50,4,5,0,191,65,91,3,171,12,85,167,171,16,104,155,253,200,141,80,208,150,162,213,53,57,197,121,68,106,70,96,188,175,119,160,72,148,223,225,199,34,97,143,5,107,219,86,93,114,31,160,6,17,195,221,157,186,50,144,147,117,99,25,160,173,15,167,20,15,91,127,217,28,255,151,248,119,197,199,201,4,248,90,115,44,13,172,116,229,191,216,187,111,255,104,43,62,207,138,134,126,114,34,99,248,241,243,25,208,2,7,247,134,6,9,213,173,242,95,39,187,214,105,81,94,111,53,212,160,183,216,152,137,123,32,101,253,223,108,59,6,176,24,161,45,42,98,92,200,74,34,7,116,231,53,86,94,40,84,151,129,250],"rct_signatures":{"type":3,"txnFee":86000000,"ecdhInfo":[{"mask":"95f1dcd5076d92d9592f1ad5d2e60e8b353c0048da1833db3d11634a9deff50f","amount":"9386f5401e2577e66dea290aae981a85f75ab81d21cd8060b6a2070c0c3d4209"},{"mask":"9a3015d73ee53f40c4a194c725aa5cea4822b99442ddb94223a52e365e02f70b","amount":"40b471293514f4399782abfe2968f5bb297a77b16b58261df7cffc60b68a5b04"},{"mask":"64b2b70d2e61fd4ac5c6d92f61d85dda1daf948853cc303a3a39baeeece41e08","amount":"b388bdce5bd31493dae245af4dbfc8486d959ef28af4ad1c1338f43dd3bd5a01"},{"mask":"e8d8b9380c446cace527ea1864d69f524b2c6b8eaf08f0f6c36621e73de49d0a","amount":"c74b47b823b7e5f2744e9643e4490f236eb9de006acd7bb8a32cca2f56223b06"},{"mask":"1ec895cc03e6831311a3ab6f86745312feec53de5aef1e1f204a984f082bff0c","amount":"d16c02a92488cd7d5fdf3c461ff8f4f7e75a18644e810ddd55a153e79464af0a"}],"outPk":["ff1a463fcb285d747df43612cc3bc925d4d27bebb08537b177a0dba960f90131","6b62f6ed7338cbf9b2639620400690676fa9d43aca93da4a9dc56d665a72b506","9363af049e5b0530fd77f884e84838efcabebf5fff57e2f00b49148c6415eafc","2fc11a581752a6465d59217e6a5841170de3ba96e27d2744ad280b5242efa9e7","56b6c2ca082d95600584ca429e6723816d4496cbf6f586cf1cfe2e0319224451"]},"rctsig_prunable":{"nbp":1,"bp":[{"A":"4e3433b32bd6d349774eac4ad467e698125d9e0402d216609ff0f4cfc216c50c","S":"7f6d8c127e4138c6153954836b127694786b890a138bae684eb951fb0fbf9be4","T1":"40ee0b2925d7555c17dd38bb69b80e1cfc05aa8b9dc2bd088c1361321a09d4f4","T2":"1488d918c2acdd6ff9e8d5bf82a08599733b9084cdfb0f891c9254742f2ea258","taux":"9b26002cff6e74e3da8ce59cadea4c8a0d93b9d4d94e6764031c21ecbac5f600","mu":"a414b36b00a290c62a443282295f50f381a44197af5db74f518a1b77dd8c120a","L":["d4c3360932332dd3cc407d857c6e759d7c29d10deede96a0649bba89fbdb0e04","33d7311748c6ee1fa92311513a3f32acf0bbcbd1c507e4378db19f108914f6c1","aeedddc3feaa374880a388a992e38027d97c8e0e3728fd536fb2f0a560f5f481","662e94760e3d51cf89a39db06c8f95e08b923ed97e883e9144d15f21e1639011","c07d35cb78309eec01052227df1967c0e0d553f6ca5d592f34bbeebcecdc78a8","9954f3a6c818fd5aed6fd7c94fdaf4f49d2159c47e31b953c3e44e11aa4c9943","a22d2b47f1a051daece177803252b976c33ac5e2a8c487afd89d61f3a08180f0","3ce357034185a6f540d00b2ab8229e64d2d6cad27a2b141d6f6e202307d959ae","5906da535fbd816292692880fe4630e9ed1dd2dc94495a4f7db080e18fd4a8e0"],"R":["0b40204226678fee886140e7c20e809165a58e1355101a2c5bdf7c797811ac21","94a1da201d9e85ad6ac564fe2e6a1fa62873d78e33a5931fd143ed165b360eba","fc458a6c42264f6c8890a386b7a68543a952ecc2b6239138b548c25d6bfa6c68","052da59d062001df5d95d3117deecb9b3175ed59a44aba9b92f84add748c1698","5aa7cf7545d4859a62903b29500449813a231a0c25cdb133a4780a9b0a411cd0","5366ad21b6b33b8f43aecfda087f0aee9cfdc2836e59f7721856058685965b39","960c4764aea3c0dff74c88728514da160bd79712cd50a948bd8b52d9569e69b1","6db5c54be77c08460e4581ee7709c0179108b46a55c3858e0897bd4f12e3e913","ffb4d75cab91763dc3e556fce046413382c84abe24615ada0605a43f8de88309"],"a":"43bf84ef0f596d1d76990c5202261f0963dade1affc1eee92a0508f5ce8d2900","b":"747be0d98f642649d2925a459238ed13f65bd6f12019683d4ede505394341604","t":"8592adba69d884c48e52135909a9738eafae80e590ae245b1a9ca65eea3a8b0f"}],"MGs":[{"ss":[["8a8838d965aa1bb49448c12ea1aabb680b393f5bf02e3b73874aa545cde6dc04","e16bf1d0c4c2639af6bed0c0205181b2a03bc5cdc22207906aac710acdd5170e"],["208d25cad34bcc9c49a5516102990814c75e0bbe2335b601880d9c6ce4fb400a","279a89826548b8b15ea342d892ca6f8bf9e6a5a14077a57edaa4fd676b0b9f0f"],["9edbd1d2082bad9dd9ca98baf82b4d70014dee720c758ed0944a9fb82ae55206","3314001eeec40a2e0ca83f48af1ade8b4139418da49e2c6d95aa3a1d4427de07"],["1837f42c1a4bd0747ed86c1e99bfe058031858c47ff4f066cfcdaf107499bf0f","963bd0ed98a01be7c847b393ad0c2c25c3052148d67126c12b25ec2239373005"],["e41e7dd0430ccbc17f717db7fa1720241ab4de24249c607b9f882143d266ff0e","95c4a4ec2756ec57caacb64f17a7e5306103f030dfb12dd53b42c72e68b6e60b"],["8ecfab987a8697c58f4b183620b2fa0e11972fa666b71c138e067621ab5d1703","2e070ae83ab7f01f91766c2fd6de425dc0f18ae4e34fdcb3ac18db4dfec77a0c"],["187cd1a318666e9f7a9f2f9d4eaf7c662c6162c5bc2be94219992f261f46b90b","97ca174ff4bcf1e5d139bf0ad85577b9c6247f9e4782cd69100e683bf2e3f80b"],["28eb6f60cfa35b52cbf74b7e68ce795ebfa0d3db6f00e69677fc98aef963bf05","6662186aa949465b7b2174d6da077ab8ffdddb710bdab42386e7d8ae20f1890d"],["577c9cf99480b0633121737756bcc7f4887fc7fdf3a9344c84578886e60d1404","2d241b48e63acc39c8c899f7c009fcbc09025ea1211930a338e193d17aed890a"],["7a3f489532743f117999a1b375789cd0863541cae0b8633e8cd4c7dedc740305","500c1033ca2b4b47c39e70a1c563553571e0e25a2e1fa984cb5ba08546bc4907"],["82efb453a98454e07e8f4b367ee0db2f957e6222e720a69354fdf910fe5fe803","1c3204cf63c8ba3ebd817d603a4e5cadfa6a9af5999648eabff7605b5de8b306"]],"cc":"8b579f973b9395a175fb2fc1df7d66511166c606903a3c082b63fa831e833b00"}],"pseudoOuts":["bd6260cafa1afbe44d24cf7c42ac9e2b451424472eb1334b3c042e82196be0d7"]}}"#;
563
564 let tx = Transaction::V2 {
565 prefix: TransactionPrefix {
566 version: 2,
567 unlock_time: 0,
568 vin: vec![Input {
569 key: Key {
570 amount: 0,
571 key_offsets: vec![
572 8608351, 301575, 15985, 56460, 28593, 9238, 1709, 170, 369, 1874, 681,
573 ],
574 k_image: Hex(hex!(
575 "86e1cc68d3970757c4a265a7c28c3a39fe230851f2d8a14c5916a6aa60dbc892"
576 )),
577 },
578 }],
579 vout: vec![
580 Output {
581 amount: 0,
582 target: Target::Key {
583 key: Hex(hex!(
584 "f21fd68e011df2e544a3d33221172baf921a121c85d1a2190c42e81d5dd1830e"
585 )),
586 },
587 },
588 Output {
589 amount: 0,
590 target: Target::Key {
591 key: Hex(hex!(
592 "64a3e54d80a729f69ae04f85db06dd26a96f3b05674f6927337a755a9cdaefeb"
593 )),
594 },
595 },
596 Output {
597 amount: 0,
598 target: Target::Key {
599 key: Hex(hex!(
600 "ad2ccf74d2c99946af10cedc922a87c30a4b1c0d7a13143e71d31cd788b0c171"
601 )),
602 },
603 },
604 Output {
605 amount: 0,
606 target: Target::Key {
607 key: Hex(hex!(
608 "e03d9b552a50734487ed0da40ba977f718c91a782fe85899debfd2c56ea3e551"
609 )),
610 },
611 },
612 Output {
613 amount: 0,
614 target: Target::Key {
615 key: Hex(hex!(
616 "b312d502c1b71a10d9483fb816e17d27d0508b5b74c462e14dca52395a14a155"
617 )),
618 },
619 },
620 ],
621 extra: vec![
622 1, 224, 97, 197, 75, 148, 190, 193, 227, 206, 86, 37, 3, 184, 209, 129, 160,
623 202, 192, 210, 43, 32, 138, 51, 151, 70, 119, 47, 146, 57, 223, 154, 50, 4, 5,
624 0, 191, 65, 91, 3, 171, 12, 85, 167, 171, 16, 104, 155, 253, 200, 141, 80, 208,
625 150, 162, 213, 53, 57, 197, 121, 68, 106, 70, 96, 188, 175, 119, 160, 72, 148,
626 223, 225, 199, 34, 97, 143, 5, 107, 219, 86, 93, 114, 31, 160, 6, 17, 195, 221,
627 157, 186, 50, 144, 147, 117, 99, 25, 160, 173, 15, 167, 20, 15, 91, 127, 217,
628 28, 255, 151, 248, 119, 197, 199, 201, 4, 248, 90, 115, 44, 13, 172, 116, 229,
629 191, 216, 187, 111, 255, 104, 43, 62, 207, 138, 134, 126, 114, 34, 99, 248,
630 241, 243, 25, 208, 2, 7, 247, 134, 6, 9, 213, 173, 242, 95, 39, 187, 214, 105,
631 81, 94, 111, 53, 212, 160, 183, 216, 152, 137, 123, 32, 101, 253, 223, 108, 59,
632 6, 176, 24, 161, 45, 42, 98, 92, 200, 74, 34, 7, 116, 231, 53, 86, 94, 40, 84,
633 151, 129, 250,
634 ],
635 },
636 rct_signatures: RctSignatures::NonCoinbase {
637 r#type: 3,
638 txnFee: 86000000,
639 ecdhInfo: vec![
640 EcdhInfo::Original {
641 mask: Hex(hex!(
642 "95f1dcd5076d92d9592f1ad5d2e60e8b353c0048da1833db3d11634a9deff50f"
643 )),
644 amount: Hex(hex!(
645 "9386f5401e2577e66dea290aae981a85f75ab81d21cd8060b6a2070c0c3d4209"
646 )),
647 },
648 EcdhInfo::Original {
649 mask: Hex(hex!(
650 "9a3015d73ee53f40c4a194c725aa5cea4822b99442ddb94223a52e365e02f70b"
651 )),
652 amount: Hex(hex!(
653 "40b471293514f4399782abfe2968f5bb297a77b16b58261df7cffc60b68a5b04"
654 )),
655 },
656 EcdhInfo::Original {
657 mask: Hex(hex!(
658 "64b2b70d2e61fd4ac5c6d92f61d85dda1daf948853cc303a3a39baeeece41e08"
659 )),
660 amount: Hex(hex!(
661 "b388bdce5bd31493dae245af4dbfc8486d959ef28af4ad1c1338f43dd3bd5a01"
662 )),
663 },
664 EcdhInfo::Original {
665 mask: Hex(hex!(
666 "e8d8b9380c446cace527ea1864d69f524b2c6b8eaf08f0f6c36621e73de49d0a"
667 )),
668 amount: Hex(hex!(
669 "c74b47b823b7e5f2744e9643e4490f236eb9de006acd7bb8a32cca2f56223b06"
670 )),
671 },
672 EcdhInfo::Original {
673 mask: Hex(hex!(
674 "1ec895cc03e6831311a3ab6f86745312feec53de5aef1e1f204a984f082bff0c"
675 )),
676 amount: Hex(hex!(
677 "d16c02a92488cd7d5fdf3c461ff8f4f7e75a18644e810ddd55a153e79464af0a"
678 )),
679 },
680 ],
681 outPk: vec![
682 Hex(hex!(
683 "ff1a463fcb285d747df43612cc3bc925d4d27bebb08537b177a0dba960f90131"
684 )),
685 Hex(hex!(
686 "6b62f6ed7338cbf9b2639620400690676fa9d43aca93da4a9dc56d665a72b506"
687 )),
688 Hex(hex!(
689 "9363af049e5b0530fd77f884e84838efcabebf5fff57e2f00b49148c6415eafc"
690 )),
691 Hex(hex!(
692 "2fc11a581752a6465d59217e6a5841170de3ba96e27d2744ad280b5242efa9e7"
693 )),
694 Hex(hex!(
695 "56b6c2ca082d95600584ca429e6723816d4496cbf6f586cf1cfe2e0319224451"
696 )),
697 ],
698 },
699 rctsig_prunable: Some(RctSigPrunable::MlsagBulletproofs {
700 nbp: 1,
701 bp: vec![Bulletproof {
702 A: Hex(hex!(
703 "4e3433b32bd6d349774eac4ad467e698125d9e0402d216609ff0f4cfc216c50c"
704 )),
705 S: Hex(hex!(
706 "7f6d8c127e4138c6153954836b127694786b890a138bae684eb951fb0fbf9be4"
707 )),
708 T1: Hex(hex!(
709 "40ee0b2925d7555c17dd38bb69b80e1cfc05aa8b9dc2bd088c1361321a09d4f4"
710 )),
711 T2: Hex(hex!(
712 "1488d918c2acdd6ff9e8d5bf82a08599733b9084cdfb0f891c9254742f2ea258"
713 )),
714 taux: Hex(hex!(
715 "9b26002cff6e74e3da8ce59cadea4c8a0d93b9d4d94e6764031c21ecbac5f600"
716 )),
717 mu: Hex(hex!(
718 "a414b36b00a290c62a443282295f50f381a44197af5db74f518a1b77dd8c120a"
719 )),
720 L: vec![
721 Hex(hex!(
722 "d4c3360932332dd3cc407d857c6e759d7c29d10deede96a0649bba89fbdb0e04"
723 )),
724 Hex(hex!(
725 "33d7311748c6ee1fa92311513a3f32acf0bbcbd1c507e4378db19f108914f6c1"
726 )),
727 Hex(hex!(
728 "aeedddc3feaa374880a388a992e38027d97c8e0e3728fd536fb2f0a560f5f481"
729 )),
730 Hex(hex!(
731 "662e94760e3d51cf89a39db06c8f95e08b923ed97e883e9144d15f21e1639011"
732 )),
733 Hex(hex!(
734 "c07d35cb78309eec01052227df1967c0e0d553f6ca5d592f34bbeebcecdc78a8"
735 )),
736 Hex(hex!(
737 "9954f3a6c818fd5aed6fd7c94fdaf4f49d2159c47e31b953c3e44e11aa4c9943"
738 )),
739 Hex(hex!(
740 "a22d2b47f1a051daece177803252b976c33ac5e2a8c487afd89d61f3a08180f0"
741 )),
742 Hex(hex!(
743 "3ce357034185a6f540d00b2ab8229e64d2d6cad27a2b141d6f6e202307d959ae"
744 )),
745 Hex(hex!(
746 "5906da535fbd816292692880fe4630e9ed1dd2dc94495a4f7db080e18fd4a8e0"
747 )),
748 ],
749 R: vec![
750 Hex(hex!(
751 "0b40204226678fee886140e7c20e809165a58e1355101a2c5bdf7c797811ac21"
752 )),
753 Hex(hex!(
754 "94a1da201d9e85ad6ac564fe2e6a1fa62873d78e33a5931fd143ed165b360eba"
755 )),
756 Hex(hex!(
757 "fc458a6c42264f6c8890a386b7a68543a952ecc2b6239138b548c25d6bfa6c68"
758 )),
759 Hex(hex!(
760 "052da59d062001df5d95d3117deecb9b3175ed59a44aba9b92f84add748c1698"
761 )),
762 Hex(hex!(
763 "5aa7cf7545d4859a62903b29500449813a231a0c25cdb133a4780a9b0a411cd0"
764 )),
765 Hex(hex!(
766 "5366ad21b6b33b8f43aecfda087f0aee9cfdc2836e59f7721856058685965b39"
767 )),
768 Hex(hex!(
769 "960c4764aea3c0dff74c88728514da160bd79712cd50a948bd8b52d9569e69b1"
770 )),
771 Hex(hex!(
772 "6db5c54be77c08460e4581ee7709c0179108b46a55c3858e0897bd4f12e3e913"
773 )),
774 Hex(hex!(
775 "ffb4d75cab91763dc3e556fce046413382c84abe24615ada0605a43f8de88309"
776 )),
777 ],
778 a: Hex(hex!(
779 "43bf84ef0f596d1d76990c5202261f0963dade1affc1eee92a0508f5ce8d2900"
780 )),
781 b: Hex(hex!(
782 "747be0d98f642649d2925a459238ed13f65bd6f12019683d4ede505394341604"
783 )),
784 t: Hex(hex!(
785 "8592adba69d884c48e52135909a9738eafae80e590ae245b1a9ca65eea3a8b0f"
786 )),
787 }],
788 MGs: vec![Mg {
789 ss: vec![
790 [
791 Hex(hex!(
792 "8a8838d965aa1bb49448c12ea1aabb680b393f5bf02e3b73874aa545cde6dc04"
793 )),
794 Hex(hex!(
795 "e16bf1d0c4c2639af6bed0c0205181b2a03bc5cdc22207906aac710acdd5170e"
796 )),
797 ],
798 [
799 Hex(hex!(
800 "208d25cad34bcc9c49a5516102990814c75e0bbe2335b601880d9c6ce4fb400a"
801 )),
802 Hex(hex!(
803 "279a89826548b8b15ea342d892ca6f8bf9e6a5a14077a57edaa4fd676b0b9f0f"
804 )),
805 ],
806 [
807 Hex(hex!(
808 "9edbd1d2082bad9dd9ca98baf82b4d70014dee720c758ed0944a9fb82ae55206"
809 )),
810 Hex(hex!(
811 "3314001eeec40a2e0ca83f48af1ade8b4139418da49e2c6d95aa3a1d4427de07"
812 )),
813 ],
814 [
815 Hex(hex!(
816 "1837f42c1a4bd0747ed86c1e99bfe058031858c47ff4f066cfcdaf107499bf0f"
817 )),
818 Hex(hex!(
819 "963bd0ed98a01be7c847b393ad0c2c25c3052148d67126c12b25ec2239373005"
820 )),
821 ],
822 [
823 Hex(hex!(
824 "e41e7dd0430ccbc17f717db7fa1720241ab4de24249c607b9f882143d266ff0e"
825 )),
826 Hex(hex!(
827 "95c4a4ec2756ec57caacb64f17a7e5306103f030dfb12dd53b42c72e68b6e60b"
828 )),
829 ],
830 [
831 Hex(hex!(
832 "8ecfab987a8697c58f4b183620b2fa0e11972fa666b71c138e067621ab5d1703"
833 )),
834 Hex(hex!(
835 "2e070ae83ab7f01f91766c2fd6de425dc0f18ae4e34fdcb3ac18db4dfec77a0c"
836 )),
837 ],
838 [
839 Hex(hex!(
840 "187cd1a318666e9f7a9f2f9d4eaf7c662c6162c5bc2be94219992f261f46b90b"
841 )),
842 Hex(hex!(
843 "97ca174ff4bcf1e5d139bf0ad85577b9c6247f9e4782cd69100e683bf2e3f80b"
844 )),
845 ],
846 [
847 Hex(hex!(
848 "28eb6f60cfa35b52cbf74b7e68ce795ebfa0d3db6f00e69677fc98aef963bf05"
849 )),
850 Hex(hex!(
851 "6662186aa949465b7b2174d6da077ab8ffdddb710bdab42386e7d8ae20f1890d"
852 )),
853 ],
854 [
855 Hex(hex!(
856 "577c9cf99480b0633121737756bcc7f4887fc7fdf3a9344c84578886e60d1404"
857 )),
858 Hex(hex!(
859 "2d241b48e63acc39c8c899f7c009fcbc09025ea1211930a338e193d17aed890a"
860 )),
861 ],
862 [
863 Hex(hex!(
864 "7a3f489532743f117999a1b375789cd0863541cae0b8633e8cd4c7dedc740305"
865 )),
866 Hex(hex!(
867 "500c1033ca2b4b47c39e70a1c563553571e0e25a2e1fa984cb5ba08546bc4907"
868 )),
869 ],
870 [
871 Hex(hex!(
872 "82efb453a98454e07e8f4b367ee0db2f957e6222e720a69354fdf910fe5fe803"
873 )),
874 Hex(hex!(
875 "1c3204cf63c8ba3ebd817d603a4e5cadfa6a9af5999648eabff7605b5de8b306"
876 )),
877 ],
878 ],
879 cc: Hex(hex!(
880 "8b579f973b9395a175fb2fc1df7d66511166c606903a3c082b63fa831e833b00"
881 )),
882 }],
883 pseudoOuts: vec![Hex(hex!(
884 "bd6260cafa1afbe44d24cf7c42ac9e2b451424472eb1334b3c042e82196be0d7"
885 ))],
886 }),
887 };
888
889 test(tx, JSON);
890 }
891
892 #[test]
893 fn tx_rct_5() {
894 const JSON: &str = r#"{"version":2,"unlock_time":0,"vin":[{"key":{"amount":0,"key_offsets":[21656060,186727,69935,9151,6868,5611,37323,11548,1080,2867,1193],"k_image":"2969fedfe8eff9fe1aa29c73ea55e8a9080c25dc565d2703e4d2776991a158bd"}}],"vout":[{"amount":0,"target":{"key":"4a46669165c842dcc4529cb0ca7e34b47073a96d5b29862c9f052a6113ac4db6"}},{"amount":0,"target":{"key":"264b1dcf7eebde1f4eb9ec87eca25dd963d7281ab5efaa5cfa994a4265fd9b4c"}}],"extra":[1,137,144,107,99,61,229,55,205,33,49,82,78,22,98,81,68,252,30,53,33,0,208,38,36,247,66,155,149,65,35,254,12,2,9,1,151,243,81,31,198,0,170,41],"rct_signatures":{"type":5,"txnFee":13210000,"ecdhInfo":[{"amount":"5db75ce558a47531"},{"amount":"0499d909aafd0109"}],"outPk":["70cbcd5105fcb33f29c8f58b7515f98cfdfcbc425239f65eac3804fbee069995","0aba72c6895d733b7cf59d2cf9c4cd7c82dedf23f9424148d63f138291e6b142"]},"rctsig_prunable":{"nbp":1,"bp":[{"A":"86765eb65aac879a755822a69a54dbf69d2d3495439eff917dc01667b72d30f8","S":"1a1e62a9ca8142cafdd8a8b74517d17f2e883d3495b7722e27750fa3fed44d84","T1":"a6513e0191d0561c16f06dda675e9d21a6f7a074dbf1af498530711a4c0a3b8e","T2":"47a1197d264c8becf36fe2e45bebbe9ff86ab7c141dd99db218ba691a412190b","taux":"cc5aa963d74e48c673f5079b0968060db5c408d8ef50ca8cba9fc58f5e11ff06","mu":"869813119eb1c88103d3b396bb1ee604df3c2ecfd7fab9a70da41f9cb95b2309","L":["34d1b4db37ad7d522d273c134a80d08eb6a22c1e009d3ab7db950090d35accdf","e7b41adc55ec0887b1a982f25c11d50a6191aa0e3de7f92ba944b0967b7b0cd5","343b5ad8c7abe7753ddba2fadb3cef36de91a2757167c102c4bb95c3e6778028","c132bb4bab3e60b86637ce2a3a563ecf92635b4a972083adacf6ede475467eb6","3303f34042776e60631352f687a4508b6e0e96ba58e05da825649c0b342527a8","c927d1a85fab1d83e1d3312e4f136e58f13853e529e3d2738d69e7885713a402","8a440a513f9e71d1a1a6357954b9a90123da3cfde7ed50b9cb389f6963090e49"],"R":["60cec37d53635e0f7cfddf7ab7bd4fc092ac69444aa8ebe1029cdac3505e028d","4b4c26bae4ee65f66246f45a83d8f2b4aca580d3ec53bfb62ed0d33e3e80ea60","f1e6aa90b3ae9e72ce487c1728f73a550b5dc41d971a85a90785b922760b0dcd","66e773ab75baa86936bd6653102be3518470f98b1357abb3251da54f273b0e40","792e4c055a4483088698a828e6b35447a4f890ad590d9e37709e53b7a8d63d0e","f6a43739cc3895d297c42179c9cacc31715f675b332a269f7fdf7c3c645f47c3","483a9954d40d1a9ce9082a7e10b8c06fd6e5e925d87dea0d04c4b05c6e74eda7"],"a":"65b1099198e6b20e5d810147bb0f9b4de297da33fb8ffbde3721a600b91ab504","b":"40280b8a652159007d7e36d2a3d4872ae3b7e25617f486a8eeca993d1146c002","t":"aa7d0c7b795de8736e1881fe4b9457cca1e370352c9a2f791d8902292d67de0d"}],"CLSAGs":[{"s":["27c6ca7f8cbdb7d8e6a1e0d3cc0805e48a809b827ccb70a9b297b7e9fd506f04","25212da093e8a866fe693e31022f8f37547cb38643f0a8373ad20032c0d0970a","c41751c335a147960f4daf5d4f18544eab8661e4509e1def78e3c2a08800ab0e","7a82c4e2e693ad5cf288b369ed647847e2b3ada1faab0727331aebce7e026507","690685c5ecab57799fed9067c88c172c466f1ca2ce6768900af0d7d46d474f0a","1891173b4f269dbeb1e13eecd8deecf3ee9bb864476b85a5639257cf6e9f8402","737980e8606d2da628368934c5c05fd2b6c2d43a2b56c5c6c2163b70c0836b06","274a23f3b8baabb020c4e5315174d12049409cae36af0016a0993cdf97957809","de2f2b04ac951975fda136268e60126a6ca53e7cd6cbbff0c9515256d5a1c50f","d5747b07bc733144c8ef9574213731a30d1239596467e25b6aac4427647b1d0c","5fd4c201cfd87e8fb155c1975e02c06c8de1ab49c84c7948e429798a90d52101"],"c1":"0e118c43701bf377e13d9693f6783963d1e6e2a7bff9d75640eb9e1684c26205","D":"deb55a8e4de5b9c84b8d94d63988ce04048497f91bdd3e3878a3f9e7c313e01c"}],"pseudoOuts":["48604572eb550295c16f5fe4282131ed4fc5de297611f813b12e752b6b67865f"]}}"#;
895
896 let tx = Transaction::V2 {
897 prefix: TransactionPrefix {
898 version: 2,
899 unlock_time: 0,
900 vin: vec![Input {
901 key: Key {
902 amount: 0,
903 key_offsets: vec![
904 21656060, 186727, 69935, 9151, 6868, 5611, 37323, 11548, 1080, 2867,
905 1193,
906 ],
907 k_image: Hex(hex!(
908 "2969fedfe8eff9fe1aa29c73ea55e8a9080c25dc565d2703e4d2776991a158bd"
909 )),
910 },
911 }],
912 vout: vec![
913 Output {
914 amount: 0,
915 target: Target::Key {
916 key: Hex(hex!(
917 "4a46669165c842dcc4529cb0ca7e34b47073a96d5b29862c9f052a6113ac4db6"
918 )),
919 },
920 },
921 Output {
922 amount: 0,
923 target: Target::Key {
924 key: Hex(hex!(
925 "264b1dcf7eebde1f4eb9ec87eca25dd963d7281ab5efaa5cfa994a4265fd9b4c"
926 )),
927 },
928 },
929 ],
930 extra: vec![
931 1, 137, 144, 107, 99, 61, 229, 55, 205, 33, 49, 82, 78, 22, 98, 81, 68, 252,
932 30, 53, 33, 0, 208, 38, 36, 247, 66, 155, 149, 65, 35, 254, 12, 2, 9, 1, 151,
933 243, 81, 31, 198, 0, 170, 41,
934 ],
935 },
936 rct_signatures: RctSignatures::NonCoinbase {
937 r#type: 5,
938 txnFee: 13210000,
939 ecdhInfo: vec![
940 EcdhInfo::Compact {
941 amount: Hex(hex!("5db75ce558a47531")),
942 },
943 EcdhInfo::Compact {
944 amount: Hex(hex!("0499d909aafd0109")),
945 },
946 ],
947 outPk: vec![
948 Hex(hex!(
949 "70cbcd5105fcb33f29c8f58b7515f98cfdfcbc425239f65eac3804fbee069995"
950 )),
951 Hex(hex!(
952 "0aba72c6895d733b7cf59d2cf9c4cd7c82dedf23f9424148d63f138291e6b142"
953 )),
954 ],
955 },
956 rctsig_prunable: Some(RctSigPrunable::ClsagBulletproofs {
957 nbp: 1,
958 bp: vec![Bulletproof {
959 A: Hex(hex!(
960 "86765eb65aac879a755822a69a54dbf69d2d3495439eff917dc01667b72d30f8"
961 )),
962 S: Hex(hex!(
963 "1a1e62a9ca8142cafdd8a8b74517d17f2e883d3495b7722e27750fa3fed44d84"
964 )),
965 T1: Hex(hex!(
966 "a6513e0191d0561c16f06dda675e9d21a6f7a074dbf1af498530711a4c0a3b8e"
967 )),
968 T2: Hex(hex!(
969 "47a1197d264c8becf36fe2e45bebbe9ff86ab7c141dd99db218ba691a412190b"
970 )),
971 taux: Hex(hex!(
972 "cc5aa963d74e48c673f5079b0968060db5c408d8ef50ca8cba9fc58f5e11ff06"
973 )),
974 mu: Hex(hex!(
975 "869813119eb1c88103d3b396bb1ee604df3c2ecfd7fab9a70da41f9cb95b2309"
976 )),
977 L: vec![
978 Hex(hex!(
979 "34d1b4db37ad7d522d273c134a80d08eb6a22c1e009d3ab7db950090d35accdf"
980 )),
981 Hex(hex!(
982 "e7b41adc55ec0887b1a982f25c11d50a6191aa0e3de7f92ba944b0967b7b0cd5"
983 )),
984 Hex(hex!(
985 "343b5ad8c7abe7753ddba2fadb3cef36de91a2757167c102c4bb95c3e6778028"
986 )),
987 Hex(hex!(
988 "c132bb4bab3e60b86637ce2a3a563ecf92635b4a972083adacf6ede475467eb6"
989 )),
990 Hex(hex!(
991 "3303f34042776e60631352f687a4508b6e0e96ba58e05da825649c0b342527a8"
992 )),
993 Hex(hex!(
994 "c927d1a85fab1d83e1d3312e4f136e58f13853e529e3d2738d69e7885713a402"
995 )),
996 Hex(hex!(
997 "8a440a513f9e71d1a1a6357954b9a90123da3cfde7ed50b9cb389f6963090e49"
998 )),
999 ],
1000 R: vec![
1001 Hex(hex!(
1002 "60cec37d53635e0f7cfddf7ab7bd4fc092ac69444aa8ebe1029cdac3505e028d"
1003 )),
1004 Hex(hex!(
1005 "4b4c26bae4ee65f66246f45a83d8f2b4aca580d3ec53bfb62ed0d33e3e80ea60"
1006 )),
1007 Hex(hex!(
1008 "f1e6aa90b3ae9e72ce487c1728f73a550b5dc41d971a85a90785b922760b0dcd"
1009 )),
1010 Hex(hex!(
1011 "66e773ab75baa86936bd6653102be3518470f98b1357abb3251da54f273b0e40"
1012 )),
1013 Hex(hex!(
1014 "792e4c055a4483088698a828e6b35447a4f890ad590d9e37709e53b7a8d63d0e"
1015 )),
1016 Hex(hex!(
1017 "f6a43739cc3895d297c42179c9cacc31715f675b332a269f7fdf7c3c645f47c3"
1018 )),
1019 Hex(hex!(
1020 "483a9954d40d1a9ce9082a7e10b8c06fd6e5e925d87dea0d04c4b05c6e74eda7"
1021 )),
1022 ],
1023 a: Hex(hex!(
1024 "65b1099198e6b20e5d810147bb0f9b4de297da33fb8ffbde3721a600b91ab504"
1025 )),
1026 b: Hex(hex!(
1027 "40280b8a652159007d7e36d2a3d4872ae3b7e25617f486a8eeca993d1146c002"
1028 )),
1029 t: Hex(hex!(
1030 "aa7d0c7b795de8736e1881fe4b9457cca1e370352c9a2f791d8902292d67de0d"
1031 )),
1032 }],
1033 CLSAGs: vec![Clsag {
1034 s: vec![
1035 Hex(hex!(
1036 "27c6ca7f8cbdb7d8e6a1e0d3cc0805e48a809b827ccb70a9b297b7e9fd506f04"
1037 )),
1038 Hex(hex!(
1039 "25212da093e8a866fe693e31022f8f37547cb38643f0a8373ad20032c0d0970a"
1040 )),
1041 Hex(hex!(
1042 "c41751c335a147960f4daf5d4f18544eab8661e4509e1def78e3c2a08800ab0e"
1043 )),
1044 Hex(hex!(
1045 "7a82c4e2e693ad5cf288b369ed647847e2b3ada1faab0727331aebce7e026507"
1046 )),
1047 Hex(hex!(
1048 "690685c5ecab57799fed9067c88c172c466f1ca2ce6768900af0d7d46d474f0a"
1049 )),
1050 Hex(hex!(
1051 "1891173b4f269dbeb1e13eecd8deecf3ee9bb864476b85a5639257cf6e9f8402"
1052 )),
1053 Hex(hex!(
1054 "737980e8606d2da628368934c5c05fd2b6c2d43a2b56c5c6c2163b70c0836b06"
1055 )),
1056 Hex(hex!(
1057 "274a23f3b8baabb020c4e5315174d12049409cae36af0016a0993cdf97957809"
1058 )),
1059 Hex(hex!(
1060 "de2f2b04ac951975fda136268e60126a6ca53e7cd6cbbff0c9515256d5a1c50f"
1061 )),
1062 Hex(hex!(
1063 "d5747b07bc733144c8ef9574213731a30d1239596467e25b6aac4427647b1d0c"
1064 )),
1065 Hex(hex!(
1066 "5fd4c201cfd87e8fb155c1975e02c06c8de1ab49c84c7948e429798a90d52101"
1067 )),
1068 ],
1069 c1: Hex(hex!(
1070 "0e118c43701bf377e13d9693f6783963d1e6e2a7bff9d75640eb9e1684c26205"
1071 )),
1072 D: Hex(hex!(
1073 "deb55a8e4de5b9c84b8d94d63988ce04048497f91bdd3e3878a3f9e7c313e01c"
1074 )),
1075 }],
1076 pseudoOuts: vec![Hex(hex!(
1077 "48604572eb550295c16f5fe4282131ed4fc5de297611f813b12e752b6b67865f"
1078 ))],
1079 }),
1080 };
1081
1082 test(tx, JSON);
1083 }
1084
1085 #[test]
1086 fn tx_rct_6() {
1087 const JSON: &str = r#"{"version":2,"unlock_time":0,"vin":[{"key":{"amount":0,"key_offsets":[56619444,517411,383964,1514827,38358,263974,91303,3018,14681,34540,7767,8131,20234,16575,18300,3587],"k_image":"ec1636db12f12cffa66e8e3286d8216ad7900128c996ffcc96196856daf10585"}},{"key":{"amount":0,"key_offsets":[49738606,2766321,6291275,92656,166783,91733,286477,1130,5724,9633,44284,24605,8133,20600,9906,2115],"k_image":"953c1d93684671eb658284061b6f7724f37c68c3bc24732fb81a09f7056426d0"}},{"key":{"amount":0,"key_offsets":[2971790,44215494,8487702,3226387,861,158991,281736,74021,24277,10705,51824,25824,4951,1235,7824,15715],"k_image":"41a34e8637c3974c9a0444f9c45b361775cc178e4d7d8e07e7d4afdc8e591675"}},{"key":{"amount":0,"key_offsets":[57701146,641169,170653,321459,625073,40514,6448,5687,13246,14743,7359,1788,1054,1061,4460,4059],"k_image":"2d57a890ff948dd7f0ba17940b6b76db2c87163322f0bd5aca29462f9224c777"}}],"vout":[{"amount":0,"target":{"tagged_key":{"key":"570482299e724f78b8441d700aa63388a842c7f5dbcbe5fa859c2c0abad96b30","view_tag":"9f"}}},{"amount":0,"target":{"tagged_key":{"key":"50c1a24ef57aeba07beecd8ddbf294e2501d6fa90ad9712829c00b7293eead96","view_tag":"06"}}}],"extra":[1,254,81,251,73,229,142,177,14,82,43,62,58,255,63,24,202,118,195,65,161,185,96,142,214,48,255,145,202,52,3,199,202,2,9,1,53,17,236,142,199,122,102,77],"rct_signatures":{"type":6,"txnFee":71860000,"ecdhInfo":[{"amount":"b0af37c16a8f08a0"},{"amount":"4cc0843dec9af6b4"}],"outPk":["3c51d83c816a0cb8585641a165e866e0215302af9b498db762db27141e673e15","96eba06bfd2781e65e9a1b1506abfd9ae29dc60fcd29007cd6ad94a8abbf1ecc"]},"rctsig_prunable":{"nbp":1,"bpp":[{"A":"28197d8ac07948082b50274fb8d5bea0f81561d02c88981e0d9b5ffd6e5ee169","A1":"efe6eda671d68a894e1b8aff4a1992f85c4269e17196916cfcdf8519cc94d35e","B":"7e374ac72276298148217d99568c3d4e09f2442864b5be228cd2d01328abe2d2","r1":"a2e06c25825774e5a130944c6c3eaa3c8afea2ca7d2c09e024615ff700be240a","s1":"6ee7e6624941d1e9ea18024f39a9a694ac798fb69084e10bf982d6a58d416c0a","d1":"d30bea1ffb8e79d0fe37d60c55f6e654d1ca388b102b29a6b28c48c2c617b70f","L":["cf6e067c87b9161c424620e83645f13284e64c803b9d7af729d0550d475d2199","159a03db0d038f6691816d9c31b52a325ad13941222ce1791a0285ca0cf0169d","f0276445ea2ec07957fa58675c89aec4dab57d163290e95845dccd484c3e1790","40c19df50385f55b4d53fc101c8eef7d411b76c8b94eadbf464d1401d171ea0a","6b9a8da4219da8f3e944351825eaf66e99ea954ed0e3b4eed0782379f8fd5509","567d12ccd952444055c9a595024f1229a8e0d3ad816f6fd28a448f021603bcc1","44616a4203c430653b12e5a2504e79ea390719a1d6a9557eeb55067ba7efc9d3"],"R":["a7dd6caebda761e8c2ca07e65f9f5b5868777bdc9a4af810d55c691ee62922aa","e8db14727596359e8b2e52bd55ceea81e102028d979f79d464d8afe3fd183de3","0f808f768cec8fe9f5e41d5925eb5c4955a2c16f650ba26e8cf7be2246b4e559","4931dd8eb664e60d86ff259b0e8af24329aefd550170683c324bf8e68ca97169","ce05c6ddb73f36dcd5d94cd6a92220c5c42df15f649d4029c9046fb8a8bf4003","ae2d51efb12a81062c7a6c9d2c4cdb4b6d7561f76e6f8aa554d98717716b8dda","ab4a29f9efa41472ae9dfb13d80c929d904a2fbc72a9d2bce063b19baf3bbdbe"]}],"CLSAGs":[{"s":["fa3c832924a4716bac410b9708ac11ed35d9cb01f3e0c1d3958e77791f9ce905","6b4dfe306de3f55c5507d802347f4c94ae55e0db4f3bf25e1af3ba1ecd993e0d","71c7c612a3dd9d123609df658aaff494787b5cabb5624d5c5d519120f29f5407","d72c30a667f22dbc5bbc8479a4e70094bff1980eb962f3f5ce43954da9a5b009","869470794715faa72ec2cbbb78743448f9dc5bb6383ac2030484adbb760e7a09","6247f181b491a4da82cadbca6272b58365e9160030ed92a1ac5641f9d4163b06","9269814384a16ff2bd297fbce5a614ed67529551ba0c21a26abdaff55c96870a","b10aeaac7f08f1782a2eb4094864f26fcb6c43559b7610ccd7809b90b1c4f003","f38ce2ac13fcdee7be79d0bd98bc17f3df4b1c266a45e1fede7582b12e3a3c0d","1b9f3aee12c9fd4e5aae9cf64bd65f0ad20dbc779f472db0bd338229638a6401","a04b7e6791b7ea10af2a8b0ff2dbfe63fb6036beed0bd09e9319d4728e33130b","a0cd570e0cb80e0fc111468add13b0fc0d8eb4df6942ce3caafedb6c9eee0f07","14b38cbfb7012d1c96a25ea5dcb9bfdfb1a92ffe727dd7a1cb332a9bd630d10f","5f9be3bc2f667e41baaad111e34ac14eefa493b565c4be4ab6eeab286903870b","549bc3275bafd26ab4b89ba14b43976dd317d8d344e37ccbd5a20351a084e005","a93847d26171a9194cfa5a94d7f40576b2e808b4bde927e3398bb0a6e9ad0f0e"],"c1":"794f4e50841235043b39fbcb5b50babf5c4b98339fec9538c2538644ac104f01","D":"6d50f7b691c0bc174aa11d9953b3452b0f249aa4e7edd560ff1e5772f592a618"},{"s":["e8140f6e69981917d78656f0b1572ff748771f3106f6134cca77ae83bc2ff201","7970c1856b630f213e52c825c507f331145c55104611a908c91998dcc76dd40f","8b6899f8eef5bb4c0c830fbb53e34b6089215e0c18b174648fe482675eb0740e","8ff4173d836bddc7fd430b0e2cd7d377f9a81025ebdee6030c19114b7964dc05","8f14171c429fbf9bd4aa5fe67d180e99a6092f8a7e27a97e6fd85c02613a0209","9208e8cc2fd66d6c154202c42bde24f14917b79ccc1b2f31d54880fa14c51202","11da8c69a612d2090b375efb61f9be10a16d6ac3d95e8777cb4d3b0cce028509","f0b097956d07aaf27a4d19463b63bed427b4945321f203be856a1c45e058ed0e","0ad2af34567c40ea4166cd49c368a9ac3bac132c2507f444657de8152465ff0c","ded4f3f699c692d01999b858cb752bb6691418393543fa0b1805115847be8f04","6ef1fa94a6448488fdc4fdc629813940f78706f9045f48b8d69ce717510b7b0e","fbc95294de167bb8a431ff2eacec66637a49927eb15bb443f0ec7c909e301a06","03eec8ccae4fd9942376e3df671ed3de9743b03331ee518a69e0f8fb09644e0e","861c4a794793dd3eaedd1770263124530035378121bde995b27cbf50bfeb0d08","043d02997ff017b110590482dba8a69d2a97092ef7640b8cba5d4271ffc67e04","23f12cabd4d7d69a1c6c6cb960b82a427a0ad2df276786312e2b1c60cb17de06"],"c1":"c0f8e42ef1b220d60fa76532b84dd5def896a25b62eec08691ca438c6abcc40d","D":"9d0844d4ac7c5988e336514ba17841a3bd1aefd5fa024b692ccd6ef6e9364e34"},{"s":["bf3a319fd83070d2c97049e1e2d4636f498a5c0547e5e0144f9eb58247f9a50d","70b626b51f5e934fad8f6df0db79c3d2af88b6a93e3fcf872d64e89d1909b10b","71b200df8b8c5132ba533f1f18924114d451d2b9cca454ea36b7e4b559962307","99cc6995a942ad4e9f993d980a077113d46da70f003539190c5bb9ffb4f6310f","4dac904bc896e0f8690353924bc98f0baf2d3a2e39da272fd34444664eede404","158c1087ae06422bd71a0b59ff7e8f2caa6bbc651b4d0e105551bf91a51f2002","e4d119f8c6d39a02b06aca1627078c37b962463d733a4b25d3b6410bdaad6f0f","16d5e70dc9bd9f8e9d8d74d75db0bf3a144952d7eaab3abc78ce7c66cb958d06","3a0ee94b516a8596bd718ffd87efb76e10b61904033fd0225543680064c5120e","354d44ea658710784c4b3389d4048399302e4d7bfa676ea3de53feba2012e30b","ce00bbc38aa3e018f1231972232a076f42d38e6d75dececee6561c6336c4be00","85094c21f620b87e976f42b742449a048eb303597b1ef362c1a44f76f8d9fa08","8e88e960c771bdd2b3df0e0fddbc0cd0a692807d8432c54d6b6ad2114007d10f","976274603af385a4079a970a5ddba77a01ac7411e9b2303e76207b288830a107","a7f760605b4dffb5b76943e8097b11fb4f2db2fea6354cffc2b96c21aef7a300","7e378e64b7a3ece77d88d966e386e939f56976109ad395b4712cf916f50b4c01"],"c1":"edecc915049e5ead7e5fe36dd70c558ace09f4d3a0c6216be148a51e3a72e302","D":"197665d3b405f42a2053f9e946483435e75d6c4e801427bfeb66cc58c72e2670"},{"s":["20c7f0d492ecf79f1d29305f4e8387238a5927fe676674fe479c129431841607","b9b98379560d7e22a09fcc72db5b1d05870ffdbded5cf560fcaf5303033f7d04","8fc79c2b767ea73f7f552f48d0603b5ee369cdd9535ca06f03fd11e16f08ea0b","7e2bdb348f8a719ffed9d995a35d83ae93a63abe1090fae68a3d23ae47c64402","aa0f6221cc1454b4dbf84b7f8c6e7b89a1c2a3d0f56a2d6302106e47b6b1b50d","08a9283d8b34426eb7b7547fa8fb1573430b99f1c119f2ff9612e82acee98e03","250d2ac44e26782f293eca3deb70fc5c52cb942166b1efb2f78ec32640e02d06","1bc1bcc3de357a4652c03815e59e14cb13668946366746dca3dad2f4c44c9000","9f8b446e373e3e19871f22b9bc95017d4411e555477afb34114b428c8296470a","e49d0313e969fb8c4e451388309280a96b8e3216fa1e28ab2efab49f38e86f07","0cee07c99293507ad558838f2fa07af1c4ddc86886658c6207c1f25f343afb06","39bd17be3aaaeda4fb8aa8dafcf5748581f7bb8b92b0dfe3add14a8481570003","0048e1ca905806551cd210c40356cc80935a98f63163a087ea89585915e8770d","3c46eea5308dbdff7376d89378998376cb722d08604d6ecb2b3cb795f91dc607","7d13be56b2e858d2fca81b3a6b0312943d33e501b4e09814818edb96fb28aa0c","313a2021350abd25bd79c22ea33fe071367da2e208913d788d50101c90f0e702"],"c1":"9d96220cd0d49340e06b915f7204cd1f68c4c2069389bf4c011b4fa6c24c0d02","D":"91d00727ba3655729ce88981e803967946403e970f0a6749625f59d4e6d7ebc9"}],"pseudoOuts":["a6785a3aca529db1da40944bb1826519d7caaa31f4549e6854cb97e5234d3e8e","f5cda4db5f83f1c1edea0b66461d1848daf01054c24a690e1438add59dc4f206","dff30968b66355b9c7890db508692e9620c999e0025ca9395fa53732e6432606","6b78d37b63714ebe1d09981766c61a07bf0bfbc9fc7f7a8998396aa99d43e0cc"]}}"#;
1088
1089 let tx = Transaction::V2 {
1090 prefix: TransactionPrefix {
1091 version: 2,
1092 unlock_time: 0,
1093 vin: vec![
1094 Input {
1095 key: Key {
1096 amount: 0,
1097 key_offsets: vec![
1098 56619444, 517411, 383964, 1514827, 38358, 263974, 91303, 3018,
1099 14681, 34540, 7767, 8131, 20234, 16575, 18300, 3587,
1100 ],
1101 k_image: Hex(hex!(
1102 "ec1636db12f12cffa66e8e3286d8216ad7900128c996ffcc96196856daf10585"
1103 )),
1104 },
1105 },
1106 Input {
1107 key: Key {
1108 amount: 0,
1109 key_offsets: vec![
1110 49738606, 2766321, 6291275, 92656, 166783, 91733, 286477, 1130,
1111 5724, 9633, 44284, 24605, 8133, 20600, 9906, 2115,
1112 ],
1113 k_image: Hex(hex!(
1114 "953c1d93684671eb658284061b6f7724f37c68c3bc24732fb81a09f7056426d0"
1115 )),
1116 },
1117 },
1118 Input {
1119 key: Key {
1120 amount: 0,
1121 key_offsets: vec![
1122 2971790, 44215494, 8487702, 3226387, 861, 158991, 281736, 74021,
1123 24277, 10705, 51824, 25824, 4951, 1235, 7824, 15715,
1124 ],
1125 k_image: Hex(hex!(
1126 "41a34e8637c3974c9a0444f9c45b361775cc178e4d7d8e07e7d4afdc8e591675"
1127 )),
1128 },
1129 },
1130 Input {
1131 key: Key {
1132 amount: 0,
1133 key_offsets: vec![
1134 57701146, 641169, 170653, 321459, 625073, 40514, 6448, 5687, 13246,
1135 14743, 7359, 1788, 1054, 1061, 4460, 4059,
1136 ],
1137 k_image: Hex(hex!(
1138 "2d57a890ff948dd7f0ba17940b6b76db2c87163322f0bd5aca29462f9224c777"
1139 )),
1140 },
1141 },
1142 ],
1143 vout: vec![
1144 Output {
1145 amount: 0,
1146 target: Target::TaggedKey {
1147 tagged_key: TaggedKey {
1148 key: Hex(hex!(
1149 "570482299e724f78b8441d700aa63388a842c7f5dbcbe5fa859c2c0abad96b30"
1150 )),
1151 view_tag: Hex(hex!("9f")),
1152 },
1153 },
1154 },
1155 Output {
1156 amount: 0,
1157 target: Target::TaggedKey {
1158 tagged_key: TaggedKey {
1159 key: Hex(hex!(
1160 "50c1a24ef57aeba07beecd8ddbf294e2501d6fa90ad9712829c00b7293eead96"
1161 )),
1162 view_tag: Hex(hex!("06")),
1163 },
1164 },
1165 },
1166 ],
1167 extra: vec![
1168 1, 254, 81, 251, 73, 229, 142, 177, 14, 82, 43, 62, 58, 255, 63, 24, 202, 118,
1169 195, 65, 161, 185, 96, 142, 214, 48, 255, 145, 202, 52, 3, 199, 202, 2, 9, 1,
1170 53, 17, 236, 142, 199, 122, 102, 77,
1171 ],
1172 },
1173 rct_signatures: RctSignatures::NonCoinbase {
1174 r#type: 6,
1175 txnFee: 71860000,
1176 ecdhInfo: vec![
1177 EcdhInfo::Compact {
1178 amount: Hex(hex!("b0af37c16a8f08a0")),
1179 },
1180 EcdhInfo::Compact {
1181 amount: Hex(hex!("4cc0843dec9af6b4")),
1182 },
1183 ],
1184 outPk: vec![
1185 Hex(hex!(
1186 "3c51d83c816a0cb8585641a165e866e0215302af9b498db762db27141e673e15"
1187 )),
1188 Hex(hex!(
1189 "96eba06bfd2781e65e9a1b1506abfd9ae29dc60fcd29007cd6ad94a8abbf1ecc"
1190 )),
1191 ],
1192 },
1193 rctsig_prunable: Some(RctSigPrunable::ClsagBulletproofsPlus {
1194 nbp: 1,
1195 bpp: vec![BulletproofPlus {
1196 A: Hex(hex!(
1197 "28197d8ac07948082b50274fb8d5bea0f81561d02c88981e0d9b5ffd6e5ee169"
1198 )),
1199 A1: Hex(hex!(
1200 "efe6eda671d68a894e1b8aff4a1992f85c4269e17196916cfcdf8519cc94d35e"
1201 )),
1202 B: Hex(hex!(
1203 "7e374ac72276298148217d99568c3d4e09f2442864b5be228cd2d01328abe2d2"
1204 )),
1205 r1: Hex(hex!(
1206 "a2e06c25825774e5a130944c6c3eaa3c8afea2ca7d2c09e024615ff700be240a"
1207 )),
1208 s1: Hex(hex!(
1209 "6ee7e6624941d1e9ea18024f39a9a694ac798fb69084e10bf982d6a58d416c0a"
1210 )),
1211 d1: Hex(hex!(
1212 "d30bea1ffb8e79d0fe37d60c55f6e654d1ca388b102b29a6b28c48c2c617b70f"
1213 )),
1214 L: vec![
1215 Hex(hex!(
1216 "cf6e067c87b9161c424620e83645f13284e64c803b9d7af729d0550d475d2199"
1217 )),
1218 Hex(hex!(
1219 "159a03db0d038f6691816d9c31b52a325ad13941222ce1791a0285ca0cf0169d"
1220 )),
1221 Hex(hex!(
1222 "f0276445ea2ec07957fa58675c89aec4dab57d163290e95845dccd484c3e1790"
1223 )),
1224 Hex(hex!(
1225 "40c19df50385f55b4d53fc101c8eef7d411b76c8b94eadbf464d1401d171ea0a"
1226 )),
1227 Hex(hex!(
1228 "6b9a8da4219da8f3e944351825eaf66e99ea954ed0e3b4eed0782379f8fd5509"
1229 )),
1230 Hex(hex!(
1231 "567d12ccd952444055c9a595024f1229a8e0d3ad816f6fd28a448f021603bcc1"
1232 )),
1233 Hex(hex!(
1234 "44616a4203c430653b12e5a2504e79ea390719a1d6a9557eeb55067ba7efc9d3"
1235 )),
1236 ],
1237 R: vec![
1238 Hex(hex!(
1239 "a7dd6caebda761e8c2ca07e65f9f5b5868777bdc9a4af810d55c691ee62922aa"
1240 )),
1241 Hex(hex!(
1242 "e8db14727596359e8b2e52bd55ceea81e102028d979f79d464d8afe3fd183de3"
1243 )),
1244 Hex(hex!(
1245 "0f808f768cec8fe9f5e41d5925eb5c4955a2c16f650ba26e8cf7be2246b4e559"
1246 )),
1247 Hex(hex!(
1248 "4931dd8eb664e60d86ff259b0e8af24329aefd550170683c324bf8e68ca97169"
1249 )),
1250 Hex(hex!(
1251 "ce05c6ddb73f36dcd5d94cd6a92220c5c42df15f649d4029c9046fb8a8bf4003"
1252 )),
1253 Hex(hex!(
1254 "ae2d51efb12a81062c7a6c9d2c4cdb4b6d7561f76e6f8aa554d98717716b8dda"
1255 )),
1256 Hex(hex!(
1257 "ab4a29f9efa41472ae9dfb13d80c929d904a2fbc72a9d2bce063b19baf3bbdbe"
1258 )),
1259 ],
1260 }],
1261 CLSAGs: vec![
1262 Clsag {
1263 s: vec![
1264 Hex(hex!(
1265 "fa3c832924a4716bac410b9708ac11ed35d9cb01f3e0c1d3958e77791f9ce905"
1266 )),
1267 Hex(hex!(
1268 "6b4dfe306de3f55c5507d802347f4c94ae55e0db4f3bf25e1af3ba1ecd993e0d"
1269 )),
1270 Hex(hex!(
1271 "71c7c612a3dd9d123609df658aaff494787b5cabb5624d5c5d519120f29f5407"
1272 )),
1273 Hex(hex!(
1274 "d72c30a667f22dbc5bbc8479a4e70094bff1980eb962f3f5ce43954da9a5b009"
1275 )),
1276 Hex(hex!(
1277 "869470794715faa72ec2cbbb78743448f9dc5bb6383ac2030484adbb760e7a09"
1278 )),
1279 Hex(hex!(
1280 "6247f181b491a4da82cadbca6272b58365e9160030ed92a1ac5641f9d4163b06"
1281 )),
1282 Hex(hex!(
1283 "9269814384a16ff2bd297fbce5a614ed67529551ba0c21a26abdaff55c96870a"
1284 )),
1285 Hex(hex!(
1286 "b10aeaac7f08f1782a2eb4094864f26fcb6c43559b7610ccd7809b90b1c4f003"
1287 )),
1288 Hex(hex!(
1289 "f38ce2ac13fcdee7be79d0bd98bc17f3df4b1c266a45e1fede7582b12e3a3c0d"
1290 )),
1291 Hex(hex!(
1292 "1b9f3aee12c9fd4e5aae9cf64bd65f0ad20dbc779f472db0bd338229638a6401"
1293 )),
1294 Hex(hex!(
1295 "a04b7e6791b7ea10af2a8b0ff2dbfe63fb6036beed0bd09e9319d4728e33130b"
1296 )),
1297 Hex(hex!(
1298 "a0cd570e0cb80e0fc111468add13b0fc0d8eb4df6942ce3caafedb6c9eee0f07"
1299 )),
1300 Hex(hex!(
1301 "14b38cbfb7012d1c96a25ea5dcb9bfdfb1a92ffe727dd7a1cb332a9bd630d10f"
1302 )),
1303 Hex(hex!(
1304 "5f9be3bc2f667e41baaad111e34ac14eefa493b565c4be4ab6eeab286903870b"
1305 )),
1306 Hex(hex!(
1307 "549bc3275bafd26ab4b89ba14b43976dd317d8d344e37ccbd5a20351a084e005"
1308 )),
1309 Hex(hex!(
1310 "a93847d26171a9194cfa5a94d7f40576b2e808b4bde927e3398bb0a6e9ad0f0e"
1311 )),
1312 ],
1313 c1: Hex(hex!(
1314 "794f4e50841235043b39fbcb5b50babf5c4b98339fec9538c2538644ac104f01"
1315 )),
1316 D: Hex(hex!(
1317 "6d50f7b691c0bc174aa11d9953b3452b0f249aa4e7edd560ff1e5772f592a618"
1318 )),
1319 },
1320 Clsag {
1321 s: vec![
1322 Hex(hex!(
1323 "e8140f6e69981917d78656f0b1572ff748771f3106f6134cca77ae83bc2ff201"
1324 )),
1325 Hex(hex!(
1326 "7970c1856b630f213e52c825c507f331145c55104611a908c91998dcc76dd40f"
1327 )),
1328 Hex(hex!(
1329 "8b6899f8eef5bb4c0c830fbb53e34b6089215e0c18b174648fe482675eb0740e"
1330 )),
1331 Hex(hex!(
1332 "8ff4173d836bddc7fd430b0e2cd7d377f9a81025ebdee6030c19114b7964dc05"
1333 )),
1334 Hex(hex!(
1335 "8f14171c429fbf9bd4aa5fe67d180e99a6092f8a7e27a97e6fd85c02613a0209"
1336 )),
1337 Hex(hex!(
1338 "9208e8cc2fd66d6c154202c42bde24f14917b79ccc1b2f31d54880fa14c51202"
1339 )),
1340 Hex(hex!(
1341 "11da8c69a612d2090b375efb61f9be10a16d6ac3d95e8777cb4d3b0cce028509"
1342 )),
1343 Hex(hex!(
1344 "f0b097956d07aaf27a4d19463b63bed427b4945321f203be856a1c45e058ed0e"
1345 )),
1346 Hex(hex!(
1347 "0ad2af34567c40ea4166cd49c368a9ac3bac132c2507f444657de8152465ff0c"
1348 )),
1349 Hex(hex!(
1350 "ded4f3f699c692d01999b858cb752bb6691418393543fa0b1805115847be8f04"
1351 )),
1352 Hex(hex!(
1353 "6ef1fa94a6448488fdc4fdc629813940f78706f9045f48b8d69ce717510b7b0e"
1354 )),
1355 Hex(hex!(
1356 "fbc95294de167bb8a431ff2eacec66637a49927eb15bb443f0ec7c909e301a06"
1357 )),
1358 Hex(hex!(
1359 "03eec8ccae4fd9942376e3df671ed3de9743b03331ee518a69e0f8fb09644e0e"
1360 )),
1361 Hex(hex!(
1362 "861c4a794793dd3eaedd1770263124530035378121bde995b27cbf50bfeb0d08"
1363 )),
1364 Hex(hex!(
1365 "043d02997ff017b110590482dba8a69d2a97092ef7640b8cba5d4271ffc67e04"
1366 )),
1367 Hex(hex!(
1368 "23f12cabd4d7d69a1c6c6cb960b82a427a0ad2df276786312e2b1c60cb17de06"
1369 )),
1370 ],
1371 c1: Hex(hex!(
1372 "c0f8e42ef1b220d60fa76532b84dd5def896a25b62eec08691ca438c6abcc40d"
1373 )),
1374 D: Hex(hex!(
1375 "9d0844d4ac7c5988e336514ba17841a3bd1aefd5fa024b692ccd6ef6e9364e34"
1376 )),
1377 },
1378 Clsag {
1379 s: vec![
1380 Hex(hex!(
1381 "bf3a319fd83070d2c97049e1e2d4636f498a5c0547e5e0144f9eb58247f9a50d"
1382 )),
1383 Hex(hex!(
1384 "70b626b51f5e934fad8f6df0db79c3d2af88b6a93e3fcf872d64e89d1909b10b"
1385 )),
1386 Hex(hex!(
1387 "71b200df8b8c5132ba533f1f18924114d451d2b9cca454ea36b7e4b559962307"
1388 )),
1389 Hex(hex!(
1390 "99cc6995a942ad4e9f993d980a077113d46da70f003539190c5bb9ffb4f6310f"
1391 )),
1392 Hex(hex!(
1393 "4dac904bc896e0f8690353924bc98f0baf2d3a2e39da272fd34444664eede404"
1394 )),
1395 Hex(hex!(
1396 "158c1087ae06422bd71a0b59ff7e8f2caa6bbc651b4d0e105551bf91a51f2002"
1397 )),
1398 Hex(hex!(
1399 "e4d119f8c6d39a02b06aca1627078c37b962463d733a4b25d3b6410bdaad6f0f"
1400 )),
1401 Hex(hex!(
1402 "16d5e70dc9bd9f8e9d8d74d75db0bf3a144952d7eaab3abc78ce7c66cb958d06"
1403 )),
1404 Hex(hex!(
1405 "3a0ee94b516a8596bd718ffd87efb76e10b61904033fd0225543680064c5120e"
1406 )),
1407 Hex(hex!(
1408 "354d44ea658710784c4b3389d4048399302e4d7bfa676ea3de53feba2012e30b"
1409 )),
1410 Hex(hex!(
1411 "ce00bbc38aa3e018f1231972232a076f42d38e6d75dececee6561c6336c4be00"
1412 )),
1413 Hex(hex!(
1414 "85094c21f620b87e976f42b742449a048eb303597b1ef362c1a44f76f8d9fa08"
1415 )),
1416 Hex(hex!(
1417 "8e88e960c771bdd2b3df0e0fddbc0cd0a692807d8432c54d6b6ad2114007d10f"
1418 )),
1419 Hex(hex!(
1420 "976274603af385a4079a970a5ddba77a01ac7411e9b2303e76207b288830a107"
1421 )),
1422 Hex(hex!(
1423 "a7f760605b4dffb5b76943e8097b11fb4f2db2fea6354cffc2b96c21aef7a300"
1424 )),
1425 Hex(hex!(
1426 "7e378e64b7a3ece77d88d966e386e939f56976109ad395b4712cf916f50b4c01"
1427 )),
1428 ],
1429 c1: Hex(hex!(
1430 "edecc915049e5ead7e5fe36dd70c558ace09f4d3a0c6216be148a51e3a72e302"
1431 )),
1432 D: Hex(hex!(
1433 "197665d3b405f42a2053f9e946483435e75d6c4e801427bfeb66cc58c72e2670"
1434 )),
1435 },
1436 Clsag {
1437 s: vec![
1438 Hex(hex!(
1439 "20c7f0d492ecf79f1d29305f4e8387238a5927fe676674fe479c129431841607"
1440 )),
1441 Hex(hex!(
1442 "b9b98379560d7e22a09fcc72db5b1d05870ffdbded5cf560fcaf5303033f7d04"
1443 )),
1444 Hex(hex!(
1445 "8fc79c2b767ea73f7f552f48d0603b5ee369cdd9535ca06f03fd11e16f08ea0b"
1446 )),
1447 Hex(hex!(
1448 "7e2bdb348f8a719ffed9d995a35d83ae93a63abe1090fae68a3d23ae47c64402"
1449 )),
1450 Hex(hex!(
1451 "aa0f6221cc1454b4dbf84b7f8c6e7b89a1c2a3d0f56a2d6302106e47b6b1b50d"
1452 )),
1453 Hex(hex!(
1454 "08a9283d8b34426eb7b7547fa8fb1573430b99f1c119f2ff9612e82acee98e03"
1455 )),
1456 Hex(hex!(
1457 "250d2ac44e26782f293eca3deb70fc5c52cb942166b1efb2f78ec32640e02d06"
1458 )),
1459 Hex(hex!(
1460 "1bc1bcc3de357a4652c03815e59e14cb13668946366746dca3dad2f4c44c9000"
1461 )),
1462 Hex(hex!(
1463 "9f8b446e373e3e19871f22b9bc95017d4411e555477afb34114b428c8296470a"
1464 )),
1465 Hex(hex!(
1466 "e49d0313e969fb8c4e451388309280a96b8e3216fa1e28ab2efab49f38e86f07"
1467 )),
1468 Hex(hex!(
1469 "0cee07c99293507ad558838f2fa07af1c4ddc86886658c6207c1f25f343afb06"
1470 )),
1471 Hex(hex!(
1472 "39bd17be3aaaeda4fb8aa8dafcf5748581f7bb8b92b0dfe3add14a8481570003"
1473 )),
1474 Hex(hex!(
1475 "0048e1ca905806551cd210c40356cc80935a98f63163a087ea89585915e8770d"
1476 )),
1477 Hex(hex!(
1478 "3c46eea5308dbdff7376d89378998376cb722d08604d6ecb2b3cb795f91dc607"
1479 )),
1480 Hex(hex!(
1481 "7d13be56b2e858d2fca81b3a6b0312943d33e501b4e09814818edb96fb28aa0c"
1482 )),
1483 Hex(hex!(
1484 "313a2021350abd25bd79c22ea33fe071367da2e208913d788d50101c90f0e702"
1485 )),
1486 ],
1487 c1: Hex(hex!(
1488 "9d96220cd0d49340e06b915f7204cd1f68c4c2069389bf4c011b4fa6c24c0d02"
1489 )),
1490 D: Hex(hex!(
1491 "91d00727ba3655729ce88981e803967946403e970f0a6749625f59d4e6d7ebc9"
1492 )),
1493 },
1494 ],
1495 pseudoOuts: vec![
1496 Hex(hex!(
1497 "a6785a3aca529db1da40944bb1826519d7caaa31f4549e6854cb97e5234d3e8e"
1498 )),
1499 Hex(hex!(
1500 "f5cda4db5f83f1c1edea0b66461d1848daf01054c24a690e1438add59dc4f206"
1501 )),
1502 Hex(hex!(
1503 "dff30968b66355b9c7890db508692e9620c999e0025ca9395fa53732e6432606"
1504 )),
1505 Hex(hex!(
1506 "6b78d37b63714ebe1d09981766c61a07bf0bfbc9fc7f7a8998396aa99d43e0cc"
1507 )),
1508 ],
1509 }),
1510 };
1511
1512 test(tx, JSON);
1513 }
1514}