Skip to main content

diem_json_rpc_types/
request.rs

1// Copyright (c) The Diem Core Contributors
2// SPDX-License-Identifier: Apache-2.0
3
4use super::{Id, JsonRpcVersion, Method};
5use crate::{errors::JsonRpcError, views::BytesView};
6use diem_types::{
7    account_address::AccountAddress, event::EventKey, transaction::SignedTransaction,
8};
9use serde::{de, Deserialize, Serialize};
10use std::fmt;
11
12#[derive(Debug, Clone, Deserialize, Serialize)]
13pub struct JsonRpcRequest {
14    jsonrpc: JsonRpcVersion,
15    #[serde(flatten)]
16    pub method_request: MethodRequest,
17    pub id: Id,
18}
19
20#[derive(Debug, Deserialize, Serialize)]
21pub struct RawJsonRpcRequest {
22    #[serde(default)]
23    pub jsonrpc: serde_json::Value,
24    #[serde(default)]
25    pub method: serde_json::Value,
26    #[serde(default)]
27    pub params: serde_json::Value,
28    pub id: Id,
29}
30
31impl JsonRpcRequest {
32    pub fn from_value(
33        value: serde_json::Value,
34    ) -> Result<Self, (JsonRpcError, Option<Method>, Option<Id>)> {
35        let RawJsonRpcRequest {
36            jsonrpc,
37            method,
38            params,
39            id,
40        } = serde_json::from_value(value)
41            .map_err(|_| (JsonRpcError::invalid_format(), None, None))?;
42        let jsonrpc: JsonRpcVersion = serde_json::from_value(jsonrpc)
43            .map_err(|_| (JsonRpcError::invalid_request(), None, Some(id.clone())))?;
44        let method: Method = serde_json::from_value(method)
45            .map_err(|_| (JsonRpcError::method_not_found(), None, Some(id.clone())))?;
46        let method_request = MethodRequest::from_value(method, params).map_err(|_| {
47            (
48                JsonRpcError::invalid_params(method.as_str()),
49                Some(method),
50                Some(id.clone()),
51            )
52        })?;
53
54        Ok(JsonRpcRequest {
55            jsonrpc,
56            method_request,
57            id,
58        })
59    }
60}
61
62#[derive(Debug, Deserialize, Serialize, Clone)]
63#[serde(rename_all = "snake_case")]
64#[serde(tag = "method", content = "params")]
65pub enum MethodRequest {
66    Submit(SubmitParams),
67    GetMetadata(GetMetadataParams),
68    GetAccount(GetAccountParams),
69    GetTransactions(GetTransactionsParams),
70    GetAccountTransaction(GetAccountTransactionParams),
71    GetAccountTransactions(GetAccountTransactionsParams),
72    GetEvents(GetEventsParams),
73    GetCurrencies(GetCurrenciesParams),
74    GetNetworkStatus(GetNetworkStatusParams),
75
76    //
77    // Experimental APIs
78    //
79    GetResources(GetResourcesParams),
80    GetStateProof(GetStateProofParams),
81    GetAccumulatorConsistencyProof(GetAccumulatorConsistencyProofParams),
82    GetAccountStateWithProof(GetAccountStateWithProofParams),
83    GetTransactionsWithProofs(GetTransactionsWithProofsParams),
84    GetAccountTransactionsWithProofs(GetAccountTransactionsWithProofsParams),
85    GetEventsWithProofs(GetEventsWithProofsParams),
86    GetEventByVersionWithProof(GetEventByVersionWithProof),
87}
88
89impl MethodRequest {
90    pub fn from_value(method: Method, value: serde_json::Value) -> Result<Self, serde_json::Error> {
91        let method_request = match method {
92            Method::Submit => MethodRequest::Submit(serde_json::from_value(value)?),
93            Method::GetMetadata => MethodRequest::GetMetadata(serde_json::from_value(value)?),
94            Method::GetAccount => MethodRequest::GetAccount(serde_json::from_value(value)?),
95            Method::GetTransactions => {
96                MethodRequest::GetTransactions(serde_json::from_value(value)?)
97            }
98            Method::GetAccountTransaction => {
99                MethodRequest::GetAccountTransaction(serde_json::from_value(value)?)
100            }
101            Method::GetAccountTransactions => {
102                MethodRequest::GetAccountTransactions(serde_json::from_value(value)?)
103            }
104            Method::GetEvents => MethodRequest::GetEvents(serde_json::from_value(value)?),
105            Method::GetCurrencies => MethodRequest::GetCurrencies(serde_json::from_value(value)?),
106            Method::GetNetworkStatus => {
107                MethodRequest::GetNetworkStatus(serde_json::from_value(value)?)
108            }
109            Method::GetResources => MethodRequest::GetResources(serde_json::from_value(value)?),
110            Method::GetStateProof => MethodRequest::GetStateProof(serde_json::from_value(value)?),
111            Method::GetAccumulatorConsistencyProof => {
112                MethodRequest::GetAccumulatorConsistencyProof(serde_json::from_value(value)?)
113            }
114            Method::GetAccountStateWithProof => {
115                MethodRequest::GetAccountStateWithProof(serde_json::from_value(value)?)
116            }
117            Method::GetTransactionsWithProofs => {
118                MethodRequest::GetTransactionsWithProofs(serde_json::from_value(value)?)
119            }
120            Method::GetAccountTransactionsWithProofs => {
121                MethodRequest::GetAccountTransactionsWithProofs(serde_json::from_value(value)?)
122            }
123            Method::GetEventsWithProofs => {
124                MethodRequest::GetEventsWithProofs(serde_json::from_value(value)?)
125            }
126            Method::GetEventByVersionWithProof => {
127                MethodRequest::GetEventByVersionWithProof(serde_json::from_value(value)?)
128            }
129        };
130
131        Ok(method_request)
132    }
133
134    pub fn method(&self) -> Method {
135        match self {
136            MethodRequest::Submit(_) => Method::Submit,
137            MethodRequest::GetMetadata(_) => Method::GetMetadata,
138            MethodRequest::GetAccount(_) => Method::GetAccount,
139            MethodRequest::GetTransactions(_) => Method::GetTransactions,
140            MethodRequest::GetAccountTransaction(_) => Method::GetAccountTransaction,
141            MethodRequest::GetAccountTransactions(_) => Method::GetAccountTransactions,
142            MethodRequest::GetEvents(_) => Method::GetEvents,
143            MethodRequest::GetCurrencies(_) => Method::GetCurrencies,
144            MethodRequest::GetNetworkStatus(_) => Method::GetNetworkStatus,
145            MethodRequest::GetResources(_) => Method::GetResources,
146            MethodRequest::GetStateProof(_) => Method::GetStateProof,
147            MethodRequest::GetAccumulatorConsistencyProof(_) => {
148                Method::GetAccumulatorConsistencyProof
149            }
150            MethodRequest::GetAccountStateWithProof(_) => Method::GetAccountStateWithProof,
151            MethodRequest::GetTransactionsWithProofs(_) => Method::GetTransactionsWithProofs,
152            MethodRequest::GetAccountTransactionsWithProofs(_) => {
153                Method::GetAccountTransactionsWithProofs
154            }
155            MethodRequest::GetEventsWithProofs(_) => Method::GetEventsWithProofs,
156            MethodRequest::GetEventByVersionWithProof(_) => Method::GetEventByVersionWithProof,
157        }
158    }
159}
160
161#[derive(Clone, Debug, Deserialize, Serialize)]
162pub struct SubmitParams {
163    #[serde(serialize_with = "serialize_signed_transaction")]
164    #[serde(deserialize_with = "deserialize_signed_transaction")]
165    pub data: SignedTransaction,
166}
167
168fn serialize_signed_transaction<S>(
169    txn: &SignedTransaction,
170    serializer: S,
171) -> Result<S::Ok, S::Error>
172where
173    S: serde::Serializer,
174{
175    use serde::ser::Error;
176    BytesView::new(bcs::to_bytes(txn).map_err(S::Error::custom)?).serialize(serializer)
177}
178
179fn deserialize_signed_transaction<'de, D>(deserializer: D) -> Result<SignedTransaction, D::Error>
180where
181    D: serde::Deserializer<'de>,
182{
183    use serde::de::Error;
184    let bytes = BytesView::deserialize(deserializer)
185        .map_err(|_| D::Error::custom("expected hex-encoded SignedTransaction"))?;
186    bcs::from_bytes(bytes.inner())
187        .map_err(|_| D::Error::custom("expected hex-encoded SignedTransaction"))
188}
189
190#[derive(Clone, Debug, Serialize)]
191pub struct GetMetadataParams {
192    #[serde(default)]
193    pub version: Option<u64>,
194}
195
196impl<'de> Deserialize<'de> for GetMetadataParams {
197    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
198    where
199        D: serde::Deserializer<'de>,
200    {
201        #[derive(Deserialize)]
202        struct Params {
203            #[serde(default)]
204            pub version: Option<u64>,
205        }
206
207        let params = match Option::<Params>::deserialize(deserializer)? {
208            Some(params) => GetMetadataParams {
209                version: params.version,
210            },
211            None => GetMetadataParams { version: None },
212        };
213        Ok(params)
214    }
215}
216
217#[derive(Clone, Debug, Deserialize, Serialize)]
218pub struct GetAccountParams {
219    pub account: AccountAddress,
220    #[serde(default)]
221    pub version: Option<u64>,
222}
223
224#[derive(Clone, Debug, Deserialize, Serialize)]
225pub struct GetTransactionsParams {
226    pub start_version: u64,
227    pub limit: u64,
228    pub include_events: bool,
229}
230
231#[derive(Clone, Debug, Deserialize, Serialize)]
232pub struct GetAccountTransactionParams {
233    pub account: AccountAddress,
234    pub sequence_number: u64,
235    pub include_events: bool,
236}
237
238#[derive(Clone, Debug, Deserialize, Serialize)]
239pub struct GetAccountTransactionsParams {
240    pub account: AccountAddress,
241    pub start: u64,
242    pub limit: u64,
243    pub include_events: bool,
244}
245
246#[derive(Clone, Debug, Deserialize, Serialize)]
247pub struct GetEventsParams {
248    pub key: EventKey,
249    pub start: u64,
250    pub limit: u64,
251}
252
253#[derive(Debug, Serialize, Clone)]
254pub struct GetCurrenciesParams;
255
256impl<'de> Deserialize<'de> for GetCurrenciesParams {
257    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
258    where
259        D: serde::Deserializer<'de>,
260    {
261        deserializer
262            .deserialize_option(NoParamsVisitor("get_currencies params"))
263            .map(|_| GetCurrenciesParams)
264    }
265}
266
267#[derive(Clone, Debug, Serialize)]
268pub struct GetNetworkStatusParams;
269
270impl<'de> Deserialize<'de> for GetNetworkStatusParams {
271    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
272    where
273        D: serde::Deserializer<'de>,
274    {
275        deserializer
276            .deserialize_option(NoParamsVisitor("get_network_status params"))
277            .map(|_| GetNetworkStatusParams)
278    }
279}
280
281/// A de::Visitor implementation for jsonrpc param structs without any parameters
282struct NoParamsVisitor(&'static str);
283impl<'de> de::Visitor<'de> for NoParamsVisitor {
284    type Value = ();
285
286    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
287        formatter.write_str(self.0)
288    }
289
290    fn visit_seq<A>(self, _seq: A) -> Result<Self::Value, A::Error>
291    where
292        A: de::SeqAccess<'de>,
293    {
294        Ok(())
295    }
296
297    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
298    where
299        D: de::Deserializer<'de>,
300    {
301        deserializer.deserialize_any(self)
302    }
303
304    fn visit_none<E>(self) -> Result<Self::Value, E>
305    where
306        E: de::Error,
307    {
308        Ok(())
309    }
310
311    fn visit_unit<E>(self) -> Result<Self::Value, E>
312    where
313        E: de::Error,
314    {
315        Ok(())
316    }
317
318    fn visit_map<A>(self, _map: A) -> Result<Self::Value, A::Error>
319    where
320        A: de::MapAccess<'de>,
321    {
322        Ok(())
323    }
324}
325
326#[derive(Clone, Debug, Deserialize, Serialize)]
327pub struct GetResourcesParams {
328    pub account: AccountAddress,
329    #[serde(default)]
330    pub version: Option<u64>,
331}
332
333#[derive(Clone, Debug, Deserialize, Serialize)]
334pub struct GetStateProofParams {
335    pub version: u64,
336}
337
338#[derive(Clone, Debug, Deserialize, Serialize)]
339pub struct GetAccumulatorConsistencyProofParams {
340    #[serde(default)]
341    pub client_known_version: Option<u64>,
342    #[serde(default)]
343    pub ledger_version: Option<u64>,
344}
345
346#[derive(Clone, Debug, Deserialize, Serialize)]
347pub struct GetAccountStateWithProofParams {
348    pub account: AccountAddress,
349    #[serde(default)]
350    pub version: Option<u64>,
351    #[serde(default)]
352    pub ledger_version: Option<u64>,
353}
354
355#[derive(Clone, Debug, Deserialize, Serialize)]
356pub struct GetTransactionsWithProofsParams {
357    pub start_version: u64,
358    pub limit: u64,
359    pub include_events: bool,
360}
361
362#[derive(Clone, Debug, Deserialize, Serialize)]
363pub struct GetAccountTransactionsWithProofsParams {
364    pub account: AccountAddress,
365    pub start: u64,
366    pub limit: u64,
367    pub include_events: bool,
368    #[serde(default)]
369    pub ledger_version: Option<u64>,
370}
371
372#[derive(Clone, Debug, Deserialize, Serialize)]
373pub struct GetEventsWithProofsParams {
374    pub key: EventKey,
375    pub start: u64,
376    pub limit: u64,
377}
378
379#[derive(Clone, Debug, Deserialize, Serialize)]
380pub struct GetEventByVersionWithProof {
381    pub key: EventKey,
382    #[serde(default)]
383    pub version: Option<u64>,
384}
385
386#[cfg(test)]
387mod test {
388    use super::*;
389    use serde_json::json;
390
391    #[test]
392    fn metadata() {
393        let parse_ok = |value| serde_json::from_value::<GetMetadataParams>(value).unwrap();
394        let parse_err = |value| serde_json::from_value::<GetMetadataParams>(value).unwrap_err();
395
396        // Too many array params
397        parse_err(json!([10, 11]));
398
399        // Correct number of array params
400        parse_ok(json!([10]));
401
402        // Correct number of array params but version is Null
403        parse_ok(json!([serde_json::Value::Null]));
404
405        // Empty array still correctly deserializes since the only param is optional
406        parse_ok(json!([]));
407
408        // Empty object still correctly deserializes since all params are optional
409        parse_ok(json!({}));
410
411        // Even if there's no object it still deserializes correctly since all params are optional
412        parse_ok(serde_json::Value::Null);
413
414        // Named params
415        parse_ok(json!({"version": 10}));
416
417        // JsonRpcRequest with no params
418        parse_ok(json!({
419            "jsonrpc": "2.0",
420            "method": Method::GetMetadata,
421            "id": 1,
422        }));
423    }
424
425    #[test]
426    fn get_account() {
427        let parse_ok = |value| serde_json::from_value::<GetAccountParams>(value).unwrap();
428        let parse_err = |value| serde_json::from_value::<GetAccountParams>(value).unwrap_err();
429        let account = "1668f6be25668c1a17cd8caf6b8d2f25";
430
431        // Array without optional param
432        parse_ok(json!([account]));
433
434        // Array with optional param
435        parse_ok(json!([account, 10]));
436
437        // Array with wrong optional param
438        parse_err(json!([account, "foo"]));
439
440        // Array with too many params
441        parse_err(json!([account, 10, 1]));
442
443        // Empty array without required params should fail
444        parse_err(json!([]));
445
446        // Object without required params should fail
447        parse_err(json!({}));
448
449        // Object without optional param
450        parse_ok(json!({
451            "account": account,
452        }));
453
454        // Object with optional param
455        parse_ok(json!({
456            "account": account,
457            "version": 10,
458        }));
459
460        // Object with more params
461        parse_ok(json!({
462            "account": account,
463            "version": 10,
464            "foo": 11,
465        }));
466    }
467
468    #[test]
469    fn get_transactions() {
470        let parse_ok = |value| serde_json::from_value::<GetTransactionsParams>(value).unwrap();
471        let parse_err = |value| serde_json::from_value::<GetTransactionsParams>(value).unwrap_err();
472
473        // Array with all params
474        parse_ok(json!([10, 11, false]));
475
476        // Array with too many params
477        parse_err(json!([10, 11, false, "foo"]));
478
479        // Array with wrong param
480        parse_err(json!(["foo", 11, false]));
481
482        // Array with too few params
483        parse_err(json!([10, 11]));
484
485        // Empty array without required params should fail
486        parse_err(json!([]));
487
488        // Object without required params should fail
489        parse_err(json!({}));
490
491        // Object params
492        parse_ok(json!({
493            "start_version": 10,
494            "limit": 10,
495            "include_events": true,
496        }));
497
498        // Object without all params
499        parse_err(json!({
500            "limit": 10,
501            "include_events": true,
502        }));
503
504        // Object with more params
505        parse_ok(json!({
506            "start_version": 10,
507            "limit": 10,
508            "include_events": true,
509            "foo": 11,
510        }));
511    }
512
513    #[test]
514    fn get_account_transaction() {
515        let parse_ok =
516            |value| serde_json::from_value::<GetAccountTransactionParams>(value).unwrap();
517        let parse_err =
518            |value| serde_json::from_value::<GetAccountTransactionParams>(value).unwrap_err();
519
520        let account = "1668f6be25668c1a17cd8caf6b8d2f25";
521
522        // Array with all params
523        parse_ok(json!([account, 11, false]));
524
525        // Array with too many params
526        parse_err(json!([account, 11, false, "foo"]));
527
528        // Array with wrong param
529        parse_err(json!(["foo", 11, false]));
530
531        // Array with too few params
532        parse_err(json!([10, 11]));
533
534        // Empty array without required params should fail
535        parse_err(json!([]));
536
537        // Object without required params should fail
538        parse_err(json!({}));
539
540        // Object params
541        parse_ok(json!({
542            "account": account,
543            "sequence_number": 10,
544            "include_events": true,
545        }));
546
547        // Object without all params
548        parse_err(json!({
549            "sequence_number": 10,
550            "include_events": true,
551        }));
552
553        // Object with more params
554        parse_ok(json!({
555            "account": account,
556            "sequence_number": 10,
557            "include_events": true,
558            "foo": 11,
559        }));
560    }
561
562    #[test]
563    fn get_account_transactions() {
564        let parse_ok =
565            |value| serde_json::from_value::<GetAccountTransactionsParams>(value).unwrap();
566        let parse_err =
567            |value| serde_json::from_value::<GetAccountTransactionsParams>(value).unwrap_err();
568
569        let account = "1668f6be25668c1a17cd8caf6b8d2f25";
570
571        // Array with all params
572        parse_ok(json!([account, 10, 11, false]));
573
574        // Array with too many params
575        parse_err(json!([account, 10, 11, false, "foo"]));
576
577        // Array with wrong param
578        parse_err(json!(["foo", 10, 11, false]));
579
580        // Array with too few params
581        parse_err(json!([10, 11]));
582
583        // Empty array without required params should fail
584        parse_err(json!([]));
585
586        // Object without required params should fail
587        parse_err(json!({}));
588
589        // Object params
590        parse_ok(json!({
591            "account": account,
592            "start": 10,
593            "limit": 11,
594            "include_events": true,
595        }));
596
597        // Object without all params
598        parse_err(json!({
599            "include_events": true,
600        }));
601
602        // Object with more params
603        parse_ok(json!({
604            "account": account,
605            "start": 10,
606            "limit": 11,
607            "include_events": true,
608            "foo": 11,
609        }));
610    }
611
612    #[test]
613    fn get_account_transactions_with_proofs() {
614        let parse = |value| serde_json::from_value::<GetAccountTransactionsWithProofsParams>(value);
615        let parse_ok = |value| parse(value).unwrap();
616        let parse_err = |value| parse(value).unwrap_err();
617        let account = "1668f6be25668c1a17cd8caf6b8d2f25";
618
619        // Array with all params
620        parse_ok(json!([account, 10, 11, false]));
621        parse_ok(json!([account, 10, 11, false, 123]));
622
623        // Array with too many params
624        parse_err(json!([account, 10, 11, false, 123, "foo"]));
625
626        // Array with wrong param
627        parse_err(json!(["foo", 10, 11, false]));
628
629        // Array with too few params
630        parse_err(json!([account, 10]));
631        parse_err(json!([]));
632        parse_err(json!({}));
633
634        // Object params
635        parse_ok(json!({
636            "account": account,
637            "start": 10,
638            "limit": 11,
639            "include_events": true,
640        }));
641        parse_ok(json!({
642            "account": account,
643            "start": 10,
644            "limit": 11,
645            "include_events": true,
646            "ledger_version": 999,
647        }));
648
649        // Object without all params
650        parse_err(json!({
651            "include_events": true,
652        }));
653
654        // Object with more params
655        parse_ok(json!({
656            "account": account,
657            "start": 10,
658            "limit": 11,
659            "include_events": true,
660            "foo": 11,
661        }));
662    }
663
664    #[test]
665    fn get_events() {
666        let parse_ok = |value| serde_json::from_value::<GetEventsParams>(value).unwrap();
667        let parse_err = |value| serde_json::from_value::<GetEventsParams>(value).unwrap_err();
668
669        let key = "13000000000000000000000000000000000000000a550c18";
670
671        // Array with all params
672        parse_ok(json!([key, 10, 11]));
673
674        // Array with too many params
675        parse_err(json!([key, 10, 11, false]));
676
677        // Array with wrong param
678        parse_err(json!(["foo", 10, 11]));
679
680        // Array with too few params
681        parse_err(json!([10, 11]));
682
683        // Empty array without required params should fail
684        parse_err(json!([]));
685
686        // Object without required params should fail
687        parse_err(json!({}));
688
689        // Object params
690        parse_ok(json!({
691            "key": key,
692            "start": 10,
693            "limit": 11,
694        }));
695
696        // Object without all params
697        parse_err(json!({
698            "start": 10,
699            "limit": 11,
700        }));
701
702        // Object with more params
703        parse_ok(json!({
704            "key": key,
705            "start": 10,
706            "limit": 11,
707            "foo": 11,
708        }));
709    }
710
711    #[test]
712    fn get_currencies() {
713        let parse_ok = |value| serde_json::from_value::<GetCurrenciesParams>(value).unwrap();
714        let parse_err = |value| serde_json::from_value::<GetCurrenciesParams>(value).unwrap_err();
715
716        parse_err(json!([10]));
717        parse_ok(json!([]));
718        parse_ok(json!({}));
719        parse_ok(serde_json::Value::Null);
720
721        let request = json!({
722            "jsonrpc": "2.0",
723            "method": Method::GetCurrencies,
724            "id": 1,
725        });
726        serde_json::from_value::<JsonRpcRequest>(request).unwrap();
727    }
728
729    #[test]
730    fn get_network_status() {
731        let parse_ok = |value| serde_json::from_value::<GetNetworkStatusParams>(value).unwrap();
732        let parse_err =
733            |value| serde_json::from_value::<GetNetworkStatusParams>(value).unwrap_err();
734
735        parse_err(json!([10]));
736        parse_ok(json!([]));
737        parse_ok(json!({}));
738        parse_ok(serde_json::Value::Null);
739
740        let request = json!({
741            "jsonrpc": "2.0",
742            "method": Method::GetNetworkStatus,
743            "id": 1,
744        });
745        serde_json::from_value::<JsonRpcRequest>(request).unwrap();
746    }
747
748    #[test]
749    fn get_state_proof() {
750        let parse_ok = |value| serde_json::from_value::<GetStateProofParams>(value).unwrap();
751        let parse_err = |value| serde_json::from_value::<GetStateProofParams>(value).unwrap_err();
752
753        // Array with all params
754        parse_ok(json!([11]));
755
756        // Array with too many params
757        parse_err(json!([11, false]));
758
759        // Array with wrong param
760        parse_err(json!(["foo"]));
761
762        // Empty array without required params should fail
763        parse_err(json!([]));
764
765        // Object without required params should fail
766        parse_err(json!({}));
767
768        // Object params
769        parse_ok(json!({
770            "version": 10,
771        }));
772
773        // Object with more params
774        parse_ok(json!({
775            "version": 10,
776            "foo": 11,
777        }));
778    }
779
780    #[test]
781    fn get_accumulator_consistency_proof() {
782        let parse = |value| serde_json::from_value::<GetAccumulatorConsistencyProofParams>(value);
783        let parse_ok = |value| parse(value).unwrap();
784        let parse_err = |value| parse(value).unwrap_err();
785
786        // Array with all params
787        parse_ok(json!([11, 42]));
788
789        // Array with too many params
790        parse_err(json!([11, 42, 7]));
791
792        // Array with no ledger version
793        parse_ok(json!([11]));
794
795        // Array with no ledger version or client known version
796        parse_ok(json!([]));
797
798        // Array with wrong first param
799        parse_err(json!(["foo"]));
800
801        // Array with wrong second param
802        parse_err(json!([123, "bar"]));
803
804        // Object with no ledger version or client known version
805        parse_ok(json!({}));
806
807        // Object with no ledger version
808        parse_ok(json!({
809            "client_known_version": 123,
810        }));
811
812        // Object with no client known version
813        parse_ok(json!({
814            "ledger_version": 123,
815        }));
816
817        // Object with all params
818        parse_ok(json!({
819            "client_known_version": 42,
820            "ledger_version": 123,
821        }));
822
823        // Object with extra params
824        parse_ok(json!({
825            "client_known_version": 42,
826            "ledger_version": 123,
827            "foo": "bar",
828        }));
829    }
830
831    #[test]
832    fn get_account_state_with_proof() {
833        let parse = |value| serde_json::from_value::<GetAccountStateWithProofParams>(value);
834        let parse_ok = |value| parse(value).unwrap();
835        let parse_err = |value| parse(value).unwrap_err();
836
837        let account = "1668f6be25668c1a17cd8caf6b8d2f25";
838
839        // Array with all params
840        parse_ok(json!([account, 11, 12]));
841
842        // Array without optional params
843        parse_ok(json!([account]));
844        parse_ok(json!([account, 12]));
845
846        // Array with too many params
847        parse_err(json!([account, 11, 12, "foo"]));
848
849        // Array with wrong param
850        parse_err(json!(["foo", 11, 12]));
851
852        // Array with too few params
853        parse_err(json!([10, 11]));
854
855        // Empty array without required params should fail
856        parse_err(json!([]));
857
858        // Object without required params should fail
859        parse_err(json!({}));
860
861        // Object params
862        parse_ok(json!({
863            "account": account,
864            "version": 10,
865            "ledger_version": 10,
866        }));
867
868        // Object without all params
869        parse_ok(json!({
870            "account": account,
871            "ledger_version": 10,
872        }));
873
874        // Object with more params
875        parse_ok(json!({
876            "account": account,
877            "version": 10,
878            "ledger_version": 10,
879            "foo": 11,
880        }));
881    }
882
883    #[test]
884    fn get_transactions_with_proofs() {
885        let parse = |value| serde_json::from_value::<GetTransactionsWithProofsParams>(value);
886        let parse_ok = |value| parse(value).unwrap();
887        let parse_err = |value| parse(value).unwrap_err();
888
889        // Array with all params
890        parse_ok(json!([10, 11, true]));
891
892        // Array with too many params
893        parse_err(json!([10, 11, 42, false]));
894
895        // Array with wrong param
896        parse_err(json!(["foo", 11, false]));
897
898        // Array with too few params
899        parse_err(json!([10, 11]));
900
901        // Empty array without required params should fail
902        parse_err(json!([]));
903
904        // Object without required params should fail
905        parse_err(json!({}));
906
907        // Object params
908        parse_ok(json!({
909            "start_version": 10,
910            "limit": 11,
911            "include_events": true,
912        }));
913
914        // Object with more params
915        parse_ok(json!({
916            "start_version": 10,
917            "limit": 11,
918            "include_events": true,
919            "foo": "bar",
920        }));
921    }
922
923    #[test]
924    fn get_events_with_proofs() {
925        let parse = |value| serde_json::from_value::<GetEventsWithProofsParams>(value);
926        let parse_ok = |value| parse(value).unwrap();
927        let parse_err = |value| parse(value).unwrap_err();
928
929        let key = "13000000000000000000000000000000000000000a550c18";
930
931        // Array with all params
932        parse_ok(json!([key, 10, 11]));
933
934        // Array with too many params
935        parse_err(json!([key, 10, 11, false]));
936
937        // Array with wrong param
938        parse_err(json!(["foo", 10, 11]));
939
940        // Array with too few params
941        parse_err(json!([10, 11]));
942
943        // Empty array without required params should fail
944        parse_err(json!([]));
945
946        // Object without required params should fail
947        parse_err(json!({}));
948
949        // Object params
950        parse_ok(json!({
951            "key": key,
952            "start": 10,
953            "limit": 11,
954        }));
955
956        // Object without all params
957        parse_err(json!({
958            "start": 10,
959            "limit": 11,
960        }));
961
962        // Object with more params
963        parse_ok(json!({
964            "key": key,
965            "start": 10,
966            "limit": 11,
967            "foo": 11,
968        }));
969    }
970
971    #[test]
972    fn get_event_by_version_with_proof() {
973        let parse = |value| serde_json::from_value::<GetEventByVersionWithProof>(value);
974        let parse_ok = |value| parse(value).unwrap();
975        let parse_err = |value| parse(value).unwrap_err();
976
977        let key = "13000000000000000000000000000000000000000a550c18";
978
979        // Correct arguments
980        parse_ok(json!([key, 10]));
981        parse_ok(json!([key]));
982
983        // Incorrect arguments
984        parse_err(json!([key, 10, false]));
985        parse_err(json!(["foo", 10]));
986        parse_err(json!([]));
987        parse_err(json!({}));
988
989        // Object params
990        parse_ok(json!({ "key": key, "version": 10 }));
991        parse_ok(json!({ "key": key }));
992
993        // Object without all required params
994        parse_err(json!({ "version": 10 }));
995
996        // Object with more params
997        parse_ok(json!({ "key": key, "version": 10, "foo": 99 }));
998    }
999}