Skip to main content

cuprate_types/json/
tx.rs

1//! JSON transaction types.
2
3#![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/// JSON representation of a non-miner transaction.
26///
27/// Used in:
28/// - [`/get_transactions` -> `txs.as_json`](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#get_transactions)
29/// - [`/get_transaction_pool` -> `tx_json`](https://www.getmonero.org/resources/developer-guides/daemon-rpc.html#get_transaction_pool)
30#[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        /// This field is [flattened](https://serde.rs/field-attrs.html#flatten).
36        #[cfg_attr(feature = "serde", serde(flatten))]
37        prefix: TransactionPrefix,
38        signatures: Vec<Hex<64>>,
39    },
40    V2 {
41        /// This field is [flattened](https://serde.rs/field-attrs.html#flatten).
42        #[cfg_attr(feature = "serde", serde(flatten))]
43        prefix: TransactionPrefix,
44        rct_signatures: RctSignatures,
45        /// This field is [`Some`] if [`Self::V2::rct_signatures`]
46        /// is [`RctSignatures::NonCoinbase`], else [`None`].
47        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/// [`Transaction::V1::prefix`] & [`Transaction::V2::prefix`].
85#[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                        // TODO: `RingSignature` needs to expose the
171                        // inner `Signature` struct as a byte array.
172                        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/// [`Transaction::V2::rct_signatures`].
233#[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/// [`Transaction::V2::rctsig_prunable`].
257#[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    /// - [`ringct::RctPrunable::AggregateMlsagBorromean`]
262    /// - [`ringct::RctPrunable::MlsagBorromean`]
263    MlsagBorromean {
264        rangeSigs: Vec<RangeSignature>,
265        MGs: Vec<Mg>,
266    },
267
268    /// - [`ringct::RctPrunable::MlsagBulletproofs`]
269    MlsagBulletproofs {
270        nbp: u64,
271        bp: Vec<Bulletproof>,
272        MGs: Vec<Mg>,
273        pseudoOuts: Vec<Hex<32>>,
274    },
275
276    /// - [`ringct::RctPrunable::Clsag`] with [`ringct::bulletproofs::Bulletproof::Original`]
277    ClsagBulletproofs {
278        nbp: u64,
279        bp: Vec<Bulletproof>,
280        CLSAGs: Vec<Clsag>,
281        pseudoOuts: Vec<Hex<32>>,
282    },
283
284    /// - [`ringct::RctPrunable::Clsag`] with [`ringct::bulletproofs::Bulletproof::Plus`]
285    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/// [`RctSigPrunable::MlsagBorromean::rangeSigs`]
340#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
341#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
342pub struct RangeSignature {
343    // These fields are hex but way too big to be
344    // using stack arrays to represent them.
345    pub asig: String,
346    pub Ci: String,
347}
348
349/// - [`RctSigPrunable::MlsagBorromean::MGs`]
350/// - [`RctSigPrunable::MlsagBulletproofs::MGs`]
351#[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/// - [`RctSigPrunable::MlsagBulletproofs::bp`]
359/// - [`RctSigPrunable::ClsagBulletproofs::bp`]
360#[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/// - [`RctSigPrunable::ClsagBulletproofsPlus::bpp`]
377#[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/// - [`RctSigPrunable::ClsagBulletproofs`]
391/// - [`RctSigPrunable::ClsagBulletproofsPlus`]
392#[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/// [`RctSignatures::NonCoinbase::ecdhInfo`].
401#[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/// [`TransactionPrefix::vin`].
434#[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/// [`Input::key`].
441#[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}