Skip to content

Commit b700aea

Browse files
kariyclaude
andcommitted
Add custom Call serde for outside execution with renamed fields
Serialize Call's `contract_address` as `to` and `entry_point_selector` as `selector` in OutsideExecutionV2/V3 using a local serde module, keeping the primitive Call type unchanged. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent cb07222 commit b700aea

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

crates/primitives/src/execution.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,8 @@ pub type EntryPointSelector = Felt;
3030
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
3131
pub struct Call {
3232
/// The address of the contract whose function you're calling.
33-
#[serde(alias = "to")]
3433
pub contract_address: ContractAddress,
3534
/// The contract function selector.
36-
#[serde(alias = "selector")]
3735
pub entry_point_selector: EntryPointSelector,
3836
/// The input to the function.
3937
pub calldata: Vec<Felt>,

crates/rpc/rpc-types/src/outside_execution.rs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,54 @@ use katana_primitives::{ContractAddress, Felt};
2020
use serde::{Deserialize, Serialize};
2121
use starknet::macros::selector;
2222

23+
mod calls_serde {
24+
use katana_primitives::execution::Call;
25+
use katana_primitives::{ContractAddress, Felt};
26+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
27+
28+
#[derive(Serialize)]
29+
struct CallRef<'a> {
30+
#[serde(rename = "to")]
31+
contract_address: &'a ContractAddress,
32+
#[serde(rename = "selector")]
33+
entry_point_selector: &'a Felt,
34+
calldata: &'a Vec<Felt>,
35+
}
36+
37+
#[derive(Deserialize)]
38+
struct CallDe {
39+
#[serde(rename = "to")]
40+
contract_address: ContractAddress,
41+
#[serde(rename = "selector")]
42+
entry_point_selector: Felt,
43+
calldata: Vec<Felt>,
44+
}
45+
46+
pub fn serialize<S: Serializer>(calls: &Vec<Call>, serializer: S) -> Result<S::Ok, S::Error> {
47+
let refs: Vec<CallRef<'_>> = calls
48+
.iter()
49+
.map(|c| CallRef {
50+
contract_address: &c.contract_address,
51+
entry_point_selector: &c.entry_point_selector,
52+
calldata: &c.calldata,
53+
})
54+
.collect();
55+
refs.serialize(serializer)
56+
}
57+
58+
pub fn deserialize<'de, D: Deserializer<'de>>(deserializer: D) -> Result<Vec<Call>, D::Error> {
59+
let items = Vec::<CallDe>::deserialize(deserializer)?;
60+
Ok(items
61+
.into_iter()
62+
.map(|c| Call {
63+
contract_address: c.contract_address,
64+
entry_point_selector: c.entry_point_selector,
65+
calldata: c.calldata,
66+
})
67+
.collect())
68+
}
69+
}
70+
2371
/// Nonce channel
2472
#[derive(Clone, CairoSerde, PartialEq, Debug, Serialize, Deserialize)]
2573
pub struct NonceChannel(
@@ -41,6 +89,7 @@ pub struct OutsideExecutionV2 {
4189
#[serde(serialize_with = "serialize_as_hex", deserialize_with = "deserialize_from_hex")]
4290
pub execute_before: u64,
4391
/// Calls to execute in order.
92+
#[serde(with = "calls_serde")]
4493
pub calls: Vec<Call>,
4594
}
4695

@@ -58,6 +107,7 @@ pub struct OutsideExecutionV3 {
58107
#[serde(serialize_with = "serialize_as_hex", deserialize_with = "deserialize_from_hex")]
59108
pub execute_before: u64,
60109
/// Calls to execute in order.
110+
#[serde(with = "calls_serde")]
61111
pub calls: Vec<Call>,
62112
}
63113

0 commit comments

Comments
 (0)