1use 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 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
281struct 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 parse_err(json!([10, 11]));
398
399 parse_ok(json!([10]));
401
402 parse_ok(json!([serde_json::Value::Null]));
404
405 parse_ok(json!([]));
407
408 parse_ok(json!({}));
410
411 parse_ok(serde_json::Value::Null);
413
414 parse_ok(json!({"version": 10}));
416
417 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 parse_ok(json!([account]));
433
434 parse_ok(json!([account, 10]));
436
437 parse_err(json!([account, "foo"]));
439
440 parse_err(json!([account, 10, 1]));
442
443 parse_err(json!([]));
445
446 parse_err(json!({}));
448
449 parse_ok(json!({
451 "account": account,
452 }));
453
454 parse_ok(json!({
456 "account": account,
457 "version": 10,
458 }));
459
460 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 parse_ok(json!([10, 11, false]));
475
476 parse_err(json!([10, 11, false, "foo"]));
478
479 parse_err(json!(["foo", 11, false]));
481
482 parse_err(json!([10, 11]));
484
485 parse_err(json!([]));
487
488 parse_err(json!({}));
490
491 parse_ok(json!({
493 "start_version": 10,
494 "limit": 10,
495 "include_events": true,
496 }));
497
498 parse_err(json!({
500 "limit": 10,
501 "include_events": true,
502 }));
503
504 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 parse_ok(json!([account, 11, false]));
524
525 parse_err(json!([account, 11, false, "foo"]));
527
528 parse_err(json!(["foo", 11, false]));
530
531 parse_err(json!([10, 11]));
533
534 parse_err(json!([]));
536
537 parse_err(json!({}));
539
540 parse_ok(json!({
542 "account": account,
543 "sequence_number": 10,
544 "include_events": true,
545 }));
546
547 parse_err(json!({
549 "sequence_number": 10,
550 "include_events": true,
551 }));
552
553 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 parse_ok(json!([account, 10, 11, false]));
573
574 parse_err(json!([account, 10, 11, false, "foo"]));
576
577 parse_err(json!(["foo", 10, 11, false]));
579
580 parse_err(json!([10, 11]));
582
583 parse_err(json!([]));
585
586 parse_err(json!({}));
588
589 parse_ok(json!({
591 "account": account,
592 "start": 10,
593 "limit": 11,
594 "include_events": true,
595 }));
596
597 parse_err(json!({
599 "include_events": true,
600 }));
601
602 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 parse_ok(json!([account, 10, 11, false]));
621 parse_ok(json!([account, 10, 11, false, 123]));
622
623 parse_err(json!([account, 10, 11, false, 123, "foo"]));
625
626 parse_err(json!(["foo", 10, 11, false]));
628
629 parse_err(json!([account, 10]));
631 parse_err(json!([]));
632 parse_err(json!({}));
633
634 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 parse_err(json!({
651 "include_events": true,
652 }));
653
654 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 parse_ok(json!([key, 10, 11]));
673
674 parse_err(json!([key, 10, 11, false]));
676
677 parse_err(json!(["foo", 10, 11]));
679
680 parse_err(json!([10, 11]));
682
683 parse_err(json!([]));
685
686 parse_err(json!({}));
688
689 parse_ok(json!({
691 "key": key,
692 "start": 10,
693 "limit": 11,
694 }));
695
696 parse_err(json!({
698 "start": 10,
699 "limit": 11,
700 }));
701
702 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 parse_ok(json!([11]));
755
756 parse_err(json!([11, false]));
758
759 parse_err(json!(["foo"]));
761
762 parse_err(json!([]));
764
765 parse_err(json!({}));
767
768 parse_ok(json!({
770 "version": 10,
771 }));
772
773 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 parse_ok(json!([11, 42]));
788
789 parse_err(json!([11, 42, 7]));
791
792 parse_ok(json!([11]));
794
795 parse_ok(json!([]));
797
798 parse_err(json!(["foo"]));
800
801 parse_err(json!([123, "bar"]));
803
804 parse_ok(json!({}));
806
807 parse_ok(json!({
809 "client_known_version": 123,
810 }));
811
812 parse_ok(json!({
814 "ledger_version": 123,
815 }));
816
817 parse_ok(json!({
819 "client_known_version": 42,
820 "ledger_version": 123,
821 }));
822
823 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 parse_ok(json!([account, 11, 12]));
841
842 parse_ok(json!([account]));
844 parse_ok(json!([account, 12]));
845
846 parse_err(json!([account, 11, 12, "foo"]));
848
849 parse_err(json!(["foo", 11, 12]));
851
852 parse_err(json!([10, 11]));
854
855 parse_err(json!([]));
857
858 parse_err(json!({}));
860
861 parse_ok(json!({
863 "account": account,
864 "version": 10,
865 "ledger_version": 10,
866 }));
867
868 parse_ok(json!({
870 "account": account,
871 "ledger_version": 10,
872 }));
873
874 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 parse_ok(json!([10, 11, true]));
891
892 parse_err(json!([10, 11, 42, false]));
894
895 parse_err(json!(["foo", 11, false]));
897
898 parse_err(json!([10, 11]));
900
901 parse_err(json!([]));
903
904 parse_err(json!({}));
906
907 parse_ok(json!({
909 "start_version": 10,
910 "limit": 11,
911 "include_events": true,
912 }));
913
914 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 parse_ok(json!([key, 10, 11]));
933
934 parse_err(json!([key, 10, 11, false]));
936
937 parse_err(json!(["foo", 10, 11]));
939
940 parse_err(json!([10, 11]));
942
943 parse_err(json!([]));
945
946 parse_err(json!({}));
948
949 parse_ok(json!({
951 "key": key,
952 "start": 10,
953 "limit": 11,
954 }));
955
956 parse_err(json!({
958 "start": 10,
959 "limit": 11,
960 }));
961
962 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 parse_ok(json!([key, 10]));
981 parse_ok(json!([key]));
982
983 parse_err(json!([key, 10, false]));
985 parse_err(json!(["foo", 10]));
986 parse_err(json!([]));
987 parse_err(json!({}));
988
989 parse_ok(json!({ "key": key, "version": 10 }));
991 parse_ok(json!({ "key": key }));
992
993 parse_err(json!({ "version": 10 }));
995
996 parse_ok(json!({ "key": key, "version": 10, "foo": 99 }));
998 }
999}