This repository was archived by the owner on Jul 22, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 53
/
Copy pathutils.rs
149 lines (137 loc) · 5.17 KB
/
utils.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
use std::{
collections::HashMap,
io::{self, Read},
};
use cairo_lang_starknet::contract_class::ContractEntryPoints;
use cairo_lang_utils::bigint::BigUintAsHex;
use cairo_vm::{felt::Felt252, vm::runners::cairo_runner::ExecutionResources};
use serde::Deserialize;
use starknet::core::types::{LegacyContractEntryPoint, LegacyEntryPointsByType};
use starknet_api::{
core::EntryPointSelector,
deprecated_contract_class::{EntryPoint, EntryPointOffset, EntryPointType},
hash::{StarkFelt, StarkHash},
transaction::{DeclareTransaction, InvokeTransaction, Transaction},
};
use starknet_in_rust::execution::CallInfo;
use crate::rpc_state::RpcCallInfo;
#[derive(Debug, Deserialize)]
pub struct MiddleSierraContractClass {
pub sierra_program: Vec<BigUintAsHex>,
pub contract_class_version: String,
pub entry_points_by_type: ContractEntryPoints,
}
pub fn map_entry_points_by_type_legacy(
entry_points_by_type: LegacyEntryPointsByType,
) -> HashMap<EntryPointType, Vec<EntryPoint>> {
let entry_types_to_points = HashMap::from([
(
EntryPointType::Constructor,
entry_points_by_type.constructor,
),
(EntryPointType::External, entry_points_by_type.external),
(EntryPointType::L1Handler, entry_points_by_type.l1_handler),
]);
let to_contract_entry_point = |entrypoint: &LegacyContractEntryPoint| -> EntryPoint {
let felt: StarkFelt = StarkHash::new(entrypoint.selector.to_bytes_be()).unwrap();
EntryPoint {
offset: EntryPointOffset(entrypoint.offset as usize),
selector: EntryPointSelector(felt),
}
};
let mut entry_points_by_type_map = HashMap::new();
for (entry_point_type, entry_points) in entry_types_to_points.into_iter() {
let values = entry_points
.iter()
.map(to_contract_entry_point)
.collect::<Vec<_>>();
entry_points_by_type_map.insert(entry_point_type, values);
}
entry_points_by_type_map
}
/// Uncompresses a Gz Encoded vector of bytes and returns a string or error
/// Here &[u8] implements BufRead
pub fn decode_reader(bytes: Vec<u8>) -> io::Result<String> {
use flate2::bufread;
let mut gz = bufread::GzDecoder::new(&bytes[..]);
let mut s = String::new();
gz.read_to_string(&mut s)?;
Ok(s)
}
/// Freestanding deserialize method to avoid a new type.
pub fn deserialize_transaction_json(
transaction: serde_json::Value,
) -> serde_json::Result<Transaction> {
let tx_type: String = serde_json::from_value(transaction["type"].clone())?;
let tx_version: String = serde_json::from_value(transaction["version"].clone())?;
match tx_type.as_str() {
"INVOKE" => match tx_version.as_str() {
"0x0" => Ok(Transaction::Invoke(InvokeTransaction::V0(
serde_json::from_value(transaction)?,
))),
"0x1" => Ok(Transaction::Invoke(InvokeTransaction::V1(
serde_json::from_value(transaction)?,
))),
x => Err(serde::de::Error::custom(format!(
"unimplemented invoke version: {x}"
))),
},
"DEPLOY_ACCOUNT" => Ok(Transaction::DeployAccount(serde_json::from_value(
transaction,
)?)),
"DECLARE" => match tx_version.as_str() {
"0x0" => Ok(Transaction::Declare(DeclareTransaction::V0(
serde_json::from_value(transaction)?,
))),
"0x1" => Ok(Transaction::Declare(DeclareTransaction::V1(
serde_json::from_value(transaction)?,
))),
"0x2" => Ok(Transaction::Declare(DeclareTransaction::V2(
serde_json::from_value(transaction)?,
))),
x => Err(serde::de::Error::custom(format!(
"unimplemented declare version: {x}"
))),
},
"L1_HANDLER" => Ok(Transaction::L1Handler(serde_json::from_value(transaction)?)),
x => Err(serde::de::Error::custom(format!(
"unimplemented transaction type deserialization: {x}"
))),
}
}
/// Converts a StarkFelt to a Felt252
pub fn starkfelt_to_felt252(data: &StarkFelt) -> Felt252 {
Felt252::from_bytes_be(data.bytes())
}
pub fn rpc_call_info_to_call_info(rpc_call_info: &RpcCallInfo) -> CallInfo {
CallInfo {
calldata: rpc_call_info
.calldata
.as_ref()
.unwrap_or(&vec![])
.iter()
.map(starkfelt_to_felt252)
.collect(),
execution_resources: ExecutionResources {
n_steps: rpc_call_info.execution_resources.n_steps,
n_memory_holes: rpc_call_info.execution_resources.n_memory_holes,
builtin_instance_counter: rpc_call_info
.execution_resources
.builtin_instance_counter
.clone(),
},
retdata: rpc_call_info
.retdata
.as_ref()
.unwrap_or(&vec![])
.iter()
.map(starkfelt_to_felt252)
.collect(),
internal_calls: rpc_call_info
.internal_calls
.iter()
.map(rpc_call_info_to_call_info)
.collect(),
..Default::default()
}
}