1use alloy_primitives::{map::HashMap, Address, Bytes, ChainId, U256};
2use std::vec::Vec;
3
4#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
6#[serde(rename_all = "camelCase")]
7pub struct SendCallsRequest {
8 pub version: String,
10 pub from: Address,
12 pub calls: Vec<CallParams>,
14 #[serde(default, skip_serializing_if = "Option::is_none")]
16 pub capabilities: Option<HashMap<String, serde_json::Value>>,
17}
18
19#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
21#[serde(rename_all = "camelCase")]
22pub struct CallParams {
23 #[serde(default, skip_serializing_if = "Option::is_none")]
25 pub to: Option<Address>,
26 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub data: Option<Bytes>,
29 #[serde(default, skip_serializing_if = "Option::is_none")]
31 pub value: Option<U256>,
32 #[serde(default, skip_serializing_if = "Option::is_none")]
34 pub chain_id: Option<ChainId>,
35}
36#[cfg(test)]
37mod tests {
38 use super::*;
39 use alloy_primitives::{Address, Bytes, ChainId, U256};
40
41 #[test]
42 fn test_serialization_deserialization() {
43 let sample_request = SendCallsRequest {
44 version: "1.0".to_string(),
45 from: Address::default(),
46 calls: vec![
47 CallParams {
48 to: Some(Address::default()),
49 data: Some(Bytes::from("d46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"
50 )),
51 value: Some(U256::from(0x9184e72au64)),
52 chain_id: Some(ChainId::from(1u64)),
53 },
54 CallParams {
55 to: Some(Address::default()),
56 data: Some(Bytes::from(
57 "fbadbaf01"),
58 ),
59 value: Some(U256::from(0x182183u64)),
60 chain_id: Some(ChainId::from(1u64)),
61 },
62 ],
63 capabilities: None,
64 };
65
66 let serialized = serde_json::to_string(&sample_request).unwrap();
67 let deserialized: SendCallsRequest = serde_json::from_str(&serialized).unwrap();
68 assert_eq!(sample_request, deserialized);
69 }
70}