Skip to content

Commit c1942ce

Browse files
test(apollo_starknet_os_program): add OS constants test (#6274)
* test(apollo_starknet_os_program): add OS constants test * feat(apollo_starknet_os_program): hard-code gas costs in constants.cairo * feat(apollo_starknet_os_program): align all class hashes to 64 characters * feat(apollo_starknet_os_program): hex contract addresses in constants.cairo
1 parent 2f9b883 commit c1942ce

File tree

5 files changed

+257
-38
lines changed

5 files changed

+257
-38
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/apollo_starknet_os_program/Cargo.toml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,3 +24,9 @@ thiserror.workspace = true
2424
[build-dependencies]
2525
apollo_infra_utils.workspace = true
2626
serde_json.workspace = true
27+
28+
[dev-dependencies]
29+
apollo_infra_utils = { workspace = true, features = ["testing"] }
30+
blockifier.workspace = true
31+
starknet-types-core.workspace = true
32+
starknet_api.workspace = true

crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/constants.cairo

Lines changed: 35 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,11 @@ const DEFAULT_ENTRY_POINT_SELECTOR = 0x0;
5656
// OS reserved contract addresses.
5757

5858
// This contract stores the block number -> block hash mapping.
59-
const BLOCK_HASH_CONTRACT_ADDRESS = 1;
59+
const BLOCK_HASH_CONTRACT_ADDRESS = 0x1;
6060
// This contract stores the aliases mapping used for stateful compression.
61-
const ALIAS_CONTRACT_ADDRESS = 2;
61+
const ALIAS_CONTRACT_ADDRESS = 0x2;
6262
// Future reserved contract address.
63-
const RESERVED_CONTRACT_ADDRESS = 3;
63+
const RESERVED_CONTRACT_ADDRESS = 0x3;
6464
// The block number -> block hash mapping is written for the current block number minus this number.
6565
const STORED_BLOCK_HASH_BUFFER = 10;
6666

@@ -79,7 +79,7 @@ const MUL_MOD_GAS_COST = 604;
7979
const ECDSA_GAS_COST = 10561;
8080
const MEMORY_HOLE_GAS_COST = 10;
8181

82-
const DEFAULT_INITIAL_GAS_COST = 100000000 * STEP_GAS_COST;
82+
const DEFAULT_INITIAL_GAS_COST = 10000000000;
8383
const VALIDATE_MAX_SIERRA_GAS = 100000000;
8484
const EXECUTE_MAX_SIERRA_GAS = 1000000000;
8585
const DEFAULT_INITIAL_GAS_COST_NO_L2 = VALIDATE_MAX_SIERRA_GAS + EXECUTE_MAX_SIERRA_GAS;
@@ -88,46 +88,43 @@ const DEFAULT_INITIAL_GAS_COST_NO_L2 = VALIDATE_MAX_SIERRA_GAS + EXECUTE_MAX_SIE
8888

8989
// The initial budget at an entry point. This needs to be high enough to cover the initial get_gas.
9090
// The entry point may refund whatever remains from the initial budget.
91-
const ENTRY_POINT_INITIAL_BUDGET = 100 * STEP_GAS_COST;
91+
const ENTRY_POINT_INITIAL_BUDGET = 10000;
9292
// The gas cost of each syscall libfunc (this value is hard-coded by the compiler).
9393
// This needs to be high enough to cover OS costs in the case of failure due to out of gas.
94-
const SYSCALL_BASE_GAS_COST = 100 * STEP_GAS_COST;
94+
const SYSCALL_BASE_GAS_COST = 10000;
9595

9696
// Syscall gas costs.
97-
const CALL_CONTRACT_GAS_COST = 18 * RANGE_CHECK_GAS_COST + 903 * STEP_GAS_COST;
98-
const DEPLOY_GAS_COST = 7 * PEDERSEN_GAS_COST + 21 * RANGE_CHECK_GAS_COST + 1173 * STEP_GAS_COST;
99-
const DEPLOY_CALLDATA_FACTOR_GAS_COST = 1 * PEDERSEN_GAS_COST + 8 * STEP_GAS_COST;
100-
const GET_BLOCK_HASH_GAS_COST = 2 * RANGE_CHECK_GAS_COST + 107 * STEP_GAS_COST;
101-
const GET_CLASS_HASH_AT_GAS_COST = 1 * SYSCALL_BASE_GAS_COST;
102-
const GET_EXECUTION_INFO_GAS_COST = 2 * RANGE_CHECK_GAS_COST + 125 * STEP_GAS_COST;
103-
const LIBRARY_CALL_GAS_COST = 18 * RANGE_CHECK_GAS_COST + 879 * STEP_GAS_COST;
104-
const REPLACE_CLASS_GAS_COST = 1 * RANGE_CHECK_GAS_COST + 106 * STEP_GAS_COST;
97+
const CALL_CONTRACT_GAS_COST = 91560;
98+
const DEPLOY_GAS_COST = 147120;
99+
const DEPLOY_CALLDATA_FACTOR_GAS_COST = 4850;
100+
const GET_BLOCK_HASH_GAS_COST = 10840;
101+
const GET_CLASS_HASH_AT_GAS_COST = 10000;
102+
const GET_EXECUTION_INFO_GAS_COST = 12640;
103+
const LIBRARY_CALL_GAS_COST = 89160;
104+
const REPLACE_CLASS_GAS_COST = 10670;
105105
// TODO(Yoni, 1/1/2026): take into account Patricia updates and dict squash.
106-
const STORAGE_READ_GAS_COST = 1 * SYSCALL_BASE_GAS_COST;
107-
const STORAGE_WRITE_GAS_COST = 1 * SYSCALL_BASE_GAS_COST;
108-
const EMIT_EVENT_GAS_COST = 1 * SYSCALL_BASE_GAS_COST;
109-
const SEND_MESSAGE_TO_L1_GAS_COST = 1 * RANGE_CHECK_GAS_COST + 144 * STEP_GAS_COST;
110-
const META_TX_V0_GAS_COST = 9 * PEDERSEN_GAS_COST + 20 * RANGE_CHECK_GAS_COST + 1301 *
111-
STEP_GAS_COST;
112-
const META_TX_V0_CALLDATA_FACTOR_GAS_COST = 1 * PEDERSEN_GAS_COST + 8 * STEP_GAS_COST;
106+
const STORAGE_READ_GAS_COST = 10000;
107+
const STORAGE_WRITE_GAS_COST = 10000;
108+
const EMIT_EVENT_GAS_COST = 10000;
109+
const SEND_MESSAGE_TO_L1_GAS_COST = 14470;
110+
const META_TX_V0_GAS_COST = 167950;
111+
const META_TX_V0_CALLDATA_FACTOR_GAS_COST = 4850;
113112

114113
// Note the the following costs include `SYSCALL_BASE_GAS_COST` implicitly.
115-
const SECP256K1_ADD_GAS_COST = 29 * RANGE_CHECK_GAS_COST + 412 * STEP_GAS_COST;
116-
const SECP256K1_GET_POINT_FROM_X_GAS_COST = 30 * RANGE_CHECK_GAS_COST + 397 * STEP_GAS_COST;
117-
const SECP256K1_GET_XY_GAS_COST = 11 * RANGE_CHECK_GAS_COST + 209 * STEP_GAS_COST;
118-
const SECP256K1_MUL_GAS_COST = 7045 * RANGE_CHECK_GAS_COST + 76507 * STEP_GAS_COST;
119-
const SECP256K1_NEW_GAS_COST = 35 * RANGE_CHECK_GAS_COST + 463 * STEP_GAS_COST;
120-
const SECP256R1_ADD_GAS_COST = 57 * RANGE_CHECK_GAS_COST + 595 * STEP_GAS_COST;
121-
const SECP256R1_GET_POINT_FROM_X_GAS_COST = 44 * RANGE_CHECK_GAS_COST + 516 * STEP_GAS_COST;
122-
const SECP256R1_GET_XY_GAS_COST = 11 * RANGE_CHECK_GAS_COST + 211 * STEP_GAS_COST;
123-
const SECP256R1_MUL_GAS_COST = 13961 * RANGE_CHECK_GAS_COST + 125346 * STEP_GAS_COST;
124-
const SECP256R1_NEW_GAS_COST = 49 * RANGE_CHECK_GAS_COST + 582 * STEP_GAS_COST;
125-
126-
const KECCAK_GAS_COST = 1 * SYSCALL_BASE_GAS_COST;
127-
const KECCAK_ROUND_COST_GAS_COST = 6 * BITWISE_BUILTIN_GAS_COST + 1 * KECCAK_BUILTIN_GAS_COST + 56 *
128-
RANGE_CHECK_GAS_COST + 281 * STEP_GAS_COST;
129-
const SHA256_PROCESS_BLOCK_GAS_COST = 1115 * BITWISE_BUILTIN_GAS_COST + 65 * RANGE_CHECK_GAS_COST +
130-
1867 * STEP_GAS_COST;
114+
const SECP256K1_ADD_GAS_COST = 43230;
115+
const SECP256K1_GET_POINT_FROM_X_GAS_COST = 41800;
116+
const SECP256K1_GET_XY_GAS_COST = 21670;
117+
const SECP256K1_MUL_GAS_COST = 8143850;
118+
const SECP256K1_NEW_GAS_COST = 48750;
119+
const SECP256R1_ADD_GAS_COST = 63490;
120+
const SECP256R1_GET_POINT_FROM_X_GAS_COST = 54680;
121+
const SECP256R1_GET_XY_GAS_COST = 21870;
122+
const SECP256R1_MUL_GAS_COST = 13511870;
123+
const SECP256R1_NEW_GAS_COST = 61630;
124+
125+
const KECCAK_GAS_COST = 10000;
126+
const KECCAK_ROUND_COST_GAS_COST = 171707;
127+
const SHA256_PROCESS_BLOCK_GAS_COST = 841295;
131128

132129
// Cairo 1.0 error codes.
133130
const ERROR_BLOCK_NUMBER_OUT_OF_RANGE = 'Block number out of range';
@@ -201,5 +198,5 @@ const V1_BOUND_ACCOUNTS_MAX_TIP = 0x746a5288000;
201198
const DATA_GAS_ACCOUNTS_0 = 0x02c8c7e6fbcfb3e8e15a46648e8914c6aa1fc506fc1e7fb3d1e19630716174bc;
202199
const DATA_GAS_ACCOUNTS_1 = 0x00816dd0297efc55dc1e7559020a3a825e81ef734b558f03c83325d4da7e6253;
203200
const DATA_GAS_ACCOUNTS_2 = 0x041bf1e71792aecb9df3e9d04e1540091c5e13122a731e02bec588f71dc1a5c3;
204-
const DATA_GAS_ACCOUNTS_3 = 0x6d612cac7690e6620055c617a83a5a0b43b9758d9d30f281ddbc77be1651a70;
201+
const DATA_GAS_ACCOUNTS_3 = 0x06d612cac7690e6620055c617a83a5a0b43b9758d9d30f281ddbc77be1651a70;
205202
const DATA_GAS_ACCOUNTS_LEN = 4;
Lines changed: 212 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,212 @@
1+
use apollo_infra_utils::cairo0_compiler::{cairo0_format, verify_cairo0_compiler_deps};
2+
use blockifier::blockifier_versioned_constants::{OsConstants, VersionedConstants};
3+
use blockifier::execution::syscalls::vm_syscall_utils::SyscallSelector;
4+
use starknet_api::core::{ClassHash, ContractAddress, EntryPointSelector};
5+
use starknet_types_core::felt::Felt;
6+
7+
const CONSTANTS_CONTENTS: &str = include_str!("cairo/starkware/starknet/core/os/constants.cairo");
8+
9+
fn selector_to_hex(selector: &EntryPointSelector) -> String {
10+
format!("{:#?}", selector.0)
11+
}
12+
13+
fn contract_address_to_hex(address: &ContractAddress) -> String {
14+
format!("{:#?}", address.0.key())
15+
}
16+
17+
fn base_only_syscall_cost(selector: SyscallSelector, os_constants: &OsConstants) -> u64 {
18+
let syscall_cost =
19+
os_constants.gas_costs.syscalls.get_syscall_gas_cost(&selector).unwrap_or_else(|error| {
20+
panic!("Selector {selector:?} should have a gas cost. Error: {error}")
21+
});
22+
assert_eq!(syscall_cost.linear_syscall_cost(), 0, "Syscall {selector:?} has a linear cost.");
23+
syscall_cost.base_syscall_cost()
24+
}
25+
26+
fn quote_string(s: &str) -> String {
27+
format!("'{s}'")
28+
}
29+
30+
/// Create constants from a list of class hashes. Example:
31+
/// ```
32+
/// let expected = #"
33+
/// X_0 = 0x1;
34+
/// X_1 = 0x2;
35+
/// X_LEN = 2;
36+
/// "#;
37+
/// assert_eq!(stringify_class_hash_list("X", &[ClassHash(1), ClassHash(2)]), expected);
38+
/// ```
39+
fn stringify_class_hash_list(name: &str, class_hashes: &[ClassHash]) -> String {
40+
class_hashes
41+
.iter()
42+
.enumerate()
43+
.map(|(i, class_hash)| {
44+
// If the line ends up longer than 100 chars, wrap the value in parenthesis, so the
45+
// formatter can split the lines.
46+
let line = format!("const {name}_{i} = {:#064x};", class_hash.0);
47+
if line.len() > 100 {
48+
format!("const {name}_{i} = ({:#064x});", class_hash.0)
49+
} else {
50+
line
51+
}
52+
})
53+
.chain(std::iter::once(format!("const {name}_LEN = {};", class_hashes.len())))
54+
.collect::<Vec<String>>()
55+
.join("\n")
56+
}
57+
58+
fn generate_constants_file() -> String {
59+
let os_constants = &VersionedConstants::latest_constants().os_constants;
60+
61+
// Replace the template with the actual values.
62+
let unformatted = format!(
63+
include_str!("cairo/starkware/starknet/core/os/constants_template.txt"),
64+
// Miscellaneous constants.
65+
NOP_ENTRY_POINT_OFFSET = os_constants.nop_entry_point_offset,
66+
STORED_BLOCK_HASH_BUFFER = os_constants.stored_block_hash_buffer,
67+
L1_HANDLER_VERSION = os_constants.l1_handler_version,
68+
L1_HANDLER_L2_GAS_MAX_AMOUNT = os_constants.l1_handler_max_amount_bounds.l2_gas.0,
69+
SIERRA_ARRAY_LEN_BOUND = os_constants.sierra_array_len_bound,
70+
// Entry point types.
71+
ENTRY_POINT_TYPE_EXTERNAL = os_constants.entry_point_type_external,
72+
ENTRY_POINT_TYPE_L1_HANDLER = os_constants.entry_point_type_l1_handler,
73+
ENTRY_POINT_TYPE_CONSTRUCTOR = os_constants.entry_point_type_constructor,
74+
// Entry point selectors.
75+
CONSTRUCTOR_ENTRY_POINT_SELECTOR =
76+
selector_to_hex(&os_constants.constructor_entry_point_selector),
77+
EXECUTE_ENTRY_POINT_SELECTOR = selector_to_hex(&os_constants.execute_entry_point_selector),
78+
VALIDATE_ENTRY_POINT_SELECTOR =
79+
selector_to_hex(&os_constants.validate_entry_point_selector),
80+
VALIDATE_DECLARE_ENTRY_POINT_SELECTOR =
81+
selector_to_hex(&os_constants.validate_declare_entry_point_selector),
82+
VALIDATE_DEPLOY_ENTRY_POINT_SELECTOR =
83+
selector_to_hex(&os_constants.validate_deploy_entry_point_selector),
84+
TRANSFER_ENTRY_POINT_SELECTOR =
85+
selector_to_hex(&os_constants.transfer_entry_point_selector),
86+
DEFAULT_ENTRY_POINT_SELECTOR = selector_to_hex(&os_constants.default_entry_point_selector),
87+
// OS addresses.
88+
BLOCK_HASH_CONTRACT_ADDRESS = contract_address_to_hex(
89+
&os_constants.os_contract_addresses.block_hash_contract_address()
90+
),
91+
ALIAS_CONTRACT_ADDRESS =
92+
contract_address_to_hex(&os_constants.os_contract_addresses.alias_contract_address()),
93+
RESERVED_CONTRACT_ADDRESS = contract_address_to_hex(
94+
&os_constants.os_contract_addresses.reserved_contract_address()
95+
),
96+
// Base costs.
97+
STEP_GAS_COST = os_constants.gas_costs.base.step_gas_cost,
98+
MEMORY_HOLE_GAS_COST = os_constants.gas_costs.base.memory_hole_gas_cost,
99+
// Builtin costs.
100+
RANGE_CHECK_GAS_COST = os_constants.gas_costs.builtins.range_check,
101+
RANGE_CHECK96_GAS_COST = os_constants.gas_costs.builtins.range_check96,
102+
KECCAK_BUILTIN_GAS_COST = os_constants.gas_costs.builtins.keccak,
103+
PEDERSEN_GAS_COST = os_constants.gas_costs.builtins.pedersen,
104+
BITWISE_BUILTIN_GAS_COST = os_constants.gas_costs.builtins.bitwise,
105+
ECOP_GAS_COST = os_constants.gas_costs.builtins.ecop,
106+
POSEIDON_GAS_COST = os_constants.gas_costs.builtins.poseidon,
107+
ADD_MOD_GAS_COST = os_constants.gas_costs.builtins.add_mod,
108+
MUL_MOD_GAS_COST = os_constants.gas_costs.builtins.mul_mod,
109+
ECDSA_GAS_COST = os_constants.gas_costs.builtins.ecdsa,
110+
// Initial costs and gas limits.
111+
DEFAULT_INITIAL_GAS_COST = os_constants.default_initial_gas_cost,
112+
VALIDATE_MAX_SIERRA_GAS = os_constants.validate_max_sierra_gas,
113+
EXECUTE_MAX_SIERRA_GAS = os_constants.execute_max_sierra_gas,
114+
ENTRY_POINT_INITIAL_BUDGET = os_constants.entry_point_initial_budget,
115+
// Syscall costs.
116+
// Costs without a linear factor use `base_only_syscall_cost`; costs with a linear factor
117+
// use `get_syscall_cost(0)` for the base cost (0 linear factor), and `linear_syscall_cost`
118+
// for the linear factor.
119+
SYSCALL_BASE_GAS_COST = os_constants.gas_costs.base.syscall_base_gas_cost,
120+
CALL_CONTRACT_GAS_COST =
121+
base_only_syscall_cost(SyscallSelector::CallContract, os_constants),
122+
DEPLOY_GAS_COST = os_constants.gas_costs.syscalls.deploy.get_syscall_cost(0),
123+
DEPLOY_CALLDATA_FACTOR_GAS_COST =
124+
os_constants.gas_costs.syscalls.deploy.linear_syscall_cost(),
125+
GET_BLOCK_HASH_GAS_COST =
126+
base_only_syscall_cost(SyscallSelector::GetBlockHash, os_constants),
127+
GET_CLASS_HASH_AT_GAS_COST =
128+
base_only_syscall_cost(SyscallSelector::GetClassHashAt, os_constants),
129+
GET_EXECUTION_INFO_GAS_COST =
130+
base_only_syscall_cost(SyscallSelector::GetExecutionInfo, os_constants),
131+
LIBRARY_CALL_GAS_COST = base_only_syscall_cost(SyscallSelector::LibraryCall, os_constants),
132+
REPLACE_CLASS_GAS_COST =
133+
base_only_syscall_cost(SyscallSelector::ReplaceClass, os_constants),
134+
STORAGE_READ_GAS_COST = base_only_syscall_cost(SyscallSelector::StorageRead, os_constants),
135+
STORAGE_WRITE_GAS_COST =
136+
base_only_syscall_cost(SyscallSelector::StorageWrite, os_constants),
137+
EMIT_EVENT_GAS_COST = base_only_syscall_cost(SyscallSelector::EmitEvent, os_constants),
138+
SEND_MESSAGE_TO_L1_GAS_COST =
139+
base_only_syscall_cost(SyscallSelector::SendMessageToL1, os_constants),
140+
META_TX_V0_GAS_COST = os_constants.gas_costs.syscalls.meta_tx_v0.get_syscall_cost(0),
141+
META_TX_V0_CALLDATA_FACTOR_GAS_COST =
142+
os_constants.gas_costs.syscalls.meta_tx_v0.linear_syscall_cost(),
143+
SECP256K1_ADD_GAS_COST =
144+
base_only_syscall_cost(SyscallSelector::Secp256k1Add, os_constants),
145+
SECP256K1_GET_POINT_FROM_X_GAS_COST =
146+
base_only_syscall_cost(SyscallSelector::Secp256k1GetPointFromX, os_constants),
147+
SECP256K1_GET_XY_GAS_COST =
148+
base_only_syscall_cost(SyscallSelector::Secp256k1GetXy, os_constants),
149+
SECP256K1_MUL_GAS_COST =
150+
base_only_syscall_cost(SyscallSelector::Secp256k1Mul, os_constants),
151+
SECP256K1_NEW_GAS_COST =
152+
base_only_syscall_cost(SyscallSelector::Secp256k1New, os_constants),
153+
SECP256R1_ADD_GAS_COST =
154+
base_only_syscall_cost(SyscallSelector::Secp256r1Add, os_constants),
155+
SECP256R1_GET_POINT_FROM_X_GAS_COST =
156+
base_only_syscall_cost(SyscallSelector::Secp256r1GetPointFromX, os_constants),
157+
SECP256R1_GET_XY_GAS_COST =
158+
base_only_syscall_cost(SyscallSelector::Secp256r1GetXy, os_constants),
159+
SECP256R1_MUL_GAS_COST =
160+
base_only_syscall_cost(SyscallSelector::Secp256r1Mul, os_constants),
161+
SECP256R1_NEW_GAS_COST =
162+
base_only_syscall_cost(SyscallSelector::Secp256r1New, os_constants),
163+
KECCAK_GAS_COST = base_only_syscall_cost(SyscallSelector::Keccak, os_constants),
164+
KECCAK_ROUND_COST_GAS_COST =
165+
base_only_syscall_cost(SyscallSelector::KeccakRound, os_constants),
166+
SHA256_PROCESS_BLOCK_GAS_COST =
167+
base_only_syscall_cost(SyscallSelector::Sha256ProcessBlock, os_constants),
168+
// Short-strings.
169+
ERROR_BLOCK_NUMBER_OUT_OF_RANGE =
170+
quote_string(&os_constants.error_block_number_out_of_range),
171+
ERROR_OUT_OF_GAS = quote_string(&os_constants.error_out_of_gas),
172+
ERROR_ENTRY_POINT_FAILED = quote_string(&os_constants.error_entry_point_failed),
173+
ERROR_ENTRY_POINT_NOT_FOUND = quote_string(&os_constants.error_entry_point_not_found),
174+
ERROR_INVALID_INPUT_LEN = quote_string(&os_constants.error_invalid_input_len),
175+
ERROR_INVALID_ARGUMENT = quote_string(&os_constants.error_invalid_argument),
176+
VALIDATED = quote_string(&os_constants.validated),
177+
// Resource bounds.
178+
L1_GAS = quote_string(&os_constants.l1_gas),
179+
L2_GAS = quote_string(&os_constants.l2_gas),
180+
L1_DATA_GAS = quote_string(&os_constants.l1_data_gas),
181+
L1_GAS_INDEX = os_constants.l1_gas_index,
182+
L2_GAS_INDEX = os_constants.l2_gas_index,
183+
L1_DATA_GAS_INDEX = os_constants.l1_data_gas_index,
184+
// Syscall rounding.
185+
VALIDATE_BLOCK_NUMBER_ROUNDING =
186+
os_constants.validate_rounding_consts.validate_block_number_rounding,
187+
VALIDATE_TIMESTAMP_ROUNDING =
188+
os_constants.validate_rounding_consts.validate_timestamp_rounding,
189+
// Backward compatibility accounts.
190+
V1_BOUND_ACCOUNTS_CAIRO0 = stringify_class_hash_list(
191+
"V1_BOUND_ACCOUNTS_CAIRO0",
192+
&os_constants.v1_bound_accounts_cairo0
193+
),
194+
V1_BOUND_ACCOUNTS_CAIRO1 = stringify_class_hash_list(
195+
"V1_BOUND_ACCOUNTS_CAIRO1",
196+
&os_constants.v1_bound_accounts_cairo1
197+
),
198+
V1_BOUND_ACCOUNTS_MAX_TIP =
199+
format!("{:#?}", Felt::from(os_constants.v1_bound_accounts_max_tip)),
200+
DATA_GAS_ACCOUNTS =
201+
stringify_class_hash_list("DATA_GAS_ACCOUNTS", &os_constants.data_gas_accounts),
202+
);
203+
204+
// Format and return.
205+
cairo0_format(&unformatted)
206+
}
207+
208+
#[test]
209+
fn test_os_constants() {
210+
verify_cairo0_compiler_deps();
211+
assert_eq!(CONSTANTS_CONTENTS, generate_constants_file());
212+
}

crates/apollo_starknet_os_program/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ use cairo_vm::types::program::Program;
66

77
use crate::program_hash::ProgramHashes;
88

9+
#[cfg(test)]
10+
mod constants_test;
911
pub mod program_hash;
1012

1113
#[cfg(feature = "dump_source_files")]

0 commit comments

Comments
 (0)