Skip to content

Commit 1a4f78d

Browse files
committed
rust any_type syscall support
1 parent c5b02db commit 1a4f78d

File tree

3 files changed

+104
-2
lines changed

3 files changed

+104
-2
lines changed

crates/dry_hint_processor/src/syscall_handler/mod.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,10 @@ use hints::vars;
1414
use serde::{Deserialize, Serialize};
1515
use starknet::CallContractHandler as StarknetCallContractHandler;
1616
use syscall_handler::{
17-
call_contract, call_contract::debug::DebugCallContractHandler, felt_from_ptr, keccak::KeccakHandler, run_handler, traits,
18-
SyscallExecutionError, SyscallResult, SyscallSelector, WriteResponseResult,
17+
call_contract::{self, any_type::AnyTypeCallContractHandler, debug::DebugCallContractHandler},
18+
felt_from_ptr,
19+
keccak::KeccakHandler,
20+
run_handler, traits, SyscallExecutionError, SyscallResult, SyscallSelector, WriteResponseResult,
1921
};
2022
use tokio::{sync::RwLock, task};
2123
use types::{
@@ -83,6 +85,7 @@ pub struct CallContractHandlerRelay {
8385
pub starknet_call_contract_handler: StarknetCallContractHandler,
8486
#[serde(skip)]
8587
pub debug_call_contract_handler: DebugCallContractHandler,
88+
pub any_type_call_contract_handler: AnyTypeCallContractHandler,
8689
}
8790

8891
impl traits::SyscallHandler for CallContractHandlerRelay {
@@ -98,6 +101,7 @@ impl traits::SyscallHandler for CallContractHandlerRelay {
98101
async fn execute(&mut self, request: Self::Request, vm: &mut VirtualMachine) -> SyscallResult<Self::Response> {
99102
match request.contract_address {
100103
v if v == call_contract::debug::CONTRACT_ADDRESS => self.debug_call_contract_handler.execute(request, vm).await,
104+
v if v == call_contract::any_type::CONTRACT_ADDRESS => self.any_type_call_contract_handler.execute(request, vm).await,
101105
_ => {
102106
let chain_id = <Felt252 as TryInto<u128>>::try_into(*vm.get_integer((request.calldata_start + 2)?)?)
103107
.map_err(|e| SyscallExecutionError::InternalError(e.to_string().into()))?;
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
use cairo_vm::{
2+
types::relocatable::{MaybeRelocatable, Relocatable},
3+
vm::vm_core::VirtualMachine,
4+
Felt252,
5+
};
6+
use serde::{Deserialize, Serialize};
7+
use types::cairo::{
8+
new_syscalls::{CallContractRequest, CallContractResponse},
9+
traits::CairoType,
10+
FELT_10,
11+
};
12+
13+
use crate::{traits, SyscallResult, WriteResponseResult};
14+
15+
pub const CONTRACT_ADDRESS: Felt252 = Felt252::from_hex_unchecked("0x616e795f74797065"); // 'any_type' in hex
16+
17+
#[derive(Debug, Default, Serialize, Deserialize, Clone)]
18+
pub struct AnyTypeCallContractHandler;
19+
20+
impl traits::SyscallHandler for AnyTypeCallContractHandler {
21+
type Request = CallContractRequest;
22+
type Response = CallContractResponse;
23+
24+
fn read_request(&mut self, vm: &VirtualMachine, ptr: &mut Relocatable) -> SyscallResult<Self::Request> {
25+
let ret = Self::Request::from_memory(vm, *ptr)?;
26+
*ptr = (*ptr + Self::Request::cairo_size())?;
27+
Ok(ret)
28+
}
29+
30+
async fn execute(&mut self, request: Self::Request, vm: &mut VirtualMachine) -> SyscallResult<Self::Response> {
31+
let field_len = (request.calldata_end - request.calldata_start)?;
32+
let fields = vm
33+
.get_integer_range(request.calldata_start, field_len)?
34+
.into_iter()
35+
.map(|f| (*f.as_ref()))
36+
.collect::<Vec<Felt252>>();
37+
38+
// we need here macro to deserialize the cairo1 way the CairoType derived structure
39+
let input = AnyTypeInput {
40+
item_a: fields[0],
41+
item_b: fields[1],
42+
item_c: fields[2],
43+
item_d: fields[3],
44+
};
45+
46+
// we need here macro to serialize the cairo1 way the CairoType derived structure
47+
let output = AnyTypeOutput {
48+
item_a: input.item_a,
49+
item_b: input.item_b,
50+
item_c: input.item_c,
51+
item_d: input.item_d,
52+
item_e: FELT_10,
53+
item_f: FELT_10,
54+
};
55+
56+
let retdata_start = vm.add_memory_segment();
57+
let retdata_end = vm.load_data(
58+
retdata_start,
59+
&[
60+
output.item_a,
61+
output.item_b,
62+
output.item_c,
63+
output.item_d,
64+
output.item_e,
65+
output.item_f,
66+
]
67+
.map(MaybeRelocatable::from),
68+
)?;
69+
70+
Ok(Self::Response {
71+
retdata_start,
72+
retdata_end,
73+
})
74+
}
75+
76+
fn write_response(&mut self, response: Self::Response, vm: &mut VirtualMachine, ptr: &mut Relocatable) -> WriteResponseResult {
77+
response.to_memory(vm, *ptr)?;
78+
*ptr = (*ptr + Self::Response::cairo_size())?;
79+
Ok(())
80+
}
81+
}
82+
83+
struct AnyTypeInput {
84+
pub item_a: Felt252,
85+
pub item_b: Felt252,
86+
pub item_c: Felt252,
87+
pub item_d: Felt252,
88+
}
89+
90+
struct AnyTypeOutput {
91+
pub item_a: Felt252,
92+
pub item_b: Felt252,
93+
pub item_c: Felt252,
94+
pub item_d: Felt252,
95+
pub item_e: Felt252,
96+
pub item_f: Felt252,
97+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
pub mod any_type;
12
pub mod debug;

0 commit comments

Comments
 (0)