Skip to main content

alloy_eip5792/
call.rs

1use alloy_primitives::{map::HashMap, Address, Bytes, ChainId, U256};
2
3/// Request that a wallet submits a batch of calls in `wallet_sendCalls`
4#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct SendCallsRequest {
7    /// RPC version
8    pub version: String,
9    /// Sender's address
10    pub from: Address,
11    /// A batch of calls to be submitted
12    pub calls: Vec<CallParams>,
13    /// Enabled permissions per chain
14    #[serde(default, skip_serializing_if = "Option::is_none")]
15    pub capabilities: Option<HashMap<String, serde_json::Value>>,
16}
17
18/// Call parameters for `wallet_sendCalls`
19#[derive(Clone, Debug, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct CallParams {
22    /// Recipient address
23    #[serde(default, skip_serializing_if = "Option::is_none")]
24    pub to: Option<Address>,
25    /// Tx data field
26    #[serde(default, skip_serializing_if = "Option::is_none")]
27    pub data: Option<Bytes>,
28    /// Transferred value
29    #[serde(default, skip_serializing_if = "Option::is_none")]
30    pub value: Option<U256>,
31    /// Id of target chain
32    #[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}