alloy_eip5792/
call.rs

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