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