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