diff --git a/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/constants_template.txt b/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/constants_template.txt new file mode 100644 index 00000000000..47cd8036c2e --- /dev/null +++ b/crates/apollo_starknet_os_program/src/cairo/starkware/starknet/core/os/constants_template.txt @@ -0,0 +1,140 @@ +// Autogenerated file. + +// An entry point offset that indicates that nothing needs to be done. +// Used to implement an empty constructor. +const NOP_ENTRY_POINT_OFFSET = {NOP_ENTRY_POINT_OFFSET}; + +const ENTRY_POINT_TYPE_EXTERNAL = {ENTRY_POINT_TYPE_EXTERNAL}; +const ENTRY_POINT_TYPE_L1_HANDLER = {ENTRY_POINT_TYPE_L1_HANDLER}; +const ENTRY_POINT_TYPE_CONSTRUCTOR = {ENTRY_POINT_TYPE_CONSTRUCTOR}; + +const L1_HANDLER_VERSION = {L1_HANDLER_VERSION}; +const L1_HANDLER_L2_GAS_MAX_AMOUNT = {L1_HANDLER_L2_GAS_MAX_AMOUNT}; + +const SIERRA_ARRAY_LEN_BOUND = {SIERRA_ARRAY_LEN_BOUND}; // 2^32 + +// get_selector_from_name('constructor'). +const CONSTRUCTOR_ENTRY_POINT_SELECTOR = ({CONSTRUCTOR_ENTRY_POINT_SELECTOR}); + +// get_selector_from_name('__execute__'). +const EXECUTE_ENTRY_POINT_SELECTOR = ({EXECUTE_ENTRY_POINT_SELECTOR}); + +// get_selector_from_name('__validate__'). +const VALIDATE_ENTRY_POINT_SELECTOR = ({VALIDATE_ENTRY_POINT_SELECTOR}); + +// get_selector_from_name('__validate_declare__'). +const VALIDATE_DECLARE_ENTRY_POINT_SELECTOR = ({VALIDATE_DECLARE_ENTRY_POINT_SELECTOR}); + +// get_selector_from_name('__validate_deploy__'). +const VALIDATE_DEPLOY_ENTRY_POINT_SELECTOR = ({VALIDATE_DEPLOY_ENTRY_POINT_SELECTOR}); + +// get_selector_from_name('transfer'). +const TRANSFER_ENTRY_POINT_SELECTOR = ({TRANSFER_ENTRY_POINT_SELECTOR}); + +const DEFAULT_ENTRY_POINT_SELECTOR = {DEFAULT_ENTRY_POINT_SELECTOR}; + +// OS reserved contract addresses. + +// This contract stores the block number -> block hash mapping. +const BLOCK_HASH_CONTRACT_ADDRESS = {BLOCK_HASH_CONTRACT_ADDRESS}; +// This contract stores the aliases mapping used for stateful compression. +const ALIAS_CONTRACT_ADDRESS = {ALIAS_CONTRACT_ADDRESS}; +// Future reserved contract address. +const RESERVED_CONTRACT_ADDRESS = {RESERVED_CONTRACT_ADDRESS}; +// The block number -> block hash mapping is written for the current block number minus this number. +const STORED_BLOCK_HASH_BUFFER = {STORED_BLOCK_HASH_BUFFER}; + +// Gas constants. +const STEP_GAS_COST = {STEP_GAS_COST}; +const RANGE_CHECK_GAS_COST = {RANGE_CHECK_GAS_COST}; +const RANGE_CHECK96_GAS_COST = {RANGE_CHECK96_GAS_COST}; +const KECCAK_BUILTIN_GAS_COST = {KECCAK_BUILTIN_GAS_COST}; +const PEDERSEN_GAS_COST = {PEDERSEN_GAS_COST}; +const BITWISE_BUILTIN_GAS_COST = {BITWISE_BUILTIN_GAS_COST}; +const ECOP_GAS_COST = {ECOP_GAS_COST}; +const POSEIDON_GAS_COST = {POSEIDON_GAS_COST}; +const ADD_MOD_GAS_COST = {ADD_MOD_GAS_COST}; +const MUL_MOD_GAS_COST = {MUL_MOD_GAS_COST}; +const ECDSA_GAS_COST = {ECDSA_GAS_COST}; +const MEMORY_HOLE_GAS_COST = {MEMORY_HOLE_GAS_COST}; + +const DEFAULT_INITIAL_GAS_COST = {DEFAULT_INITIAL_GAS_COST}; +const VALIDATE_MAX_SIERRA_GAS = {VALIDATE_MAX_SIERRA_GAS}; +const EXECUTE_MAX_SIERRA_GAS = {EXECUTE_MAX_SIERRA_GAS}; +const DEFAULT_INITIAL_GAS_COST_NO_L2 = VALIDATE_MAX_SIERRA_GAS + EXECUTE_MAX_SIERRA_GAS; + +// Compiler gas costs. + +// The initial budget at an entry point. This needs to be high enough to cover the initial get_gas. +// The entry point may refund whatever remains from the initial budget. +const ENTRY_POINT_INITIAL_BUDGET = {ENTRY_POINT_INITIAL_BUDGET}; +// The gas cost of each syscall libfunc (this value is hard-coded by the compiler). +// This needs to be high enough to cover OS costs in the case of failure due to out of gas. +const SYSCALL_BASE_GAS_COST = {SYSCALL_BASE_GAS_COST}; + +// Syscall gas costs. +const CALL_CONTRACT_GAS_COST = {CALL_CONTRACT_GAS_COST}; +const DEPLOY_GAS_COST = {DEPLOY_GAS_COST}; +const DEPLOY_CALLDATA_FACTOR_GAS_COST = {DEPLOY_CALLDATA_FACTOR_GAS_COST}; +const GET_BLOCK_HASH_GAS_COST = {GET_BLOCK_HASH_GAS_COST}; +const GET_CLASS_HASH_AT_GAS_COST = {GET_CLASS_HASH_AT_GAS_COST}; +const GET_EXECUTION_INFO_GAS_COST = {GET_EXECUTION_INFO_GAS_COST}; +const LIBRARY_CALL_GAS_COST = {LIBRARY_CALL_GAS_COST}; +const REPLACE_CLASS_GAS_COST = {REPLACE_CLASS_GAS_COST}; +const STORAGE_READ_GAS_COST = {STORAGE_READ_GAS_COST}; +const STORAGE_WRITE_GAS_COST = {STORAGE_WRITE_GAS_COST}; +const EMIT_EVENT_GAS_COST = {EMIT_EVENT_GAS_COST}; +const SEND_MESSAGE_TO_L1_GAS_COST = {SEND_MESSAGE_TO_L1_GAS_COST}; +const META_TX_V0_GAS_COST = {META_TX_V0_GAS_COST}; +const META_TX_V0_CALLDATA_FACTOR_GAS_COST = {META_TX_V0_CALLDATA_FACTOR_GAS_COST}; + +// Note the the following costs include `SYSCALL_BASE_GAS_COST` implicitly. +const SECP256K1_ADD_GAS_COST = {SECP256K1_ADD_GAS_COST}; +const SECP256K1_GET_POINT_FROM_X_GAS_COST = {SECP256K1_GET_POINT_FROM_X_GAS_COST}; +const SECP256K1_GET_XY_GAS_COST = {SECP256K1_GET_XY_GAS_COST}; +const SECP256K1_MUL_GAS_COST = {SECP256K1_MUL_GAS_COST}; +const SECP256K1_NEW_GAS_COST = {SECP256K1_NEW_GAS_COST}; +const SECP256R1_ADD_GAS_COST = {SECP256R1_ADD_GAS_COST}; +const SECP256R1_GET_POINT_FROM_X_GAS_COST = {SECP256R1_GET_POINT_FROM_X_GAS_COST}; +const SECP256R1_GET_XY_GAS_COST = {SECP256R1_GET_XY_GAS_COST}; +const SECP256R1_MUL_GAS_COST = {SECP256R1_MUL_GAS_COST}; +const SECP256R1_NEW_GAS_COST = {SECP256R1_NEW_GAS_COST}; + +const KECCAK_GAS_COST = {KECCAK_GAS_COST}; +const KECCAK_ROUND_COST_GAS_COST = {KECCAK_ROUND_COST_GAS_COST}; +const SHA256_PROCESS_BLOCK_GAS_COST = {SHA256_PROCESS_BLOCK_GAS_COST}; + +// Cairo 1.0 error codes. +const ERROR_BLOCK_NUMBER_OUT_OF_RANGE = {ERROR_BLOCK_NUMBER_OUT_OF_RANGE}; +const ERROR_OUT_OF_GAS = {ERROR_OUT_OF_GAS}; +const ERROR_ENTRY_POINT_FAILED = {ERROR_ENTRY_POINT_FAILED}; +const ERROR_ENTRY_POINT_NOT_FOUND = {ERROR_ENTRY_POINT_NOT_FOUND}; +const ERROR_INVALID_INPUT_LEN = {ERROR_INVALID_INPUT_LEN}; +const ERROR_INVALID_ARGUMENT = {ERROR_INVALID_ARGUMENT}; + +// The expected return value of the `__validate*__` functions of a Cairo 1.0 account contract. +const VALIDATED = {VALIDATED}; + +// Resources +const L1_GAS = {L1_GAS}; +const L2_GAS = {L2_GAS}; +const L1_DATA_GAS = {L1_DATA_GAS}; +const L1_GAS_INDEX = {L1_GAS_INDEX}; +const L2_GAS_INDEX = {L2_GAS_INDEX}; +const L1_DATA_GAS_INDEX = {L1_DATA_GAS_INDEX}; + +// Round down the block number and timestamp when queried inside `__validate__`. +const VALIDATE_BLOCK_NUMBER_ROUNDING = {VALIDATE_BLOCK_NUMBER_ROUNDING}; +const VALIDATE_TIMESTAMP_ROUNDING = {VALIDATE_TIMESTAMP_ROUNDING}; + +// List of CairoZero account contracts that require the transaction version to be 1. +{V1_BOUND_ACCOUNTS_CAIRO0} + +// List of Cairo1 account contracts that require the transaction version to be 1. +{V1_BOUND_ACCOUNTS_CAIRO1} + +// Max transaction tip for which a v3 transaction can be replaced with a v1 transaction. +const V1_BOUND_ACCOUNTS_MAX_TIP = {V1_BOUND_ACCOUNTS_MAX_TIP}; + +// List of Cairo1 account contracts that require the resource bounds to exclude data gas. +{DATA_GAS_ACCOUNTS} diff --git a/crates/apollo_starknet_os_program/src/constants_test.rs b/crates/apollo_starknet_os_program/src/constants_test.rs new file mode 100644 index 00000000000..bc345e14d0c --- /dev/null +++ b/crates/apollo_starknet_os_program/src/constants_test.rs @@ -0,0 +1,3 @@ +const _CONSTS_CONTENTS: &str = include_str!("cairo/starkware/starknet/core/os/constants.cairo"); +const _CONSTS_TEMPLATE: &str = + include_str!("cairo/starkware/starknet/core/os/constants_template.txt"); diff --git a/crates/apollo_starknet_os_program/src/lib.rs b/crates/apollo_starknet_os_program/src/lib.rs index 383ee77822e..6f183f826c7 100644 --- a/crates/apollo_starknet_os_program/src/lib.rs +++ b/crates/apollo_starknet_os_program/src/lib.rs @@ -7,6 +7,8 @@ use cairo_vm::types::program::Program; use crate::program_hash::{ProgramHash, PROGRAM_HASH_PATH}; +#[cfg(test)] +pub mod constants_test; pub mod program_hash; #[cfg(feature = "test_programs")] pub mod test_programs;