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_serai::{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.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                        // TODO: `RingSignature` needs to expose the
169                        // inner `Signature` struct as a byte array.
170                        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/// [`Transaction::V2::rct_signatures`].
231#[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/// [`Transaction::V2::rctsig_prunable`].
255#[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    /// - [`ringct::RctPrunable::AggregateMlsagBorromean`]
260    /// - [`ringct::RctPrunable::MlsagBorromean`]
261    MlsagBorromean {
262        rangeSigs: Vec<RangeSignature>,
263        MGs: Vec<Mg>,
264    },
265
266    /// - [`ringct::RctPrunable::MlsagBulletproofs`]
267    MlsagBulletproofs {
268        nbp: u64,
269        bp: Vec<Bulletproof>,
270        MGs: Vec<Mg>,
271        pseudoOuts: Vec<Hex<32>>,
272    },
273
274    /// - [`ringct::RctPrunable::Clsag`] with [`ringct::bulletproofs::Bulletproof::Original`]
275    ClsagBulletproofs {
276        nbp: u64,
277        bp: Vec<Bulletproof>,
278        CLSAGs: Vec<Clsag>,
279        pseudoOuts: Vec<Hex<32>>,
280    },
281
282    /// - [`ringct::RctPrunable::Clsag`] with [`ringct::bulletproofs::Bulletproof::Plus`]
283    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/// [`RctSigPrunable::MlsagBorromean::rangeSigs`]
338#[derive(Default, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
339#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
340pub struct RangeSignature {
341    // These fields are hex but way too big to be
342    // using stack arrays to represent them.
343    pub asig: String,
344    pub Ci: String,
345}
346
347/// - [`RctSigPrunable::MlsagBorromean::MGs`]
348/// - [`RctSigPrunable::MlsagBulletproofs::MGs`]
349#[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/// - [`RctSigPrunable::MlsagBulletproofs::bp`]
357/// - [`RctSigPrunable::ClsagBulletproofs::bp`]
358#[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/// - [`RctSigPrunable::ClsagBulletproofsPlus::bpp`]
375#[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/// - [`RctSigPrunable::ClsagBulletproofs`]
389/// - [`RctSigPrunable::ClsagBulletproofsPlus`]
390#[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/// [`RctSignatures::NonCoinbase::ecdhInfo`].
399#[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/// [`TransactionPrefix::vin`].
432#[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/// [`Input::key`].
439#[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}