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