diff --git a/Cargo.lock b/Cargo.lock index 78cd9d3b49..f8947fcb69 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7959,8 +7959,12 @@ dependencies = [ "alloy-primitives", "anyhow", "dirs 6.0.0", + "katana-executor", "katana-primitives", + "katana-provider", "lazy_static", + "num-traits 0.2.19", + "rstest 0.18.2", "serde", "serde_json", "similar-asserts", @@ -8051,6 +8055,7 @@ dependencies = [ "parking_lot 0.12.3", "rand", "reqwest 0.11.27", + "rstest 0.18.2", "serde", "serde_json", "starknet", @@ -8308,6 +8313,7 @@ dependencies = [ "indexmap 2.5.0", "jsonrpsee", "katana-cairo", + "katana-chain-spec", "katana-core", "katana-executor", "katana-node", diff --git a/bin/katana/src/cli/init/mod.rs b/bin/katana/src/cli/init/mod.rs index aada4f8943..bb85889315 100644 --- a/bin/katana/src/cli/init/mod.rs +++ b/bin/katana/src/cli/init/mod.rs @@ -6,11 +6,13 @@ use std::sync::Arc; use anyhow::{Context, Result}; use clap::Args; use inquire::{Confirm, CustomType, Select}; -use katana_chain_spec::{SettlementLayer, DEV_UNALLOCATED}; +use katana_chain_spec::rollup::FeeContract; +use katana_chain_spec::{rollup, SettlementLayer}; use katana_primitives::chain::ChainId; use katana_primitives::genesis::allocation::DevAllocationsGenerator; +use katana_primitives::genesis::constant::DEFAULT_PREFUNDED_ACCOUNT_BALANCE; use katana_primitives::genesis::Genesis; -use katana_primitives::{ContractAddress, Felt}; +use katana_primitives::{ContractAddress, Felt, U256}; use lazy_static::lazy_static; use starknet::accounts::{ExecutionEncoding, SingleOwnerAccount}; use starknet::core::types::{BlockId, BlockTag}; @@ -40,12 +42,13 @@ impl InitArgs { core_contract: input.settlement_contract, }; - let mut chain_spec = DEV_UNALLOCATED.clone(); - chain_spec.genesis = GENESIS.clone(); - chain_spec.id = ChainId::parse(&input.id)?; - chain_spec.settlement = Some(settlement); + let id = ChainId::parse(&input.id)?; + let genesis = GENESIS.clone(); + // At the moment, the fee token is limited to a predefined token. + let fee_contract = FeeContract::default(); - katana_chain_spec::file::write(&chain_spec).context("failed to write chain spec file")?; + let chain_spec = rollup::ChainSpec { id, genesis, settlement, fee_contract }; + rollup::file::write(&chain_spec).context("failed to write chain spec file")?; Ok(()) } @@ -181,7 +184,7 @@ struct PromptOutcome { lazy_static! { static ref GENESIS: Genesis = { // master account - let accounts = DevAllocationsGenerator::new(1).generate(); + let accounts = DevAllocationsGenerator::new(1).with_balance(U256::from(DEFAULT_PREFUNDED_ACCOUNT_BALANCE)).generate(); let mut genesis = Genesis::default(); genesis.extend_allocations(accounts.into_iter().map(|(k, v)| (k, v.into()))); genesis diff --git a/crates/dojo/test-utils/src/sequencer.rs b/crates/dojo/test-utils/src/sequencer.rs index b7ef3cd54c..000807da10 100644 --- a/crates/dojo/test-utils/src/sequencer.rs +++ b/crates/dojo/test-utils/src/sequencer.rs @@ -45,7 +45,7 @@ impl TestSequencer { let url = Url::parse(&format!("http://{}", handle.rpc.addr())).expect("Failed to parse URL"); - let account = handle.node.backend.chain_spec.genesis.accounts().next().unwrap(); + let account = handle.node.backend.chain_spec.genesis().accounts().next().unwrap(); let account = TestAccount { private_key: Felt::from_bytes_be(&account.1.private_key().unwrap().to_bytes_be()), account_address: Felt::from_bytes_be(&account.0.to_bytes_be()), @@ -81,7 +81,7 @@ impl TestSequencer { index: usize, ) -> SingleOwnerAccount, LocalWallet> { let accounts: Vec<_> = - self.handle.node.backend.chain_spec.genesis.accounts().collect::<_>(); + self.handle.node.backend.chain_spec.genesis().accounts().collect::<_>(); let account = accounts[index]; let private_key = Felt::from_bytes_be(&account.1.private_key().unwrap().to_bytes_be()); @@ -115,7 +115,8 @@ impl TestSequencer { pub fn get_default_test_config(sequencing: SequencingConfig) -> Config { let dev = DevConfig { fee: false, account_validation: true, fixed_gas_prices: None }; - let mut chain = ChainSpec { id: ChainId::SEPOLIA, ..Default::default() }; + let mut chain = + katana_chain_spec::dev::ChainSpec { id: ChainId::SEPOLIA, ..Default::default() }; chain.genesis.sequencer_address = *DEFAULT_SEQUENCER_ADDRESS; let rpc = RpcConfig { @@ -128,5 +129,5 @@ pub fn get_default_test_config(sequencing: SequencingConfig) -> Config { max_proof_keys: Some(100), }; - Config { sequencing, rpc, dev, chain: chain.into(), ..Default::default() } + Config { sequencing, rpc, dev, chain: ChainSpec::Dev(chain).into(), ..Default::default() } } diff --git a/crates/katana/chain-spec/Cargo.toml b/crates/katana/chain-spec/Cargo.toml index 7b3e28cdec..88fbe2a448 100644 --- a/crates/katana/chain-spec/Cargo.toml +++ b/crates/katana/chain-spec/Cargo.toml @@ -10,16 +10,20 @@ katana-primitives.workspace = true alloy-primitives.workspace = true anyhow.workspace = true +dirs = "6.0.0" lazy_static.workspace = true +num-traits.workspace = true serde.workspace = true serde_json.workspace = true starknet.workspace = true thiserror.workspace = true -url.workspace = true -dirs = "6.0.0" toml.workspace = true +url.workspace = true [dev-dependencies] +katana-executor.workspace = true +katana-provider = { workspace = true, features = ["test-utils"] } +rstest.workspace = true similar-asserts.workspace = true tempfile.workspace = true diff --git a/crates/katana/chain-spec/src/dev.rs b/crates/katana/chain-spec/src/dev.rs new file mode 100644 index 0000000000..ae18f2cb22 --- /dev/null +++ b/crates/katana/chain-spec/src/dev.rs @@ -0,0 +1,647 @@ +use std::collections::BTreeMap; + +use alloy_primitives::U256; +use katana_primitives::block::{Block, Header}; +use katana_primitives::chain::ChainId; +use katana_primitives::class::ClassHash; +use katana_primitives::contract::ContractAddress; +use katana_primitives::da::L1DataAvailabilityMode; +use katana_primitives::genesis::allocation::{DevAllocationsGenerator, GenesisAllocation}; +use katana_primitives::genesis::constant::{ + get_fee_token_balance_base_storage_address, DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, + DEFAULT_ETH_FEE_TOKEN_ADDRESS, DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_ERC20_CLASS_HASH, + DEFAULT_LEGACY_UDC_CLASS, DEFAULT_LEGACY_UDC_CLASS_HASH, DEFAULT_PREFUNDED_ACCOUNT_BALANCE, + DEFAULT_STRK_FEE_TOKEN_ADDRESS, DEFAULT_UDC_ADDRESS, ERC20_DECIMAL_STORAGE_SLOT, + ERC20_NAME_STORAGE_SLOT, ERC20_SYMBOL_STORAGE_SLOT, ERC20_TOTAL_SUPPLY_STORAGE_SLOT, +}; +use katana_primitives::genesis::Genesis; +use katana_primitives::state::StateUpdatesWithClasses; +use katana_primitives::utils::split_u256; +use katana_primitives::version::CURRENT_STARKNET_VERSION; +use katana_primitives::Felt; +use lazy_static::lazy_static; +use serde::{Deserialize, Serialize}; +use starknet::core::utils::cairo_short_string_to_felt; + +use crate::SettlementLayer; + +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(PartialEq))] +pub struct ChainSpec { + /// The rollup network chain id. + pub id: ChainId, + + /// The chain's genesis states. + pub genesis: Genesis, + + /// The chain fee token contract. + pub fee_contracts: FeeContracts, + + pub settlement: Option, +} + +////////////////////////////////////////////////////////////// +// ChainSpec implementations +////////////////////////////////////////////////////////////// + +impl ChainSpec { + pub fn block(&self) -> Block { + let header = Header { + state_diff_length: 0, + protocol_version: CURRENT_STARKNET_VERSION, + number: self.genesis.number, + timestamp: self.genesis.timestamp, + events_count: 0, + transaction_count: 0, + events_commitment: Felt::ZERO, + receipts_commitment: Felt::ZERO, + state_diff_commitment: Felt::ZERO, + transactions_commitment: Felt::ZERO, + state_root: self.genesis.state_root, + parent_hash: self.genesis.parent_hash, + l1_da_mode: L1DataAvailabilityMode::Calldata, + l1_gas_prices: self.genesis.gas_prices.clone(), + l1_data_gas_prices: self.genesis.gas_prices.clone(), + sequencer_address: self.genesis.sequencer_address, + }; + Block { header, body: Vec::new() } + } + + // this method will include the ETH and STRK fee tokens, and the UDC + pub fn state_updates(&self) -> StateUpdatesWithClasses { + let mut states = StateUpdatesWithClasses::default(); + + for (class_hash, class) in &self.genesis.classes { + let class_hash = *class_hash; + + if class.is_legacy() { + states.state_updates.deprecated_declared_classes.insert(class_hash); + } else { + let casm_hash = class.as_ref().clone().compile().unwrap().class_hash().unwrap(); + states.state_updates.declared_classes.insert(class_hash, casm_hash); + } + + states.classes.insert(class_hash, class.as_ref().clone()); + } + + for (address, alloc) in &self.genesis.allocations { + let address = *address; + + if let Some(hash) = alloc.class_hash() { + states.state_updates.deployed_contracts.insert(address, hash); + } + + if let Some(nonce) = alloc.nonce() { + states.state_updates.nonce_updates.insert(address, nonce); + } + + let mut storage = alloc.storage().cloned().unwrap_or_default(); + if let Some(pub_key) = alloc.public_key() { + storage.insert(DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, pub_key); + } + + states.state_updates.storage_updates.insert(address, storage); + } + + //-- Fee tokens + add_default_fee_tokens(&mut states, &self.genesis); + // -- UDC + add_default_udc(&mut states); + + states + } +} + +/// Tokens that can be used for transaction fee payments in the chain. As +/// supported on Starknet. +// TODO: include both l1 and l2 addresses +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(test, derive(PartialEq))] +pub struct FeeContracts { + /// L2 ETH fee token address. Used for paying pre-V3 transactions. + pub eth: ContractAddress, + /// L2 STRK fee token address. Used for paying V3 transactions. + pub strk: ContractAddress, +} + +impl Default for ChainSpec { + fn default() -> Self { + DEV.clone() + } +} + +lazy_static! { + /// The default chain specification in dev mode. + pub static ref DEV: ChainSpec = { + let mut chain_spec = DEV_UNALLOCATED.clone(); + + let accounts = DevAllocationsGenerator::new(10) + .with_balance(U256::from(DEFAULT_PREFUNDED_ACCOUNT_BALANCE)) + .generate(); + + chain_spec.genesis.extend_allocations(accounts.into_iter().map(|(k, v)| (k, v.into()))); + chain_spec + }; + + /// The default chain specification for dev mode but without any allocations. + /// + /// Used when we want to create a chain spec with user defined # of allocations. + pub static ref DEV_UNALLOCATED: ChainSpec = { + let id = ChainId::parse("KATANA").unwrap(); + let genesis = Genesis::default(); + let fee_contracts = FeeContracts { eth: DEFAULT_ETH_FEE_TOKEN_ADDRESS, strk: DEFAULT_STRK_FEE_TOKEN_ADDRESS }; + + ChainSpec { + id, + genesis, + fee_contracts, + settlement: None, + } + }; +} + +fn add_default_fee_tokens(states: &mut StateUpdatesWithClasses, genesis: &Genesis) { + // declare erc20 token contract + states + .classes + .entry(DEFAULT_LEGACY_ERC20_CLASS_HASH) + .or_insert_with(|| DEFAULT_LEGACY_ERC20_CLASS.clone()); + + // -- ETH + add_fee_token( + states, + "Ether", + "ETH", + 18, + DEFAULT_ETH_FEE_TOKEN_ADDRESS, + DEFAULT_LEGACY_ERC20_CLASS_HASH, + &genesis.allocations, + ); + + // -- STRK + add_fee_token( + states, + "Starknet Token", + "STRK", + 18, + DEFAULT_STRK_FEE_TOKEN_ADDRESS, + DEFAULT_LEGACY_ERC20_CLASS_HASH, + &genesis.allocations, + ); +} + +fn add_fee_token( + states: &mut StateUpdatesWithClasses, + name: &str, + symbol: &str, + decimals: u8, + address: ContractAddress, + class_hash: ClassHash, + allocations: &BTreeMap, +) { + let mut storage = BTreeMap::new(); + let mut total_supply = U256::ZERO; + + // --- set the ERC20 balances for each allocations that have a balance + + for (address, alloc) in allocations { + if let Some(balance) = alloc.balance() { + total_supply += balance; + let (low, high) = split_u256(balance); + + // the base storage address for a standard ERC20 contract balance + let bal_base_storage_var = get_fee_token_balance_base_storage_address(*address); + + // the storage address of low u128 of the balance + let low_bal_storage_var = bal_base_storage_var; + // the storage address of high u128 of the balance + let high_bal_storage_var = bal_base_storage_var + Felt::ONE; + + storage.insert(low_bal_storage_var, low); + storage.insert(high_bal_storage_var, high); + } + } + + // --- ERC20 metadata + + let name = cairo_short_string_to_felt(name).unwrap(); + let symbol = cairo_short_string_to_felt(symbol).unwrap(); + let decimals = decimals.into(); + let (total_supply_low, total_supply_high) = split_u256(total_supply); + + storage.insert(ERC20_NAME_STORAGE_SLOT, name); + storage.insert(ERC20_SYMBOL_STORAGE_SLOT, symbol); + storage.insert(ERC20_DECIMAL_STORAGE_SLOT, decimals); + storage.insert(ERC20_TOTAL_SUPPLY_STORAGE_SLOT, total_supply_low); + storage.insert(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE, total_supply_high); + + states.state_updates.deployed_contracts.insert(address, class_hash); + states.state_updates.storage_updates.insert(address, storage); +} + +fn add_default_udc(states: &mut StateUpdatesWithClasses) { + // declare UDC class + states + .classes + .entry(DEFAULT_LEGACY_UDC_CLASS_HASH) + .or_insert_with(|| DEFAULT_LEGACY_UDC_CLASS.clone()); + + states.state_updates.deprecated_declared_classes.insert(DEFAULT_LEGACY_UDC_CLASS_HASH); + + // deploy UDC contract + states + .state_updates + .deployed_contracts + .entry(DEFAULT_UDC_ADDRESS) + .or_insert(DEFAULT_LEGACY_UDC_CLASS_HASH); +} + +#[cfg(test)] +mod tests { + + use std::str::FromStr; + + use alloy_primitives::U256; + use katana_primitives::address; + use katana_primitives::block::{Block, GasPrices, Header}; + use katana_primitives::da::L1DataAvailabilityMode; + use katana_primitives::genesis::allocation::{ + GenesisAccount, GenesisAccountAlloc, GenesisContractAlloc, + }; + #[cfg(feature = "controller")] + use katana_primitives::genesis::constant::{CONTROLLER_ACCOUNT_CLASS, CONTROLLER_CLASS_HASH}; + use katana_primitives::genesis::constant::{ + DEFAULT_ACCOUNT_CLASS, DEFAULT_ACCOUNT_CLASS_HASH, + DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, DEFAULT_ACCOUNT_COMPILED_CLASS_HASH, + DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_ERC20_COMPILED_CLASS_HASH, + DEFAULT_LEGACY_UDC_CLASS, DEFAULT_LEGACY_UDC_COMPILED_CLASS_HASH, + }; + use katana_primitives::version::CURRENT_STARKNET_VERSION; + use starknet::macros::felt; + + use super::*; + + #[test] + fn genesis_block_and_state_updates() { + // setup initial states to test + + let classes = BTreeMap::from([ + (DEFAULT_LEGACY_UDC_CLASS_HASH, DEFAULT_LEGACY_UDC_CLASS.clone().into()), + (DEFAULT_LEGACY_ERC20_CLASS_HASH, DEFAULT_LEGACY_ERC20_CLASS.clone().into()), + (DEFAULT_ACCOUNT_CLASS_HASH, DEFAULT_ACCOUNT_CLASS.clone().into()), + #[cfg(feature = "controller")] + (CONTROLLER_CLASS_HASH, CONTROLLER_ACCOUNT_CLASS.clone().into()), + ]); + + let allocations = [ + ( + address!("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"), + GenesisAllocation::Account(GenesisAccountAlloc::Account(GenesisAccount { + public_key: felt!( + "0x01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca" + ), + balance: Some(U256::from_str("0xD3C21BCECCEDA1000000").unwrap()), + class_hash: DEFAULT_ACCOUNT_CLASS_HASH, + nonce: Some(felt!("0x99")), + storage: Some(BTreeMap::from([ + (felt!("0x1"), felt!("0x1")), + (felt!("0x2"), felt!("0x2")), + ])), + })), + ), + ( + address!("0xdeadbeef"), + GenesisAllocation::Contract(GenesisContractAlloc { + balance: Some(U256::from_str("0xD3C21BCECCEDA1000000").unwrap()), + class_hash: Some(DEFAULT_ACCOUNT_CLASS_HASH), + nonce: Some(felt!("0x100")), + storage: Some(BTreeMap::from([ + (felt!("0x100"), felt!("0x111")), + (felt!("0x200"), felt!("0x222")), + ])), + }), + ), + ( + address!("0x2"), + GenesisAllocation::Account(GenesisAccountAlloc::Account(GenesisAccount { + public_key: felt!("0x2"), + balance: Some(U256::ZERO), + class_hash: DEFAULT_ACCOUNT_CLASS_HASH, + nonce: None, + storage: None, + })), + ), + ]; + let chain_spec = ChainSpec { + id: ChainId::SEPOLIA, + genesis: Genesis { + classes, + allocations: BTreeMap::from(allocations.clone()), + number: 0, + timestamp: 5123512314u64, + state_root: felt!("0x99"), + parent_hash: felt!("0x999"), + sequencer_address: address!("0x100"), + gas_prices: GasPrices { eth: 1111, strk: 2222 }, + }, + fee_contracts: FeeContracts { + eth: DEFAULT_ETH_FEE_TOKEN_ADDRESS, + strk: DEFAULT_STRK_FEE_TOKEN_ADDRESS, + }, + settlement: None, + }; + + // setup expected storage values + let expected_block = Block { + header: Header { + state_diff_length: 0, + events_commitment: Felt::ZERO, + receipts_commitment: Felt::ZERO, + state_diff_commitment: Felt::ZERO, + transactions_commitment: Felt::ZERO, + number: chain_spec.genesis.number, + timestamp: chain_spec.genesis.timestamp, + state_root: chain_spec.genesis.state_root, + parent_hash: chain_spec.genesis.parent_hash, + sequencer_address: chain_spec.genesis.sequencer_address, + l1_gas_prices: chain_spec.genesis.gas_prices.clone(), + l1_data_gas_prices: chain_spec.genesis.gas_prices.clone(), + l1_da_mode: L1DataAvailabilityMode::Calldata, + protocol_version: CURRENT_STARKNET_VERSION, + transaction_count: 0, + events_count: 0, + }, + body: Vec::new(), + }; + + let actual_block = chain_spec.block(); + let actual_state_updates = chain_spec.state_updates(); + + similar_asserts::assert_eq!(actual_block, expected_block); + + if cfg!(feature = "controller") { + assert!(actual_state_updates.classes.len() == 4); + } else { + assert!(actual_state_updates.classes.len() == 3); + } + + assert_eq!( + actual_state_updates + .state_updates + .deprecated_declared_classes + .get(&DEFAULT_LEGACY_ERC20_CLASS_HASH), + Some(&DEFAULT_LEGACY_ERC20_COMPILED_CLASS_HASH), + ); + assert_eq!( + actual_state_updates.classes.get(&DEFAULT_LEGACY_ERC20_CLASS_HASH), + Some(&DEFAULT_LEGACY_ERC20_CLASS.clone()) + ); + + assert_eq!( + actual_state_updates.classes.get(&DEFAULT_LEGACY_ERC20_CLASS_HASH), + Some(&*DEFAULT_LEGACY_ERC20_CLASS), + ); + + assert_eq!( + actual_state_updates + .state_updates + .deployed_contracts + .get(&DEFAULT_ETH_FEE_TOKEN_ADDRESS), + Some(&DEFAULT_LEGACY_ERC20_CLASS_HASH), + "The ETH fee token contract should be created" + ); + assert_eq!( + actual_state_updates + .state_updates + .deployed_contracts + .get(&DEFAULT_STRK_FEE_TOKEN_ADDRESS), + Some(&DEFAULT_LEGACY_ERC20_CLASS_HASH), + "The STRK fee token contract should be created" + ); + + assert_eq!( + actual_state_updates + .state_updates + .deprecated_declared_classes + .get(&DEFAULT_LEGACY_UDC_CLASS_HASH), + Some(&DEFAULT_LEGACY_UDC_COMPILED_CLASS_HASH), + "The default universal deployer class should be declared" + ); + + assert_eq!( + actual_state_updates.classes.get(&DEFAULT_LEGACY_UDC_CLASS_HASH), + Some(&*DEFAULT_LEGACY_UDC_CLASS), + "The default universal deployer casm class should be declared" + ); + assert_eq!( + actual_state_updates.classes.get(&DEFAULT_LEGACY_UDC_CLASS_HASH), + Some(&DEFAULT_LEGACY_UDC_CLASS.clone()) + ); + + assert_eq!( + actual_state_updates.state_updates.deployed_contracts.get(&DEFAULT_UDC_ADDRESS), + Some(&DEFAULT_LEGACY_UDC_CLASS_HASH), + "The universal deployer contract should be created" + ); + + assert_eq!( + actual_state_updates.state_updates.declared_classes.get(&DEFAULT_ACCOUNT_CLASS_HASH), + Some(&DEFAULT_ACCOUNT_COMPILED_CLASS_HASH), + "The default oz account class should be declared" + ); + + assert_eq!( + actual_state_updates.classes.get(&DEFAULT_ACCOUNT_CLASS_HASH), + Some(&*DEFAULT_ACCOUNT_CLASS), + "The default oz account contract sierra class should be declared" + ); + + #[cfg(feature = "controller")] + { + assert_eq!( + actual_state_updates.state_updates.declared_classes.get(&CONTROLLER_CLASS_HASH), + Some(&CONTROLLER_ACCOUNT_CLASS.clone().compile().unwrap().class_hash().unwrap()), + "The controller account class should be declared" + ); + + assert_eq!( + actual_state_updates.classes.get(&CONTROLLER_CLASS_HASH), + Some(&*CONTROLLER_ACCOUNT_CLASS), + "The controller account contract sierra class should be declared" + ); + } + + // check that all contract allocations exist in the state updates + + assert_eq!( + actual_state_updates.state_updates.deployed_contracts.len(), + 6, + "6 contracts should be created: STRK fee token, ETH fee token, universal deployer, \ + and 3 allocations" + ); + + let alloc_1_addr = allocations[0].0; + + let mut account_allocation_storage = allocations[0].1.storage().unwrap().clone(); + account_allocation_storage.insert( + DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, + felt!("0x01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca"), + ); + + assert_eq!( + actual_state_updates.state_updates.deployed_contracts.get(&alloc_1_addr), + allocations[0].1.class_hash().as_ref(), + "allocation should exist" + ); + assert_eq!( + actual_state_updates.state_updates.nonce_updates.get(&alloc_1_addr).cloned(), + allocations[0].1.nonce(), + "allocation nonce should be updated" + ); + assert_eq!( + actual_state_updates.state_updates.storage_updates.get(&alloc_1_addr).cloned(), + Some(account_allocation_storage), + "account allocation storage should be updated" + ); + + let alloc_2_addr = allocations[1].0; + + assert_eq!( + actual_state_updates.state_updates.deployed_contracts.get(&alloc_2_addr), + allocations[1].1.class_hash().as_ref(), + "allocation should exist" + ); + assert_eq!( + actual_state_updates.state_updates.nonce_updates.get(&alloc_2_addr).cloned(), + allocations[1].1.nonce(), + "allocation nonce should be updated" + ); + assert_eq!( + actual_state_updates.state_updates.storage_updates.get(&alloc_2_addr), + allocations[1].1.storage(), + "allocation storage should be updated" + ); + + let alloc_3_addr = allocations[2].0; + + assert_eq!( + actual_state_updates.state_updates.deployed_contracts.get(&alloc_3_addr), + allocations[2].1.class_hash().as_ref(), + "allocation should exist" + ); + assert_eq!( + actual_state_updates.state_updates.nonce_updates.get(&alloc_3_addr).cloned(), + allocations[2].1.nonce(), + "allocation nonce should be updated" + ); + assert_eq!( + actual_state_updates.state_updates.storage_updates.get(&alloc_3_addr).cloned(), + Some(BTreeMap::from([(DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, felt!("0x2"))])), + "account allocation storage should be updated" + ); + + // check ETH fee token contract storage + + // there are only two allocations with a balance so the total token supply is + // 0xD3C21BCECCEDA1000000 * 2 = 0x1a784379d99db42000000 + let (total_supply_low, total_supply_high) = + split_u256(U256::from_str("0x1a784379d99db42000000").unwrap()); + + let name = cairo_short_string_to_felt("Ether").unwrap(); + let symbol = cairo_short_string_to_felt("ETH").unwrap(); + let decimals = Felt::from(18); + + let eth_fee_token_storage = actual_state_updates + .state_updates + .storage_updates + .get(&DEFAULT_ETH_FEE_TOKEN_ADDRESS) + .unwrap(); + + assert_eq!(eth_fee_token_storage.get(&ERC20_NAME_STORAGE_SLOT), Some(&name)); + assert_eq!(eth_fee_token_storage.get(&ERC20_SYMBOL_STORAGE_SLOT), Some(&symbol)); + assert_eq!(eth_fee_token_storage.get(&ERC20_DECIMAL_STORAGE_SLOT), Some(&decimals)); + assert_eq!( + eth_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), + Some(&total_supply_low) + ); + assert_eq!( + eth_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), + Some(&total_supply_high) + ); + + // check STRK fee token contract storage + + let strk_name = cairo_short_string_to_felt("Starknet Token").unwrap(); + let strk_symbol = cairo_short_string_to_felt("STRK").unwrap(); + let strk_decimals = Felt::from(18); + + let strk_fee_token_storage = actual_state_updates + .state_updates + .storage_updates + .get(&DEFAULT_STRK_FEE_TOKEN_ADDRESS) + .unwrap(); + + assert_eq!(strk_fee_token_storage.get(&ERC20_NAME_STORAGE_SLOT), Some(&strk_name)); + assert_eq!(strk_fee_token_storage.get(&ERC20_SYMBOL_STORAGE_SLOT), Some(&strk_symbol)); + assert_eq!(strk_fee_token_storage.get(&ERC20_DECIMAL_STORAGE_SLOT), Some(&strk_decimals)); + assert_eq!( + strk_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), + Some(&total_supply_low) + ); + assert_eq!( + strk_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), + Some(&total_supply_high) + ); + + let mut allocs_total_supply = U256::ZERO; + + // check for balance in both ETH and STRK + for (address, alloc) in &allocations { + if let Some(balance) = alloc.balance() { + let (low, high) = split_u256(balance); + + // the base storage address for a standard ERC20 contract balance + let bal_base_storage_var = get_fee_token_balance_base_storage_address(*address); + + // the storage address of low u128 of the balance + let low_bal_storage_var = bal_base_storage_var; + // the storage address of high u128 of the balance + let high_bal_storage_var = bal_base_storage_var + Felt::ONE; + + assert_eq!(eth_fee_token_storage.get(&low_bal_storage_var), Some(&low)); + assert_eq!(eth_fee_token_storage.get(&high_bal_storage_var), Some(&high)); + + assert_eq!(strk_fee_token_storage.get(&low_bal_storage_var), Some(&low)); + assert_eq!(strk_fee_token_storage.get(&high_bal_storage_var), Some(&high)); + + allocs_total_supply += balance; + } + } + // Check that the total supply is the sum of all balances in the allocations. + // Technically this is not necessary bcs we already checked the total supply in + // the fee token storage but it's a good sanity check. + + let (actual_total_supply_low, actual_total_supply_high) = split_u256(allocs_total_supply); + assert_eq!( + eth_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), + Some(&actual_total_supply_low), + "ETH total supply must be calculated from allocations balances correctly" + ); + assert_eq!( + eth_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), + Some(&actual_total_supply_high), + "ETH total supply must be calculated from allocations balances correctly" + ); + + assert_eq!( + strk_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), + Some(&actual_total_supply_low), + "STRK total supply must be calculated from allocations balances correctly" + ); + assert_eq!( + strk_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), + Some(&actual_total_supply_high), + "STRK total supply must be calculated from allocations balances correctly" + ); + } +} diff --git a/crates/katana/chain-spec/src/lib.rs b/crates/katana/chain-spec/src/lib.rs index 0a9aa8e232..dfefc07372 100644 --- a/crates/katana/chain-spec/src/lib.rs +++ b/crates/katana/chain-spec/src/lib.rs @@ -1,60 +1,66 @@ -use std::collections::BTreeMap; - -use alloy_primitives::U256; -use katana_primitives::block::{Block, Header}; use katana_primitives::chain::ChainId; -use katana_primitives::class::ClassHash; -use katana_primitives::contract::ContractAddress; -use katana_primitives::da::L1DataAvailabilityMode; -use katana_primitives::genesis::allocation::{DevAllocationsGenerator, GenesisAllocation}; -use katana_primitives::genesis::constant::{ - get_fee_token_balance_base_storage_address, DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, - DEFAULT_ETH_FEE_TOKEN_ADDRESS, DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_ERC20_CLASS_HASH, - DEFAULT_LEGACY_UDC_CLASS, DEFAULT_LEGACY_UDC_CLASS_HASH, DEFAULT_PREFUNDED_ACCOUNT_BALANCE, - DEFAULT_STRK_FEE_TOKEN_ADDRESS, DEFAULT_UDC_ADDRESS, ERC20_DECIMAL_STORAGE_SLOT, - ERC20_NAME_STORAGE_SLOT, ERC20_SYMBOL_STORAGE_SLOT, ERC20_TOTAL_SUPPLY_STORAGE_SLOT, -}; use katana_primitives::genesis::Genesis; -use katana_primitives::state::StateUpdatesWithClasses; -use katana_primitives::utils::split_u256; -use katana_primitives::version::CURRENT_STARKNET_VERSION; -use katana_primitives::{eth, Felt}; -use lazy_static::lazy_static; +use katana_primitives::{eth, ContractAddress}; use serde::{Deserialize, Serialize}; -use starknet::core::utils::cairo_short_string_to_felt; use url::Url; -pub mod file; +pub mod dev; +pub mod rollup; -/// The rollup chain specification. #[derive(Debug, Clone)] -#[cfg_attr(test, derive(PartialEq))] -pub struct ChainSpec { - /// The rollup network chain id. - pub id: ChainId, +pub enum ChainSpec { + Dev(dev::ChainSpec), + Rollup(rollup::ChainSpec), +} - /// The chain's genesis states. - pub genesis: Genesis, +////////////////////////////////////////////////////////////// +// ChainSpec implementations +////////////////////////////////////////////////////////////// - /// The chain fee token contract. - pub fee_contracts: FeeContracts, +impl ChainSpec { + /// Creates a new [`ChainSpec`] for a development chain. + pub fn dev() -> Self { + Self::Dev(dev::DEV.clone()) + } - /// The chain's settlement layer configurations. - /// - /// This should only be optional if the chain is in development mode. - pub settlement: Option, + pub fn id(&self) -> ChainId { + match self { + Self::Dev(spec) => spec.id, + Self::Rollup(spec) => spec.id, + } + } + + pub fn genesis(&self) -> &Genesis { + match self { + Self::Dev(spec) => &spec.genesis, + Self::Rollup(spec) => &spec.genesis, + } + } + + pub fn settlement(&self) -> Option<&SettlementLayer> { + match self { + Self::Dev(spec) => spec.settlement.as_ref(), + Self::Rollup(spec) => Some(&spec.settlement), + } + } } -/// Tokens that can be used for transaction fee payments in the chain. As -/// supported on Starknet. -// TODO: include both l1 and l2 addresses -#[derive(Debug, Clone, Serialize, Deserialize)] -#[cfg_attr(test, derive(PartialEq))] -pub struct FeeContracts { - /// L2 ETH fee token address. Used for paying pre-V3 transactions. - pub eth: ContractAddress, - /// L2 STRK fee token address. Used for paying V3 transactions. - pub strk: ContractAddress, +impl From for ChainSpec { + fn from(spec: dev::ChainSpec) -> Self { + Self::Dev(spec) + } +} + +impl From for ChainSpec { + fn from(spec: rollup::ChainSpec) -> Self { + Self::Rollup(spec) + } +} + +impl Default for ChainSpec { + fn default() -> Self { + Self::dev() + } } #[derive(Debug, Clone, Serialize, Deserialize)] @@ -89,597 +95,3 @@ pub enum SettlementLayer { core_contract: ContractAddress, }, } - -////////////////////////////////////////////////////////////// -// ChainSpec implementations -////////////////////////////////////////////////////////////// - -impl ChainSpec { - pub fn block(&self) -> Block { - let header = Header { - state_diff_length: 0, - protocol_version: CURRENT_STARKNET_VERSION, - number: self.genesis.number, - timestamp: self.genesis.timestamp, - events_count: 0, - transaction_count: 0, - events_commitment: Felt::ZERO, - receipts_commitment: Felt::ZERO, - state_diff_commitment: Felt::ZERO, - transactions_commitment: Felt::ZERO, - state_root: self.genesis.state_root, - parent_hash: self.genesis.parent_hash, - l1_da_mode: L1DataAvailabilityMode::Calldata, - l1_gas_prices: self.genesis.gas_prices.clone(), - l1_data_gas_prices: self.genesis.gas_prices.clone(), - sequencer_address: self.genesis.sequencer_address, - }; - Block { header, body: Vec::new() } - } - - // this method will include the ETH and STRK fee tokens, and the UDC - pub fn state_updates(&self) -> StateUpdatesWithClasses { - let mut states = StateUpdatesWithClasses::default(); - - for (class_hash, class) in &self.genesis.classes { - let class_hash = *class_hash; - - if class.is_legacy() { - states.state_updates.deprecated_declared_classes.insert(class_hash); - } else { - let casm_hash = class.as_ref().clone().compile().unwrap().class_hash().unwrap(); - states.state_updates.declared_classes.insert(class_hash, casm_hash); - } - - states.classes.insert(class_hash, class.as_ref().clone()); - } - - for (address, alloc) in &self.genesis.allocations { - let address = *address; - - if let Some(hash) = alloc.class_hash() { - states.state_updates.deployed_contracts.insert(address, hash); - } - - if let Some(nonce) = alloc.nonce() { - states.state_updates.nonce_updates.insert(address, nonce); - } - - let mut storage = alloc.storage().cloned().unwrap_or_default(); - if let Some(pub_key) = alloc.public_key() { - storage.insert(DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, pub_key); - } - - states.state_updates.storage_updates.insert(address, storage); - } - - //-- Fee tokens - add_default_fee_tokens(&mut states, &self.genesis); - // -- UDC - add_default_udc(&mut states); - - states - } -} - -impl Default for ChainSpec { - fn default() -> Self { - DEV.clone() - } -} - -lazy_static! { - /// The default chain specification in dev mode. - pub static ref DEV: ChainSpec = { - let mut chain_spec = DEV_UNALLOCATED.clone(); - - let accounts = DevAllocationsGenerator::new(10) - .with_balance(U256::from(DEFAULT_PREFUNDED_ACCOUNT_BALANCE)) - .generate(); - - chain_spec.genesis.extend_allocations(accounts.into_iter().map(|(k, v)| (k, v.into()))); - chain_spec - }; - - /// The default chain specification for dev mode but without any allocations. - /// - /// Used when we want to create a chain spec with user defined # of allocations. - pub static ref DEV_UNALLOCATED: ChainSpec = { - let id = ChainId::parse("KATANA").unwrap(); - let genesis = Genesis::default(); - let fee_contracts = FeeContracts { eth: DEFAULT_ETH_FEE_TOKEN_ADDRESS, strk: DEFAULT_STRK_FEE_TOKEN_ADDRESS }; - - ChainSpec { - id, - genesis, - fee_contracts, - settlement: None, - } - }; -} - -fn add_default_fee_tokens(states: &mut StateUpdatesWithClasses, genesis: &Genesis) { - // declare erc20 token contract - states - .classes - .entry(DEFAULT_LEGACY_ERC20_CLASS_HASH) - .or_insert_with(|| DEFAULT_LEGACY_ERC20_CLASS.clone()); - - // -- ETH - add_fee_token( - states, - "Ether", - "ETH", - 18, - DEFAULT_ETH_FEE_TOKEN_ADDRESS, - DEFAULT_LEGACY_ERC20_CLASS_HASH, - &genesis.allocations, - ); - - // -- STRK - add_fee_token( - states, - "Starknet Token", - "STRK", - 18, - DEFAULT_STRK_FEE_TOKEN_ADDRESS, - DEFAULT_LEGACY_ERC20_CLASS_HASH, - &genesis.allocations, - ); -} - -fn add_fee_token( - states: &mut StateUpdatesWithClasses, - name: &str, - symbol: &str, - decimals: u8, - address: ContractAddress, - class_hash: ClassHash, - allocations: &BTreeMap, -) { - let mut storage = BTreeMap::new(); - let mut total_supply = U256::ZERO; - - // --- set the ERC20 balances for each allocations that have a balance - - for (address, alloc) in allocations { - if let Some(balance) = alloc.balance() { - total_supply += balance; - let (low, high) = split_u256(balance); - - // the base storage address for a standard ERC20 contract balance - let bal_base_storage_var = get_fee_token_balance_base_storage_address(*address); - - // the storage address of low u128 of the balance - let low_bal_storage_var = bal_base_storage_var; - // the storage address of high u128 of the balance - let high_bal_storage_var = bal_base_storage_var + Felt::ONE; - - storage.insert(low_bal_storage_var, low); - storage.insert(high_bal_storage_var, high); - } - } - - // --- ERC20 metadata - - let name = cairo_short_string_to_felt(name).unwrap(); - let symbol = cairo_short_string_to_felt(symbol).unwrap(); - let decimals = decimals.into(); - let (total_supply_low, total_supply_high) = split_u256(total_supply); - - storage.insert(ERC20_NAME_STORAGE_SLOT, name); - storage.insert(ERC20_SYMBOL_STORAGE_SLOT, symbol); - storage.insert(ERC20_DECIMAL_STORAGE_SLOT, decimals); - storage.insert(ERC20_TOTAL_SUPPLY_STORAGE_SLOT, total_supply_low); - storage.insert(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE, total_supply_high); - - states.state_updates.deployed_contracts.insert(address, class_hash); - states.state_updates.storage_updates.insert(address, storage); -} - -fn add_default_udc(states: &mut StateUpdatesWithClasses) { - // declare UDC class - states - .classes - .entry(DEFAULT_LEGACY_UDC_CLASS_HASH) - .or_insert_with(|| DEFAULT_LEGACY_UDC_CLASS.clone()); - - states.state_updates.deprecated_declared_classes.insert(DEFAULT_LEGACY_UDC_CLASS_HASH); - - // deploy UDC contract - states - .state_updates - .deployed_contracts - .entry(DEFAULT_UDC_ADDRESS) - .or_insert(DEFAULT_LEGACY_UDC_CLASS_HASH); -} - -#[cfg(test)] -mod tests { - - use std::str::FromStr; - - use alloy_primitives::U256; - use katana_primitives::address; - use katana_primitives::block::{Block, GasPrices, Header}; - use katana_primitives::da::L1DataAvailabilityMode; - use katana_primitives::genesis::allocation::{ - GenesisAccount, GenesisAccountAlloc, GenesisContractAlloc, - }; - #[cfg(feature = "controller")] - use katana_primitives::genesis::constant::{CONTROLLER_ACCOUNT_CLASS, CONTROLLER_CLASS_HASH}; - use katana_primitives::genesis::constant::{ - DEFAULT_ACCOUNT_CLASS, DEFAULT_ACCOUNT_CLASS_HASH, - DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, DEFAULT_ACCOUNT_COMPILED_CLASS_HASH, - DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_ERC20_COMPILED_CLASS_HASH, - DEFAULT_LEGACY_UDC_CLASS, DEFAULT_LEGACY_UDC_COMPILED_CLASS_HASH, - }; - use katana_primitives::version::CURRENT_STARKNET_VERSION; - use starknet::macros::felt; - - use super::*; - - #[test] - fn genesis_block_and_state_updates() { - // setup initial states to test - - let classes = BTreeMap::from([ - (DEFAULT_LEGACY_UDC_CLASS_HASH, DEFAULT_LEGACY_UDC_CLASS.clone().into()), - (DEFAULT_LEGACY_ERC20_CLASS_HASH, DEFAULT_LEGACY_ERC20_CLASS.clone().into()), - (DEFAULT_ACCOUNT_CLASS_HASH, DEFAULT_ACCOUNT_CLASS.clone().into()), - #[cfg(feature = "controller")] - (CONTROLLER_CLASS_HASH, CONTROLLER_ACCOUNT_CLASS.clone().into()), - ]); - - let allocations = [ - ( - address!("0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266"), - GenesisAllocation::Account(GenesisAccountAlloc::Account(GenesisAccount { - public_key: felt!( - "0x01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca" - ), - balance: Some(U256::from_str("0xD3C21BCECCEDA1000000").unwrap()), - class_hash: DEFAULT_ACCOUNT_CLASS_HASH, - nonce: Some(felt!("0x99")), - storage: Some(BTreeMap::from([ - (felt!("0x1"), felt!("0x1")), - (felt!("0x2"), felt!("0x2")), - ])), - })), - ), - ( - address!("0xdeadbeef"), - GenesisAllocation::Contract(GenesisContractAlloc { - balance: Some(U256::from_str("0xD3C21BCECCEDA1000000").unwrap()), - class_hash: Some(DEFAULT_ACCOUNT_CLASS_HASH), - nonce: Some(felt!("0x100")), - storage: Some(BTreeMap::from([ - (felt!("0x100"), felt!("0x111")), - (felt!("0x200"), felt!("0x222")), - ])), - }), - ), - ( - address!("0x2"), - GenesisAllocation::Account(GenesisAccountAlloc::Account(GenesisAccount { - public_key: felt!("0x2"), - balance: Some(U256::ZERO), - class_hash: DEFAULT_ACCOUNT_CLASS_HASH, - nonce: None, - storage: None, - })), - ), - ]; - let chain_spec = ChainSpec { - id: ChainId::SEPOLIA, - genesis: Genesis { - classes, - allocations: BTreeMap::from(allocations.clone()), - number: 0, - timestamp: 5123512314u64, - state_root: felt!("0x99"), - parent_hash: felt!("0x999"), - sequencer_address: address!("0x100"), - gas_prices: GasPrices { eth: 1111, strk: 2222 }, - }, - fee_contracts: FeeContracts { - eth: DEFAULT_ETH_FEE_TOKEN_ADDRESS, - strk: DEFAULT_STRK_FEE_TOKEN_ADDRESS, - }, - settlement: None, - }; - - // setup expected storage values - let expected_block = Block { - header: Header { - state_diff_length: 0, - events_commitment: Felt::ZERO, - receipts_commitment: Felt::ZERO, - state_diff_commitment: Felt::ZERO, - transactions_commitment: Felt::ZERO, - number: chain_spec.genesis.number, - timestamp: chain_spec.genesis.timestamp, - state_root: chain_spec.genesis.state_root, - parent_hash: chain_spec.genesis.parent_hash, - sequencer_address: chain_spec.genesis.sequencer_address, - l1_gas_prices: chain_spec.genesis.gas_prices.clone(), - l1_data_gas_prices: chain_spec.genesis.gas_prices.clone(), - l1_da_mode: L1DataAvailabilityMode::Calldata, - protocol_version: CURRENT_STARKNET_VERSION, - transaction_count: 0, - events_count: 0, - }, - body: Vec::new(), - }; - - let actual_block = chain_spec.block(); - let actual_state_updates = chain_spec.state_updates(); - - similar_asserts::assert_eq!(actual_block, expected_block); - - if cfg!(feature = "controller") { - assert!(actual_state_updates.classes.len() == 4); - } else { - assert!(actual_state_updates.classes.len() == 3); - } - - assert_eq!( - actual_state_updates - .state_updates - .deprecated_declared_classes - .get(&DEFAULT_LEGACY_ERC20_CLASS_HASH), - Some(&DEFAULT_LEGACY_ERC20_COMPILED_CLASS_HASH), - ); - assert_eq!( - actual_state_updates.classes.get(&DEFAULT_LEGACY_ERC20_CLASS_HASH), - Some(&DEFAULT_LEGACY_ERC20_CLASS.clone()) - ); - - assert_eq!( - actual_state_updates.classes.get(&DEFAULT_LEGACY_ERC20_CLASS_HASH), - Some(&*DEFAULT_LEGACY_ERC20_CLASS), - ); - - assert_eq!( - actual_state_updates - .state_updates - .deployed_contracts - .get(&DEFAULT_ETH_FEE_TOKEN_ADDRESS), - Some(&DEFAULT_LEGACY_ERC20_CLASS_HASH), - "The ETH fee token contract should be created" - ); - assert_eq!( - actual_state_updates - .state_updates - .deployed_contracts - .get(&DEFAULT_STRK_FEE_TOKEN_ADDRESS), - Some(&DEFAULT_LEGACY_ERC20_CLASS_HASH), - "The STRK fee token contract should be created" - ); - - assert_eq!( - actual_state_updates - .state_updates - .deprecated_declared_classes - .get(&DEFAULT_LEGACY_UDC_CLASS_HASH), - Some(&DEFAULT_LEGACY_UDC_COMPILED_CLASS_HASH), - "The default universal deployer class should be declared" - ); - - assert_eq!( - actual_state_updates.classes.get(&DEFAULT_LEGACY_UDC_CLASS_HASH), - Some(&*DEFAULT_LEGACY_UDC_CLASS), - "The default universal deployer casm class should be declared" - ); - assert_eq!( - actual_state_updates.classes.get(&DEFAULT_LEGACY_UDC_CLASS_HASH), - Some(&DEFAULT_LEGACY_UDC_CLASS.clone()) - ); - - assert_eq!( - actual_state_updates.state_updates.deployed_contracts.get(&DEFAULT_UDC_ADDRESS), - Some(&DEFAULT_LEGACY_UDC_CLASS_HASH), - "The universal deployer contract should be created" - ); - - assert_eq!( - actual_state_updates.state_updates.declared_classes.get(&DEFAULT_ACCOUNT_CLASS_HASH), - Some(&DEFAULT_ACCOUNT_COMPILED_CLASS_HASH), - "The default oz account class should be declared" - ); - - assert_eq!( - actual_state_updates.classes.get(&DEFAULT_ACCOUNT_CLASS_HASH), - Some(&*DEFAULT_ACCOUNT_CLASS), - "The default oz account contract sierra class should be declared" - ); - - #[cfg(feature = "controller")] - { - assert_eq!( - actual_state_updates.state_updates.declared_classes.get(&CONTROLLER_CLASS_HASH), - Some(&CONTROLLER_ACCOUNT_CLASS.clone().compile().unwrap().class_hash().unwrap()), - "The controller account class should be declared" - ); - - assert_eq!( - actual_state_updates.classes.get(&CONTROLLER_CLASS_HASH), - Some(&*CONTROLLER_ACCOUNT_CLASS), - "The controller account contract sierra class should be declared" - ); - } - - // check that all contract allocations exist in the state updates - - assert_eq!( - actual_state_updates.state_updates.deployed_contracts.len(), - 6, - "6 contracts should be created: STRK fee token, ETH fee token, universal deployer, \ - and 3 allocations" - ); - - let alloc_1_addr = allocations[0].0; - - let mut account_allocation_storage = allocations[0].1.storage().unwrap().clone(); - account_allocation_storage.insert( - DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, - felt!("0x01ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca"), - ); - - assert_eq!( - actual_state_updates.state_updates.deployed_contracts.get(&alloc_1_addr), - allocations[0].1.class_hash().as_ref(), - "allocation should exist" - ); - assert_eq!( - actual_state_updates.state_updates.nonce_updates.get(&alloc_1_addr).cloned(), - allocations[0].1.nonce(), - "allocation nonce should be updated" - ); - assert_eq!( - actual_state_updates.state_updates.storage_updates.get(&alloc_1_addr).cloned(), - Some(account_allocation_storage), - "account allocation storage should be updated" - ); - - let alloc_2_addr = allocations[1].0; - - assert_eq!( - actual_state_updates.state_updates.deployed_contracts.get(&alloc_2_addr), - allocations[1].1.class_hash().as_ref(), - "allocation should exist" - ); - assert_eq!( - actual_state_updates.state_updates.nonce_updates.get(&alloc_2_addr).cloned(), - allocations[1].1.nonce(), - "allocation nonce should be updated" - ); - assert_eq!( - actual_state_updates.state_updates.storage_updates.get(&alloc_2_addr), - allocations[1].1.storage(), - "allocation storage should be updated" - ); - - let alloc_3_addr = allocations[2].0; - - assert_eq!( - actual_state_updates.state_updates.deployed_contracts.get(&alloc_3_addr), - allocations[2].1.class_hash().as_ref(), - "allocation should exist" - ); - assert_eq!( - actual_state_updates.state_updates.nonce_updates.get(&alloc_3_addr).cloned(), - allocations[2].1.nonce(), - "allocation nonce should be updated" - ); - assert_eq!( - actual_state_updates.state_updates.storage_updates.get(&alloc_3_addr).cloned(), - Some(BTreeMap::from([(DEFAULT_ACCOUNT_CLASS_PUBKEY_STORAGE_SLOT, felt!("0x2"))])), - "account allocation storage should be updated" - ); - - // check ETH fee token contract storage - - // there are only two allocations with a balance so the total token supply is - // 0xD3C21BCECCEDA1000000 * 2 = 0x1a784379d99db42000000 - let (total_supply_low, total_supply_high) = - split_u256(U256::from_str("0x1a784379d99db42000000").unwrap()); - - let name = cairo_short_string_to_felt("Ether").unwrap(); - let symbol = cairo_short_string_to_felt("ETH").unwrap(); - let decimals = Felt::from(18); - - let eth_fee_token_storage = actual_state_updates - .state_updates - .storage_updates - .get(&DEFAULT_ETH_FEE_TOKEN_ADDRESS) - .unwrap(); - - assert_eq!(eth_fee_token_storage.get(&ERC20_NAME_STORAGE_SLOT), Some(&name)); - assert_eq!(eth_fee_token_storage.get(&ERC20_SYMBOL_STORAGE_SLOT), Some(&symbol)); - assert_eq!(eth_fee_token_storage.get(&ERC20_DECIMAL_STORAGE_SLOT), Some(&decimals)); - assert_eq!( - eth_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), - Some(&total_supply_low) - ); - assert_eq!( - eth_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), - Some(&total_supply_high) - ); - - // check STRK fee token contract storage - - let strk_name = cairo_short_string_to_felt("Starknet Token").unwrap(); - let strk_symbol = cairo_short_string_to_felt("STRK").unwrap(); - let strk_decimals = Felt::from(18); - - let strk_fee_token_storage = actual_state_updates - .state_updates - .storage_updates - .get(&DEFAULT_STRK_FEE_TOKEN_ADDRESS) - .unwrap(); - - assert_eq!(strk_fee_token_storage.get(&ERC20_NAME_STORAGE_SLOT), Some(&strk_name)); - assert_eq!(strk_fee_token_storage.get(&ERC20_SYMBOL_STORAGE_SLOT), Some(&strk_symbol)); - assert_eq!(strk_fee_token_storage.get(&ERC20_DECIMAL_STORAGE_SLOT), Some(&strk_decimals)); - assert_eq!( - strk_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), - Some(&total_supply_low) - ); - assert_eq!( - strk_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), - Some(&total_supply_high) - ); - - let mut allocs_total_supply = U256::ZERO; - - // check for balance in both ETH and STRK - for (address, alloc) in &allocations { - if let Some(balance) = alloc.balance() { - let (low, high) = split_u256(balance); - - // the base storage address for a standard ERC20 contract balance - let bal_base_storage_var = get_fee_token_balance_base_storage_address(*address); - - // the storage address of low u128 of the balance - let low_bal_storage_var = bal_base_storage_var; - // the storage address of high u128 of the balance - let high_bal_storage_var = bal_base_storage_var + Felt::ONE; - - assert_eq!(eth_fee_token_storage.get(&low_bal_storage_var), Some(&low)); - assert_eq!(eth_fee_token_storage.get(&high_bal_storage_var), Some(&high)); - - assert_eq!(strk_fee_token_storage.get(&low_bal_storage_var), Some(&low)); - assert_eq!(strk_fee_token_storage.get(&high_bal_storage_var), Some(&high)); - - allocs_total_supply += balance; - } - } - // Check that the total supply is the sum of all balances in the allocations. - // Technically this is not necessary bcs we already checked the total supply in - // the fee token storage but it's a good sanity check. - - let (actual_total_supply_low, actual_total_supply_high) = split_u256(allocs_total_supply); - assert_eq!( - eth_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), - Some(&actual_total_supply_low), - "ETH total supply must be calculated from allocations balances correctly" - ); - assert_eq!( - eth_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), - Some(&actual_total_supply_high), - "ETH total supply must be calculated from allocations balances correctly" - ); - - assert_eq!( - strk_fee_token_storage.get(&ERC20_TOTAL_SUPPLY_STORAGE_SLOT), - Some(&actual_total_supply_low), - "STRK total supply must be calculated from allocations balances correctly" - ); - assert_eq!( - strk_fee_token_storage.get(&(ERC20_TOTAL_SUPPLY_STORAGE_SLOT + Felt::ONE)), - Some(&actual_total_supply_high), - "STRK total supply must be calculated from allocations balances correctly" - ); - } -} diff --git a/crates/katana/chain-spec/src/file.rs b/crates/katana/chain-spec/src/rollup/file.rs similarity index 86% rename from crates/katana/chain-spec/src/file.rs rename to crates/katana/chain-spec/src/rollup/file.rs index 6a0fa75ea1..43af73e2bf 100644 --- a/crates/katana/chain-spec/src/file.rs +++ b/crates/katana/chain-spec/src/rollup/file.rs @@ -7,7 +7,9 @@ use katana_primitives::genesis::json::GenesisJson; use katana_primitives::genesis::Genesis; use serde::{Deserialize, Serialize}; -use crate::{ChainSpec, FeeContracts, SettlementLayer}; +use super::FeeContract; +use crate::rollup::ChainSpec; +use crate::SettlementLayer; #[derive(Debug, thiserror::Error)] pub enum Error { @@ -48,7 +50,7 @@ pub fn read(id: &ChainId) -> Result { genesis, id: chain_spec.id, settlement: chain_spec.settlement, - fee_contracts: chain_spec.fee_contracts, + fee_contract: chain_spec.fee_contract, }) } @@ -59,7 +61,7 @@ pub fn write(chain_spec: &ChainSpec) -> Result<(), Error> { let cfg = ChainSpecFile { id: chain_spec.id, settlement: chain_spec.settlement.clone(), - fee_contracts: chain_spec.fee_contracts.clone(), + fee_contract: chain_spec.fee_contract.clone(), }; let content = toml::to_string_pretty(&cfg)?; @@ -79,9 +81,8 @@ pub fn write(chain_spec: &ChainSpec) -> Result<(), Error> { #[serde(rename_all = "kebab-case")] struct ChainSpecFile { id: ChainId, - fee_contracts: FeeContracts, - #[serde(skip_serializing_if = "Option::is_none")] - settlement: Option, + fee_contract: FeeContract, + settlement: SettlementLayer, } /// The local directory name where the chain configuration files are stored. @@ -150,6 +151,9 @@ pub fn local_dir() -> Result { #[cfg(test)] mod tests { + use katana_primitives::ContractAddress; + use url::Url; + use super::*; // To make sure the path returned by `local_dir` is always the same across @@ -169,18 +173,32 @@ mod tests { } } + fn chainspec() -> ChainSpec { + ChainSpec { + id: ChainId::default(), + genesis: Genesis::default(), + fee_contract: FeeContract { strk: ContractAddress::default() }, + settlement: SettlementLayer::Starknet { + id: ChainId::default(), + account: ContractAddress::default(), + core_contract: ContractAddress::default(), + rpc_url: Url::parse("http://localhost:5050").expect("valid url"), + }, + } + } + #[test] fn test_read_write_chainspec() { init(); - let chain_spec = ChainSpec::default(); + let chain_spec = chainspec(); let id = chain_spec.id; write(&chain_spec).unwrap(); let read_spec = read(&id).unwrap(); assert_eq!(chain_spec.id, read_spec.id); - assert_eq!(chain_spec.fee_contracts, read_spec.fee_contracts); + assert_eq!(chain_spec.fee_contract, read_spec.fee_contract); assert_eq!(chain_spec.settlement, read_spec.settlement); } diff --git a/crates/katana/chain-spec/src/rollup/mod.rs b/crates/katana/chain-spec/src/rollup/mod.rs new file mode 100644 index 0000000000..53b58a3be5 --- /dev/null +++ b/crates/katana/chain-spec/src/rollup/mod.rs @@ -0,0 +1,67 @@ +use katana_primitives::block::{ExecutableBlock, PartialHeader}; +use katana_primitives::chain::ChainId; +use katana_primitives::contract::ContractAddress; +use katana_primitives::da::L1DataAvailabilityMode; +use katana_primitives::genesis::Genesis; +use katana_primitives::version::CURRENT_STARKNET_VERSION; +use serde::{Deserialize, Serialize}; + +pub mod file; +mod utils; + +pub use utils::DEFAULT_APPCHAIN_FEE_TOKEN_ADDRESS; + +use crate::SettlementLayer; + +/// The rollup chain specification. +#[derive(Debug, Clone)] +#[cfg_attr(test, derive(PartialEq))] +pub struct ChainSpec { + /// The rollup network chain id. + pub id: ChainId, + + /// The chain's genesis states. + pub genesis: Genesis, + + /// The chain fee token contract. + pub fee_contract: FeeContract, + + /// The chain's settlement layer configurations. + pub settlement: SettlementLayer, +} + +////////////////////////////////////////////////////////////// +// ChainSpec implementations +////////////////////////////////////////////////////////////// + +impl ChainSpec { + pub fn block(&self) -> ExecutableBlock { + let header = PartialHeader { + protocol_version: CURRENT_STARKNET_VERSION, + number: self.genesis.number, + timestamp: self.genesis.timestamp, + parent_hash: self.genesis.parent_hash, + l1_da_mode: L1DataAvailabilityMode::Calldata, + l1_gas_prices: self.genesis.gas_prices.clone(), + l1_data_gas_prices: self.genesis.gas_prices.clone(), + sequencer_address: self.genesis.sequencer_address, + }; + + let transactions = utils::GenesisTransactionsBuilder::new(self).build(); + + ExecutableBlock { header, body: transactions } + } +} + +/// Token that can be used for transaction fee payments on the chain. +#[derive(Debug, Clone, Serialize, Deserialize)] +#[cfg_attr(test, derive(PartialEq))] +pub struct FeeContract { + pub strk: ContractAddress, +} + +impl Default for FeeContract { + fn default() -> Self { + Self { strk: DEFAULT_APPCHAIN_FEE_TOKEN_ADDRESS } + } +} diff --git a/crates/katana/chain-spec/src/rollup/utils.rs b/crates/katana/chain-spec/src/rollup/utils.rs new file mode 100644 index 0000000000..b152621c0e --- /dev/null +++ b/crates/katana/chain-spec/src/rollup/utils.rs @@ -0,0 +1,498 @@ +use std::cell::{OnceCell, RefCell}; +use std::collections::HashSet; +use std::sync::Arc; + +use alloy_primitives::U256; +use katana_primitives::class::{ClassHash, ContractClass}; +use katana_primitives::contract::{ContractAddress, Nonce}; +use katana_primitives::genesis::allocation::{DevGenesisAccount, GenesisAccountAlloc}; +use katana_primitives::genesis::constant::{ + DEFAULT_ACCOUNT_CLASS, DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_UDC_CLASS, + GENESIS_ACCOUNT_CLASS, +}; +use katana_primitives::transaction::{ + DeclareTx, DeclareTxV0, DeclareTxV2, DeclareTxWithClass, DeployAccountTx, DeployAccountTxV1, + ExecutableTx, ExecutableTxWithHash, InvokeTx, InvokeTxV1, +}; +use katana_primitives::utils::split_u256; +use katana_primitives::utils::transaction::compute_deploy_account_v1_tx_hash; +use katana_primitives::{felt, Felt}; +use num_traits::FromPrimitive; +use starknet::core::utils::{get_contract_address, get_selector_from_name}; +use starknet::macros::short_string; +use starknet::signers::SigningKey; + +use crate::rollup::ChainSpec; + +/// The contract address of the fee token generated by [`utils::GenesisTransactionsBuilder`]. +pub const DEFAULT_APPCHAIN_FEE_TOKEN_ADDRESS: ContractAddress = + ContractAddress(felt!("0x2e7442625bab778683501c0eadbc1ea17b3535da040a12ac7d281066e915eea")); + +/// A convenience builder for creating valid and executable transactions for the genesis block based +/// on the [`Genesis`]. +/// +/// The transactions are crafted in a way that can be executed by the StarknetOS Cairo program and +/// thus `blockifier`. +#[derive(Debug)] +pub struct GenesisTransactionsBuilder<'c> { + chain_spec: &'c ChainSpec, + fee_token: OnceCell, + master_address: OnceCell, + master_signer: SigningKey, + master_nonce: RefCell, + transactions: RefCell>, + declared_classes: RefCell>, +} + +impl<'c> GenesisTransactionsBuilder<'c> { + /// Creates a new [`GenesisTransactionsBuilder`] for the given [`ChainSpec`]. + pub fn new(chain_spec: &'c ChainSpec) -> Self { + Self { + chain_spec, + fee_token: OnceCell::new(), + master_address: OnceCell::new(), + transactions: RefCell::new(Vec::new()), + master_nonce: RefCell::new(Nonce::ZERO), + declared_classes: RefCell::new(HashSet::new()), + master_signer: SigningKey::from_secret_scalar(felt!("0xa55")), + } + } + + fn legacy_declare(&self, class: ContractClass) -> ClassHash { + if matches!(class, ContractClass::Class(..)) { + panic!("legacy_declare must be called only with legacy class") + } + + let class = Arc::new(class); + let class_hash = class.class_hash().unwrap(); + + // No need to declare the same class if it was already declared. + if self.declared_classes.borrow_mut().contains(&class_hash) { + return class_hash; + } + + let transaction = ExecutableTx::Declare(DeclareTxWithClass { + transaction: DeclareTx::V0(DeclareTxV0 { + sender_address: Felt::ONE.into(), + chain_id: self.chain_spec.id, + signature: Vec::new(), + class_hash, + max_fee: 0, + }), + class, + }); + + let tx_hash = transaction.calculate_hash(false); + self.declared_classes.borrow_mut().insert(class_hash); + self.transactions.borrow_mut().push(ExecutableTxWithHash { hash: tx_hash, transaction }); + + class_hash + } + + fn declare(&self, class: ContractClass) -> ClassHash { + let nonce = self.master_nonce.replace_with(|&mut n| n + Felt::ONE); + let sender_address = *self.master_address.get().expect("must be initialized first"); + + let class_hash = class.class_hash().unwrap(); + + // No need to declare the same class if it was already declared. + if self.declared_classes.borrow_mut().contains(&class_hash) { + return class_hash; + } + + let compiled_class_hash = class.clone().compile().unwrap().class_hash().unwrap(); + + let mut transaction = DeclareTxV2 { + chain_id: self.chain_spec.id, + signature: Vec::new(), + compiled_class_hash, + sender_address, + class_hash, + max_fee: 0, + nonce, + }; + + let hash = DeclareTx::V2(transaction.clone()).calculate_hash(false); + let signature = self.master_signer.sign(&hash).unwrap(); + transaction.signature = vec![signature.r, signature.s]; + + self.transactions.borrow_mut().push(ExecutableTxWithHash { + transaction: ExecutableTx::Declare(DeclareTxWithClass { + transaction: DeclareTx::V2(transaction), + class: class.into(), + }), + hash, + }); + + self.declared_classes.borrow_mut().insert(class_hash); + + class_hash + } + + fn deploy(&self, class: ClassHash, ctor_args: Vec) -> ContractAddress { + use std::iter; + + const DEPLOY_CONTRACT_SELECTOR: &str = "deploy_contract"; + let master_address = *self.master_address.get().expect("must be initialized first"); + + let salt = Felt::ZERO; + let contract_address = get_contract_address(salt, class, &ctor_args, Felt::ZERO); + + let ctor_args_len = Felt::from_usize(ctor_args.len()).unwrap(); + let args: Vec = iter::once(class) // class_hash + .chain(iter::once(salt)) // contract_address_salt + .chain(iter::once(ctor_args_len)) // constructor_calldata_len + .chain(ctor_args) // constructor_calldata + .chain(iter::once(Felt::ONE)) // deploy_from_zero + .collect(); + + self.invoke(master_address, DEPLOY_CONTRACT_SELECTOR, args); + + contract_address.into() + } + + fn invoke(&self, contract: ContractAddress, function: &str, args: Vec) { + use std::iter; + + let nonce = self.master_nonce.replace_with(|&mut n| n + Felt::ONE); + let sender_address = *self.master_address.get().expect("must be initialized first"); + let selector = get_selector_from_name(function).unwrap(); + + let args_len = Felt::from_usize(args.len()).unwrap(); + let calldata: Vec = iter::once(Felt::ONE) + .chain(iter::once(contract.into())) + .chain(iter::once(selector)) + .chain(iter::once(Felt::ZERO)) + .chain(iter::once(args_len)) + .chain(iter::once(args_len)) + .chain(args) + .collect(); + + let mut transaction = InvokeTxV1 { + chain_id: self.chain_spec.id, + signature: Vec::new(), + sender_address, + max_fee: 0, + calldata, + nonce, + }; + + let tx_hash = InvokeTx::V1(transaction.clone()).calculate_hash(false); + let signature = self.master_signer.sign(&tx_hash).unwrap(); + transaction.signature = vec![signature.r, signature.s]; + + self.transactions.borrow_mut().push(ExecutableTxWithHash { + transaction: ExecutableTx::Invoke(InvokeTx::V1(transaction)), + hash: tx_hash, + }); + } + + fn deploy_predeployed_account(&self, account: &DevGenesisAccount) -> ContractAddress { + // The salt used in `GenesisAccount::new()` to compute the contract address + // + // The only reason we use this value is to make sure the generated account addresses are the + // same with the previous implementation. + const SALT: Felt = felt!("666"); + + let signer = SigningKey::from_secret_scalar(account.private_key); + let pubkey = signer.verifying_key().scalar(); + + let class_hash = account.class_hash; + let calldata = vec![pubkey]; + let account_address = get_contract_address(SALT, class_hash, &calldata, Felt::ZERO); + + let tx_hash = compute_deploy_account_v1_tx_hash( + account_address, + &calldata, + class_hash, + SALT, + 0, + self.chain_spec.id.into(), + Felt::ZERO, + false, + ); + + let signature = signer.sign(&tx_hash).unwrap(); + + let transaction = ExecutableTx::DeployAccount(DeployAccountTx::V1(DeployAccountTxV1 { + signature: vec![signature.r, signature.s], + contract_address: account_address.into(), + constructor_calldata: calldata, + chain_id: self.chain_spec.id, + contract_address_salt: SALT, + nonce: Felt::ZERO, + max_fee: 0, + class_hash, + })); + + let tx_hash = transaction.calculate_hash(false); + self.transactions.borrow_mut().push(ExecutableTxWithHash { hash: tx_hash, transaction }); + + account_address.into() + } + + fn build_master_account(&self) { + let account_class_hash = self.legacy_declare(GENESIS_ACCOUNT_CLASS.clone()); + + let master_pubkey = self.master_signer.verifying_key().scalar(); + let calldata = vec![master_pubkey]; + let salt = Felt::ONE; + let master_address = get_contract_address(salt, account_class_hash, &calldata, Felt::ZERO); + + self.master_address.set(master_address.into()).expect("must be uninitialized"); + + let deploy_account_tx_hash = compute_deploy_account_v1_tx_hash( + master_address, + &calldata, + account_class_hash, + salt, + 0, + self.chain_spec.id.into(), + Felt::ZERO, + false, + ); + + let signature = self.master_signer.sign(&deploy_account_tx_hash).unwrap(); + + let transaction = ExecutableTx::DeployAccount(DeployAccountTx::V1(DeployAccountTxV1 { + signature: vec![signature.r, signature.s], + nonce: Felt::ZERO, + max_fee: 0, + contract_address_salt: salt, + contract_address: master_address.into(), + constructor_calldata: calldata, + class_hash: account_class_hash, + chain_id: self.chain_spec.id, + })); + + let tx_hash = transaction.calculate_hash(false); + self.transactions.borrow_mut().push(ExecutableTxWithHash { hash: tx_hash, transaction }); + self.master_nonce.replace(Nonce::ONE); + } + + fn build_core_contracts(&mut self) { + let udc_class_hash = self.legacy_declare(DEFAULT_LEGACY_UDC_CLASS.clone()); + self.deploy(udc_class_hash, Vec::new()); + + let master_address = *self.master_address.get().expect("must be initialized first"); + + let ctor_args = vec![ + short_string!("Starknet Token"), + short_string!("STRK"), + felt!("0x12"), + Felt::from_u128(u128::MAX).unwrap(), + Felt::from_u128(u128::MAX).unwrap(), + master_address.into(), + ]; + + let erc20_class_hash = self.legacy_declare(DEFAULT_LEGACY_ERC20_CLASS.clone()); + let fee_token_address = self.deploy(erc20_class_hash, ctor_args); + + self.fee_token.set(fee_token_address).expect("must be uninitialized"); + } + + fn build_allocated_dev_accounts(&mut self) { + let default_account_class_hash = self.declare(DEFAULT_ACCOUNT_CLASS.clone()); + + for (expected_addr, account) in self.chain_spec.genesis.accounts() { + if account.class_hash() != default_account_class_hash { + panic!( + "unexpected account class hash; expected {default_account_class_hash:#x}, got \ + {:#x}", + account.class_hash() + ) + } + + if let GenesisAccountAlloc::DevAccount(account) = account { + let account_address = self.deploy_predeployed_account(account); + debug_assert_eq!(&account_address, expected_addr); + if let Some(amount) = account.balance { + self.transfer_balance(account_address, amount); + } + } + } + } + + fn transfer_balance(&self, recipient: ContractAddress, balance: U256) { + let fee_token = *self.fee_token.get().expect("must be initialized first"); + + let (low_amount, high_amount) = split_u256(balance); + let args = vec![recipient.into(), low_amount, high_amount]; + + const TRANSFER: &str = "transfer"; + self.invoke(fee_token, TRANSFER, args); + } + + pub fn build(mut self) -> Vec { + self.build_master_account(); + self.build_core_contracts(); + self.build_allocated_dev_accounts(); + self.transactions.into_inner() + } +} + +#[cfg(test)] +mod tests { + + use alloy_primitives::U256; + use katana_executor::implementation::blockifier::BlockifierFactory; + use katana_executor::ExecutorFactory; + use katana_primitives::chain::ChainId; + use katana_primitives::contract::Nonce; + use katana_primitives::env::CfgEnv; + use katana_primitives::genesis::allocation::DevAllocationsGenerator; + use katana_primitives::genesis::constant::{ + DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_UDC_CLASS, DEFAULT_PREFUNDED_ACCOUNT_BALANCE, + DEFAULT_UDC_ADDRESS, + }; + use katana_primitives::genesis::Genesis; + use katana_primitives::transaction::TxType; + use katana_provider::providers::db::DbProvider; + use katana_provider::traits::state::StateFactoryProvider; + use url::Url; + + use super::GenesisTransactionsBuilder; + use crate::rollup::{ChainSpec, FeeContract, DEFAULT_APPCHAIN_FEE_TOKEN_ADDRESS}; + use crate::SettlementLayer; + + fn chain_spec(n_accounts: u16) -> ChainSpec { + let accounts = DevAllocationsGenerator::new(n_accounts) + .with_balance(U256::from(DEFAULT_PREFUNDED_ACCOUNT_BALANCE)) + .generate(); + + let mut genesis = Genesis::default(); + genesis.extend_allocations(accounts.into_iter().map(|(k, v)| (k, v.into()))); + + let id = ChainId::parse("KATANA").unwrap(); + let fee_contract = FeeContract::default(); + + let settlement = SettlementLayer::Starknet { + id: ChainId::default(), + account: Default::default(), + core_contract: Default::default(), + rpc_url: Url::parse("http://localhost:5050").unwrap(), + }; + + ChainSpec { id, genesis, settlement, fee_contract } + } + + fn executor(chain_spec: &ChainSpec) -> BlockifierFactory { + BlockifierFactory::new( + CfgEnv { + chain_id: chain_spec.id, + validate_max_n_steps: u32::MAX, + invoke_tx_max_n_steps: u32::MAX, + max_recursion_depth: usize::MAX, + ..Default::default() + }, + Default::default(), + ) + } + + #[test] + fn valid_transactions() { + let chain_spec = chain_spec(1); + + let provider = DbProvider::new_ephemeral(); + let ef = executor(&chain_spec); + + let mut executor = ef.with_state(provider.latest().unwrap()); + executor.execute_block(chain_spec.block()).expect("failed to execute genesis block"); + + let output = executor.take_execution_output().unwrap(); + + for (i, (.., result)) in output.transactions.iter().enumerate() { + assert!(result.is_success(), "tx {i} failed; {result:?}"); + } + } + + #[test] + fn genesis_states() { + let chain_spec = chain_spec(1); + + let provider = DbProvider::new_ephemeral(); + let ef = executor(&chain_spec); + + let mut executor = ef.with_state(provider.latest().unwrap()); + executor.execute_block(chain_spec.block()).expect("failed to execute genesis block"); + + let genesis_state = executor.state(); + + // ----------------------------------------------------------------------- + // Classes + + // check that the default erc20 class is declared + let erc20_class_hash = DEFAULT_LEGACY_ERC20_CLASS.class_hash().unwrap(); + assert!(genesis_state.class(erc20_class_hash).unwrap().is_some()); + + // check that the default udc class is declared + let udc_class_hash = DEFAULT_LEGACY_UDC_CLASS.class_hash().unwrap(); + assert!(genesis_state.class(udc_class_hash).unwrap().is_some()); + + // ----------------------------------------------------------------------- + // Contracts + + // check that the default fee token is deployed + let res = genesis_state.class_hash_of_contract(DEFAULT_APPCHAIN_FEE_TOKEN_ADDRESS).unwrap(); + assert_eq!(res, Some(erc20_class_hash)); + + // check that the default udc is deployed + let res = genesis_state.class_hash_of_contract(DEFAULT_UDC_ADDRESS).unwrap(); + assert_eq!(res, Some(udc_class_hash)); + + for (address, account) in chain_spec.genesis.accounts() { + let nonce = genesis_state.nonce(*address).unwrap(); + let class_hash = genesis_state.class_hash_of_contract(*address).unwrap(); + + assert_eq!(nonce, Some(Nonce::ONE)); + assert_eq!(class_hash, Some(account.class_hash())); + } + } + + #[test] + fn transaction_order() { + let chain_spec = chain_spec(1); + let transactions = GenesisTransactionsBuilder::new(&chain_spec).build(); + + let expected_order = vec![ + TxType::Declare, // Master account class declare + TxType::DeployAccount, // Master account + TxType::Declare, // UDC declare + TxType::Invoke, // UDC deploy + TxType::Declare, // ERC20 declare + TxType::Invoke, // ERC20 deploy + TxType::Declare, // Account class declare (V2) + TxType::DeployAccount, // Dev account + TxType::Invoke, // Balance transfer + ]; + + assert_eq!(transactions.len(), expected_order.len()); + for (tx, expected) in transactions.iter().zip(expected_order) { + assert_eq!(tx.transaction.r#type(), expected); + } + } + + #[test] + fn dev_predeployed_acccounts() { + fn inner(n_accounts: u16) { + let chain_spec = chain_spec(n_accounts); + let mut transactions = GenesisTransactionsBuilder::new(&chain_spec).build(); + + // We only want to check that for each predeployed accounts, there should be a deploy + // account and transfer balance (invoke) transactions. So we skip the first 7 + // transactions (master account, UDC, ERC20, etc). + let account_transactions = &transactions.split_off(7); + + assert_eq!(account_transactions.len(), n_accounts as usize * 2); + + for txs in account_transactions.chunks(2) { + assert_eq!(txs[0].transaction.r#type(), TxType::DeployAccount); + assert_eq!(txs[1].transaction.r#type(), TxType::Invoke); + } + } + + for i in 0..10 { + inner(i); + } + } +} diff --git a/crates/katana/cli/src/args.rs b/crates/katana/cli/src/args.rs index 4621cfb022..9f3390fa87 100644 --- a/crates/katana/cli/src/args.rs +++ b/crates/katana/cli/src/args.rs @@ -239,16 +239,14 @@ impl NodeArgs { fn chain_spec(&self) -> Result> { if let Some(id) = &self.chain { - use katana_chain_spec::file; - - let mut chain_spec = file::read(id).context("failed to load chain spec")?; - chain_spec.genesis.sequencer_address = *DEFAULT_SEQUENCER_ADDRESS; - - Ok(Arc::new(chain_spec)) + let mut cs = + katana_chain_spec::rollup::file::read(id).context("failed to load chain spec")?; + cs.genesis.sequencer_address = *DEFAULT_SEQUENCER_ADDRESS; + Ok(Arc::new(ChainSpec::Rollup(cs))) } // exclusively for development mode else { - let mut chain_spec = katana_chain_spec::DEV_UNALLOCATED.clone(); + let mut chain_spec = katana_chain_spec::dev::DEV_UNALLOCATED.clone(); if let Some(id) = self.starknet.environment.chain_id { chain_spec.id = id; @@ -273,7 +271,7 @@ impl NodeArgs { katana_slot_controller::add_controller_account(&mut chain_spec.genesis)?; } - Ok(Arc::new(chain_spec)) + Ok(Arc::new(ChainSpec::Dev(chain_spec))) } } @@ -438,8 +436,8 @@ mod test { assert_eq!(config.execution.invocation_max_steps, DEFAULT_INVOCATION_MAX_STEPS); assert_eq!(config.execution.validation_max_steps, DEFAULT_VALIDATION_MAX_STEPS); assert_eq!(config.db.dir, None); - assert_eq!(config.chain.id, ChainId::parse("KATANA").unwrap()); - assert_eq!(config.chain.genesis.sequencer_address, *DEFAULT_SEQUENCER_ADDRESS); + assert_eq!(config.chain.id(), ChainId::parse("KATANA").unwrap()); + assert_eq!(config.chain.genesis().sequencer_address, *DEFAULT_SEQUENCER_ADDRESS); } #[test] @@ -465,8 +463,8 @@ mod test { assert_eq!(config.execution.invocation_max_steps, 200); assert_eq!(config.execution.validation_max_steps, 100); assert_eq!(config.db.dir, Some(PathBuf::from("/path/to/db"))); - assert_eq!(config.chain.id, ChainId::GOERLI); - assert_eq!(config.chain.genesis.sequencer_address, *DEFAULT_SEQUENCER_ADDRESS); + assert_eq!(config.chain.id(), ChainId::GOERLI); + assert_eq!(config.chain.genesis().sequencer_address, *DEFAULT_SEQUENCER_ADDRESS); } #[test] @@ -569,13 +567,13 @@ mod test { .config() .unwrap(); - assert_eq!(config.chain.genesis.number, 0); - assert_eq!(config.chain.genesis.parent_hash, felt!("0x999")); - assert_eq!(config.chain.genesis.timestamp, 5123512314); - assert_eq!(config.chain.genesis.state_root, felt!("0x99")); - assert_eq!(config.chain.genesis.sequencer_address, address!("0x100")); - assert_eq!(config.chain.genesis.gas_prices.eth, 9999); - assert_eq!(config.chain.genesis.gas_prices.strk, 8888); + assert_eq!(config.chain.genesis().number, 0); + assert_eq!(config.chain.genesis().parent_hash, felt!("0x999")); + assert_eq!(config.chain.genesis().timestamp, 5123512314); + assert_eq!(config.chain.genesis().state_root, felt!("0x99")); + assert_eq!(config.chain.genesis().sequencer_address, address!("0x100")); + assert_eq!(config.chain.genesis().gas_prices.eth, 9999); + assert_eq!(config.chain.genesis().gas_prices.strk, 8888); assert_matches!(config.dev.fixed_gas_prices, Some(prices) => { assert_eq!(prices.gas_price.eth, 100); assert_eq!(prices.gas_price.strk, 200); @@ -633,14 +631,14 @@ chain_id.Named = "Mainnet" assert_eq!(prices.data_gas_price.eth, 111); assert_eq!(prices.data_gas_price.strk, 222); }); - assert_eq!(config.chain.genesis.number, 0); - assert_eq!(config.chain.genesis.parent_hash, felt!("0x999")); - assert_eq!(config.chain.genesis.timestamp, 5123512314); - assert_eq!(config.chain.genesis.state_root, felt!("0x99")); - assert_eq!(config.chain.genesis.sequencer_address, address!("0x100")); - assert_eq!(config.chain.genesis.gas_prices.eth, 9999); - assert_eq!(config.chain.genesis.gas_prices.strk, 8888); - assert_eq!(config.chain.id, ChainId::Id(Felt::from_str("0x123").unwrap())); + assert_eq!(config.chain.genesis().number, 0); + assert_eq!(config.chain.genesis().parent_hash, felt!("0x999")); + assert_eq!(config.chain.genesis().timestamp, 5123512314); + assert_eq!(config.chain.genesis().state_root, felt!("0x99")); + assert_eq!(config.chain.genesis().sequencer_address, address!("0x100")); + assert_eq!(config.chain.genesis().gas_prices.eth, 9999); + assert_eq!(config.chain.genesis().gas_prices.strk, 8888); + assert_eq!(config.chain.id(), ChainId::Id(Felt::from_str("0x123").unwrap())); } #[test] diff --git a/crates/katana/cli/src/utils.rs b/crates/katana/cli/src/utils.rs index 675589b652..a94d32578e 100644 --- a/crates/katana/cli/src/utils.rs +++ b/crates/katana/cli/src/utils.rs @@ -81,7 +81,7 @@ impl Display for LogFormat { } pub fn print_intro(args: &NodeArgs, chain: &ChainSpec) { - let mut accounts = chain.genesis.accounts().peekable(); + let mut accounts = chain.genesis().accounts().peekable(); let account_class_hash = accounts.peek().map(|e| e.1.class_hash()); let seed = &args.development.seed; @@ -126,8 +126,10 @@ ACCOUNTS SEED } fn print_genesis_contracts(chain: &ChainSpec, account_class_hash: Option) { - println!( - r" + match chain { + ChainSpec::Dev(cs) => { + println!( + r" PREDEPLOYED CONTRACTS ================== @@ -138,11 +140,26 @@ PREDEPLOYED CONTRACTS | Contract | STRK Fee Token | Address | {} | Class Hash | {:#064x}", - chain.fee_contracts.eth, - DEFAULT_LEGACY_ERC20_CLASS_HASH, - chain.fee_contracts.strk, - DEFAULT_LEGACY_ERC20_CLASS_HASH - ); + cs.fee_contracts.eth, + DEFAULT_LEGACY_ERC20_CLASS_HASH, + cs.fee_contracts.strk, + DEFAULT_LEGACY_ERC20_CLASS_HASH + ); + } + + ChainSpec::Rollup(cs) => { + println!( + r" +PREDEPLOYED CONTRACTS +================== + +| Contract | STRK Fee Token +| Address | {} +| Class Hash | {:#064x}", + cs.fee_contract.strk, DEFAULT_LEGACY_ERC20_CLASS_HASH, + ); + } + } println!( r" diff --git a/crates/katana/contracts/build/account.json b/crates/katana/contracts/build/account.json index 195603b14e..6c031da2d8 100644 --- a/crates/katana/contracts/build/account.json +++ b/crates/katana/contracts/build/account.json @@ -1,5698 +1,4831 @@ { - "abi": [ + "abi": [ + { + "members": [ { - "members": [ - { - "name": "to", - "offset": 0, - "type": "felt" - }, - { - "name": "selector", - "offset": 1, - "type": "felt" - }, - { - "name": "data_offset", - "offset": 2, - "type": "felt" - }, - { - "name": "data_len", - "offset": 3, - "type": "felt" - } - ], - "name": "AccountCallArray", - "size": 4, - "type": "struct" + "name": "to", + "offset": 0, + "type": "felt" }, { - "inputs": [ - { - "name": "publicKey", - "type": "felt" - } - ], - "name": "constructor", - "outputs": [], - "type": "constructor" + "name": "selector", + "offset": 1, + "type": "felt" }, { - "inputs": [], - "name": "getPublicKey", - "outputs": [ - { - "name": "publicKey", - "type": "felt" - } - ], - "stateMutability": "view", - "type": "function" + "name": "data_offset", + "offset": 2, + "type": "felt" }, { - "inputs": [ - { - "name": "interfaceId", - "type": "felt" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "name": "success", - "type": "felt" - } - ], - "stateMutability": "view", - "type": "function" + "name": "data_len", + "offset": 3, + "type": "felt" + } + ], + "name": "CallArray", + "size": 4, + "type": "struct" + }, + { + "inputs": [], + "name": "assert_only_self", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "get_public_key", + "outputs": [ + { + "name": "res", + "type": "felt" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "new_public_key", + "type": "felt" + } + ], + "name": "set_public_key", + "outputs": [], + "type": "function" + }, + { + "inputs": [ + { + "name": "_public_key", + "type": "felt" + } + ], + "name": "constructor", + "outputs": [], + "type": "constructor" + }, + { + "inputs": [ + { + "name": "hash", + "type": "felt" + }, + { + "name": "signature_len", + "type": "felt" + }, + { + "name": "signature", + "type": "felt*" + } + ], + "name": "is_valid_signature", + "outputs": [], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "name": "class_hash", + "type": "felt" + } + ], + "name": "__validate_declare__", + "outputs": [], + "type": "function" + }, + { + "inputs": [ + { + "name": "class_hash", + "type": "felt" + }, + { + "name": "contract_address_salt", + "type": "felt" + }, + { + "name": "_public_key", + "type": "felt" + } + ], + "name": "__validate_deploy__", + "outputs": [], + "type": "function" + }, + { + "inputs": [ + { + "name": "call_array_len", + "type": "felt" + }, + { + "name": "call_array", + "type": "CallArray*" }, { - "inputs": [ - { - "name": "newPublicKey", - "type": "felt" - } - ], - "name": "setPublicKey", - "outputs": [], - "type": "function" + "name": "calldata_len", + "type": "felt" }, { - "inputs": [ - { - "name": "hash", - "type": "felt" - }, - { - "name": "signature_len", - "type": "felt" - }, - { - "name": "signature", - "type": "felt*" - } - ], - "name": "isValidSignature", - "outputs": [ - { - "name": "isValid", - "type": "felt" - } - ], - "stateMutability": "view", - "type": "function" + "name": "calldata", + "type": "felt*" + } + ], + "name": "__validate__", + "outputs": [], + "type": "function" + }, + { + "inputs": [ + { + "name": "call_array_len", + "type": "felt" + }, + { + "name": "call_array", + "type": "CallArray*" + }, + { + "name": "calldata_len", + "type": "felt" + }, + { + "name": "calldata", + "type": "felt*" + } + ], + "name": "__execute__", + "outputs": [ + { + "name": "retdata_size", + "type": "felt" + }, + { + "name": "retdata", + "type": "felt*" + } + ], + "type": "function" + }, + { + "inputs": [ + { + "name": "class_hash", + "type": "felt" }, { - "inputs": [ - { - "name": "call_array_len", - "type": "felt" - }, - { - "name": "call_array", - "type": "AccountCallArray*" - }, - { - "name": "calldata_len", - "type": "felt" - }, - { - "name": "calldata", - "type": "felt*" - } - ], - "name": "__validate__", - "outputs": [], - "type": "function" + "name": "contract_address_salt", + "type": "felt" }, { - "inputs": [ - { - "name": "class_hash", - "type": "felt" - } - ], - "name": "__validate_declare__", - "outputs": [], - "type": "function" + "name": "constructor_calldata_len", + "type": "felt" }, { - "inputs": [ - { - "name": "class_hash", - "type": "felt" - }, - { - "name": "salt", - "type": "felt" - }, - { - "name": "publicKey", - "type": "felt" - } - ], - "name": "__validate_deploy__", - "outputs": [], - "type": "function" + "name": "constructor_calldata", + "type": "felt*" }, { - "inputs": [ - { - "name": "call_array_len", - "type": "felt" - }, - { - "name": "call_array", - "type": "AccountCallArray*" - }, - { - "name": "calldata_len", - "type": "felt" - }, - { - "name": "calldata", - "type": "felt*" - } - ], - "name": "__execute__", - "outputs": [ - { - "name": "response_len", - "type": "felt" - }, - { - "name": "response", - "type": "felt*" - } - ], - "type": "function" + "name": "deploy_from_zero", + "type": "felt" } + ], + "name": "deploy_contract", + "outputs": [ + { + "name": "contract_address", + "type": "felt" + } + ], + "type": "function" + } + ], + "program": { + "attributes": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__main__.is_valid_signature" + ], + "end_pc": 315, + "flow_tracking_data": { + "ap_tracking": { + "group": 31, + "offset": 23 + }, + "reference_ids": {} + }, + "name": "error_message", + "start_pc": 313, + "value": "INVALID_SIGNATURE_LENGTH" + }, + { + "accessible_scopes": ["__main__", "__main__", "__main__.__execute__"], + "end_pc": 492, + "flow_tracking_data": { + "ap_tracking": { + "group": 39, + "offset": 22 + }, + "reference_ids": {} + }, + "name": "error_message", + "start_pc": 490, + "value": "Invalid caller. This function cannot be called from another contract." + }, + { + "accessible_scopes": ["__main__", "__main__", "__main__.__execute__"], + "end_pc": 497, + "flow_tracking_data": { + "ap_tracking": { + "group": 39, + "offset": 22 + }, + "reference_ids": {} + }, + "name": "error_message", + "start_pc": 492, + "value": "Invalid transaction version. This account contract does not support transaction version 0." + } + ], + "builtins": ["pedersen", "range_check", "ecdsa"], + "compiler_version": null, + "data": [ + "0x40780017fff7fff", + "0x1", + "0x208b7fff7fff7ffe", + "0x400380007ffb7ffc", + "0x400380017ffb7ffd", + "0x482680017ffb8000", + "0x3", + "0x480280027ffb8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffd", + "0x3", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480080007fff8000", + "0x400080007ffd7fff", + "0x482480017ffd8001", + "0x1", + "0x482480017ffd8001", + "0x1", + "0xa0680017fff7ffe", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb", + "0x402a7ffc7ffd7fff", + "0x208b7fff7fff7ffe", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x43616c6c436f6e7472616374", + "0x400280007ff97fff", + "0x400380017ff97ffa", + "0x400380027ff97ffb", + "0x400380037ff97ffc", + "0x400380047ff97ffd", + "0x482680017ff98000", + "0x7", + "0x480280057ff98000", + "0x480280067ff98000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x4465706c6f79", + "0x400280007ff87fff", + "0x400380017ff87ff9", + "0x400380027ff87ffa", + "0x400380037ff87ffb", + "0x400380047ff87ffc", + "0x400380057ff87ffd", + "0x482680017ff88000", + "0x9", + "0x480280067ff88000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x47657443616c6c657241646472657373", + "0x400280007ffd7fff", + "0x482680017ffd8000", + "0x2", + "0x480280017ffd8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x476574436f6e747261637441646472657373", + "0x400280007ffd7fff", + "0x482680017ffd8000", + "0x2", + "0x480280017ffd8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x53746f7261676552656164", + "0x400280007ffc7fff", + "0x400380017ffc7ffd", + "0x482680017ffc8000", + "0x3", + "0x480280027ffc8000", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x53746f726167655772697465", + "0x400280007ffb7fff", + "0x400380017ffb7ffc", + "0x400380027ffb7ffd", + "0x482680017ffb8000", + "0x3", + "0x208b7fff7fff7ffe", + "0x480680017fff8000", + "0x4765745478496e666f", + "0x400280007ffd7fff", + "0x482680017ffd8000", + "0x2", + "0x480280017ffd8000", + "0x208b7fff7fff7ffe", + "0x48297ffd80007ffc", + "0x20680017fff7fff", + "0x4", + "0x402780017ffc7ffc", + "0x1", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x2", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbb", + "0x400780017fff8000", + "0x0", + "0x400780017fff8001", + "0x0", + "0x48127ffe7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x2", + "0x480a7ffa7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480280007ffb8000", + "0x1104800180018000", + "0x20", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffab", + "0x40137ffd7fff8000", + "0x480280017ffb8000", + "0x40297ffd7fff8001", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x2", + "0x480a7ffb7fff8000", + "0x480280007ffc8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff89", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9c", + "0x40137ffd7fff8000", + "0x480280017ffc8000", + "0x402580017fff8001", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffc7fff8000", + "0x480280007ffd8000", + "0x480280017ffd8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7b", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffc", + "0x5", + "0x480a7ffa7fff8000", + "0x480a7ffd7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x482680017ffc8000", + "0x800000000000011000000000000000000000000000000000000000000000000", + "0x40337fff7ffb8000", + "0x480a7ffb7fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffd7fff8000", + "0x48317ffd80008000", + "0x400080007ffd7ffe", + "0x480080007ffc8000", + "0x400080017ffc7fff", + "0x482480017ffb8000", + "0x1", + "0x482480017ffb8000", + "0x3", + "0x480080027ffa8000", + "0x20680017fff7ffb", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff8", + "0x208b7fff7fff7ffe", + "0x400380017ff97ffa", + "0x400380007ff97ffb", + "0x482680017ff98000", + "0x2", + "0x208b7fff7fff7ffe", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x480680017fff8000", + "0x3b28019ccfdbd30ffc65951d94bb85c9e2b8434111a000b5afd533ce65f57a4", + "0x208b7fff7fff7ffe", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", + "0x480a7ffb7fff8000", + "0x48127ffe7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8b", + "0x48127ffe7fff8000", + "0x48127ff57fff8000", + "0x48127ff57fff8000", + "0x48127ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", + "0x480a7ffa7fff8000", + "0x48127ffe7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff85", + "0x48127ff67fff8000", + "0x48127ff67fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff70", + "0x48127ffe7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff66", + "0x40127fff7fff7ff9", + "0x48127ffe7fff8000", + "0x208b7fff7fff7ffe", + "0x402b7ffd7ffc7ffd", + "0x480280007ffb8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff6", + "0x40780017fff7fff", + "0x1", + "0x48127ffe7fff8000", + "0x480280017ffb8000", + "0x480280027ffb8000", + "0x480280037ffb8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffce", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x4003800080007ffc", + "0x4826800180008000", + "0x1", + "0x480a7ffd7fff8000", + "0x4828800080007ffe", + "0x480a80007fff8000", + "0x208b7fff7fff7ffe", + "0x402b7ffd7ffc7ffd", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x480280027ffb8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", + "0x48127ffe7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x48127ffb7fff8000", + "0x480280037ffb8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffca", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb9", + "0x208b7fff7fff7ffe", + "0x482680017ffd8000", + "0x1", + "0x402a7ffd7ffc7fff", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x480280027ffb8000", + "0x480280007ffd8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", + "0x40780017fff7fff", + "0x1", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480280037ffb8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9f", + "0x208b7fff7fff7ffe", + "0x482680017ffd8000", + "0x1", + "0x402a7ffd7ffc7fff", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x480280027ffb8000", + "0x480280007ffd8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", + "0x40780017fff7fff", + "0x1", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x48127ffc7fff8000", + "0x480280037ffb8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ff77fff8000", + "0x480a7ff87fff8000", + "0x480a7ff97fff8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff79", + "0x400780017fff7ffc", + "0x2", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x48127ffd7fff8000", + "0x480280007ffd8000", + "0x480280017ffd8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff66", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x48127ff47fff8000", + "0x48127ffc7fff8000", + "0x208b7fff7fff7ffe", + "0x480280027ffb8000", + "0x480280017ffd8000", + "0x400080007ffe7fff", + "0x482680017ffd8000", + "0x2", + "0x480280017ffd8000", + "0x48307fff7ffe8000", + "0x402a7ffd7ffc7fff", + "0x480280027ffb8000", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x482480017ffd8000", + "0x1", + "0x480280037ffb8000", + "0x480280007ffd8000", + "0x480280017ffd8000", + "0x482680017ffd8000", + "0x2", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc", + "0x40780017fff7fff", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ff97fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeea", + "0x48127ffe7fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480080057ffb8000", + "0x480080037ffa8000", + "0x480080047ff98000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6", + "0x208b7fff7fff7ffe", + "0x482680017ffd8000", + "0x1", + "0x402a7ffd7ffc7fff", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x480280027ffb8000", + "0x480280037ffb8000", + "0x480280007ffd8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", + "0x40780017fff7fff", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ff77fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec9", + "0x48127ffe7fff8000", + "0x480a7ff87fff8000", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480080057ffb8000", + "0x480080037ffa8000", + "0x480080047ff98000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa5", + "0x208b7fff7fff7ffe", + "0x482680017ffd8000", + "0x3", + "0x402a7ffd7ffc7fff", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x480280027ffb8000", + "0x480280037ffb8000", + "0x480280007ffd8000", + "0x480280017ffd8000", + "0x480280027ffd8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea", + "0x40780017fff7fff", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x480a7ff67fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffea6", + "0x48127ffe7fff8000", + "0x480a7ff77fff8000", + "0x480a7ff87fff8000", + "0x480a7ff97fff8000", + "0x480080057ffb8000", + "0x480080037ffa8000", + "0x480080047ff98000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff82", + "0x208b7fff7fff7ffe", + "0x480280027ffb8000", + "0x480280007ffd8000", + "0x400080007ffe7fff", + "0x482680017ffd8000", + "0x1", + "0x480280007ffd8000", + "0x484480017fff8000", + "0x4", + "0x48307fff7ffd8000", + "0x480280027ffb8000", + "0x480080007ffe8000", + "0x400080017ffe7fff", + "0x482480017ffd8000", + "0x1", + "0x480080007ffc8000", + "0x48307fff7ffe8000", + "0x402a7ffd7ffc7fff", + "0x480280027ffb8000", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x482480017ffd8000", + "0x2", + "0x480280037ffb8000", + "0x480280007ffd8000", + "0x482680017ffd8000", + "0x1", + "0x480080007ff38000", + "0x482480017ff28000", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7", + "0x40780017fff7fff", + "0x1", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x48127ffb7fff8000", + "0x480680017fff8000", + "0x0", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x8", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe38", + "0x480a7ff67fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6c", + "0x40137fff7fff8000", + "0x48127ffe7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe4a", + "0x400680017fff7fff", + "0x0", + "0x4802800080008000", + "0x480680017fff8000", + "0x0", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe68", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe10", + "0x40137fff7fff8001", + "0x48127ff67fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffd7fff8000", + "0x480a80017fff8000", + "0x1104800180018000", + "0x8d", + "0x4003800180008002", + "0x400b7ffa7fff8003", + "0x400b80017fff8004", + "0x4003800280008005", + "0x4003800080008006", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe01", + "0x40137fff7fff8007", + "0x48127ffc7fff8000", + "0x480a80037fff8000", + "0x480a80047fff8000", + "0x480a80077fff8000", + "0x1104800180018000", + "0x5d", + "0x48127ffe7fff8000", + "0x480a7ff77fff8000", + "0x480a7ff87fff8000", + "0x480a7ff97fff8000", + "0x48127ffb7fff8000", + "0x480a80077fff8000", + "0x208b7fff7fff7ffe", + "0x480280027ffb8000", + "0x480280007ffd8000", + "0x400080007ffe7fff", + "0x482680017ffd8000", + "0x1", + "0x480280007ffd8000", + "0x484480017fff8000", + "0x4", + "0x48307fff7ffd8000", + "0x480280027ffb8000", + "0x480080007ffe8000", + "0x400080017ffe7fff", + "0x482480017ffd8000", + "0x1", + "0x480080007ffc8000", + "0x48307fff7ffe8000", + "0x402a7ffd7ffc7fff", + "0x480280027ffb8000", + "0x480280007ffb8000", + "0x480280017ffb8000", + "0x482480017ffd8000", + "0x2", + "0x480280037ffb8000", + "0x480280007ffd8000", + "0x482680017ffd8000", + "0x1", + "0x480080007ff38000", + "0x482480017ff28000", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb3", + "0x208b7fff7fff7ffe", + "0x480a7ff87fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe98", + "0x480a7ff97fff8000", + "0x480a7ffa7fff8000", + "0x480a7ffb7fff8000", + "0x480a7ffc7fff8000", + "0x480a7ffd7fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdee", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x1", + "0x4003800080007ffc", + "0x4826800180008000", + "0x1", + "0x480a7ffd7fff8000", + "0x4828800080007ffe", + "0x480a80007fff8000", + "0x208b7fff7fff7ffe", + "0x480280027ffb8000", + "0x480280027ffd8000", + "0x400080007ffe7fff", + "0x482680017ffd8000", + "0x3", + "0x480280027ffd8000", + "0x48307fff7ffe8000", + "0x482480017fff8000", + "0x1", + "0x402a7ffd7ffc7fff", + "0x480280007ffb8000", + "0x480280007ffd8000", + "0x480280017ffd8000", + "0x480280027ffd8000", + "0x482680017ffd8000", + "0x3", + "0x480080007ff98000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc", + "0x480280027ffb8000", + "0x48127ffe7fff8000", + "0x482480017ffe8000", + "0x1", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe1", + "0x48127ff47fff8000", + "0x480280017ffb8000", + "0x48127ffb7fff8000", + "0x480280037ffb8000", + "0x48127ffa7fff8000", + "0x48127ffa7fff8000", + "0x208b7fff7fff7ffe", + "0x40780017fff7fff", + "0x3", + "0x20780017fff7ffb", + "0x6", + "0x480a7ffa7fff8000", + "0x480680017fff8000", + "0x0", + "0x208b7fff7fff7ffe", + "0x480a7ffa7fff8000", + "0x480280007ffc8000", + "0x480280017ffc8000", + "0x480280027ffc8000", + "0x480280037ffc8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffda9", + "0x40137ffe7fff8000", + "0x40137fff7fff8001", + "0x40137ffd7fff8002", + "0x480a7ffd7fff8000", + "0x480a80017fff8000", + "0x480a80007fff8000", + "0x1104800180018000", + "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd91", + "0x480a80027fff8000", + "0x482680017ffb8000", + "0x800000000000011000000000000000000000000000000000000000000000000", + "0x482680017ffc8000", + "0x4", + "0x482a80007ffd8000", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", + "0x48127ffe7fff8000", + "0x482880007ffe8000", + "0x208b7fff7fff7ffe", + "0x20780017fff7ffa", + "0x4", + "0x480a7ff97fff8000", + "0x208b7fff7fff7ffe", + "0x480280007ffb8000", + "0x400280007ffd7fff", + "0x480280017ffb8000", + "0x400280017ffd7fff", + "0x480280037ffb8000", + "0x400280027ffd7fff", + "0x480280027ffb8000", + "0x48327fff7ffc8000", + "0x400280037ffd7fff", + "0x480a7ff97fff8000", + "0x482680017ffa8000", + "0x800000000000011000000000000000000000000000000000000000000000000", + "0x482680017ffb8000", + "0x4", + "0x480a7ffc7fff8000", + "0x482680017ffd8000", + "0x4", + "0x1104800180018000", + "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", + "0x208b7fff7fff7ffe" ], - "entry_points_by_type": { - "CONSTRUCTOR": [ - { - "offset": "0x16e", - "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194" + "debug_info": null, + "hints": { + "0": [ + { + "accessible_scopes": [ + "starkware.cairo.common.alloc", + "starkware.cairo.common.alloc.alloc" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 0, + "offset": 0 + }, + "reference_ids": {} + } + } + ], + "12": [ + { + "accessible_scopes": [ + "starkware.cairo.common.memcpy", + "starkware.cairo.common.memcpy.memcpy" + ], + "code": "vm_enter_scope({'n': ids.len})", + "flow_tracking_data": { + "ap_tracking": { + "group": 2, + "offset": 0 + }, + "reference_ids": { + "starkware.cairo.common.memcpy.memcpy.len": 0 } - ], - "EXTERNAL": [ - { - "offset": "0x1cd", - "selector": "0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9" - }, - { - "offset": "0x2bb", - "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad" - }, - { - "offset": "0x224", - "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775" - }, - { - "offset": "0x191", - "selector": "0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079" - }, - { - "offset": "0x1f4", - "selector": "0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e" - }, - { - "offset": "0x25f", - "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3" - }, - { - "offset": "0x1b2", - "selector": "0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd" - }, - { - "offset": "0x285", - "selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895" + } + } + ], + "20": [ + { + "accessible_scopes": [ + "starkware.cairo.common.memcpy", + "starkware.cairo.common.memcpy.memcpy" + ], + "code": "n -= 1\nids.continue_copying = 1 if n > 0 else 0", + "flow_tracking_data": { + "ap_tracking": { + "group": 2, + "offset": 5 + }, + "reference_ids": { + "starkware.cairo.common.memcpy.memcpy.continue_copying": 1 } - ], - "L1_HANDLER": [] - }, - "program": { - "debug_info": { - "file_contents": {}, - "instruction_locations": {} - }, - "attributes": [ - { - "accessible_scopes": [ - "openzeppelin.account.library", - "openzeppelin.account.library.Account", - "openzeppelin.account.library.Account.assert_only_self" - ], - "end_pc": 192, - "flow_tracking_data": { - "ap_tracking": { - "group": 16, - "offset": 12 - }, - "reference_ids": {} - }, - "name": "error_message", - "start_pc": 191, - "value": "Account: caller is not this account" - }, - { - "accessible_scopes": [ - "openzeppelin.account.library", - "openzeppelin.account.library.Account", - "openzeppelin.account.library.Account.execute" - ], - "end_pc": 269, - "flow_tracking_data": { - "ap_tracking": { - "group": 21, - "offset": 9 - }, - "reference_ids": {} - }, - "name": "error_message", - "start_pc": 259, - "value": "Account: deprecated tx version" - }, - { - "accessible_scopes": [ - "openzeppelin.account.library", - "openzeppelin.account.library.Account", - "openzeppelin.account.library.Account.execute" - ], - "end_pc": 274, - "flow_tracking_data": { - "ap_tracking": { - "group": 21, - "offset": 49 - }, - "reference_ids": {} - }, - "name": "error_message", - "start_pc": 272, - "value": "Account: reentrant call" + } + } + ], + "23": [ + { + "accessible_scopes": [ + "starkware.cairo.common.memcpy", + "starkware.cairo.common.memcpy.memcpy" + ], + "code": "vm_exit_scope()", + "flow_tracking_data": { + "ap_tracking": { + "group": 2, + "offset": 6 + }, + "reference_ids": {} + } + } + ], + "32": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.call_contract" + ], + "code": "syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 4, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.call_contract.syscall_ptr": 2 + } + } + } + ], + "45": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.deploy" + ], + "code": "syscall_handler.deploy(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 5, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.deploy.syscall_ptr": 3 + } + } + } + ], + "52": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.get_caller_address" + ], + "code": "syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 6, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": 4 + } + } + } + ], + "59": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.get_contract_address" + ], + "code": "syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 7, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": 5 + } + } + } + ], + "67": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.storage_read" + ], + "code": "syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 8, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 6 + } + } + } + ], + "76": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.storage_write" + ], + "code": "syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 9, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 7 + } + } + } + ], + "82": [ + { + "accessible_scopes": [ + "starkware.starknet.common.syscalls", + "starkware.starknet.common.syscalls.get_tx_info" + ], + "code": "syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)", + "flow_tracking_data": { + "ap_tracking": { + "group": 10, + "offset": 1 + }, + "reference_ids": { + "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": 8 + } + } + } + ], + "86": [ + { + "accessible_scopes": [ + "starkware.cairo.common.math", + "starkware.cairo.common.math.assert_not_equal" + ], + "code": "from starkware.cairo.lang.vm.relocatable import RelocatableValue\nboth_ints = isinstance(ids.a, int) and isinstance(ids.b, int)\nboth_relocatable = (\n isinstance(ids.a, RelocatableValue) and isinstance(ids.b, RelocatableValue) and\n ids.a.segment_index == ids.b.segment_index)\nassert both_ints or both_relocatable, \\\n f'assert_not_equal failed: non-comparable values: {ids.a}, {ids.b}.'\nassert (ids.a - ids.b) % PRIME != 0, f'assert_not_equal failed: {ids.a} = {ids.b}.'", + "flow_tracking_data": { + "ap_tracking": { + "group": 11, + "offset": 0 + }, + "reference_ids": { + "starkware.cairo.common.math.assert_not_equal.a": 9, + "starkware.cairo.common.math.assert_not_equal.b": 10 + } + } + } + ], + "165": [ + { + "accessible_scopes": [ + "starkware.cairo.common.signature", + "starkware.cairo.common.signature.verify_ecdsa_signature" + ], + "code": "ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))", + "flow_tracking_data": { + "ap_tracking": { + "group": 18, + "offset": 0 + }, + "reference_ids": { + "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": 13, + "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": 11, + "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": 12 } + } + } + ], + "213": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.assert_only_self" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 23, + "offset": 16 + }, + "reference_ids": {} + } + } + ], + "229": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.get_public_key_encode_return" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 25, + "offset": 0 + }, + "reference_ids": {} + } + } + ], + "272": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.set_public_key" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 28, + "offset": 44 + }, + "reference_ids": {} + } + } + ], + "298": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.constructor" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 30, + "offset": 29 + }, + "reference_ids": {} + } + } + ], + "347": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.is_valid_signature" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 32, + "offset": 50 + }, + "reference_ids": {} + } + } + ], + "380": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.__validate_declare__" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 34, + "offset": 58 + }, + "reference_ids": {} + } + } + ], + "415": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.__validate_deploy__" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 36, + "offset": 60 + }, + "reference_ids": {} + } + } + ], + "469": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.__validate__" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 38, + "offset": 72 + }, + "reference_ids": {} + } + } + ], + "571": [ + { + "accessible_scopes": [ + "__main__", + "__main__", + "__wrappers__", + "__wrappers__.deploy_contract_encode_return" + ], + "code": "memory[ap] = segments.add()", + "flow_tracking_data": { + "ap_tracking": { + "group": 45, + "offset": 0 + }, + "reference_ids": {} + } + } + ] + }, + "identifiers": { + "__main__.Call": { + "full_name": "__main__.Call", + "members": { + "calldata": { + "cairo_type": "felt*", + "offset": 3 + }, + "calldata_len": { + "cairo_type": "felt", + "offset": 2 + }, + "selector": { + "cairo_type": "felt", + "offset": 1 + }, + "to": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.CallArray": { + "full_name": "__main__.CallArray", + "members": { + "data_len": { + "cairo_type": "felt", + "offset": 3 + }, + "data_offset": { + "cairo_type": "felt", + "offset": 2 + }, + "selector": { + "cairo_type": "felt", + "offset": 1 + }, + "to": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.HashBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", + "type": "alias" + }, + "__main__.MultiCall": { + "full_name": "__main__.MultiCall", + "members": { + "account": { + "cairo_type": "felt", + "offset": 0 + }, + "calls": { + "cairo_type": "__main__.Call*", + "offset": 2 + }, + "calls_len": { + "cairo_type": "felt", + "offset": 1 + }, + "max_fee": { + "cairo_type": "felt", + "offset": 3 + }, + "version": { + "cairo_type": "felt", + "offset": 4 + } + }, + "size": 5, + "type": "struct" + }, + "__main__.ORIGIN_ADDRESS": { + "destination": "starkware.starknet.common.constants.ORIGIN_ADDRESS", + "type": "alias" + }, + "__main__.PREFIX_TRANSACTION": { + "destination": "starkware.starknet.third_party.open_zeppelin.utils.constants.PREFIX_TRANSACTION", + "type": "alias" + }, + "__main__.SignatureBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", + "type": "alias" + }, + "__main__.__execute__": { + "decorators": ["external", "raw_output"], + "pc": 479, + "type": "function" + }, + "__main__.__execute__.Args": { + "full_name": "__main__.__execute__.Args", + "members": { + "call_array": { + "cairo_type": "__main__.CallArray*", + "offset": 1 + }, + "call_array_len": { + "cairo_type": "felt", + "offset": 0 + }, + "calldata": { + "cairo_type": "felt*", + "offset": 3 + }, + "calldata_len": { + "cairo_type": "felt", + "offset": 2 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.__execute__.ImplicitArgs": { + "full_name": "__main__.__execute__.ImplicitArgs", + "members": { + "ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "offset": 3 + }, + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.__execute__.Return": { + "cairo_type": "(retdata_size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__main__.__execute__.SIZEOF_LOCALS": { + "type": "const", + "value": 8 + }, + "__main__.__validate__": { + "decorators": ["external"], + "pc": 425, + "type": "function" + }, + "__main__.__validate__.Args": { + "full_name": "__main__.__validate__.Args", + "members": { + "call_array": { + "cairo_type": "__main__.CallArray*", + "offset": 1 + }, + "call_array_len": { + "cairo_type": "felt", + "offset": 0 + }, + "calldata": { + "cairo_type": "felt*", + "offset": 3 + }, + "calldata_len": { + "cairo_type": "felt", + "offset": 2 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.__validate__.ImplicitArgs": { + "full_name": "__main__.__validate__.ImplicitArgs", + "members": { + "ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "offset": 3 + }, + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.__validate__.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.__validate__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.__validate_declare__": { + "decorators": ["external"], + "pc": 357, + "type": "function" + }, + "__main__.__validate_declare__.Args": { + "full_name": "__main__.__validate_declare__.Args", + "members": { + "class_hash": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.__validate_declare__.ImplicitArgs": { + "full_name": "__main__.__validate_declare__.ImplicitArgs", + "members": { + "ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "offset": 3 + }, + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.__validate_declare__.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.__validate_declare__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.__validate_deploy__": { + "decorators": ["external"], + "pc": 390, + "type": "function" + }, + "__main__.__validate_deploy__.Args": { + "full_name": "__main__.__validate_deploy__.Args", + "members": { + "_public_key": { + "cairo_type": "felt", + "offset": 2 + }, + "class_hash": { + "cairo_type": "felt", + "offset": 0 + }, + "contract_address_salt": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.__validate_deploy__.ImplicitArgs": { + "full_name": "__main__.__validate_deploy__.ImplicitArgs", + "members": { + "ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "offset": 3 + }, + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.__validate_deploy__.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.__validate_deploy__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.alloc": { + "destination": "starkware.cairo.common.alloc.alloc", + "type": "alias" + }, + "__main__.assert_not_equal": { + "destination": "starkware.cairo.common.math.assert_not_equal", + "type": "alias" + }, + "__main__.assert_only_self": { + "decorators": ["view"], + "pc": 200, + "type": "function" + }, + "__main__.assert_only_self.Args": { + "full_name": "__main__.assert_only_self.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__main__.assert_only_self.ImplicitArgs": { + "full_name": "__main__.assert_only_self.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.assert_only_self.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.assert_only_self.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.call_contract": { + "destination": "starkware.starknet.common.syscalls.call_contract", + "type": "alias" + }, + "__main__.constructor": { + "decorators": ["constructor"], + "pc": 282, + "type": "function" + }, + "__main__.constructor.Args": { + "full_name": "__main__.constructor.Args", + "members": { + "_public_key": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.constructor.ImplicitArgs": { + "full_name": "__main__.constructor.ImplicitArgs", + "members": { + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.constructor.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.constructor.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.deploy": { + "destination": "starkware.starknet.common.syscalls.deploy", + "type": "alias" + }, + "__main__.deploy_contract": { + "decorators": ["external"], + "pc": 560, + "type": "function" + }, + "__main__.deploy_contract.Args": { + "full_name": "__main__.deploy_contract.Args", + "members": { + "class_hash": { + "cairo_type": "felt", + "offset": 0 + }, + "constructor_calldata": { + "cairo_type": "felt*", + "offset": 3 + }, + "constructor_calldata_len": { + "cairo_type": "felt", + "offset": 2 + }, + "contract_address_salt": { + "cairo_type": "felt", + "offset": 1 + }, + "deploy_from_zero": { + "cairo_type": "felt", + "offset": 4 + } + }, + "size": 5, + "type": "struct" + }, + "__main__.deploy_contract.ImplicitArgs": { + "full_name": "__main__.deploy_contract.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.deploy_contract.Return": { + "cairo_type": "(contract_address: felt)", + "type": "type_definition" + }, + "__main__.deploy_contract.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.execute_list": { + "decorators": [], + "pc": 612, + "type": "function" + }, + "__main__.execute_list.Args": { + "full_name": "__main__.execute_list.Args", + "members": { + "calls": { + "cairo_type": "__main__.Call*", + "offset": 1 + }, + "calls_len": { + "cairo_type": "felt", + "offset": 0 + }, + "response": { + "cairo_type": "felt*", + "offset": 2 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.execute_list.ImplicitArgs": { + "full_name": "__main__.execute_list.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.execute_list.Return": { + "cairo_type": "(response_len: felt)", + "type": "type_definition" + }, + "__main__.execute_list.SIZEOF_LOCALS": { + "type": "const", + "value": 3 + }, + "__main__.from_call_array_to_call": { + "decorators": [], + "pc": 646, + "type": "function" + }, + "__main__.from_call_array_to_call.Args": { + "full_name": "__main__.from_call_array_to_call.Args", + "members": { + "call_array": { + "cairo_type": "__main__.CallArray*", + "offset": 1 + }, + "call_array_len": { + "cairo_type": "felt", + "offset": 0 + }, + "calldata": { + "cairo_type": "felt*", + "offset": 2 + }, + "calls": { + "cairo_type": "__main__.Call*", + "offset": 3 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.from_call_array_to_call.ImplicitArgs": { + "full_name": "__main__.from_call_array_to_call.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.from_call_array_to_call.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.from_call_array_to_call.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.get_caller_address": { + "destination": "starkware.starknet.common.syscalls.get_caller_address", + "type": "alias" + }, + "__main__.get_contract_address": { + "destination": "starkware.starknet.common.syscalls.get_contract_address", + "type": "alias" + }, + "__main__.get_fp_and_pc": { + "destination": "starkware.cairo.common.registers.get_fp_and_pc", + "type": "alias" + }, + "__main__.get_public_key": { + "decorators": ["view"], + "pc": 223, + "type": "function" + }, + "__main__.get_public_key.Args": { + "full_name": "__main__.get_public_key.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__main__.get_public_key.ImplicitArgs": { + "full_name": "__main__.get_public_key.ImplicitArgs", + "members": { + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.get_public_key.Return": { + "cairo_type": "(res: felt)", + "type": "type_definition" + }, + "__main__.get_public_key.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.get_tx_info": { + "destination": "starkware.starknet.common.syscalls.get_tx_info", + "type": "alias" + }, + "__main__.hash_finalize": { + "destination": "starkware.cairo.common.hash_state.hash_finalize", + "type": "alias" + }, + "__main__.hash_init": { + "destination": "starkware.cairo.common.hash_state.hash_init", + "type": "alias" + }, + "__main__.hash_update": { + "destination": "starkware.cairo.common.hash_state.hash_update", + "type": "alias" + }, + "__main__.hash_update_single": { + "destination": "starkware.cairo.common.hash_state.hash_update_single", + "type": "alias" + }, + "__main__.is_valid_signature": { + "decorators": ["view"], + "pc": 308, + "type": "function" + }, + "__main__.is_valid_signature.Args": { + "full_name": "__main__.is_valid_signature.Args", + "members": { + "hash": { + "cairo_type": "felt", + "offset": 0 + }, + "signature": { + "cairo_type": "felt*", + "offset": 2 + }, + "signature_len": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.is_valid_signature.ImplicitArgs": { + "full_name": "__main__.is_valid_signature.ImplicitArgs", + "members": { + "ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "offset": 3 + }, + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 4, + "type": "struct" + }, + "__main__.is_valid_signature.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.is_valid_signature.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__main__.public_key": { + "type": "namespace" + }, + "__main__.public_key.Args": { + "full_name": "__main__.public_key.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__main__.public_key.HashBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", + "type": "alias" + }, + "__main__.public_key.ImplicitArgs": { + "full_name": "__main__.public_key.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__main__.public_key.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.public_key.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.public_key.addr": { + "decorators": [], + "pc": 170, + "type": "function" + }, + "__main__.public_key.addr.Args": { + "full_name": "__main__.public_key.addr.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__main__.public_key.addr.ImplicitArgs": { + "full_name": "__main__.public_key.addr.ImplicitArgs", + "members": { + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 0 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "__main__.public_key.addr.Return": { + "cairo_type": "(res: felt)", + "type": "type_definition" + }, + "__main__.public_key.addr.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.public_key.hash2": { + "destination": "starkware.cairo.common.hash.hash2", + "type": "alias" + }, + "__main__.public_key.normalize_address": { + "destination": "starkware.starknet.common.storage.normalize_address", + "type": "alias" + }, + "__main__.public_key.read": { + "decorators": [], + "pc": 175, + "type": "function" + }, + "__main__.public_key.read.Args": { + "full_name": "__main__.public_key.read.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__main__.public_key.read.ImplicitArgs": { + "full_name": "__main__.public_key.read.ImplicitArgs", + "members": { + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.public_key.read.Return": { + "cairo_type": "(res: felt)", + "type": "type_definition" + }, + "__main__.public_key.read.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.public_key.storage_read": { + "destination": "starkware.starknet.common.syscalls.storage_read", + "type": "alias" + }, + "__main__.public_key.storage_write": { + "destination": "starkware.starknet.common.syscalls.storage_write", + "type": "alias" + }, + "__main__.public_key.write": { + "decorators": [], + "pc": 188, + "type": "function" + }, + "__main__.public_key.write.Args": { + "full_name": "__main__.public_key.write.Args", + "members": { + "value": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.public_key.write.ImplicitArgs": { + "full_name": "__main__.public_key.write.ImplicitArgs", + "members": { + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.public_key.write.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.public_key.write.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.set_public_key": { + "decorators": ["external"], + "pc": 254, + "type": "function" + }, + "__main__.set_public_key.Args": { + "full_name": "__main__.set_public_key.Args", + "members": { + "new_public_key": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "__main__.set_public_key.ImplicitArgs": { + "full_name": "__main__.set_public_key.ImplicitArgs", + "members": { + "pedersen_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + }, + "range_check_ptr": { + "cairo_type": "felt", + "offset": 2 + }, + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "__main__.set_public_key.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "__main__.set_public_key.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__main__.verify_ecdsa_signature": { + "destination": "starkware.cairo.common.signature.verify_ecdsa_signature", + "type": "alias" + }, + "__wrappers__.__execute__": { + "decorators": ["external", "raw_output"], + "pc": 528, + "type": "function" + }, + "__wrappers__.__execute__.Args": { + "full_name": "__wrappers__.__execute__.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__execute__.ImplicitArgs": { + "full_name": "__wrappers__.__execute__.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__execute__.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.__execute__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.__execute__.__wrapped_func": { + "destination": "__main__.__execute__", + "type": "alias" + }, + "__wrappers__.__execute___encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.__validate__": { + "decorators": ["external"], + "pc": 438, + "type": "function" + }, + "__wrappers__.__validate__.Args": { + "full_name": "__wrappers__.__validate__.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__validate__.ImplicitArgs": { + "full_name": "__wrappers__.__validate__.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__validate__.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.__validate__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.__validate__.__wrapped_func": { + "destination": "__main__.__validate__", + "type": "alias" + }, + "__wrappers__.__validate___encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.__validate_declare__": { + "decorators": ["external"], + "pc": 370, + "type": "function" + }, + "__wrappers__.__validate_declare__.Args": { + "full_name": "__wrappers__.__validate_declare__.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__validate_declare__.ImplicitArgs": { + "full_name": "__wrappers__.__validate_declare__.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__validate_declare__.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.__validate_declare__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.__validate_declare__.__wrapped_func": { + "destination": "__main__.__validate_declare__", + "type": "alias" + }, + "__wrappers__.__validate_declare___encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.__validate_deploy__": { + "decorators": ["external"], + "pc": 403, + "type": "function" + }, + "__wrappers__.__validate_deploy__.Args": { + "full_name": "__wrappers__.__validate_deploy__.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__validate_deploy__.ImplicitArgs": { + "full_name": "__wrappers__.__validate_deploy__.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.__validate_deploy__.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.__validate_deploy__.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.__validate_deploy__.__wrapped_func": { + "destination": "__main__.__validate_deploy__", + "type": "alias" + }, + "__wrappers__.__validate_deploy___encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.assert_only_self": { + "decorators": ["view"], + "pc": 209, + "type": "function" + }, + "__wrappers__.assert_only_self.Args": { + "full_name": "__wrappers__.assert_only_self.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.assert_only_self.ImplicitArgs": { + "full_name": "__wrappers__.assert_only_self.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.assert_only_self.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: felt, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.assert_only_self.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.assert_only_self.__wrapped_func": { + "destination": "__main__.assert_only_self", + "type": "alias" + }, + "__wrappers__.assert_only_self_encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.constructor": { + "decorators": ["constructor"], + "pc": 289, + "type": "function" + }, + "__wrappers__.constructor.Args": { + "full_name": "__wrappers__.constructor.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.constructor.ImplicitArgs": { + "full_name": "__wrappers__.constructor.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.constructor.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.constructor.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.constructor.__wrapped_func": { + "destination": "__main__.constructor", + "type": "alias" + }, + "__wrappers__.constructor_encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.deploy_contract": { + "decorators": ["external"], + "pc": 580, + "type": "function" + }, + "__wrappers__.deploy_contract.Args": { + "full_name": "__wrappers__.deploy_contract.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.deploy_contract.ImplicitArgs": { + "full_name": "__wrappers__.deploy_contract.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.deploy_contract.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: felt, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.deploy_contract.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.deploy_contract.__wrapped_func": { + "destination": "__main__.deploy_contract", + "type": "alias" + }, + "__wrappers__.deploy_contract_encode_return": { + "decorators": [], + "pc": 571, + "type": "function" + }, + "__wrappers__.deploy_contract_encode_return.Args": { + "full_name": "__wrappers__.deploy_contract_encode_return.Args", + "members": { + "range_check_ptr": { + "cairo_type": "felt", + "offset": 1 + }, + "ret_value": { + "cairo_type": "(contract_address: felt)", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "__wrappers__.deploy_contract_encode_return.ImplicitArgs": { + "full_name": "__wrappers__.deploy_contract_encode_return.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.deploy_contract_encode_return.Return": { + "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", + "type": "type_definition" + }, + "__wrappers__.deploy_contract_encode_return.SIZEOF_LOCALS": { + "type": "const", + "value": 1 + }, + "__wrappers__.deploy_contract_encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.get_public_key": { + "decorators": ["view"], + "pc": 238, + "type": "function" + }, + "__wrappers__.get_public_key.Args": { + "full_name": "__wrappers__.get_public_key.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.get_public_key.ImplicitArgs": { + "full_name": "__wrappers__.get_public_key.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.get_public_key.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.get_public_key.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.get_public_key.__wrapped_func": { + "destination": "__main__.get_public_key", + "type": "alias" + }, + "__wrappers__.get_public_key_encode_return": { + "decorators": [], + "pc": 229, + "type": "function" + }, + "__wrappers__.get_public_key_encode_return.Args": { + "full_name": "__wrappers__.get_public_key_encode_return.Args", + "members": { + "range_check_ptr": { + "cairo_type": "felt", + "offset": 1 + }, + "ret_value": { + "cairo_type": "(res: felt)", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "__wrappers__.get_public_key_encode_return.ImplicitArgs": { + "full_name": "__wrappers__.get_public_key_encode_return.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.get_public_key_encode_return.Return": { + "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", + "type": "type_definition" + }, + "__wrappers__.get_public_key_encode_return.SIZEOF_LOCALS": { + "type": "const", + "value": 1 + }, + "__wrappers__.get_public_key_encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.is_valid_signature": { + "decorators": ["view"], + "pc": 327, + "type": "function" + }, + "__wrappers__.is_valid_signature.Args": { + "full_name": "__wrappers__.is_valid_signature.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.is_valid_signature.ImplicitArgs": { + "full_name": "__wrappers__.is_valid_signature.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.is_valid_signature.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.is_valid_signature.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.is_valid_signature.__wrapped_func": { + "destination": "__main__.is_valid_signature", + "type": "alias" + }, + "__wrappers__.is_valid_signature_encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "__wrappers__.set_public_key": { + "decorators": ["external"], + "pc": 263, + "type": "function" + }, + "__wrappers__.set_public_key.Args": { + "full_name": "__wrappers__.set_public_key.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.set_public_key.ImplicitArgs": { + "full_name": "__wrappers__.set_public_key.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "__wrappers__.set_public_key.Return": { + "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, size: felt, retdata: felt*)", + "type": "type_definition" + }, + "__wrappers__.set_public_key.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "__wrappers__.set_public_key.__wrapped_func": { + "destination": "__main__.set_public_key", + "type": "alias" + }, + "__wrappers__.set_public_key_encode_return.memcpy": { + "destination": "starkware.cairo.common.memcpy.memcpy", + "type": "alias" + }, + "starkware.cairo.common.alloc.alloc": { + "decorators": [], + "pc": 0, + "type": "function" + }, + "starkware.cairo.common.alloc.alloc.Args": { + "full_name": "starkware.cairo.common.alloc.alloc.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.alloc.alloc.ImplicitArgs": { + "full_name": "starkware.cairo.common.alloc.alloc.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.alloc.alloc.Return": { + "cairo_type": "(ptr: felt*)", + "type": "type_definition" + }, + "starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.bool.FALSE": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.bool.TRUE": { + "type": "const", + "value": 1 + }, + "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", + "members": { + "x": { + "cairo_type": "felt", + "offset": 0 + }, + "x_and_y": { + "cairo_type": "felt", + "offset": 2 + }, + "x_or_y": { + "cairo_type": "felt", + "offset": 4 + }, + "x_xor_y": { + "cairo_type": "felt", + "offset": 3 + }, + "y": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 5, + "type": "struct" + }, + "starkware.cairo.common.cairo_builtins.EcOpBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", + "members": { + "m": { + "cairo_type": "felt", + "offset": 4 + }, + "p": { + "cairo_type": "starkware.cairo.common.ec_point.EcPoint", + "offset": 0 + }, + "q": { + "cairo_type": "starkware.cairo.common.ec_point.EcPoint", + "offset": 2 + }, + "r": { + "cairo_type": "starkware.cairo.common.ec_point.EcPoint", + "offset": 5 + } + }, + "size": 7, + "type": "struct" + }, + "starkware.cairo.common.cairo_builtins.EcPoint": { + "destination": "starkware.cairo.common.ec_point.EcPoint", + "type": "alias" + }, + "starkware.cairo.common.cairo_builtins.HashBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.HashBuiltin", + "members": { + "result": { + "cairo_type": "felt", + "offset": 2 + }, + "x": { + "cairo_type": "felt", + "offset": 0 + }, + "y": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.cairo_builtins.KeccakBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", + "members": { + "input": { + "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "offset": 0 + }, + "output": { + "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "offset": 8 + } + }, + "size": 16, + "type": "struct" + }, + "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": { + "destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "type": "alias" + }, + "starkware.cairo.common.cairo_builtins.PoseidonBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.PoseidonBuiltin", + "members": { + "input": { + "cairo_type": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", + "offset": 0 + }, + "output": { + "cairo_type": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", + "offset": 3 + } + }, + "size": 6, + "type": "struct" + }, + "starkware.cairo.common.cairo_builtins.PoseidonBuiltinState": { + "destination": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", + "type": "alias" + }, + "starkware.cairo.common.cairo_builtins.SignatureBuiltin": { + "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", + "members": { + "message": { + "cairo_type": "felt", + "offset": 1 + }, + "pub_key": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.dict_access.DictAccess": { + "full_name": "starkware.cairo.common.dict_access.DictAccess", + "members": { + "key": { + "cairo_type": "felt", + "offset": 0 + }, + "new_value": { + "cairo_type": "felt", + "offset": 2 + }, + "prev_value": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.ec.EcOpBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", + "type": "alias" + }, + "starkware.cairo.common.ec.EcPoint": { + "destination": "starkware.cairo.common.ec_point.EcPoint", + "type": "alias" + }, + "starkware.cairo.common.ec.StarkCurve": { + "type": "namespace" + }, + "starkware.cairo.common.ec.StarkCurve.ALPHA": { + "type": "const", + "value": 1 + }, + "starkware.cairo.common.ec.StarkCurve.Args": { + "full_name": "starkware.cairo.common.ec.StarkCurve.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.ec.StarkCurve.BETA": { + "type": "const", + "value": -476910135076337975234679399815567221425937815956490878998147463828055613816 + }, + "starkware.cairo.common.ec.StarkCurve.GEN_X": { + "type": "const", + "value": 874739451078007766457464989774322083649278607533249481151382481072868806602 + }, + "starkware.cairo.common.ec.StarkCurve.GEN_Y": { + "type": "const", + "value": 152666792071518830868575557812948353041420400780739481342941381225525861407 + }, + "starkware.cairo.common.ec.StarkCurve.ImplicitArgs": { + "full_name": "starkware.cairo.common.ec.StarkCurve.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.ec.StarkCurve.ORDER": { + "type": "const", + "value": -96363463615509210819012598251359154898 + }, + "starkware.cairo.common.ec.StarkCurve.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.ec.is_quad_residue": { + "destination": "starkware.cairo.common.math.is_quad_residue", + "type": "alias" + }, + "starkware.cairo.common.ec_point.EcPoint": { + "full_name": "starkware.cairo.common.ec_point.EcPoint", + "members": { + "x": { + "cairo_type": "felt", + "offset": 0 + }, + "y": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.hash.HashBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", + "type": "alias" + }, + "starkware.cairo.common.hash.hash2": { + "decorators": [], + "pc": 3, + "type": "function" + }, + "starkware.cairo.common.hash.hash2.Args": { + "full_name": "starkware.cairo.common.hash.hash2.Args", + "members": { + "x": { + "cairo_type": "felt", + "offset": 0 + }, + "y": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.hash.hash2.ImplicitArgs": { + "full_name": "starkware.cairo.common.hash.hash2.ImplicitArgs", + "members": { + "hash_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.hash.hash2.Return": { + "cairo_type": "(result: felt)", + "type": "type_definition" + }, + "starkware.cairo.common.hash.hash2.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.hash_state.HashBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", + "type": "alias" + }, + "starkware.cairo.common.hash_state.HashState": { + "full_name": "starkware.cairo.common.hash_state.HashState", + "members": { + "current_hash": { + "cairo_type": "felt", + "offset": 0 + }, + "n_words": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.hash_state.get_fp_and_pc": { + "destination": "starkware.cairo.common.registers.get_fp_and_pc", + "type": "alias" + }, + "starkware.cairo.common.hash_state.hash2": { + "destination": "starkware.cairo.common.hash.hash2", + "type": "alias" + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding": { + "decorators": [], + "pc": 140, + "type": "function" + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding.Args": { + "full_name": "starkware.cairo.common.hash_state.hash_felts_no_padding.Args", + "members": { + "data_length": { + "cairo_type": "felt", + "offset": 1 + }, + "data_ptr": { + "cairo_type": "felt*", + "offset": 0 + }, + "initial_hash": { + "cairo_type": "felt", + "offset": 2 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding.ImplicitArgs": { + "full_name": "starkware.cairo.common.hash_state.hash_felts_no_padding.ImplicitArgs", + "members": { + "hash_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding.LoopLocals": { + "full_name": "starkware.cairo.common.hash_state.hash_felts_no_padding.LoopLocals", + "members": { + "cur_hash": { + "cairo_type": "felt", + "offset": 2 + }, + "data_ptr": { + "cairo_type": "felt*", + "offset": 0 + }, + "hash_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding.Return": { + "cairo_type": "(hash: felt)", + "type": "type_definition" + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding.SIZEOF_LOCALS": { + "type": "const", + "value": 1 + }, + "starkware.cairo.common.hash_state.hash_felts_no_padding.hash_loop": { + "pc": 153, + "type": "label" + }, + "starkware.cairo.common.hash_state.hash_finalize": { + "decorators": [], + "pc": 134, + "type": "function" + }, + "starkware.cairo.common.hash_state.hash_finalize.Args": { + "full_name": "starkware.cairo.common.hash_state.hash_finalize.Args", + "members": { + "hash_state_ptr": { + "cairo_type": "starkware.cairo.common.hash_state.HashState*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_finalize.ImplicitArgs": { + "full_name": "starkware.cairo.common.hash_state.hash_finalize.ImplicitArgs", + "members": { + "hash_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_finalize.Return": { + "cairo_type": "(hash: felt)", + "type": "type_definition" + }, + "starkware.cairo.common.hash_state.hash_finalize.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.hash_state.hash_init": { + "decorators": [], + "pc": 92, + "type": "function" + }, + "starkware.cairo.common.hash_state.hash_init.Args": { + "full_name": "starkware.cairo.common.hash_state.hash_init.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_init.ImplicitArgs": { + "full_name": "starkware.cairo.common.hash_state.hash_init.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_init.Return": { + "cairo_type": "(hash_state_ptr: starkware.cairo.common.hash_state.HashState*)", + "type": "type_definition" + }, + "starkware.cairo.common.hash_state.hash_init.SIZEOF_LOCALS": { + "type": "const", + "value": 2 + }, + "starkware.cairo.common.hash_state.hash_update": { + "decorators": [], + "pc": 102, + "type": "function" + }, + "starkware.cairo.common.hash_state.hash_update.Args": { + "full_name": "starkware.cairo.common.hash_state.hash_update.Args", + "members": { + "data_length": { + "cairo_type": "felt", + "offset": 2 + }, + "data_ptr": { + "cairo_type": "felt*", + "offset": 1 + }, + "hash_state_ptr": { + "cairo_type": "starkware.cairo.common.hash_state.HashState*", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_update.ImplicitArgs": { + "full_name": "starkware.cairo.common.hash_state.hash_update.ImplicitArgs", + "members": { + "hash_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_update.Return": { + "cairo_type": "(new_hash_state_ptr: starkware.cairo.common.hash_state.HashState*)", + "type": "type_definition" + }, + "starkware.cairo.common.hash_state.hash_update.SIZEOF_LOCALS": { + "type": "const", + "value": 2 + }, + "starkware.cairo.common.hash_state.hash_update_single": { + "decorators": [], + "pc": 118, + "type": "function" + }, + "starkware.cairo.common.hash_state.hash_update_single.Args": { + "full_name": "starkware.cairo.common.hash_state.hash_update_single.Args", + "members": { + "hash_state_ptr": { + "cairo_type": "starkware.cairo.common.hash_state.HashState*", + "offset": 0 + }, + "item": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_update_single.ImplicitArgs": { + "full_name": "starkware.cairo.common.hash_state.hash_update_single.ImplicitArgs", + "members": { + "hash_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.hash_state.hash_update_single.Return": { + "cairo_type": "(new_hash_state_ptr: starkware.cairo.common.hash_state.HashState*)", + "type": "type_definition" + }, + "starkware.cairo.common.hash_state.hash_update_single.SIZEOF_LOCALS": { + "type": "const", + "value": 2 + }, + "starkware.cairo.common.keccak_state.KeccakBuiltinState": { + "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", + "members": { + "s0": { + "cairo_type": "felt", + "offset": 0 + }, + "s1": { + "cairo_type": "felt", + "offset": 1 + }, + "s2": { + "cairo_type": "felt", + "offset": 2 + }, + "s3": { + "cairo_type": "felt", + "offset": 3 + }, + "s4": { + "cairo_type": "felt", + "offset": 4 + }, + "s5": { + "cairo_type": "felt", + "offset": 5 + }, + "s6": { + "cairo_type": "felt", + "offset": 6 + }, + "s7": { + "cairo_type": "felt", + "offset": 7 + } + }, + "size": 8, + "type": "struct" + }, + "starkware.cairo.common.math.FALSE": { + "destination": "starkware.cairo.common.bool.FALSE", + "type": "alias" + }, + "starkware.cairo.common.math.TRUE": { + "destination": "starkware.cairo.common.bool.TRUE", + "type": "alias" + }, + "starkware.cairo.common.math.assert_not_equal": { + "decorators": [], + "pc": 86, + "type": "function" + }, + "starkware.cairo.common.math.assert_not_equal.Args": { + "full_name": "starkware.cairo.common.math.assert_not_equal.Args", + "members": { + "a": { + "cairo_type": "felt", + "offset": 0 + }, + "b": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.math.assert_not_equal.ImplicitArgs": { + "full_name": "starkware.cairo.common.math.assert_not_equal.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.math.assert_not_equal.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "starkware.cairo.common.math.assert_not_equal.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.math.assert_not_equal.a": { + "cairo_type": "felt", + "full_name": "starkware.cairo.common.math.assert_not_equal.a", + "references": [ + { + "ap_tracking_data": { + "group": 11, + "offset": 0 + }, + "pc": 86, + "value": "[cast(fp + (-4), felt*)]" + } ], - "builtins": [ - "pedersen", - "range_check", - "ecdsa", - "bitwise" + "type": "reference" + }, + "starkware.cairo.common.math.assert_not_equal.b": { + "cairo_type": "felt", + "full_name": "starkware.cairo.common.math.assert_not_equal.b", + "references": [ + { + "ap_tracking_data": { + "group": 11, + "offset": 0 + }, + "pc": 86, + "value": "[cast(fp + (-3), felt*)]" + } ], - "compiler_version": "0.10.2", - "data": [ - "0x40780017fff7fff", - "0x1", - "0x208b7fff7fff7ffe", - "0x20780017fff7ffd", - "0x3", - "0x208b7fff7fff7ffe", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480080007fff8000", - "0x400080007ffd7fff", - "0x482480017ffd8001", - "0x1", - "0x482480017ffd8001", - "0x1", - "0xa0680017fff7ffe", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb", - "0x402a7ffc7ffd7fff", - "0x208b7fff7fff7ffe", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x484480017fff8000", - "0x2aaaaaaaaaaaab05555555555555556", - "0x48307fff7ffd8000", - "0x480280027ffb8000", - "0x480280037ffb8000", - "0x484480017fff8000", - "0x4000000000000088000000000000001", - "0x48307fff7ffd8000", - "0xa0680017fff8000", - "0xe", - "0x480680017fff8000", - "0x800000000000011000000000000000000000000000000000000000000000000", - "0x48287ffc80007fff", - "0x40307ffc7ff87fff", - "0x48297ffd80007ffc", - "0x482680017ffd8000", - "0x1", - "0x48507fff7ffe8000", - "0x40507ff97ff57fff", - "0x482680017ffb8000", - "0x4", - "0x208b7fff7fff7ffe", - "0xa0680017fff8000", - "0xc", - "0x480680017fff8000", - "0x800000000000011000000000000000000000000000000000000000000000000", - "0x48287ffd80007fff", - "0x48327fff7ffc8000", - "0x40307ffa7ff67fff", - "0x48527ffe7ffc8000", - "0x40507ff97ff57fff", - "0x482680017ffb8000", - "0x4", - "0x208b7fff7fff7ffe", - "0x40317ffd7ff97ffd", - "0x48297ffc80007ffd", - "0x48527fff7ffc8000", - "0x40507ffb7ff77fff", - "0x40780017fff7fff", - "0x2", - "0x482680017ffb8000", - "0x4", - "0x208b7fff7fff7ffe", - "0x48297ffd80007ffc", - "0x20680017fff7fff", - "0x4", - "0x402780017ffc7ffc", - "0x1", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x43616c6c436f6e7472616374", - "0x400280007ff97fff", - "0x400380017ff97ffa", - "0x400380027ff97ffb", - "0x400380037ff97ffc", - "0x400380047ff97ffd", - "0x482680017ff98000", - "0x7", - "0x480280057ff98000", - "0x480280067ff98000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x47657443616c6c657241646472657373", - "0x400280007ffd7fff", - "0x482680017ffd8000", - "0x2", - "0x480280017ffd8000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x476574436f6e747261637441646472657373", - "0x400280007ffd7fff", - "0x482680017ffd8000", - "0x2", - "0x480280017ffd8000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x53746f7261676552656164", - "0x400280007ffc7fff", - "0x400380017ffc7ffd", - "0x482680017ffc8000", - "0x3", - "0x480280027ffc8000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x53746f726167655772697465", - "0x400280007ffb7fff", - "0x400380017ffb7ffc", - "0x400380027ffb7ffd", - "0x482680017ffb8000", - "0x3", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x4765745478496e666f", - "0x400280007ffd7fff", - "0x482680017ffd8000", - "0x2", - "0x480280017ffd8000", - "0x208b7fff7fff7ffe", - "0x400380017ff97ffa", - "0x400380007ff97ffb", - "0x482680017ff98000", - "0x2", - "0x208b7fff7fff7ffe", - "0xa0680017fff8000", - "0xc", - "0x40780017fff7fff", - "0x6", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c", - "0x480680017fff8000", - "0x1", - "0x208b7fff7fff7ffe", - "0x480a7ffb7fff8000", - "0x480a7ffd7fff8000", - "0x480a7ffc7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1", - "0x480680017fff8000", - "0x0", - "0x208b7fff7fff7ffe", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x480680017fff8000", - "0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f", - "0x208b7fff7fff7ffe", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", - "0x480a7ffb7fff8000", - "0x48127ffe7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6", - "0x48127ffe7fff8000", - "0x48127ff57fff8000", - "0x48127ff57fff8000", - "0x48127ffc7fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", - "0x480a7ffa7fff8000", - "0x48127ffe7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0", - "0x48127ff67fff8000", - "0x48127ff67fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", - "0x208b7fff7fff7ffe", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa4", - "0x48127ffe7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a", - "0x40127fff7fff7ff9", - "0x48127ffe7fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a", - "0x20680017fff7fff", - "0x8", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480680017fff8000", - "0x1", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffff59942a8c", - "0x20680017fff7fff", - "0x8", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480680017fff8000", - "0x1", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480680017fff8000", - "0x0", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbf", - "0x208b7fff7fff7ffe", - "0x480a7ff77fff8000", - "0x480a7ff87fff8000", - "0x480a7ffa7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffac", - "0x480a7ff97fff8000", - "0x480a7ffb7fff8000", - "0x48127ffd7fff8000", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff87", - "0x48127ff47fff8000", - "0x48127ff47fff8000", - "0x48127ffd7fff8000", - "0x48127ff37fff8000", - "0x480680017fff8000", - "0x1", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x3", - "0x480a7ff57fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff74", - "0x480a7ff97fff8000", - "0x480680017fff8000", - "0x1", - "0x480080007ffd8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a", - "0x480680017fff8000", - "0x1", - "0x40127fff7fff7ffe", - "0x40137ffd7fff8000", - "0x48127fdc7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49", - "0x400680017fff7fff", - "0x0", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef", - "0x40137fff7fff8001", - "0x48127ffb7fff8000", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffd7fff8000", - "0x480a80017fff8000", - "0x1104800180018000", - "0x35", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee5", - "0x40137fff7fff8002", - "0x48127ffc7fff8000", - "0x480a7ffa7fff8000", - "0x480a80017fff8000", - "0x480a80027fff8000", - "0x1104800180018000", - "0xa", - "0x48127ffe7fff8000", - "0x480a7ff67fff8000", - "0x480a7ff77fff8000", - "0x480a7ff87fff8000", - "0x480a80007fff8000", - "0x48127ffa7fff8000", - "0x480a80027fff8000", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x3", - "0x20780017fff7ffb", - "0x6", - "0x480a7ffa7fff8000", - "0x480680017fff8000", - "0x0", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x480280007ffc8000", - "0x480280017ffc8000", - "0x480280027ffc8000", - "0x480280037ffc8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11", - "0x40137ffe7fff8000", - "0x40137fff7fff8001", - "0x40137ffd7fff8002", - "0x480a7ffd7fff8000", - "0x480a80017fff8000", - "0x480a80007fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2", - "0x480a80027fff8000", - "0x482680017ffb8000", - "0x800000000000011000000000000000000000000000000000000000000000000", - "0x482680017ffc8000", - "0x4", - "0x482a80007ffd8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", - "0x48127ffe7fff8000", - "0x482880007ffe8000", - "0x208b7fff7fff7ffe", - "0x20780017fff7ffa", - "0x4", - "0x480a7ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480280007ffb8000", - "0x400280007ffd7fff", - "0x480280017ffb8000", - "0x400280017ffd7fff", - "0x480280037ffb8000", - "0x400280027ffd7fff", - "0x480280027ffb8000", - "0x48327fff7ffc8000", - "0x400280037ffd7fff", - "0x480a7ff97fff8000", - "0x482680017ffa8000", - "0x800000000000011000000000000000000000000000000000000000000000000", - "0x482680017ffb8000", - "0x4", - "0x480a7ffc7fff8000", - "0x482680017ffd8000", - "0x4", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x1", - "0x402a7ffd7ffc7fff", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", - "0x40780017fff7fff", - "0x1", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", - "0x480280037ffb8000", - "0x480280047ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3e", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x1", - "0x4003800080007ffc", - "0x4826800180008000", - "0x1", - "0x480a7ffd7fff8000", - "0x4828800080007ffe", - "0x480a80007fff8000", - "0x208b7fff7fff7ffe", - "0x402b7ffd7ffc7ffd", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", - "0x48127ffe7fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", - "0x48127ff47fff8000", - "0x48127ff47fff8000", - "0x48127ffb7fff8000", - "0x480280037ffb8000", - "0x480280047ffb8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x1", - "0x4003800080007ffc", - "0x4826800180008000", - "0x1", - "0x480a7ffd7fff8000", - "0x4828800080007ffe", - "0x480a80007fff8000", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x1", - "0x402a7ffd7ffc7fff", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea", - "0x48127ffe7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", - "0x48127ff47fff8000", - "0x48127ff47fff8000", - "0x48127ffb7fff8000", - "0x480280037ffb8000", - "0x480280047ffb8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff19", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x1", - "0x402a7ffd7ffc7fff", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", - "0x40780017fff7fff", - "0x1", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", - "0x48127ffc7fff8000", - "0x480280037ffb8000", - "0x480280047ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ff77fff8000", - "0x480a7ff87fff8000", - "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x1", - "0x4003800080007ffc", - "0x4826800180008000", - "0x1", - "0x480a7ffd7fff8000", - "0x4828800080007ffe", - "0x480a80007fff8000", - "0x208b7fff7fff7ffe", - "0x480280027ffb8000", - "0x480280017ffd8000", - "0x400080007ffe7fff", - "0x482680017ffd8000", - "0x2", - "0x480280017ffd8000", - "0x48307fff7ffe8000", - "0x402a7ffd7ffc7fff", - "0x480280027ffb8000", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280037ffb8000", - "0x482480017ffc8000", - "0x1", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x482680017ffd8000", - "0x2", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc", - "0x48127ffe7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3", - "0x48127ff37fff8000", - "0x48127ff37fff8000", - "0x48127ffb7fff8000", - "0x48127ff27fff8000", - "0x480280047ffb8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ff67fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe61", - "0x48127ffe7fff8000", - "0x480a7ff77fff8000", - "0x480a7ff87fff8000", - "0x480a7ff97fff8000", - "0x480080057ffb8000", - "0x480080037ffa8000", - "0x480080047ff98000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecf", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x400080007ffe7fff", - "0x482680017ffd8000", - "0x1", - "0x480280007ffd8000", - "0x484480017fff8000", - "0x4", - "0x48307fff7ffd8000", - "0x480280027ffb8000", - "0x480080007ffe8000", - "0x400080017ffe7fff", - "0x482480017ffd8000", - "0x1", - "0x480080007ffc8000", - "0x48307fff7ffe8000", - "0x402a7ffd7ffc7fff", - "0x480280027ffb8000", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280037ffb8000", - "0x482480017ffc8000", - "0x2", - "0x480280007ffd8000", - "0x482680017ffd8000", - "0x1", - "0x480080007ff38000", - "0x482480017ff28000", - "0x1", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd3", - "0x40780017fff7fff", - "0x1", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", - "0x480280047ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ff97fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe26", - "0x48127ffe7fff8000", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480080057ffb8000", - "0x480080037ffa8000", - "0x480080047ff98000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe94", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x1", - "0x402a7ffd7ffc7fff", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280037ffb8000", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8", - "0x40780017fff7fff", - "0x1", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", - "0x480280047ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ff77fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe00", - "0x48127ffe7fff8000", - "0x480a7ff87fff8000", - "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", - "0x480080057ffb8000", - "0x480080037ffa8000", - "0x480080047ff98000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6e", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x3", - "0x402a7ffd7ffc7fff", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280037ffb8000", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x480280027ffd8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", - "0x40780017fff7fff", - "0x1", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffc7fff8000", - "0x48127ffa7fff8000", - "0x480280047ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ff57fff8000", - "0x480a7ff67fff8000", - "0x480a7ff77fff8000", - "0x480a7ff87fff8000", - "0x480a7ff97fff8000", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5a", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x3", - "0x4003800080007ffb", - "0x400380007ffd7ffb", - "0x402780017ffd8001", - "0x1", - "0x4826800180008000", - "0x1", - "0x40297ffb7fff8002", - "0x4826800180008000", - "0x1", - "0x480a7ffc7fff8000", - "0x480a7ffb7fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f", - "0x480a80017fff8000", - "0x4829800080008002", - "0x480a80007fff8000", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x4", - "0x480280027ffb8000", - "0x480280007ffd8000", - "0x400080007ffe7fff", - "0x482680017ffd8000", - "0x1", - "0x480280007ffd8000", - "0x484480017fff8000", - "0x4", - "0x48307fff7ffd8000", - "0x480280027ffb8000", - "0x480080007ffe8000", - "0x400080017ffe7fff", - "0x482480017ffd8000", - "0x1", - "0x480080007ffc8000", - "0x48307fff7ffe8000", - "0x402a7ffd7ffc7fff", - "0x480280027ffb8000", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280037ffb8000", - "0x480280047ffb8000", - "0x482480017ffb8000", - "0x2", - "0x480280007ffd8000", - "0x482680017ffd8000", - "0x1", - "0x480080007ff28000", - "0x482480017ff18000", - "0x1", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2", - "0x40137ff97fff8000", - "0x40137ffa7fff8001", - "0x40137ffb7fff8002", - "0x40137ffc7fff8003", - "0x48127ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7", - "0x480a80007fff8000", - "0x480a80017fff8000", - "0x48127ffb7fff8000", - "0x480a80027fff8000", - "0x480a80037fff8000", - "0x48127ff97fff8000", - "0x48127ff97fff8000", - "0x208b7fff7fff7ffe" + "type": "reference" + }, + "starkware.cairo.common.memcpy.memcpy": { + "decorators": [], + "pc": 9, + "type": "function" + }, + "starkware.cairo.common.memcpy.memcpy.Args": { + "full_name": "starkware.cairo.common.memcpy.memcpy.Args", + "members": { + "dst": { + "cairo_type": "felt*", + "offset": 0 + }, + "len": { + "cairo_type": "felt", + "offset": 2 + }, + "src": { + "cairo_type": "felt*", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.memcpy.memcpy.ImplicitArgs": { + "full_name": "starkware.cairo.common.memcpy.memcpy.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.common.memcpy.memcpy.LoopFrame": { + "full_name": "starkware.cairo.common.memcpy.memcpy.LoopFrame", + "members": { + "dst": { + "cairo_type": "felt*", + "offset": 0 + }, + "src": { + "cairo_type": "felt*", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.cairo.common.memcpy.memcpy.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.memcpy.memcpy.continue_copying": { + "cairo_type": "felt", + "full_name": "starkware.cairo.common.memcpy.memcpy.continue_copying", + "references": [ + { + "ap_tracking_data": { + "group": 2, + "offset": 3 + }, + "pc": 16, + "value": "[cast(ap, felt*)]" + } ], - "hints": { - "0": [ - { - "accessible_scopes": [ - "starkware.cairo.common.alloc", - "starkware.cairo.common.alloc.alloc" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 0 - }, - "reference_ids": {} - } - } - ], - "6": [ - { - "accessible_scopes": [ - "starkware.cairo.common.memcpy", - "starkware.cairo.common.memcpy.memcpy" - ], - "code": "vm_enter_scope({'n': ids.len})", - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 0 - }, - "reference_ids": { - "starkware.cairo.common.memcpy.memcpy.len": 0 - } - } - } - ], - "14": [ - { - "accessible_scopes": [ - "starkware.cairo.common.memcpy", - "starkware.cairo.common.memcpy.memcpy" - ], - "code": "n -= 1\nids.continue_copying = 1 if n > 0 else 0", - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 5 - }, - "reference_ids": { - "starkware.cairo.common.memcpy.memcpy.continue_copying": 1 - } - } - } - ], - "17": [ - { - "accessible_scopes": [ - "starkware.cairo.common.memcpy", - "starkware.cairo.common.memcpy.memcpy" - ], - "code": "vm_exit_scope()", - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 6 - }, - "reference_ids": {} - } - } - ], - "18": [ - { - "accessible_scopes": [ - "starkware.cairo.common.math", - "starkware.cairo.common.math.assert_le_felt" - ], - "code": "import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))", - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 0 - }, - "reference_ids": { - "starkware.cairo.common.math.assert_le_felt.a": 2, - "starkware.cairo.common.math.assert_le_felt.b": 3, - "starkware.cairo.common.math.assert_le_felt.range_check_ptr": 4 - } - } - } - ], - "28": [ - { - "accessible_scopes": [ - "starkware.cairo.common.math", - "starkware.cairo.common.math.assert_le_felt" - ], - "code": "memory[ap] = 1 if excluded != 0 else 0", - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 8 - }, - "reference_ids": {} - } - } - ], - "42": [ - { - "accessible_scopes": [ - "starkware.cairo.common.math", - "starkware.cairo.common.math.assert_le_felt" - ], - "code": "memory[ap] = 1 if excluded != 1 else 0", - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 9 - }, - "reference_ids": {} - } - } - ], - "54": [ - { - "accessible_scopes": [ - "starkware.cairo.common.math", - "starkware.cairo.common.math.assert_le_felt" - ], - "code": "assert excluded == 2", - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 10 - }, - "reference_ids": {} - } - } - ], - "63": [ - { - "accessible_scopes": [ - "starkware.cairo.common.math", - "starkware.cairo.common.math.assert_lt_felt" - ], - "code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'", - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 0 - }, - "reference_ids": { - "starkware.cairo.common.math.assert_lt_felt.a": 5, - "starkware.cairo.common.math.assert_lt_felt.b": 6 - } - } - } - ], - "81": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.call_contract" - ], - "code": "syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 4, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.call_contract.syscall_ptr": 7 - } - } - } - ], - "89": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.get_caller_address" - ], - "code": "syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": 8 - } - } - } - ], - "96": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.get_contract_address" - ], - "code": "syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 6, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": 9 - } - } - } - ], - "104": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.storage_read" - ], - "code": "syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": 10 - } - } - } - ], - "113": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.storage_write" - ], - "code": "syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 8, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": 11 - } - } - } - ], - "119": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.get_tx_info" - ], - "code": "syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": 12 - } - } - } - ], - "123": [ - { - "accessible_scopes": [ - "starkware.cairo.common.signature", - "starkware.cairo.common.signature.verify_ecdsa_signature" - ], - "code": "ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))", - "flow_tracking_data": { - "ap_tracking": { - "group": 10, - "offset": 0 - }, - "reference_ids": { - "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": 15, - "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": 13, - "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": 14 - } - } - } - ], - "128": [ - { - "accessible_scopes": [ - "starkware.cairo.common.math_cmp", - "starkware.cairo.common.math_cmp.is_le_felt" - ], - "code": "memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1", - "flow_tracking_data": { - "ap_tracking": { - "group": 11, - "offset": 0 - }, - "reference_ids": { - "starkware.cairo.common.math_cmp.is_le_felt.a": 16, - "starkware.cairo.common.math_cmp.is_le_felt.b": 17 - } - } - } - ], - "375": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.constructor" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 30, - "offset": 35 - }, - "reference_ids": {} - } - } - ], - "392": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.getPublicKey_encode_return" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 32, - "offset": 0 - }, - "reference_ids": {} - } - } - ], - "425": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.supportsInterface_encode_return" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 36, - "offset": 0 - }, - "reference_ids": {} - } - } - ], - "470": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.setPublicKey" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 40, - "offset": 50 - }, - "reference_ids": {} - } - } - ], - "491": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.isValidSignature_encode_return" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 42, - "offset": 0 - }, - "reference_ids": {} - } - } - ], - "579": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__validate__" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 45, - "offset": 77 - }, - "reference_ids": {} - } - } - ], - "617": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__validate_declare__" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 47, - "offset": 63 - }, - "reference_ids": {} - } - } - ], - "657": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__validate_deploy__" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 49, - "offset": 65 - }, - "reference_ids": {} - } - } - ], - "680": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__execute___encode_return" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 52, - "offset": 0 - }, - "reference_ids": {} - } - } - ] - }, - "identifiers": { - "__main__.Account": { - "destination": "openzeppelin.account.library.Account", - "type": "alias" - }, - "__main__.AccountCallArray": { - "destination": "openzeppelin.account.library.AccountCallArray", - "type": "alias" - }, - "__main__.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "__main__.HashBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "type": "alias" - }, - "__main__.SignatureBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", - "type": "alias" - }, - "__main__.__execute__": { - "decorators": [ - "external" - ], - "pc": 668, - "type": "function" - }, - "__main__.__execute__.Args": { - "full_name": "__main__.__execute__.Args", - "members": { - "call_array": { - "cairo_type": "openzeppelin.account.library.AccountCallArray*", - "offset": 1 - }, - "call_array_len": { - "cairo_type": "felt", - "offset": 0 - }, - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_len": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__execute__.ImplicitArgs": { - "full_name": "__main__.__execute__.ImplicitArgs", - "members": { - "bitwise_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin*", - "offset": 3 - }, - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 4 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "__main__.__execute__.Return": { - "cairo_type": "(response_len: felt, response: felt*)", - "type": "type_definition" - }, - "__main__.__execute__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.__validate__": { - "decorators": [ - "external" - ], - "pc": 531, - "type": "function" - }, - "__main__.__validate__.Args": { - "full_name": "__main__.__validate__.Args", - "members": { - "call_array": { - "cairo_type": "openzeppelin.account.library.AccountCallArray*", - "offset": 1 - }, - "call_array_len": { - "cairo_type": "felt", - "offset": 0 - }, - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_len": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__validate__.ImplicitArgs": { - "full_name": "__main__.__validate__.ImplicitArgs", - "members": { - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__validate__.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.__validate__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.__validate_declare__": { - "decorators": [ - "external" - ], - "pc": 590, - "type": "function" - }, - "__main__.__validate_declare__.Args": { - "full_name": "__main__.__validate_declare__.Args", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.__validate_declare__.ImplicitArgs": { - "full_name": "__main__.__validate_declare__.ImplicitArgs", - "members": { - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__validate_declare__.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.__validate_declare__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.__validate_deploy__": { - "decorators": [ - "external" - ], - "pc": 628, - "type": "function" - }, - "__main__.__validate_deploy__.Args": { - "full_name": "__main__.__validate_deploy__.Args", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 0 - }, - "publicKey": { - "cairo_type": "felt", - "offset": 2 - }, - "salt": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.__validate_deploy__.ImplicitArgs": { - "full_name": "__main__.__validate_deploy__.ImplicitArgs", - "members": { - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__validate_deploy__.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.__validate_deploy__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.constructor": { - "decorators": [ - "constructor" - ], - "pc": 359, - "type": "function" - }, - "__main__.constructor.Args": { - "full_name": "__main__.constructor.Args", - "members": { - "publicKey": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.constructor.ImplicitArgs": { - "full_name": "__main__.constructor.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.constructor.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.constructor.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.getPublicKey": { - "decorators": [ - "view" - ], - "pc": 386, - "type": "function" - }, - "__main__.getPublicKey.Args": { - "full_name": "__main__.getPublicKey.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__main__.getPublicKey.ImplicitArgs": { - "full_name": "__main__.getPublicKey.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.getPublicKey.Return": { - "cairo_type": "(publicKey: felt)", - "type": "type_definition" - }, - "__main__.getPublicKey.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.get_tx_info": { - "destination": "starkware.starknet.common.syscalls.get_tx_info", - "type": "alias" - }, - "__main__.isValidSignature": { - "decorators": [ - "view" - ], - "pc": 481, - "type": "function" - }, - "__main__.isValidSignature.Args": { - "full_name": "__main__.isValidSignature.Args", - "members": { - "hash": { - "cairo_type": "felt", - "offset": 0 - }, - "signature": { - "cairo_type": "felt*", - "offset": 2 - }, - "signature_len": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.isValidSignature.ImplicitArgs": { - "full_name": "__main__.isValidSignature.ImplicitArgs", - "members": { - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.isValidSignature.Return": { - "cairo_type": "(isValid: felt)", - "type": "type_definition" - }, - "__main__.isValidSignature.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.setPublicKey": { - "decorators": [ - "external" - ], - "pc": 454, - "type": "function" - }, - "__main__.setPublicKey.Args": { - "full_name": "__main__.setPublicKey.Args", - "members": { - "newPublicKey": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.setPublicKey.ImplicitArgs": { - "full_name": "__main__.setPublicKey.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.setPublicKey.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.setPublicKey.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.supportsInterface": { - "decorators": [ - "view" - ], - "pc": 418, - "type": "function" - }, - "__main__.supportsInterface.Args": { - "full_name": "__main__.supportsInterface.Args", - "members": { - "interfaceId": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.supportsInterface.ImplicitArgs": { - "full_name": "__main__.supportsInterface.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.supportsInterface.Return": { - "cairo_type": "(success: felt)", - "type": "type_definition" - }, - "__main__.supportsInterface.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__execute__": { - "decorators": [ - "external" - ], - "pc": 699, - "type": "function" - }, - "__wrappers__.__execute__.Args": { - "full_name": "__wrappers__.__execute__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__execute__.ImplicitArgs": { - "full_name": "__wrappers__.__execute__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__execute__.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: starkware.cairo.common.cairo_builtins.BitwiseBuiltin*, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__execute__.SIZEOF_LOCALS": { - "type": "const", - "value": 4 - }, - "__wrappers__.__execute__.__wrapped_func": { - "destination": "__main__.__execute__", - "type": "alias" - }, - "__wrappers__.__execute___encode_return": { - "decorators": [], - "pc": 680, - "type": "function" - }, - "__wrappers__.__execute___encode_return.Args": { - "full_name": "__wrappers__.__execute___encode_return.Args", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "ret_value": { - "cairo_type": "(response_len: felt, response: felt*)", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "__wrappers__.__execute___encode_return.ImplicitArgs": { - "full_name": "__wrappers__.__execute___encode_return.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__execute___encode_return.Return": { - "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", - "type": "type_definition" - }, - "__wrappers__.__execute___encode_return.SIZEOF_LOCALS": { - "type": "const", - "value": 3 - }, - "__wrappers__.__execute___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.__validate__": { - "decorators": [ - "external" - ], - "pc": 548, - "type": "function" - }, - "__wrappers__.__validate__.Args": { - "full_name": "__wrappers__.__validate__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate__.ImplicitArgs": { - "full_name": "__wrappers__.__validate__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate__.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__validate__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__validate__.__wrapped_func": { - "destination": "__main__.__validate__", - "type": "alias" - }, - "__wrappers__.__validate___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.__validate_declare__": { - "decorators": [ - "external" - ], - "pc": 607, - "type": "function" - }, - "__wrappers__.__validate_declare__.Args": { - "full_name": "__wrappers__.__validate_declare__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_declare__.ImplicitArgs": { - "full_name": "__wrappers__.__validate_declare__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_declare__.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__validate_declare__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__validate_declare__.__wrapped_func": { - "destination": "__main__.__validate_declare__", - "type": "alias" - }, - "__wrappers__.__validate_declare___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.__validate_deploy__": { - "decorators": [ - "external" - ], - "pc": 645, - "type": "function" - }, - "__wrappers__.__validate_deploy__.Args": { - "full_name": "__wrappers__.__validate_deploy__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_deploy__.ImplicitArgs": { - "full_name": "__wrappers__.__validate_deploy__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_deploy__.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__validate_deploy__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__validate_deploy__.__wrapped_func": { - "destination": "__main__.__validate_deploy__", - "type": "alias" - }, - "__wrappers__.__validate_deploy___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.constructor": { - "decorators": [ - "constructor" - ], - "pc": 366, - "type": "function" - }, - "__wrappers__.constructor.Args": { - "full_name": "__wrappers__.constructor.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.constructor.ImplicitArgs": { - "full_name": "__wrappers__.constructor.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.constructor.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.constructor.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.constructor.__wrapped_func": { - "destination": "__main__.constructor", - "type": "alias" - }, - "__wrappers__.constructor_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.getPublicKey": { - "decorators": [ - "view" - ], - "pc": 401, - "type": "function" - }, - "__wrappers__.getPublicKey.Args": { - "full_name": "__wrappers__.getPublicKey.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.getPublicKey.ImplicitArgs": { - "full_name": "__wrappers__.getPublicKey.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.getPublicKey.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.getPublicKey.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.getPublicKey.__wrapped_func": { - "destination": "__main__.getPublicKey", - "type": "alias" - }, - "__wrappers__.getPublicKey_encode_return": { - "decorators": [], - "pc": 392, - "type": "function" - }, - "__wrappers__.getPublicKey_encode_return.Args": { - "full_name": "__wrappers__.getPublicKey_encode_return.Args", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 1 - }, - "ret_value": { - "cairo_type": "(publicKey: felt)", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "__wrappers__.getPublicKey_encode_return.ImplicitArgs": { - "full_name": "__wrappers__.getPublicKey_encode_return.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.getPublicKey_encode_return.Return": { - "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", - "type": "type_definition" - }, - "__wrappers__.getPublicKey_encode_return.SIZEOF_LOCALS": { - "type": "const", - "value": 1 - }, - "__wrappers__.getPublicKey_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.isValidSignature": { - "decorators": [ - "view" - ], - "pc": 500, - "type": "function" - }, - "__wrappers__.isValidSignature.Args": { - "full_name": "__wrappers__.isValidSignature.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.isValidSignature.ImplicitArgs": { - "full_name": "__wrappers__.isValidSignature.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.isValidSignature.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.isValidSignature.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.isValidSignature.__wrapped_func": { - "destination": "__main__.isValidSignature", - "type": "alias" - }, - "__wrappers__.isValidSignature_encode_return": { - "decorators": [], - "pc": 491, - "type": "function" - }, - "__wrappers__.isValidSignature_encode_return.Args": { - "full_name": "__wrappers__.isValidSignature_encode_return.Args", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 1 - }, - "ret_value": { - "cairo_type": "(isValid: felt)", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "__wrappers__.isValidSignature_encode_return.ImplicitArgs": { - "full_name": "__wrappers__.isValidSignature_encode_return.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.isValidSignature_encode_return.Return": { - "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", - "type": "type_definition" - }, - "__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS": { - "type": "const", - "value": 1 - }, - "__wrappers__.isValidSignature_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.setPublicKey": { - "decorators": [ - "external" - ], - "pc": 461, - "type": "function" - }, - "__wrappers__.setPublicKey.Args": { - "full_name": "__wrappers__.setPublicKey.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.setPublicKey.ImplicitArgs": { - "full_name": "__wrappers__.setPublicKey.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.setPublicKey.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.setPublicKey.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.setPublicKey.__wrapped_func": { - "destination": "__main__.setPublicKey", - "type": "alias" - }, - "__wrappers__.setPublicKey_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.supportsInterface": { - "decorators": [ - "view" - ], - "pc": 434, - "type": "function" - }, - "__wrappers__.supportsInterface.Args": { - "full_name": "__wrappers__.supportsInterface.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.supportsInterface.ImplicitArgs": { - "full_name": "__wrappers__.supportsInterface.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.supportsInterface.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.supportsInterface.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.supportsInterface.__wrapped_func": { - "destination": "__main__.supportsInterface", - "type": "alias" - }, - "__wrappers__.supportsInterface_encode_return": { - "decorators": [], - "pc": 425, - "type": "function" - }, - "__wrappers__.supportsInterface_encode_return.Args": { - "full_name": "__wrappers__.supportsInterface_encode_return.Args", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 1 - }, - "ret_value": { - "cairo_type": "(success: felt)", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "__wrappers__.supportsInterface_encode_return.ImplicitArgs": { - "full_name": "__wrappers__.supportsInterface_encode_return.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.supportsInterface_encode_return.Return": { - "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", - "type": "type_definition" - }, - "__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS": { - "type": "const", - "value": 1 - }, - "__wrappers__.supportsInterface_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "openzeppelin.account.library.Account": { - "type": "namespace" - }, - "openzeppelin.account.library.Account.Args": { - "full_name": "openzeppelin.account.library.Account.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account._execute_list": { - "decorators": [], - "pc": 301, - "type": "function" - }, - "openzeppelin.account.library.Account._execute_list.Args": { - "full_name": "openzeppelin.account.library.Account._execute_list.Args", - "members": { - "calls": { - "cairo_type": "openzeppelin.account.library.Call*", - "offset": 1 - }, - "calls_len": { - "cairo_type": "felt", - "offset": 0 - }, - "response": { - "cairo_type": "felt*", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account._execute_list.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account._execute_list.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account._execute_list.Return": { - "cairo_type": "(response_len: felt)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account._execute_list.SIZEOF_LOCALS": { - "type": "const", - "value": 3 - }, - "openzeppelin.account.library.Account._from_call_array_to_call": { - "decorators": [], - "pc": 335, - "type": "function" - }, - "openzeppelin.account.library.Account._from_call_array_to_call.Args": { - "full_name": "openzeppelin.account.library.Account._from_call_array_to_call.Args", - "members": { - "call_array": { - "cairo_type": "openzeppelin.account.library.AccountCallArray*", - "offset": 1 - }, - "call_array_len": { - "cairo_type": "felt", - "offset": 0 - }, - "calldata": { - "cairo_type": "felt*", - "offset": 2 - }, - "calls": { - "cairo_type": "openzeppelin.account.library.Call*", - "offset": 3 - } - }, - "size": 4, - "type": "struct" - }, - "openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account._from_call_array_to_call.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account._from_call_array_to_call.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account.assert_only_self": { - "decorators": [], - "pc": 185, - "type": "function" - }, - "openzeppelin.account.library.Account.assert_only_self.Args": { - "full_name": "openzeppelin.account.library.Account.assert_only_self.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account.assert_only_self.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.assert_only_self.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account.assert_only_self.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.assert_only_self.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account.execute": { - "decorators": [], - "pc": 254, - "type": "function" - }, - "openzeppelin.account.library.Account.execute.Args": { - "full_name": "openzeppelin.account.library.Account.execute.Args", - "members": { - "call_array": { - "cairo_type": "openzeppelin.account.library.AccountCallArray*", - "offset": 1 - }, - "call_array_len": { - "cairo_type": "felt", - "offset": 0 - }, - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_len": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 4, - "type": "struct" - }, - "openzeppelin.account.library.Account.execute.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.execute.ImplicitArgs", - "members": { - "bitwise_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin*", - "offset": 3 - }, - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 4 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "openzeppelin.account.library.Account.execute.Return": { - "cairo_type": "(response_len: felt, response: felt*)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.execute.SIZEOF_LOCALS": { - "type": "const", - "value": 3 - }, - "openzeppelin.account.library.Account.get_public_key": { - "decorators": [], - "pc": 194, - "type": "function" - }, - "openzeppelin.account.library.Account.get_public_key.Args": { - "full_name": "openzeppelin.account.library.Account.get_public_key.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account.get_public_key.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.get_public_key.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account.get_public_key.Return": { - "cairo_type": "(public_key: felt)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.get_public_key.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account.initializer": { - "decorators": [], - "pc": 178, - "type": "function" - }, - "openzeppelin.account.library.Account.initializer.Args": { - "full_name": "openzeppelin.account.library.Account.initializer.Args", - "members": { - "_public_key": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account.initializer.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.initializer.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account.initializer.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.initializer.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account.is_valid_signature": { - "decorators": [], - "pc": 235, - "type": "function" - }, - "openzeppelin.account.library.Account.is_valid_signature.Args": { - "full_name": "openzeppelin.account.library.Account.is_valid_signature.Args", - "members": { - "hash": { - "cairo_type": "felt", - "offset": 0 - }, - "signature": { - "cairo_type": "felt*", - "offset": 2 - }, - "signature_len": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs", - "members": { - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 2 - }, - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 3 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "openzeppelin.account.library.Account.is_valid_signature.Return": { - "cairo_type": "(is_valid: felt)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.is_valid_signature.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account.set_public_key": { - "decorators": [], - "pc": 226, - "type": "function" - }, - "openzeppelin.account.library.Account.set_public_key.Args": { - "full_name": "openzeppelin.account.library.Account.set_public_key.Args", - "members": { - "new_public_key": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account.set_public_key.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.set_public_key.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account.set_public_key.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.set_public_key.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account.supports_interface": { - "decorators": [], - "pc": 200, - "type": "function" - }, - "openzeppelin.account.library.Account.supports_interface.Args": { - "full_name": "openzeppelin.account.library.Account.supports_interface.Args", - "members": { - "interface_id": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account.supports_interface.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account.supports_interface.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account.supports_interface.Return": { - "cairo_type": "(success: felt)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account.supports_interface.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.AccountCallArray": { - "full_name": "openzeppelin.account.library.AccountCallArray", - "members": { - "data_len": { - "cairo_type": "felt", - "offset": 3 - }, - "data_offset": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 1 - }, - "to": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key": { - "type": "namespace" - }, - "openzeppelin.account.library.Account_public_key.Args": { - "full_name": "openzeppelin.account.library.Account_public_key.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.HashBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "type": "alias" - }, - "openzeppelin.account.library.Account_public_key.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account_public_key.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account_public_key.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account_public_key.addr": { - "decorators": [], - "pc": 148, - "type": "function" - }, - "openzeppelin.account.library.Account_public_key.addr.Args": { - "full_name": "openzeppelin.account.library.Account_public_key.addr.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.addr.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account_public_key.addr.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 0 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.addr.Return": { - "cairo_type": "(res: felt)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account_public_key.addr.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account_public_key.hash2": { - "destination": "starkware.cairo.common.hash.hash2", - "type": "alias" - }, - "openzeppelin.account.library.Account_public_key.normalize_address": { - "destination": "starkware.starknet.common.storage.normalize_address", - "type": "alias" - }, - "openzeppelin.account.library.Account_public_key.read": { - "decorators": [], - "pc": 153, - "type": "function" - }, - "openzeppelin.account.library.Account_public_key.read.Args": { - "full_name": "openzeppelin.account.library.Account_public_key.read.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.read.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account_public_key.read.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.read.Return": { - "cairo_type": "(public_key: felt)", - "type": "type_definition" - }, - "openzeppelin.account.library.Account_public_key.read.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.Account_public_key.storage_read": { - "destination": "starkware.starknet.common.syscalls.storage_read", - "type": "alias" - }, - "openzeppelin.account.library.Account_public_key.storage_write": { - "destination": "starkware.starknet.common.syscalls.storage_write", - "type": "alias" - }, - "openzeppelin.account.library.Account_public_key.write": { - "decorators": [], - "pc": 166, - "type": "function" - }, - "openzeppelin.account.library.Account_public_key.write.Args": { - "full_name": "openzeppelin.account.library.Account_public_key.write.Args", - "members": { - "value": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.write.ImplicitArgs": { - "full_name": "openzeppelin.account.library.Account_public_key.write.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "openzeppelin.account.library.Account_public_key.write.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "openzeppelin.account.library.Account_public_key.write.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "openzeppelin.account.library.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "openzeppelin.account.library.Call": { - "full_name": "openzeppelin.account.library.Call", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_len": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 1 - }, - "to": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 4, - "type": "struct" - }, - "openzeppelin.account.library.FALSE": { - "destination": "starkware.cairo.common.bool.FALSE", - "type": "alias" - }, - "openzeppelin.account.library.HashBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "type": "alias" - }, - "openzeppelin.account.library.IACCOUNT_ID": { - "destination": "openzeppelin.utils.constants.library.IACCOUNT_ID", - "type": "alias" - }, - "openzeppelin.account.library.IERC165_ID": { - "destination": "openzeppelin.utils.constants.library.IERC165_ID", - "type": "alias" - }, - "openzeppelin.account.library.SignatureBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", - "type": "alias" - }, - "openzeppelin.account.library.TRANSACTION_VERSION": { - "destination": "openzeppelin.utils.constants.library.TRANSACTION_VERSION", - "type": "alias" - }, - "openzeppelin.account.library.TRUE": { - "destination": "starkware.cairo.common.bool.TRUE", - "type": "alias" - }, - "openzeppelin.account.library.Uint256": { - "destination": "starkware.cairo.common.uint256.Uint256", - "type": "alias" - }, - "openzeppelin.account.library.alloc": { - "destination": "starkware.cairo.common.alloc.alloc", - "type": "alias" - }, - "openzeppelin.account.library.call_contract": { - "destination": "starkware.starknet.common.syscalls.call_contract", - "type": "alias" - }, - "openzeppelin.account.library.get_caller_address": { - "destination": "starkware.starknet.common.syscalls.get_caller_address", - "type": "alias" - }, - "openzeppelin.account.library.get_contract_address": { - "destination": "starkware.starknet.common.syscalls.get_contract_address", - "type": "alias" - }, - "openzeppelin.account.library.get_fp_and_pc": { - "destination": "starkware.cairo.common.registers.get_fp_and_pc", - "type": "alias" - }, - "openzeppelin.account.library.get_tx_info": { - "destination": "starkware.starknet.common.syscalls.get_tx_info", - "type": "alias" - }, - "openzeppelin.account.library.is_le_felt": { - "destination": "starkware.cairo.common.math_cmp.is_le_felt", - "type": "alias" - }, - "openzeppelin.account.library.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "openzeppelin.account.library.split_felt": { - "destination": "starkware.cairo.common.math.split_felt", - "type": "alias" - }, - "openzeppelin.account.library.verify_ecdsa_signature": { - "destination": "starkware.cairo.common.signature.verify_ecdsa_signature", - "type": "alias" - }, - "openzeppelin.account.library.verify_eth_signature_uint256": { - "destination": "starkware.cairo.common.cairo_secp.signature.verify_eth_signature_uint256", - "type": "alias" - }, - "openzeppelin.utils.constants.library.DEFAULT_ADMIN_ROLE": { - "type": "const", - "value": 0 - }, - "openzeppelin.utils.constants.library.IACCESSCONTROL_ID": { - "type": "const", - "value": 2036718347 - }, - "openzeppelin.utils.constants.library.IACCOUNT_ID": { - "type": "const", - "value": 2792084853 - }, - "openzeppelin.utils.constants.library.IERC165_ID": { - "type": "const", - "value": 33540519 - }, - "openzeppelin.utils.constants.library.IERC721_ENUMERABLE_ID": { - "type": "const", - "value": 2014223715 - }, - "openzeppelin.utils.constants.library.IERC721_ID": { - "type": "const", - "value": 2158778573 - }, - "openzeppelin.utils.constants.library.IERC721_METADATA_ID": { - "type": "const", - "value": 1532892063 - }, - "openzeppelin.utils.constants.library.IERC721_RECEIVER_ID": { - "type": "const", - "value": 353073666 - }, - "openzeppelin.utils.constants.library.INVALID_ID": { - "type": "const", - "value": 4294967295 - }, - "openzeppelin.utils.constants.library.TRANSACTION_VERSION": { - "type": "const", - "value": 1 - }, - "openzeppelin.utils.constants.library.UINT8_MAX": { - "type": "const", - "value": 255 - }, - "starkware.cairo.common.alloc.alloc": { - "decorators": [], - "pc": 0, - "type": "function" - }, - "starkware.cairo.common.alloc.alloc.Args": { - "full_name": "starkware.cairo.common.alloc.alloc.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.cairo.common.alloc.alloc.ImplicitArgs": { - "full_name": "starkware.cairo.common.alloc.alloc.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.cairo.common.alloc.alloc.Return": { - "cairo_type": "(ptr: felt*)", - "type": "type_definition" - }, - "starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.bitwise.ALL_ONES": { - "type": "const", - "value": -106710729501573572985208420194530329073740042555888586719234 - }, - "starkware.cairo.common.bitwise.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "starkware.cairo.common.bool.FALSE": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.bool.TRUE": { - "type": "const", - "value": 1 - }, - "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "members": { - "x": { - "cairo_type": "felt", - "offset": 0 - }, - "x_and_y": { - "cairo_type": "felt", - "offset": 2 - }, - "x_or_y": { - "cairo_type": "felt", - "offset": 4 - }, - "x_xor_y": { - "cairo_type": "felt", - "offset": 3 - }, - "y": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.EcOpBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", - "members": { - "m": { - "cairo_type": "felt", - "offset": 4 - }, - "p": { - "cairo_type": "starkware.cairo.common.ec_point.EcPoint", - "offset": 0 - }, - "q": { - "cairo_type": "starkware.cairo.common.ec_point.EcPoint", - "offset": 2 - }, - "r": { - "cairo_type": "starkware.cairo.common.ec_point.EcPoint", - "offset": 5 - } - }, - "size": 7, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.EcPoint": { - "destination": "starkware.cairo.common.ec_point.EcPoint", - "type": "alias" - }, - "starkware.cairo.common.cairo_builtins.HashBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "members": { - "result": { - "cairo_type": "felt", - "offset": 2 - }, - "x": { - "cairo_type": "felt", - "offset": 0 - }, - "y": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.KeccakBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", - "members": { - "input": { - "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "offset": 0 - }, - "output": { - "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "offset": 8 - } - }, - "size": 16, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": { - "destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "type": "alias" - }, - "starkware.cairo.common.cairo_builtins.SignatureBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", - "members": { - "message": { - "cairo_type": "felt", - "offset": 1 - }, - "pub_key": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.cairo_keccak.keccak.BLOCK_SIZE": { - "destination": "starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.BYTES_IN_WORD": { - "type": "const", - "value": 8 - }, - "starkware.cairo.common.cairo_keccak.keccak.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.KECCAK_CAPACITY_IN_WORDS": { - "type": "const", - "value": 8 - }, - "starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_BYTES": { - "type": "const", - "value": 136 - }, - "starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_WORDS": { - "type": "const", - "value": 17 - }, - "starkware.cairo.common.cairo_keccak.keccak.KECCAK_STATE_SIZE_FELTS": { - "type": "const", - "value": 25 - }, - "starkware.cairo.common.cairo_keccak.keccak.Uint256": { - "destination": "starkware.cairo.common.uint256.Uint256", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.alloc": { - "destination": "starkware.cairo.common.alloc.alloc", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.assert_lt": { - "destination": "starkware.cairo.common.math.assert_lt", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.assert_nn": { - "destination": "starkware.cairo.common.math.assert_nn", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.assert_nn_le": { - "destination": "starkware.cairo.common.math.assert_nn_le", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.assert_not_zero": { - "destination": "starkware.cairo.common.math.assert_not_zero", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.bitwise_and": { - "destination": "starkware.cairo.common.bitwise.bitwise_and", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.bitwise_or": { - "destination": "starkware.cairo.common.bitwise.bitwise_or", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.bitwise_xor": { - "destination": "starkware.cairo.common.bitwise.bitwise_xor", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.memset": { - "destination": "starkware.cairo.common.memset.memset", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.packed_keccak_func": { - "destination": "starkware.cairo.common.cairo_keccak.packed_keccak.packed_keccak_func", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.pow": { - "destination": "starkware.cairo.common.pow.pow", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.split_felt": { - "destination": "starkware.cairo.common.math.split_felt", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.uint256_reverse_endian": { - "destination": "starkware.cairo.common.uint256.uint256_reverse_endian", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.keccak.unsigned_div_rem": { - "destination": "starkware.cairo.common.math.unsigned_div_rem", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.packed_keccak.ALL_ONES": { - "type": "const", - "value": -106710729501573572985208420194530329073740042555888586719234 - }, - "starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE": { - "type": "const", - "value": 3 - }, - "starkware.cairo.common.cairo_keccak.packed_keccak.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.packed_keccak.SHIFTS": { - "type": "const", - "value": 340282366920938463481821351505477763073 - }, - "starkware.cairo.common.cairo_keccak.packed_keccak.alloc": { - "destination": "starkware.cairo.common.alloc.alloc", - "type": "alias" - }, - "starkware.cairo.common.cairo_keccak.packed_keccak.get_fp_and_pc": { - "destination": "starkware.cairo.common.registers.get_fp_and_pc", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.bigint.BASE": { - "destination": "starkware.cairo.common.cairo_secp.constants.BASE", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.bigint.BigInt3": { - "full_name": "starkware.cairo.common.cairo_secp.bigint.BigInt3", - "members": { - "d0": { - "cairo_type": "felt", - "offset": 0 - }, - "d1": { - "cairo_type": "felt", - "offset": 1 - }, - "d2": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.cairo_secp.bigint.RC_BOUND": { - "destination": "starkware.cairo.common.math_cmp.RC_BOUND", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.bigint.Uint256": { - "destination": "starkware.cairo.common.uint256.Uint256", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3": { - "full_name": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", - "members": { - "d0": { - "cairo_type": "felt", - "offset": 0 - }, - "d1": { - "cairo_type": "felt", - "offset": 1 - }, - "d2": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5": { - "full_name": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5", - "members": { - "d0": { - "cairo_type": "felt", - "offset": 0 - }, - "d1": { - "cairo_type": "felt", - "offset": 1 - }, - "d2": { - "cairo_type": "felt", - "offset": 2 - }, - "d3": { - "cairo_type": "felt", - "offset": 3 - }, - "d4": { - "cairo_type": "felt", - "offset": 4 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.cairo.common.cairo_secp.bigint.assert_nn": { - "destination": "starkware.cairo.common.math.assert_nn", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.bigint.assert_nn_le": { - "destination": "starkware.cairo.common.math.assert_nn_le", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.bigint.unsigned_div_rem": { - "destination": "starkware.cairo.common.math.unsigned_div_rem", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.constants.BASE": { - "type": "const", - "value": 77371252455336267181195264 - }, - "starkware.cairo.common.cairo_secp.constants.BETA": { - "type": "const", - "value": 7 - }, - "starkware.cairo.common.cairo_secp.constants.N0": { - "type": "const", - "value": 10428087374290690730508609 - }, - "starkware.cairo.common.cairo_secp.constants.N1": { - "type": "const", - "value": 77371252455330678278691517 - }, - "starkware.cairo.common.cairo_secp.constants.N2": { - "type": "const", - "value": 19342813113834066795298815 - }, - "starkware.cairo.common.cairo_secp.constants.P0": { - "type": "const", - "value": 77371252455336262886226991 - }, - "starkware.cairo.common.cairo_secp.constants.P1": { - "type": "const", - "value": 77371252455336267181195263 - }, - "starkware.cairo.common.cairo_secp.constants.P2": { - "type": "const", - "value": 19342813113834066795298815 - }, - "starkware.cairo.common.cairo_secp.constants.SECP_REM": { - "type": "const", - "value": 4294968273 - }, - "starkware.cairo.common.cairo_secp.ec.BigInt3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.ec.EcPoint": { - "full_name": "starkware.cairo.common.cairo_secp.ec.EcPoint", - "members": { - "x": { - "cairo_type": "starkware.cairo.common.cairo_secp.bigint.BigInt3", - "offset": 0 - }, - "y": { - "cairo_type": "starkware.cairo.common.cairo_secp.bigint.BigInt3", - "offset": 3 - } - }, - "size": 6, - "type": "struct" - }, - "starkware.cairo.common.cairo_secp.ec.UnreducedBigInt3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.ec.is_zero": { - "destination": "starkware.cairo.common.cairo_secp.field.is_zero", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.ec.nondet_bigint3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.ec.unreduced_mul": { - "destination": "starkware.cairo.common.cairo_secp.field.unreduced_mul", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.ec.unreduced_sqr": { - "destination": "starkware.cairo.common.cairo_secp.field.unreduced_sqr", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.ec.verify_zero": { - "destination": "starkware.cairo.common.cairo_secp.field.verify_zero", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.BASE": { - "destination": "starkware.cairo.common.cairo_secp.constants.BASE", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.BigInt3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.P0": { - "destination": "starkware.cairo.common.cairo_secp.constants.P0", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.P1": { - "destination": "starkware.cairo.common.cairo_secp.constants.P1", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.P2": { - "destination": "starkware.cairo.common.cairo_secp.constants.P2", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.SECP_REM": { - "destination": "starkware.cairo.common.cairo_secp.constants.SECP_REM", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.UnreducedBigInt3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.assert_nn_le": { - "destination": "starkware.cairo.common.math.assert_nn_le", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.field.nondet_bigint3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.BASE": { - "destination": "starkware.cairo.common.cairo_secp.bigint.BASE", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.BETA": { - "destination": "starkware.cairo.common.cairo_secp.constants.BETA", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.BigInt3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.EcPoint": { - "destination": "starkware.cairo.common.cairo_secp.ec.EcPoint", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.N0": { - "destination": "starkware.cairo.common.cairo_secp.constants.N0", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.N1": { - "destination": "starkware.cairo.common.cairo_secp.constants.N1", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.N2": { - "destination": "starkware.cairo.common.cairo_secp.constants.N2", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.RC_BOUND": { - "destination": "starkware.cairo.common.math_cmp.RC_BOUND", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.Uint256": { - "destination": "starkware.cairo.common.uint256.Uint256", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.UnreducedBigInt3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.alloc": { - "destination": "starkware.cairo.common.alloc.alloc", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.assert_nn": { - "destination": "starkware.cairo.common.math.assert_nn", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.assert_nn_le": { - "destination": "starkware.cairo.common.math.assert_nn_le", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.assert_not_zero": { - "destination": "starkware.cairo.common.math.assert_not_zero", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.bigint_mul": { - "destination": "starkware.cairo.common.cairo_secp.bigint.bigint_mul", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.bigint_to_uint256": { - "destination": "starkware.cairo.common.cairo_secp.bigint.bigint_to_uint256", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.ec_add": { - "destination": "starkware.cairo.common.cairo_secp.ec.ec_add", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.ec_mul": { - "destination": "starkware.cairo.common.cairo_secp.ec.ec_mul", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.ec_negate": { - "destination": "starkware.cairo.common.cairo_secp.ec.ec_negate", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.finalize_keccak": { - "destination": "starkware.cairo.common.cairo_keccak.keccak.finalize_keccak", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.keccak_uint256s_bigend": { - "destination": "starkware.cairo.common.cairo_keccak.keccak.keccak_uint256s_bigend", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.nondet_bigint3": { - "destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.reduce": { - "destination": "starkware.cairo.common.cairo_secp.field.reduce", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.uint256_to_bigint": { - "destination": "starkware.cairo.common.cairo_secp.bigint.uint256_to_bigint", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.unreduced_mul": { - "destination": "starkware.cairo.common.cairo_secp.field.unreduced_mul", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.unreduced_sqr": { - "destination": "starkware.cairo.common.cairo_secp.field.unreduced_sqr", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.unsigned_div_rem": { - "destination": "starkware.cairo.common.math.unsigned_div_rem", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.validate_reduced_field_element": { - "destination": "starkware.cairo.common.cairo_secp.field.validate_reduced_field_element", - "type": "alias" - }, - "starkware.cairo.common.cairo_secp.signature.verify_zero": { - "destination": "starkware.cairo.common.cairo_secp.field.verify_zero", - "type": "alias" - }, - "starkware.cairo.common.dict_access.DictAccess": { - "full_name": "starkware.cairo.common.dict_access.DictAccess", - "members": { - "key": { - "cairo_type": "felt", - "offset": 0 - }, - "new_value": { - "cairo_type": "felt", - "offset": 2 - }, - "prev_value": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.ec.EcOpBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", - "type": "alias" - }, - "starkware.cairo.common.ec.EcPoint": { - "destination": "starkware.cairo.common.ec_point.EcPoint", - "type": "alias" - }, - "starkware.cairo.common.ec.StarkCurve": { - "type": "namespace" - }, - "starkware.cairo.common.ec.StarkCurve.ALPHA": { - "type": "const", - "value": 1 - }, - "starkware.cairo.common.ec.StarkCurve.Args": { - "full_name": "starkware.cairo.common.ec.StarkCurve.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.cairo.common.ec.StarkCurve.BETA": { - "type": "const", - "value": -476910135076337975234679399815567221425937815956490878998147463828055613816 - }, - "starkware.cairo.common.ec.StarkCurve.GEN_X": { - "type": "const", - "value": 874739451078007766457464989774322083649278607533249481151382481072868806602 - }, - "starkware.cairo.common.ec.StarkCurve.GEN_Y": { - "type": "const", - "value": 152666792071518830868575557812948353041420400780739481342941381225525861407 - }, - "starkware.cairo.common.ec.StarkCurve.ImplicitArgs": { - "full_name": "starkware.cairo.common.ec.StarkCurve.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.cairo.common.ec.StarkCurve.ORDER": { - "type": "const", - "value": -96363463615509210819012598251359154898 - }, - "starkware.cairo.common.ec.StarkCurve.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.ec.is_quad_residue": { - "destination": "starkware.cairo.common.math.is_quad_residue", - "type": "alias" - }, - "starkware.cairo.common.ec_point.EcPoint": { - "full_name": "starkware.cairo.common.ec_point.EcPoint", - "members": { - "x": { - "cairo_type": "felt", - "offset": 0 - }, - "y": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.hash.HashBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "type": "alias" - }, - "starkware.cairo.common.keccak_state.KeccakBuiltinState": { - "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "members": { - "s0": { - "cairo_type": "felt", - "offset": 0 - }, - "s1": { - "cairo_type": "felt", - "offset": 1 - }, - "s2": { - "cairo_type": "felt", - "offset": 2 - }, - "s3": { - "cairo_type": "felt", - "offset": 3 - }, - "s4": { - "cairo_type": "felt", - "offset": 4 - }, - "s5": { - "cairo_type": "felt", - "offset": 5 - }, - "s6": { - "cairo_type": "felt", - "offset": 6 - }, - "s7": { - "cairo_type": "felt", - "offset": 7 - } - }, - "size": 8, - "type": "struct" - }, - "starkware.cairo.common.math.FALSE": { - "destination": "starkware.cairo.common.bool.FALSE", - "type": "alias" - }, - "starkware.cairo.common.math.TRUE": { - "destination": "starkware.cairo.common.bool.TRUE", - "type": "alias" - }, - "starkware.cairo.common.math.assert_le_felt": { - "decorators": [ - "known_ap_change" - ], - "pc": 18, - "type": "function" - }, - "starkware.cairo.common.math.assert_le_felt.Args": { - "full_name": "starkware.cairo.common.math.assert_le_felt.Args", - "members": { - "a": { - "cairo_type": "felt", - "offset": 0 - }, - "b": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.math.assert_le_felt.ImplicitArgs": { - "full_name": "starkware.cairo.common.math.assert_le_felt.ImplicitArgs", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH": { - "type": "const", - "value": 5316911983139663648412552867652567041 - }, - "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH": { - "type": "const", - "value": 3544607988759775765608368578435044694 - }, - "starkware.cairo.common.math.assert_le_felt.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.math.assert_le_felt.a": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math.assert_le_felt.a", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 18, - "value": "[cast(fp + (-4), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math.assert_le_felt.b": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math.assert_le_felt.b", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 18, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math.assert_le_felt.range_check_ptr": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math.assert_le_felt.range_check_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 18, - "value": "[cast(fp + (-5), felt*)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 8 - }, - "pc": 28, - "value": "cast([fp + (-5)] + 4, felt)" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math.assert_le_felt.skip_exclude_a": { - "pc": 42, - "type": "label" - }, - "starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a": { - "pc": 54, - "type": "label" - }, - "starkware.cairo.common.math.assert_lt_felt": { - "decorators": [ - "known_ap_change" - ], - "pc": 63, - "type": "function" - }, - "starkware.cairo.common.math.assert_lt_felt.Args": { - "full_name": "starkware.cairo.common.math.assert_lt_felt.Args", - "members": { - "a": { - "cairo_type": "felt", - "offset": 0 - }, - "b": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs": { - "full_name": "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.cairo.common.math.assert_lt_felt.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.math.assert_lt_felt.a": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math.assert_lt_felt.a", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 63, - "value": "[cast(fp + (-4), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math.assert_lt_felt.b": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math.assert_lt_felt.b", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 63, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math_cmp.RC_BOUND": { - "type": "const", - "value": 340282366920938463463374607431768211456 - }, - "starkware.cairo.common.math_cmp.assert_le_felt": { - "destination": "starkware.cairo.common.math.assert_le_felt", - "type": "alias" - }, - "starkware.cairo.common.math_cmp.assert_lt_felt": { - "destination": "starkware.cairo.common.math.assert_lt_felt", - "type": "alias" - }, - "starkware.cairo.common.math_cmp.is_le_felt": { - "decorators": [ - "known_ap_change" - ], - "pc": 128, - "type": "function" - }, - "starkware.cairo.common.math_cmp.is_le_felt.Args": { - "full_name": "starkware.cairo.common.math_cmp.is_le_felt.Args", - "members": { - "a": { - "cairo_type": "felt", - "offset": 0 - }, - "b": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs": { - "full_name": "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.cairo.common.math_cmp.is_le_felt.Return": { - "cairo_type": "felt", - "type": "type_definition" - }, - "starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.math_cmp.is_le_felt.a": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math_cmp.is_le_felt.a", - "references": [ - { - "ap_tracking_data": { - "group": 11, - "offset": 0 - }, - "pc": 128, - "value": "[cast(fp + (-4), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math_cmp.is_le_felt.b": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.math_cmp.is_le_felt.b", - "references": [ - { - "ap_tracking_data": { - "group": 11, - "offset": 0 - }, - "pc": 128, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.math_cmp.is_le_felt.not_le": { - "pc": 140, - "type": "label" - }, - "starkware.cairo.common.memcpy.memcpy": { - "decorators": [], - "pc": 3, - "type": "function" - }, - "starkware.cairo.common.memcpy.memcpy.Args": { - "full_name": "starkware.cairo.common.memcpy.memcpy.Args", - "members": { - "dst": { - "cairo_type": "felt*", - "offset": 0 - }, - "len": { - "cairo_type": "felt", - "offset": 2 - }, - "src": { - "cairo_type": "felt*", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.memcpy.memcpy.ImplicitArgs": { - "full_name": "starkware.cairo.common.memcpy.memcpy.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.cairo.common.memcpy.memcpy.LoopFrame": { - "full_name": "starkware.cairo.common.memcpy.memcpy.LoopFrame", - "members": { - "dst": { - "cairo_type": "felt*", - "offset": 0 - }, - "src": { - "cairo_type": "felt*", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.memcpy.memcpy.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.memcpy.memcpy.continue_copying": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.memcpy.memcpy.continue_copying", - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 3 - }, - "pc": 10, - "value": "[cast(ap, felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.memcpy.memcpy.len": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.memcpy.memcpy.len", - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 3, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.memcpy.memcpy.loop": { - "pc": 8, - "type": "label" - }, - "starkware.cairo.common.pow.assert_le": { - "destination": "starkware.cairo.common.math.assert_le", - "type": "alias" - }, - "starkware.cairo.common.pow.get_ap": { - "destination": "starkware.cairo.common.registers.get_ap", - "type": "alias" - }, - "starkware.cairo.common.pow.get_fp_and_pc": { - "destination": "starkware.cairo.common.registers.get_fp_and_pc", - "type": "alias" - }, - "starkware.cairo.common.registers.get_ap": { - "destination": "starkware.cairo.lang.compiler.lib.registers.get_ap", - "type": "alias" - }, - "starkware.cairo.common.registers.get_fp_and_pc": { - "destination": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc", - "type": "alias" - }, - "starkware.cairo.common.signature.EcOpBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", - "type": "alias" - }, - "starkware.cairo.common.signature.EcPoint": { - "destination": "starkware.cairo.common.ec_point.EcPoint", - "type": "alias" - }, - "starkware.cairo.common.signature.FALSE": { - "destination": "starkware.cairo.common.bool.FALSE", - "type": "alias" - }, - "starkware.cairo.common.signature.SignatureBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", - "type": "alias" - }, - "starkware.cairo.common.signature.StarkCurve": { - "destination": "starkware.cairo.common.ec.StarkCurve", - "type": "alias" - }, - "starkware.cairo.common.signature.TRUE": { - "destination": "starkware.cairo.common.bool.TRUE", - "type": "alias" - }, - "starkware.cairo.common.signature.ec_add": { - "destination": "starkware.cairo.common.ec.ec_add", - "type": "alias" - }, - "starkware.cairo.common.signature.ec_mul": { - "destination": "starkware.cairo.common.ec.ec_mul", - "type": "alias" - }, - "starkware.cairo.common.signature.ec_sub": { - "destination": "starkware.cairo.common.ec.ec_sub", - "type": "alias" - }, - "starkware.cairo.common.signature.is_x_on_curve": { - "destination": "starkware.cairo.common.ec.is_x_on_curve", - "type": "alias" - }, - "starkware.cairo.common.signature.recover_y": { - "destination": "starkware.cairo.common.ec.recover_y", - "type": "alias" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature": { - "decorators": [], - "pc": 123, - "type": "function" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.Args": { - "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.Args", - "members": { - "message": { - "cairo_type": "felt", - "offset": 0 - }, - "public_key": { - "cairo_type": "felt", - "offset": 1 - }, - "signature_r": { - "cairo_type": "felt", - "offset": 2 - }, - "signature_s": { - "cairo_type": "felt", - "offset": 3 - } - }, - "size": 4, - "type": "struct" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs": { - "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs", - "members": { - "ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", - "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 123, - "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 125, - "value": "cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)" - } - ], - "type": "reference" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r", - "references": [ - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 123, - "value": "[cast(fp + (-4), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": { - "cairo_type": "felt", - "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s", - "references": [ - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 123, - "value": "[cast(fp + (-3), felt*)]" - } - ], - "type": "reference" - }, - "starkware.cairo.common.uint256.ALL_ONES": { - "type": "const", - "value": 340282366920938463463374607431768211455 - }, - "starkware.cairo.common.uint256.BitwiseBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "type": "alias" - }, - "starkware.cairo.common.uint256.HALF_SHIFT": { - "type": "const", - "value": 18446744073709551616 - }, - "starkware.cairo.common.uint256.SHIFT": { - "type": "const", - "value": 340282366920938463463374607431768211456 - }, - "starkware.cairo.common.uint256.Uint256": { - "full_name": "starkware.cairo.common.uint256.Uint256", - "members": { - "high": { - "cairo_type": "felt", - "offset": 1 - }, - "low": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.uint256.assert_in_range": { - "destination": "starkware.cairo.common.math.assert_in_range", - "type": "alias" - }, - "starkware.cairo.common.uint256.assert_le": { - "destination": "starkware.cairo.common.math.assert_le", - "type": "alias" - }, - "starkware.cairo.common.uint256.assert_nn_le": { - "destination": "starkware.cairo.common.math.assert_nn_le", - "type": "alias" - }, - "starkware.cairo.common.uint256.assert_not_zero": { - "destination": "starkware.cairo.common.math.assert_not_zero", - "type": "alias" - }, - "starkware.cairo.common.uint256.bitwise_and": { - "destination": "starkware.cairo.common.bitwise.bitwise_and", - "type": "alias" - }, - "starkware.cairo.common.uint256.bitwise_or": { - "destination": "starkware.cairo.common.bitwise.bitwise_or", - "type": "alias" - }, - "starkware.cairo.common.uint256.bitwise_xor": { - "destination": "starkware.cairo.common.bitwise.bitwise_xor", - "type": "alias" - }, - "starkware.cairo.common.uint256.get_ap": { - "destination": "starkware.cairo.common.registers.get_ap", - "type": "alias" - }, - "starkware.cairo.common.uint256.get_fp_and_pc": { - "destination": "starkware.cairo.common.registers.get_fp_and_pc", - "type": "alias" - }, - "starkware.cairo.common.uint256.is_le": { - "destination": "starkware.cairo.common.math_cmp.is_le", - "type": "alias" - }, - "starkware.cairo.common.uint256.pow": { - "destination": "starkware.cairo.common.pow.pow", - "type": "alias" - }, - "starkware.starknet.common.storage.ADDR_BOUND": { - "type": "const", - "value": -106710729501573572985208420194530329073740042555888586719489 - }, - "starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE": { - "type": "const", - "value": 256 - }, - "starkware.starknet.common.storage.assert_250_bit": { - "destination": "starkware.cairo.common.math.assert_250_bit", - "type": "alias" - }, - "starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR": { - "type": "const", - "value": 20853273475220472486191784820 - }, - "starkware.starknet.common.syscalls.CallContract": { - "full_name": "starkware.starknet.common.syscalls.CallContract", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.CallContractRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", - "offset": 5 - } - }, - "size": 7, - "type": "struct" - }, - "starkware.starknet.common.syscalls.CallContractRequest": { - "full_name": "starkware.starknet.common.syscalls.CallContractRequest", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 4 - }, - "calldata_size": { - "cairo_type": "felt", - "offset": 3 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 1 - }, - "function_selector": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.CallContractResponse": { - "full_name": "starkware.starknet.common.syscalls.CallContractResponse", - "members": { - "retdata": { - "cairo_type": "felt*", - "offset": 1 - }, - "retdata_size": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR": { - "type": "const", - "value": 21167594061783206823196716140 - }, - "starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR": { - "type": "const", - "value": 23274015802972845247556842986379118667122 - }, - "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": { - "type": "const", - "value": 75202468540281 - }, - "starkware.starknet.common.syscalls.Deploy": { - "full_name": "starkware.starknet.common.syscalls.Deploy", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.DeployRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.DeployResponse", - "offset": 6 - } - }, - "size": 9, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DeployRequest": { - "full_name": "starkware.starknet.common.syscalls.DeployRequest", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 1 - }, - "constructor_calldata": { - "cairo_type": "felt*", - "offset": 4 - }, - "constructor_calldata_size": { - "cairo_type": "felt", - "offset": 3 - }, - "contract_address_salt": { - "cairo_type": "felt", - "offset": 2 - }, - "deploy_from_zero": { - "cairo_type": "felt", - "offset": 5 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 6, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DeployResponse": { - "full_name": "starkware.starknet.common.syscalls.DeployResponse", - "members": { - "constructor_retdata": { - "cairo_type": "felt*", - "offset": 2 - }, - "constructor_retdata_size": { - "cairo_type": "felt", - "offset": 1 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DictAccess": { - "destination": "starkware.cairo.common.dict_access.DictAccess", - "type": "alias" - }, - "starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR": { - "type": "const", - "value": 1280709301550335749748 - }, - "starkware.starknet.common.syscalls.EmitEvent": { - "full_name": "starkware.starknet.common.syscalls.EmitEvent", - "members": { - "data": { - "cairo_type": "felt*", - "offset": 4 - }, - "data_len": { - "cairo_type": "felt", - "offset": 3 - }, - "keys": { - "cairo_type": "felt*", - "offset": 2 - }, - "keys_len": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR": { - "type": "const", - "value": 1448089106835523001438702345020786 - }, - "starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR": { - "type": "const", - "value": 24294903732626645868215235778792757751152 - }, - "starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR": { - "type": "const", - "value": 94901967781393078444254803017658102643 - }, - "starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR": { - "type": "const", - "value": 6219495360805491471215297013070624192820083 - }, - "starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR": { - "type": "const", - "value": 1592190833581991703053805829594610833820054387 - }, - "starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR": { - "type": "const", - "value": 1317029390204112103023 - }, - "starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR": { - "type": "const", - "value": 1448089128652340074717162277007973 - }, - "starkware.starknet.common.syscalls.GetBlockNumber": { - "full_name": "starkware.starknet.common.syscalls.GetBlockNumber", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockNumberRequest": { - "full_name": "starkware.starknet.common.syscalls.GetBlockNumberRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockNumberResponse": { - "full_name": "starkware.starknet.common.syscalls.GetBlockNumberResponse", - "members": { - "block_number": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockTimestamp": { - "full_name": "starkware.starknet.common.syscalls.GetBlockTimestamp", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockTimestampRequest": { - "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockTimestampResponse": { - "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", - "members": { - "block_timestamp": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetCallerAddress": { - "full_name": "starkware.starknet.common.syscalls.GetCallerAddress", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetCallerAddressRequest": { - "full_name": "starkware.starknet.common.syscalls.GetCallerAddressRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetCallerAddressResponse": { - "full_name": "starkware.starknet.common.syscalls.GetCallerAddressResponse", - "members": { - "caller_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetContractAddress": { - "full_name": "starkware.starknet.common.syscalls.GetContractAddress", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetContractAddressRequest": { - "full_name": "starkware.starknet.common.syscalls.GetContractAddressRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetContractAddressResponse": { - "full_name": "starkware.starknet.common.syscalls.GetContractAddressResponse", - "members": { - "contract_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetSequencerAddress": { - "full_name": "starkware.starknet.common.syscalls.GetSequencerAddress", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetSequencerAddressRequest": { - "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetSequencerAddressResponse": { - "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", - "members": { - "sequencer_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxInfo": { - "full_name": "starkware.starknet.common.syscalls.GetTxInfo", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxInfoRequest": { - "full_name": "starkware.starknet.common.syscalls.GetTxInfoRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxInfoResponse": { - "full_name": "starkware.starknet.common.syscalls.GetTxInfoResponse", - "members": { - "tx_info": { - "cairo_type": "starkware.starknet.common.syscalls.TxInfo*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxSignature": { - "full_name": "starkware.starknet.common.syscalls.GetTxSignature", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureResponse", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxSignatureRequest": { - "full_name": "starkware.starknet.common.syscalls.GetTxSignatureRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxSignatureResponse": { - "full_name": "starkware.starknet.common.syscalls.GetTxSignatureResponse", - "members": { - "signature": { - "cairo_type": "felt*", - "offset": 1 - }, - "signature_len": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": { - "type": "const", - "value": 436233452754198157705746250789557519228244616562 - }, - "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": { - "type": "const", - "value": 92376026794327011772951660 - }, - "starkware.starknet.common.syscalls.LibraryCall": { - "full_name": "starkware.starknet.common.syscalls.LibraryCall", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", - "offset": 5 - } - }, - "size": 7, - "type": "struct" - }, - "starkware.starknet.common.syscalls.LibraryCallRequest": { - "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 4 - }, - "calldata_size": { - "cairo_type": "felt", - "offset": 3 - }, - "class_hash": { - "cairo_type": "felt", - "offset": 1 - }, - "function_selector": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": { - "type": "const", - "value": 433017908768303439907196859243777073 - }, - "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": { - "type": "const", - "value": 100890693370601760042082660 - }, - "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": { - "type": "const", - "value": 25828017502874050592466629733 - }, - "starkware.starknet.common.syscalls.SendMessageToL1SysCall": { - "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", - "members": { - "payload_ptr": { - "cairo_type": "felt*", - "offset": 3 - }, - "payload_size": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - }, - "to_address": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageRead": { - "full_name": "starkware.starknet.common.syscalls.StorageRead", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.StorageReadRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageReadRequest": { - "full_name": "starkware.starknet.common.syscalls.StorageReadRequest", - "members": { - "address": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageReadResponse": { - "full_name": "starkware.starknet.common.syscalls.StorageReadResponse", - "members": { - "value": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageWrite": { - "full_name": "starkware.starknet.common.syscalls.StorageWrite", - "members": { - "address": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - }, - "value": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.TxInfo": { - "full_name": "starkware.starknet.common.syscalls.TxInfo", - "members": { - "account_contract_address": { - "cairo_type": "felt", - "offset": 1 - }, - "chain_id": { - "cairo_type": "felt", - "offset": 6 - }, - "max_fee": { - "cairo_type": "felt", - "offset": 2 - }, - "nonce": { - "cairo_type": "felt", - "offset": 7 - }, - "signature": { - "cairo_type": "felt*", - "offset": 4 - }, - "signature_len": { - "cairo_type": "felt", - "offset": 3 - }, - "transaction_hash": { - "cairo_type": "felt", - "offset": 5 - }, - "version": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 8, - "type": "struct" - }, - "starkware.starknet.common.syscalls.call_contract": { - "decorators": [], - "pc": 74, - "type": "function" - }, - "starkware.starknet.common.syscalls.call_contract.Args": { - "full_name": "starkware.starknet.common.syscalls.call_contract.Args", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_size": { - "cairo_type": "felt", - "offset": 2 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 0 - }, - "function_selector": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "starkware.starknet.common.syscalls.call_contract.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.call_contract.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.call_contract.Return": { - "cairo_type": "(retdata_size: felt, retdata: felt*)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.call_contract.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.call_contract.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 74, - "value": "[cast(fp + (-7), felt**)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 1 - }, - "pc": 81, - "value": "cast([fp + (-7)] + 7, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.get_caller_address": { - "decorators": [], - "pc": 86, - "type": "function" - }, - "starkware.starknet.common.syscalls.get_caller_address.Args": { - "full_name": "starkware.starknet.common.syscalls.get_caller_address.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_caller_address.Return": { - "cairo_type": "(caller_address: felt)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 86, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 1 - }, - "pc": 89, - "value": "cast([fp + (-3)] + 2, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.get_contract_address": { - "decorators": [], - "pc": 93, - "type": "function" - }, - "starkware.starknet.common.syscalls.get_contract_address.Args": { - "full_name": "starkware.starknet.common.syscalls.get_contract_address.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_contract_address.Return": { - "cairo_type": "(contract_address: felt)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 93, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 1 - }, - "pc": 96, - "value": "cast([fp + (-3)] + 2, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.get_tx_info": { - "decorators": [], - "pc": 116, - "type": "function" - }, - "starkware.starknet.common.syscalls.get_tx_info.Args": { - "full_name": "starkware.starknet.common.syscalls.get_tx_info.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_tx_info.Return": { - "cairo_type": "(tx_info: starkware.starknet.common.syscalls.TxInfo*)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 116, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 1 - }, - "pc": 119, - "value": "cast([fp + (-3)] + 2, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_read": { - "decorators": [], - "pc": 100, - "type": "function" - }, - "starkware.starknet.common.syscalls.storage_read.Args": { - "full_name": "starkware.starknet.common.syscalls.storage_read.Args", - "members": { - "address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.storage_read.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.storage_read.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.storage_read.Return": { - "cairo_type": "(value: felt)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.storage_read.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.storage_read.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 100, - "value": "[cast(fp + (-4), felt**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 1 - }, - "pc": 104, - "value": "cast([fp + (-4)] + 3, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.storage_write": { - "decorators": [], - "pc": 108, - "type": "function" - }, - "starkware.starknet.common.syscalls.storage_write.Args": { - "full_name": "starkware.starknet.common.syscalls.storage_write.Args", - "members": { - "address": { - "cairo_type": "felt", - "offset": 0 - }, - "value": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.storage_write.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.storage_write.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.storage_write.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.storage_write.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.storage_write.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 8, - "offset": 0 - }, - "pc": 108, - "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 1 - }, - "pc": 113, - "value": "cast([fp + (-5)] + 3, felt*)" - } - ], - "type": "reference" - } + "type": "reference" + }, + "starkware.cairo.common.memcpy.memcpy.len": { + "cairo_type": "felt", + "full_name": "starkware.cairo.common.memcpy.memcpy.len", + "references": [ + { + "ap_tracking_data": { + "group": 2, + "offset": 0 + }, + "pc": 9, + "value": "[cast(fp + (-3), felt*)]" + } + ], + "type": "reference" + }, + "starkware.cairo.common.memcpy.memcpy.loop": { + "pc": 14, + "type": "label" + }, + "starkware.cairo.common.poseidon_state.PoseidonBuiltinState": { + "full_name": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", + "members": { + "s0": { + "cairo_type": "felt", + "offset": 0 + }, + "s1": { + "cairo_type": "felt", + "offset": 1 + }, + "s2": { + "cairo_type": "felt", + "offset": 2 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.cairo.common.registers.get_ap": { + "destination": "starkware.cairo.lang.compiler.lib.registers.get_ap", + "type": "alias" + }, + "starkware.cairo.common.registers.get_fp_and_pc": { + "destination": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc", + "type": "alias" + }, + "starkware.cairo.common.signature.EcOpBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", + "type": "alias" + }, + "starkware.cairo.common.signature.EcPoint": { + "destination": "starkware.cairo.common.ec_point.EcPoint", + "type": "alias" + }, + "starkware.cairo.common.signature.FALSE": { + "destination": "starkware.cairo.common.bool.FALSE", + "type": "alias" + }, + "starkware.cairo.common.signature.SignatureBuiltin": { + "destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", + "type": "alias" + }, + "starkware.cairo.common.signature.StarkCurve": { + "destination": "starkware.cairo.common.ec.StarkCurve", + "type": "alias" + }, + "starkware.cairo.common.signature.TRUE": { + "destination": "starkware.cairo.common.bool.TRUE", + "type": "alias" + }, + "starkware.cairo.common.signature.ec_add": { + "destination": "starkware.cairo.common.ec.ec_add", + "type": "alias" + }, + "starkware.cairo.common.signature.ec_mul": { + "destination": "starkware.cairo.common.ec.ec_mul", + "type": "alias" + }, + "starkware.cairo.common.signature.ec_sub": { + "destination": "starkware.cairo.common.ec.ec_sub", + "type": "alias" + }, + "starkware.cairo.common.signature.is_x_on_curve": { + "destination": "starkware.cairo.common.ec.is_x_on_curve", + "type": "alias" + }, + "starkware.cairo.common.signature.recover_y": { + "destination": "starkware.cairo.common.ec.recover_y", + "type": "alias" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature": { + "decorators": [], + "pc": 165, + "type": "function" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.Args": { + "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.Args", + "members": { + "message": { + "cairo_type": "felt", + "offset": 0 + }, + "public_key": { + "cairo_type": "felt", + "offset": 1 + }, + "signature_r": { + "cairo_type": "felt", + "offset": 2 + }, + "signature_s": { + "cairo_type": "felt", + "offset": 3 + } + }, + "size": 4, + "type": "struct" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs": { + "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs", + "members": { + "ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": { + "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", + "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 165, + "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]" + }, + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 167, + "value": "cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)" + } + ], + "type": "reference" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": { + "cairo_type": "felt", + "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r", + "references": [ + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 165, + "value": "[cast(fp + (-4), felt*)]" + } + ], + "type": "reference" + }, + "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": { + "cairo_type": "felt", + "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s", + "references": [ + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 165, + "value": "[cast(fp + (-3), felt*)]" + } + ], + "type": "reference" + }, + "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc": { + "decorators": [], + "pc": 24, + "type": "function" + }, + "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc.Args": { + "full_name": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc.ImplicitArgs": { + "full_name": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc.ImplicitArgs", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc.Return": { + "cairo_type": "(fp_val: felt*, pc_val: felt*)", + "type": "type_definition" + }, + "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.constants.DECLARE_HASH_PREFIX": { + "type": "const", + "value": 28258975365558885 + }, + "starkware.starknet.common.constants.DEPLOY_ACCOUNT_HASH_PREFIX": { + "type": "const", + "value": 2036277798190617858034555652763252 + }, + "starkware.starknet.common.constants.DEPLOY_HASH_PREFIX": { + "type": "const", + "value": 110386840629113 + }, + "starkware.starknet.common.constants.INVOKE_HASH_PREFIX": { + "type": "const", + "value": 115923154332517 + }, + "starkware.starknet.common.constants.L1_HANDLER_HASH_PREFIX": { + "type": "const", + "value": 510926345461491391292786 + }, + "starkware.starknet.common.constants.ORIGIN_ADDRESS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.storage.ADDR_BOUND": { + "type": "const", + "value": -106710729501573572985208420194530329073740042555888586719489 + }, + "starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE": { + "type": "const", + "value": 256 + }, + "starkware.starknet.common.storage.assert_250_bit": { + "destination": "starkware.cairo.common.math.assert_250_bit", + "type": "alias" + }, + "starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR": { + "type": "const", + "value": 20853273475220472486191784820 + }, + "starkware.starknet.common.syscalls.CallContract": { + "full_name": "starkware.starknet.common.syscalls.CallContract", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.CallContractRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", + "offset": 5 + } + }, + "size": 7, + "type": "struct" + }, + "starkware.starknet.common.syscalls.CallContractRequest": { + "full_name": "starkware.starknet.common.syscalls.CallContractRequest", + "members": { + "calldata": { + "cairo_type": "felt*", + "offset": 4 + }, + "calldata_size": { + "cairo_type": "felt", + "offset": 3 + }, + "contract_address": { + "cairo_type": "felt", + "offset": 1 + }, + "function_selector": { + "cairo_type": "felt", + "offset": 2 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 5, + "type": "struct" + }, + "starkware.starknet.common.syscalls.CallContractResponse": { + "full_name": "starkware.starknet.common.syscalls.CallContractResponse", + "members": { + "retdata": { + "cairo_type": "felt*", + "offset": 1 + }, + "retdata_size": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR": { + "type": "const", + "value": 21167594061783206823196716140 + }, + "starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR": { + "type": "const", + "value": 23274015802972845247556842986379118667122 + }, + "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": { + "type": "const", + "value": 75202468540281 + }, + "starkware.starknet.common.syscalls.Deploy": { + "full_name": "starkware.starknet.common.syscalls.Deploy", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.DeployRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.DeployResponse", + "offset": 6 + } + }, + "size": 9, + "type": "struct" + }, + "starkware.starknet.common.syscalls.DeployRequest": { + "full_name": "starkware.starknet.common.syscalls.DeployRequest", + "members": { + "class_hash": { + "cairo_type": "felt", + "offset": 1 + }, + "constructor_calldata": { + "cairo_type": "felt*", + "offset": 4 + }, + "constructor_calldata_size": { + "cairo_type": "felt", + "offset": 3 + }, + "contract_address_salt": { + "cairo_type": "felt", + "offset": 2 + }, + "deploy_from_zero": { + "cairo_type": "felt", + "offset": 5 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 6, + "type": "struct" + }, + "starkware.starknet.common.syscalls.DeployResponse": { + "full_name": "starkware.starknet.common.syscalls.DeployResponse", + "members": { + "constructor_retdata": { + "cairo_type": "felt*", + "offset": 2 + }, + "constructor_retdata_size": { + "cairo_type": "felt", + "offset": 1 + }, + "contract_address": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.starknet.common.syscalls.DictAccess": { + "destination": "starkware.cairo.common.dict_access.DictAccess", + "type": "alias" + }, + "starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR": { + "type": "const", + "value": 1280709301550335749748 + }, + "starkware.starknet.common.syscalls.EmitEvent": { + "full_name": "starkware.starknet.common.syscalls.EmitEvent", + "members": { + "data": { + "cairo_type": "felt*", + "offset": 4 + }, + "data_len": { + "cairo_type": "felt", + "offset": 3 + }, + "keys": { + "cairo_type": "felt*", + "offset": 2 + }, + "keys_len": { + "cairo_type": "felt", + "offset": 1 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 5, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR": { + "type": "const", + "value": 1448089106835523001438702345020786 + }, + "starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR": { + "type": "const", + "value": 24294903732626645868215235778792757751152 + }, + "starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR": { + "type": "const", + "value": 94901967781393078444254803017658102643 + }, + "starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR": { + "type": "const", + "value": 6219495360805491471215297013070624192820083 + }, + "starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR": { + "type": "const", + "value": 1592190833581991703053805829594610833820054387 + }, + "starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR": { + "type": "const", + "value": 1317029390204112103023 + }, + "starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR": { + "type": "const", + "value": 1448089128652340074717162277007973 + }, + "starkware.starknet.common.syscalls.GetBlockNumber": { + "full_name": "starkware.starknet.common.syscalls.GetBlockNumber", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberResponse", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetBlockNumberRequest": { + "full_name": "starkware.starknet.common.syscalls.GetBlockNumberRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetBlockNumberResponse": { + "full_name": "starkware.starknet.common.syscalls.GetBlockNumberResponse", + "members": { + "block_number": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetBlockTimestamp": { + "full_name": "starkware.starknet.common.syscalls.GetBlockTimestamp", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetBlockTimestampRequest": { + "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetBlockTimestampResponse": { + "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", + "members": { + "block_timestamp": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetCallerAddress": { + "full_name": "starkware.starknet.common.syscalls.GetCallerAddress", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressResponse", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetCallerAddressRequest": { + "full_name": "starkware.starknet.common.syscalls.GetCallerAddressRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetCallerAddressResponse": { + "full_name": "starkware.starknet.common.syscalls.GetCallerAddressResponse", + "members": { + "caller_address": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetContractAddress": { + "full_name": "starkware.starknet.common.syscalls.GetContractAddress", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressResponse", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetContractAddressRequest": { + "full_name": "starkware.starknet.common.syscalls.GetContractAddressRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetContractAddressResponse": { + "full_name": "starkware.starknet.common.syscalls.GetContractAddressResponse", + "members": { + "contract_address": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetSequencerAddress": { + "full_name": "starkware.starknet.common.syscalls.GetSequencerAddress", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", + "offset": 1 + } }, - "main_scope": "__main__", - "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "reference_manager": { - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 3, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 3 - }, - "pc": 10, - "value": "[cast(ap, felt*)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 18, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 18, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 18, - "value": "[cast(fp + (-5), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 63, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 63, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 4, - "offset": 0 - }, - "pc": 74, - "value": "[cast(fp + (-7), felt**)]" - }, - { - "ap_tracking_data": { - "group": 5, - "offset": 0 - }, - "pc": 86, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 6, - "offset": 0 - }, - "pc": 93, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 7, - "offset": 0 - }, - "pc": 100, - "value": "[cast(fp + (-4), felt**)]" - }, - { - "ap_tracking_data": { - "group": 8, - "offset": 0 - }, - "pc": 108, - "value": "[cast(fp + (-5), felt**)]" - }, - { - "ap_tracking_data": { - "group": 9, - "offset": 0 - }, - "pc": 116, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 123, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 123, - "value": "[cast(fp + (-3), felt*)]" - }, - { - "ap_tracking_data": { - "group": 10, - "offset": 0 - }, - "pc": 123, - "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]" - }, - { - "ap_tracking_data": { - "group": 11, - "offset": 0 - }, - "pc": 128, - "value": "[cast(fp + (-4), felt*)]" - }, - { - "ap_tracking_data": { - "group": 11, - "offset": 0 - }, - "pc": 128, - "value": "[cast(fp + (-3), felt*)]" - } - ] + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetSequencerAddressRequest": { + "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetSequencerAddressResponse": { + "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", + "members": { + "sequencer_address": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetTxInfo": { + "full_name": "starkware.starknet.common.syscalls.GetTxInfo", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoResponse", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetTxInfoRequest": { + "full_name": "starkware.starknet.common.syscalls.GetTxInfoRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetTxInfoResponse": { + "full_name": "starkware.starknet.common.syscalls.GetTxInfoResponse", + "members": { + "tx_info": { + "cairo_type": "starkware.starknet.common.syscalls.TxInfo*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetTxSignature": { + "full_name": "starkware.starknet.common.syscalls.GetTxSignature", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureResponse", + "offset": 1 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetTxSignatureRequest": { + "full_name": "starkware.starknet.common.syscalls.GetTxSignatureRequest", + "members": { + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.GetTxSignatureResponse": { + "full_name": "starkware.starknet.common.syscalls.GetTxSignatureResponse", + "members": { + "signature": { + "cairo_type": "felt*", + "offset": 1 + }, + "signature_len": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": { + "type": "const", + "value": 436233452754198157705746250789557519228244616562 + }, + "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": { + "type": "const", + "value": 92376026794327011772951660 + }, + "starkware.starknet.common.syscalls.LibraryCall": { + "full_name": "starkware.starknet.common.syscalls.LibraryCall", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", + "offset": 5 + } + }, + "size": 7, + "type": "struct" + }, + "starkware.starknet.common.syscalls.LibraryCallRequest": { + "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", + "members": { + "calldata": { + "cairo_type": "felt*", + "offset": 4 + }, + "calldata_size": { + "cairo_type": "felt", + "offset": 3 + }, + "class_hash": { + "cairo_type": "felt", + "offset": 1 + }, + "function_selector": { + "cairo_type": "felt", + "offset": 2 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 5, + "type": "struct" + }, + "starkware.starknet.common.syscalls.REPLACE_CLASS_SELECTOR": { + "type": "const", + "value": 25500403217443378527601783667 + }, + "starkware.starknet.common.syscalls.ReplaceClass": { + "full_name": "starkware.starknet.common.syscalls.ReplaceClass", + "members": { + "class_hash": { + "cairo_type": "felt", + "offset": 1 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": { + "type": "const", + "value": 433017908768303439907196859243777073 + }, + "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": { + "type": "const", + "value": 100890693370601760042082660 + }, + "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": { + "type": "const", + "value": 25828017502874050592466629733 + }, + "starkware.starknet.common.syscalls.SendMessageToL1SysCall": { + "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", + "members": { + "payload_ptr": { + "cairo_type": "felt*", + "offset": 3 + }, + "payload_size": { + "cairo_type": "felt", + "offset": 2 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + }, + "to_address": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 4, + "type": "struct" + }, + "starkware.starknet.common.syscalls.StorageRead": { + "full_name": "starkware.starknet.common.syscalls.StorageRead", + "members": { + "request": { + "cairo_type": "starkware.starknet.common.syscalls.StorageReadRequest", + "offset": 0 + }, + "response": { + "cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse", + "offset": 2 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.starknet.common.syscalls.StorageReadRequest": { + "full_name": "starkware.starknet.common.syscalls.StorageReadRequest", + "members": { + "address": { + "cairo_type": "felt", + "offset": 1 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.StorageReadResponse": { + "full_name": "starkware.starknet.common.syscalls.StorageReadResponse", + "members": { + "value": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.StorageWrite": { + "full_name": "starkware.starknet.common.syscalls.StorageWrite", + "members": { + "address": { + "cairo_type": "felt", + "offset": 1 + }, + "selector": { + "cairo_type": "felt", + "offset": 0 + }, + "value": { + "cairo_type": "felt", + "offset": 2 + } + }, + "size": 3, + "type": "struct" + }, + "starkware.starknet.common.syscalls.TxInfo": { + "full_name": "starkware.starknet.common.syscalls.TxInfo", + "members": { + "account_contract_address": { + "cairo_type": "felt", + "offset": 1 + }, + "chain_id": { + "cairo_type": "felt", + "offset": 6 + }, + "max_fee": { + "cairo_type": "felt", + "offset": 2 + }, + "nonce": { + "cairo_type": "felt", + "offset": 7 + }, + "signature": { + "cairo_type": "felt*", + "offset": 4 + }, + "signature_len": { + "cairo_type": "felt", + "offset": 3 + }, + "transaction_hash": { + "cairo_type": "felt", + "offset": 5 + }, + "version": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 8, + "type": "struct" + }, + "starkware.starknet.common.syscalls.call_contract": { + "decorators": [], + "pc": 25, + "type": "function" + }, + "starkware.starknet.common.syscalls.call_contract.Args": { + "full_name": "starkware.starknet.common.syscalls.call_contract.Args", + "members": { + "calldata": { + "cairo_type": "felt*", + "offset": 3 + }, + "calldata_size": { + "cairo_type": "felt", + "offset": 2 + }, + "contract_address": { + "cairo_type": "felt", + "offset": 0 + }, + "function_selector": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 4, + "type": "struct" + }, + "starkware.starknet.common.syscalls.call_contract.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.call_contract.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.call_contract.Return": { + "cairo_type": "(retdata_size: felt, retdata: felt*)", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.call_contract.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.call_contract.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 4, + "offset": 0 + }, + "pc": 25, + "value": "[cast(fp + (-7), felt**)]" + }, + { + "ap_tracking_data": { + "group": 4, + "offset": 1 + }, + "pc": 32, + "value": "cast([fp + (-7)] + 7, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.common.syscalls.deploy": { + "decorators": [], + "pc": 37, + "type": "function" + }, + "starkware.starknet.common.syscalls.deploy.Args": { + "full_name": "starkware.starknet.common.syscalls.deploy.Args", + "members": { + "class_hash": { + "cairo_type": "felt", + "offset": 0 + }, + "constructor_calldata": { + "cairo_type": "felt*", + "offset": 3 + }, + "constructor_calldata_size": { + "cairo_type": "felt", + "offset": 2 + }, + "contract_address_salt": { + "cairo_type": "felt", + "offset": 1 + }, + "deploy_from_zero": { + "cairo_type": "felt", + "offset": 4 + } + }, + "size": 5, + "type": "struct" + }, + "starkware.starknet.common.syscalls.deploy.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.deploy.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.deploy.Return": { + "cairo_type": "(contract_address: felt)", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.deploy.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.deploy.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.deploy.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 5, + "offset": 0 + }, + "pc": 37, + "value": "[cast(fp + (-8), felt**)]" + }, + { + "ap_tracking_data": { + "group": 5, + "offset": 1 + }, + "pc": 45, + "value": "cast([fp + (-8)] + 9, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.common.syscalls.get_caller_address": { + "decorators": [], + "pc": 49, + "type": "function" + }, + "starkware.starknet.common.syscalls.get_caller_address.Args": { + "full_name": "starkware.starknet.common.syscalls.get_caller_address.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.get_caller_address.Return": { + "cairo_type": "(caller_address: felt)", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 6, + "offset": 0 + }, + "pc": 49, + "value": "[cast(fp + (-3), felt**)]" + }, + { + "ap_tracking_data": { + "group": 6, + "offset": 1 + }, + "pc": 52, + "value": "cast([fp + (-3)] + 2, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.common.syscalls.get_contract_address": { + "decorators": [], + "pc": 56, + "type": "function" + }, + "starkware.starknet.common.syscalls.get_contract_address.Args": { + "full_name": "starkware.starknet.common.syscalls.get_contract_address.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.get_contract_address.Return": { + "cairo_type": "(contract_address: felt)", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 7, + "offset": 0 + }, + "pc": 56, + "value": "[cast(fp + (-3), felt**)]" + }, + { + "ap_tracking_data": { + "group": 7, + "offset": 1 + }, + "pc": 59, + "value": "cast([fp + (-3)] + 2, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.common.syscalls.get_tx_info": { + "decorators": [], + "pc": 79, + "type": "function" + }, + "starkware.starknet.common.syscalls.get_tx_info.Args": { + "full_name": "starkware.starknet.common.syscalls.get_tx_info.Args", + "members": {}, + "size": 0, + "type": "struct" + }, + "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.get_tx_info.Return": { + "cairo_type": "(tx_info: starkware.starknet.common.syscalls.TxInfo*)", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 10, + "offset": 0 + }, + "pc": 79, + "value": "[cast(fp + (-3), felt**)]" + }, + { + "ap_tracking_data": { + "group": 10, + "offset": 1 + }, + "pc": 82, + "value": "cast([fp + (-3)] + 2, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.common.syscalls.storage_read": { + "decorators": [], + "pc": 63, + "type": "function" + }, + "starkware.starknet.common.syscalls.storage_read.Args": { + "full_name": "starkware.starknet.common.syscalls.storage_read.Args", + "members": { + "address": { + "cairo_type": "felt", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.storage_read.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.storage_read.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.storage_read.Return": { + "cairo_type": "(value: felt)", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.storage_read.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.storage_read.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 8, + "offset": 0 + }, + "pc": 63, + "value": "[cast(fp + (-4), felt**)]" + }, + { + "ap_tracking_data": { + "group": 8, + "offset": 1 + }, + "pc": 67, + "value": "cast([fp + (-4)] + 3, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.common.syscalls.storage_write": { + "decorators": [], + "pc": 71, + "type": "function" + }, + "starkware.starknet.common.syscalls.storage_write.Args": { + "full_name": "starkware.starknet.common.syscalls.storage_write.Args", + "members": { + "address": { + "cairo_type": "felt", + "offset": 0 + }, + "value": { + "cairo_type": "felt", + "offset": 1 + } + }, + "size": 2, + "type": "struct" + }, + "starkware.starknet.common.syscalls.storage_write.ImplicitArgs": { + "full_name": "starkware.starknet.common.syscalls.storage_write.ImplicitArgs", + "members": { + "syscall_ptr": { + "cairo_type": "felt*", + "offset": 0 + } + }, + "size": 1, + "type": "struct" + }, + "starkware.starknet.common.syscalls.storage_write.Return": { + "cairo_type": "()", + "type": "type_definition" + }, + "starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS": { + "type": "const", + "value": 0 + }, + "starkware.starknet.common.syscalls.storage_write.syscall_ptr": { + "cairo_type": "felt*", + "full_name": "starkware.starknet.common.syscalls.storage_write.syscall_ptr", + "references": [ + { + "ap_tracking_data": { + "group": 9, + "offset": 0 + }, + "pc": 71, + "value": "[cast(fp + (-5), felt**)]" + }, + { + "ap_tracking_data": { + "group": 9, + "offset": 1 + }, + "pc": 76, + "value": "cast([fp + (-5)] + 3, felt*)" + } + ], + "type": "reference" + }, + "starkware.starknet.third_party.open_zeppelin.utils.constants.FALSE": { + "type": "const", + "value": 0 + }, + "starkware.starknet.third_party.open_zeppelin.utils.constants.PREFIX_TRANSACTION": { + "type": "const", + "value": 476441609247967894954472788179128007176248455022 + }, + "starkware.starknet.third_party.open_zeppelin.utils.constants.TRUE": { + "type": "const", + "value": 1 + }, + "starkware.starknet.third_party.open_zeppelin.utils.constants.UINT8_MAX": { + "type": "const", + "value": 256 + } + }, + "main_scope": "__main__", + "prime": "0x800000000000011000000000000000000000000000000000000000000000001", + "reference_manager": { + "references": [ + { + "ap_tracking_data": { + "group": 2, + "offset": 0 + }, + "pc": 9, + "value": "[cast(fp + (-3), felt*)]" + }, + { + "ap_tracking_data": { + "group": 2, + "offset": 3 + }, + "pc": 16, + "value": "[cast(ap, felt*)]" + }, + { + "ap_tracking_data": { + "group": 4, + "offset": 0 + }, + "pc": 25, + "value": "[cast(fp + (-7), felt**)]" + }, + { + "ap_tracking_data": { + "group": 5, + "offset": 0 + }, + "pc": 37, + "value": "[cast(fp + (-8), felt**)]" + }, + { + "ap_tracking_data": { + "group": 6, + "offset": 0 + }, + "pc": 49, + "value": "[cast(fp + (-3), felt**)]" + }, + { + "ap_tracking_data": { + "group": 7, + "offset": 0 + }, + "pc": 56, + "value": "[cast(fp + (-3), felt**)]" + }, + { + "ap_tracking_data": { + "group": 8, + "offset": 0 + }, + "pc": 63, + "value": "[cast(fp + (-4), felt**)]" + }, + { + "ap_tracking_data": { + "group": 9, + "offset": 0 + }, + "pc": 71, + "value": "[cast(fp + (-5), felt**)]" + }, + { + "ap_tracking_data": { + "group": 10, + "offset": 0 + }, + "pc": 79, + "value": "[cast(fp + (-3), felt**)]" + }, + { + "ap_tracking_data": { + "group": 11, + "offset": 0 + }, + "pc": 86, + "value": "[cast(fp + (-4), felt*)]" + }, + { + "ap_tracking_data": { + "group": 11, + "offset": 0 + }, + "pc": 86, + "value": "[cast(fp + (-3), felt*)]" + }, + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 165, + "value": "[cast(fp + (-4), felt*)]" + }, + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 165, + "value": "[cast(fp + (-3), felt*)]" + }, + { + "ap_tracking_data": { + "group": 18, + "offset": 0 + }, + "pc": 165, + "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]" } + ] } + }, + "entry_points_by_type": { + "L1_HANDLER": [], + "EXTERNAL": [ + { + "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad", + "offset": "0x210" + }, + { + "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775", + "offset": "0x1b6" + }, + { + "selector": "0x1a35984e05126dbecb7c3bb9929e7dd9106d460c59b1633739a5c733a5fb13b", + "offset": "0xee" + }, + { + "selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8", + "offset": "0x244" + }, + { + "selector": "0x28420862938116cb3bbdbedee07451ccc54d4e9412dbef71142ad1980a30941", + "offset": "0x147" + }, + { + "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3", + "offset": "0x172" + }, + { + "selector": "0x2de154d8a89be65c1724e962dc4c65637c05532a6c2825d0a7b7d774169dbba", + "offset": "0xd1" + }, + { + "selector": "0x2e3e21ff5952b2531241e37999d9c4c8b3034cccc89a202a6bf019bdf5294f9", + "offset": "0x107" + }, + { + "selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895", + "offset": "0x193" + } + ], + "CONSTRUCTOR": [ + { + "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194", + "offset": "0x121" + } + ] + } } diff --git a/crates/katana/core/Cargo.toml b/crates/katana/core/Cargo.toml index d33d32cb7b..add0dcf9e5 100644 --- a/crates/katana/core/Cargo.toml +++ b/crates/katana/core/Cargo.toml @@ -50,6 +50,7 @@ arbitrary.workspace = true assert_matches.workspace = true hex.workspace = true rand.workspace = true +rstest.workspace = true tempfile.workspace = true [features] diff --git a/crates/katana/core/src/backend/gas_oracle.rs b/crates/katana/core/src/backend/gas_oracle.rs index 1cf2ad3f70..6bbfd62328 100644 --- a/crates/katana/core/src/backend/gas_oracle.rs +++ b/crates/katana/core/src/backend/gas_oracle.rs @@ -68,6 +68,13 @@ impl GasOracle { Self::fixed(GasPrices { eth: 0, strk: 0 }, GasPrices { eth: 0, strk: 0 }) } + /// Returns a fixed gas oracle with zero gas prices. + /// + /// Mainly used for testing purposes. + pub fn zero() -> Self { + Self::fixed(GasPrices { eth: 0, strk: 0 }, GasPrices { eth: 0, strk: 0 }) + } + /// Returns the current gas prices. pub fn current_gas_prices(&self) -> GasPrices { match self { diff --git a/crates/katana/core/src/backend/mod.rs b/crates/katana/core/src/backend/mod.rs index afcb726789..a0823209a4 100644 --- a/crates/katana/core/src/backend/mod.rs +++ b/crates/katana/core/src/backend/mod.rs @@ -1,5 +1,6 @@ use std::sync::Arc; +use anyhow::{anyhow, Context}; use gas_oracle::GasOracle; use katana_chain_spec::ChainSpec; use katana_executor::{ExecutionOutput, ExecutionResult, ExecutorFactory}; @@ -9,11 +10,13 @@ use katana_primitives::block::{ }; use katana_primitives::da::L1DataAvailabilityMode; use katana_primitives::env::BlockEnv; -use katana_primitives::receipt::{Event, ReceiptWithTxHash}; -use katana_primitives::state::{compute_state_diff_hash, StateUpdates}; +use katana_primitives::receipt::{Event, Receipt, ReceiptWithTxHash}; +use katana_primitives::state::{compute_state_diff_hash, StateUpdates, StateUpdatesWithClasses}; +use katana_primitives::trace::TxExecInfo; use katana_primitives::transaction::{TxHash, TxWithHash}; use katana_primitives::version::CURRENT_STARKNET_VERSION; use katana_primitives::{address, ContractAddress, Felt}; +use katana_provider::providers::in_memory::state::EmptyStateProvider; use katana_provider::traits::block::{BlockHashProvider, BlockWriter}; use katana_provider::traits::trie::TrieWriter; use katana_trie::compute_merkle_root; @@ -64,41 +67,52 @@ impl Backend { } impl Backend { + pub fn init_genesis(&self) -> anyhow::Result<()> { + match self.chain_spec.as_ref() { + ChainSpec::Dev(cs) => self.init_dev_genesis(cs), + ChainSpec::Rollup(cs) => self.init_rollup_genesis(cs), + } + } + // TODO: add test for this function pub fn do_mine_block( &self, block_env: &BlockEnv, mut execution_output: ExecutionOutput, ) -> Result { - // we optimistically allocate the maximum amount possible - let mut txs = Vec::with_capacity(execution_output.transactions.len()); let mut traces = Vec::with_capacity(execution_output.transactions.len()); let mut receipts = Vec::with_capacity(execution_output.transactions.len()); + let mut transactions = Vec::with_capacity(execution_output.transactions.len()); // only include successful transactions in the block for (tx, res) in execution_output.transactions { if let ExecutionResult::Success { receipt, trace, .. } = res { receipts.push(ReceiptWithTxHash::new(tx.hash, receipt)); + transactions.push(tx); traces.push(trace); - txs.push(tx); } } - let tx_count = txs.len() as u32; - let tx_hashes = txs.iter().map(|tx| tx.hash).collect::>(); - - // Update special contract address 0x1 - self.update_block_hash_registry_contract( - &mut execution_output.states.state_updates, - block_env.number, - )?; + let tx_count = transactions.len(); + let tx_hashes = transactions.iter().map(|tx| tx.hash).collect::>(); // create a new block and compute its commitment + let partial_header = PartialHeader { + number: block_env.number, + timestamp: block_env.timestamp, + protocol_version: CURRENT_STARKNET_VERSION, + l1_da_mode: L1DataAvailabilityMode::Calldata, + sequencer_address: block_env.sequencer_address, + l1_gas_prices: block_env.l1_gas_prices.clone(), + parent_hash: self.blockchain.provider().latest_hash()?, + l1_data_gas_prices: block_env.l1_data_gas_prices.clone(), + }; + let block = self.commit_block( - block_env.clone(), - execution_output.states.state_updates.clone(), - txs, + partial_header, + transactions, &receipts, + &mut execution_output.states.state_updates, )?; let block = SealedBlockWithStatus { block, status: FinalityStatus::AcceptedOnL2 }; @@ -107,17 +121,25 @@ impl Backend { // TODO: maybe should change the arguments for insert_block_with_states_and_receipts to // accept ReceiptWithTxHash instead to avoid this conversion. let receipts = receipts.into_iter().map(|r| r.receipt).collect::>(); - self.blockchain.provider().insert_block_with_states_and_receipts( - block, - execution_output.states, - receipts, - traces, - )?; + self.store_block(block, execution_output.states, receipts, traces)?; info!(target: LOG_TARGET, %block_number, %tx_count, "Block mined."); Ok(MinedBlockOutcome { block_number, txs: tx_hashes, stats: execution_output.stats }) } + fn store_block( + &self, + block: SealedBlockWithStatus, + states: StateUpdatesWithClasses, + receipts: Vec, + traces: Vec, + ) -> Result<(), BlockProductionError> { + self.blockchain + .provider() + .insert_block_with_states_and_receipts(block, states, receipts, traces)?; + Ok(()) + } + // TODO: create a dedicated struct for this contract. // https://docs.starknet.io/architecture-and-concepts/network-architecture/starknet-state/#address_0x1 fn update_block_hash_registry_contract( @@ -182,33 +204,136 @@ impl Backend { fn commit_block( &self, - block_env: BlockEnv, - state_updates: StateUpdates, + header: PartialHeader, transactions: Vec, receipts: &[ReceiptWithTxHash], + state_updates: &mut StateUpdates, ) -> Result { - let parent_hash = self.blockchain.provider().latest_hash()?; - let partial_header = PartialHeader { - parent_hash, - number: block_env.number, - timestamp: block_env.timestamp, - protocol_version: CURRENT_STARKNET_VERSION, - sequencer_address: block_env.sequencer_address, - l1_gas_prices: block_env.l1_gas_prices, - l1_data_gas_prices: block_env.l1_data_gas_prices, - l1_da_mode: L1DataAvailabilityMode::Calldata, - }; + // Update special contract address 0x1 + self.update_block_hash_registry_contract(state_updates, header.number)?; let block = UncommittedBlock::new( - partial_header, + header, transactions, receipts, - &state_updates, + state_updates, &self.blockchain.provider(), ) .commit(); + Ok(block) } + + fn init_dev_genesis( + &self, + chain_spec: &katana_chain_spec::dev::ChainSpec, + ) -> anyhow::Result<()> { + let provider = self.blockchain.provider(); + + // check whether the genesis block has been initialized + let local_hash = provider.block_hash_by_num(chain_spec.genesis.number)?; + + if let Some(local_hash) = local_hash { + let genesis_hash = chain_spec.block().header.compute_hash(); + // check genesis should be the same + if local_hash != genesis_hash { + return Err(anyhow!( + "Genesis block hash mismatch: expected {genesis_hash:#x}, got {local_hash:#x}", + )); + } + + info!("Genesis has already been initialized"); + } else { + // Initialize the dev genesis block + + let block = chain_spec.block().seal(); + let block = SealedBlockWithStatus { block, status: FinalityStatus::AcceptedOnL1 }; + let states = chain_spec.state_updates(); + + let mut block = block; + let block_number = block.block.header.number; + + let class_trie_root = provider + .trie_insert_declared_classes(block_number, &states.state_updates.declared_classes) + .context("failed to update class trie")?; + + let contract_trie_root = provider + .trie_insert_contract_updates(block_number, &states.state_updates) + .context("failed to update contract trie")?; + + let genesis_state_root = hash::Poseidon::hash_array(&[ + short_string!("STARKNET_STATE_V0"), + contract_trie_root, + class_trie_root, + ]); + + block.block.header.state_root = genesis_state_root; + provider.insert_block_with_states_and_receipts(block, states, vec![], vec![])?; + + info!("Genesis initialized"); + } + + Ok(()) + } + + fn init_rollup_genesis( + &self, + chain_spec: &katana_chain_spec::rollup::ChainSpec, + ) -> anyhow::Result<()> { + let provider = self.blockchain.provider(); + + let block = chain_spec.block(); + let header = block.header.clone(); + + let mut executor = self.executor_factory.with_state(EmptyStateProvider); + executor.execute_block(block).context("failed to execute genesis block")?; + + let mut output = + executor.take_execution_output().context("failed to get execution output")?; + + let mut traces = Vec::with_capacity(output.transactions.len()); + let mut receipts = Vec::with_capacity(output.transactions.len()); + let mut transactions = Vec::with_capacity(output.transactions.len()); + + // only include successful transactions in the block + for (tx, res) in output.transactions { + if let ExecutionResult::Success { receipt, trace, .. } = res { + receipts.push(ReceiptWithTxHash::new(tx.hash, receipt)); + transactions.push(tx); + traces.push(trace); + } + } + + let block = + self.commit_block(header, transactions, &receipts, &mut output.states.state_updates)?; + + // Check whether the genesis block has been initialized or not. + let local_hash = provider.block_hash_by_num(block.header.number)?; + + if let Some(local_hash) = local_hash { + let expected_genesis_hash = block.hash; + + if expected_genesis_hash != local_hash { + return Err(anyhow!( + "Genesis block hash mismatch: expected {expected_genesis_hash:#x}, got \ + {local_hash:#x}", + )); + } + + info!("Genesis has already been initialized"); + } else { + let block = SealedBlockWithStatus { block, status: FinalityStatus::AcceptedOnL2 }; + + // TODO: maybe should change the arguments for insert_block_with_states_and_receipts to + // accept ReceiptWithTxHash instead to avoid this conversion. + let receipts = receipts.into_iter().map(|r| r.receipt).collect::>(); + self.store_block(block, output.states, receipts, traces)?; + + info!("Genesis initialized"); + } + + Ok(()) + } } #[derive(Debug, Clone)] diff --git a/crates/katana/core/src/backend/storage.rs b/crates/katana/core/src/backend/storage.rs index 04f199ef1b..4b4c1b1f76 100644 --- a/crates/katana/core/src/backend/storage.rs +++ b/crates/katana/core/src/backend/storage.rs @@ -1,14 +1,12 @@ use std::sync::Arc; use anyhow::{anyhow, bail, Context, Result}; -use katana_chain_spec::ChainSpec; use katana_db::mdbx::DbEnv; use katana_primitives::block::{ BlockHashOrNumber, BlockIdOrTag, BlockNumber, FinalityStatus, SealedBlockWithStatus, }; use katana_primitives::da::L1DataAvailabilityMode; use katana_primitives::hash::{self, StarkHash}; -use katana_primitives::state::StateUpdatesWithClasses; use katana_provider::providers::db::DbProvider; use katana_provider::providers::fork::ForkedProvider; use katana_provider::traits::block::{BlockProvider, BlockWriter}; @@ -24,7 +22,7 @@ use katana_provider::traits::transaction::{ use katana_provider::traits::trie::TrieWriter; use katana_provider::BlockchainProvider; use num_traits::ToPrimitive; -use starknet::core::types::{BlockStatus, MaybePendingBlockWithTxHashes}; +use starknet::core::types::MaybePendingBlockWithTxHashes; use starknet::core::utils::parse_cairo_short_string; use starknet::macros::short_string; use starknet::providers::jsonrpc::HttpTransport; @@ -88,44 +86,16 @@ impl Blockchain { Self { inner: BlockchainProvider::new(Box::new(provider)) } } - /// Creates a new [Blockchain] with the given [Database] implementation and genesis state. - pub fn new_with_chain(provider: impl Database, chain: &ChainSpec) -> Result { - // check whether the genesis block has been initialized - let genesis_hash = provider.block_hash_by_num(chain.genesis.number)?; - - match genesis_hash { - Some(db_hash) => { - let genesis_hash = chain.block().header.compute_hash(); - // check genesis should be the same - if db_hash == genesis_hash { - Ok(Self::new(provider)) - } else { - Err(anyhow!( - "Genesis block hash mismatch: expected {genesis_hash:#x}, got {db_hash:#x}", - )) - } - } - - None => { - let block = chain.block().seal(); - let block = SealedBlockWithStatus { block, status: FinalityStatus::AcceptedOnL1 }; - let state_updates = chain.state_updates(); - - Self::new_with_genesis_block_and_state(provider, block, state_updates) - } - } - } - /// Creates a new [Blockchain] from a database at `path` and `genesis` state. - pub fn new_with_db(db: DbEnv, chain: &ChainSpec) -> Result { - Self::new_with_chain(DbProvider::new(db), chain) + pub fn new_with_db(db: DbEnv) -> Self { + Self::new(DbProvider::new(db)) } /// Builds a new blockchain with a forked block. pub async fn new_from_forked( fork_url: Url, fork_block: Option, - chain: &mut ChainSpec, + chain: &mut katana_chain_spec::dev::ChainSpec, ) -> Result<(Self, BlockNumber)> { let provider = JsonRpcClient::new(HttpTransport::new(fork_url)); let chain_id = provider.chain_id().await.context("failed to fetch forked network id")?; @@ -173,13 +143,6 @@ impl Blockchain { chain.genesis.gas_prices.strk = forked_block.l1_gas_price.price_in_fri.to_u128().expect("should fit in u128"); - let status = match forked_block.status { - BlockStatus::AcceptedOnL1 => FinalityStatus::AcceptedOnL1, - BlockStatus::AcceptedOnL2 => FinalityStatus::AcceptedOnL2, - // we already checked for pending block earlier. so this should never happen. - _ => bail!("qed; block status shouldn't be pending"), - }; - // TODO: convert this to block number instead of BlockHashOrNumber so that it is easier to // check if the requested block is within the supported range or not. let database = ForkedProvider::new(Arc::new(provider), block_id)?; @@ -200,200 +163,65 @@ impl Blockchain { } }; - let block = block.seal_with_hash_and_status(forked_block.block_hash, status); - let state_updates = chain.state_updates(); - - let blockchain = Self::new_with_genesis_block_and_state(database, block, state_updates)?; - Ok((blockchain, block_num)) + Ok((Self::new(database), block_num)) } - pub fn provider(&self) -> &BlockchainProvider> { - &self.inner - } - - fn new_with_genesis_block_and_state( + /// Creates a new [Blockchain] with the given [Database] implementation and genesis state. + pub fn new_dev( provider: impl Database, - block: SealedBlockWithStatus, - states: StateUpdatesWithClasses, + chain_spec: &katana_chain_spec::dev::ChainSpec, ) -> Result { - let mut block = block; - let block_number = block.block.header.number; - - let class_trie_root = provider - .trie_insert_declared_classes(block_number, &states.state_updates.declared_classes) - .context("failed to update class trie")?; - - let contract_trie_root = provider - .trie_insert_contract_updates(block_number, &states.state_updates) - .context("failed to update contract trie")?; - - let genesis_state_root = hash::Poseidon::hash_array(&[ - short_string!("STARKNET_STATE_V0"), - contract_trie_root, - class_trie_root, - ]); - - block.block.header.state_root = genesis_state_root; - provider.insert_block_with_states_and_receipts(block, states, vec![], vec![])?; - - Ok(Self::new(provider)) - } -} - -#[cfg(test)] -mod tests { - use katana_primitives::block::{ - Block, FinalityStatus, GasPrices, Header, SealedBlockWithStatus, - }; - use katana_primitives::da::L1DataAvailabilityMode; - use katana_primitives::fee::{PriceUnit, TxFeeInfo}; - use katana_primitives::genesis::constant::{ - DEFAULT_ETH_FEE_TOKEN_ADDRESS, DEFAULT_LEGACY_ERC20_CLASS, DEFAULT_LEGACY_ERC20_CLASS_HASH, - DEFAULT_LEGACY_UDC_CLASS, DEFAULT_LEGACY_UDC_CLASS_HASH, DEFAULT_UDC_ADDRESS, - }; - use katana_primitives::receipt::{InvokeTxReceipt, Receipt}; - use katana_primitives::state::StateUpdatesWithClasses; - use katana_primitives::trace::TxExecInfo; - use katana_primitives::transaction::{InvokeTx, Tx, TxWithHash}; - use katana_primitives::Felt; - use katana_provider::providers::db::DbProvider; - use katana_provider::traits::block::{ - BlockHashProvider, BlockNumberProvider, BlockProvider, BlockWriter, - }; - use katana_provider::traits::state::StateFactoryProvider; - use katana_provider::traits::transaction::{TransactionProvider, TransactionTraceProvider}; - use starknet::macros::felt; - - use super::Blockchain; - - #[test] - fn blockchain_from_genesis_states() { - let provider = DbProvider::new_ephemeral(); - - let blockchain = Blockchain::new_with_chain(provider, &katana_chain_spec::DEV) - .expect("failed to create blockchain from genesis block"); - let state = blockchain.provider().latest().expect("failed to get latest state"); - - let latest_number = blockchain.provider().latest_number().unwrap(); - let fee_token_class_hash = - state.class_hash_of_contract(DEFAULT_ETH_FEE_TOKEN_ADDRESS).unwrap().unwrap(); - let udc_class_hash = state.class_hash_of_contract(DEFAULT_UDC_ADDRESS).unwrap().unwrap(); - - assert_eq!(latest_number, 0); - assert_eq!(udc_class_hash, DEFAULT_LEGACY_UDC_CLASS_HASH); - assert_eq!(fee_token_class_hash, DEFAULT_LEGACY_ERC20_CLASS_HASH); - } - - #[test] - fn blockchain_from_db() { - let db_path = tempfile::TempDir::new().expect("Failed to create temp dir.").into_path(); - - let dummy_tx = TxWithHash { - hash: felt!("0xbad"), - transaction: Tx::Invoke(InvokeTx::V1(Default::default())), - }; + // check whether the genesis block has been initialized + let genesis_hash = provider.block_hash_by_num(chain_spec.genesis.number)?; - let dummy_block = SealedBlockWithStatus { - status: FinalityStatus::AcceptedOnL1, - block: Block { - header: Header { - parent_hash: Felt::ZERO, - number: 1, - l1_gas_prices: GasPrices::default(), - l1_data_gas_prices: GasPrices::default(), - l1_da_mode: L1DataAvailabilityMode::Calldata, - timestamp: 123456, - ..Default::default() - }, - body: vec![dummy_tx.clone()], + match genesis_hash { + Some(db_hash) => { + let genesis_hash = chain_spec.block().header.compute_hash(); + // check genesis should be the same + if db_hash == genesis_hash { + Ok(Self::new(provider)) + } else { + Err(anyhow!( + "Genesis block hash mismatch: expected {genesis_hash:#x}, got {db_hash:#x}", + )) + } } - .seal(), - }; - - { - let db = katana_db::init_db(&db_path).expect("Failed to init database"); - let blockchain = Blockchain::new_with_db(db, &katana_chain_spec::DEV) - .expect("Failed to create db-backed blockchain storage"); - blockchain - .provider() - .insert_block_with_states_and_receipts( - dummy_block.clone(), - StateUpdatesWithClasses::default(), - vec![Receipt::Invoke(InvokeTxReceipt { - revert_error: None, - events: Vec::new(), - messages_sent: Vec::new(), - execution_resources: Default::default(), - fee: TxFeeInfo { - gas_price: 0, - overall_fee: 0, - gas_consumed: 0, - unit: PriceUnit::Wei, - }, - })], - vec![TxExecInfo::default()], - ) - .unwrap(); + // Initialize the dev genesis block + None => { + let block = chain_spec.block().seal(); + let block = SealedBlockWithStatus { block, status: FinalityStatus::AcceptedOnL1 }; + let states = chain_spec.state_updates(); - // assert genesis state is correct + let mut block = block; + let block_number = block.block.header.number; - let state = blockchain.provider().latest().expect("failed to get latest state"); + let class_trie_root = provider + .trie_insert_declared_classes( + block_number, + &states.state_updates.declared_classes, + ) + .context("failed to update class trie")?; - let actual_udc_class_hash = - state.class_hash_of_contract(DEFAULT_UDC_ADDRESS).unwrap().unwrap(); - let actual_udc_class = state.class(actual_udc_class_hash).unwrap().unwrap(); + let contract_trie_root = provider + .trie_insert_contract_updates(block_number, &states.state_updates) + .context("failed to update contract trie")?; - let actual_fee_token_class_hash = - state.class_hash_of_contract(DEFAULT_ETH_FEE_TOKEN_ADDRESS).unwrap().unwrap(); - let actual_fee_token_class = state.class(actual_fee_token_class_hash).unwrap().unwrap(); + let genesis_state_root = hash::Poseidon::hash_array(&[ + short_string!("STARKNET_STATE_V0"), + contract_trie_root, + class_trie_root, + ]); - assert_eq!(actual_udc_class_hash, DEFAULT_LEGACY_UDC_CLASS_HASH); - assert_eq!(actual_udc_class, DEFAULT_LEGACY_UDC_CLASS.clone()); + block.block.header.state_root = genesis_state_root; + provider.insert_block_with_states_and_receipts(block, states, vec![], vec![])?; - assert_eq!(actual_fee_token_class_hash, DEFAULT_LEGACY_ERC20_CLASS_HASH); - assert_eq!(actual_fee_token_class, DEFAULT_LEGACY_ERC20_CLASS.clone()); + Ok(Self::new(provider)) + } } + } - // re open the db and assert the state is the same and not overwritten - - { - let db = katana_db::init_db(db_path).expect("Failed to init database"); - let blockchain = Blockchain::new_with_db(db, &katana_chain_spec::DEV) - .expect("Failed to create db-backed blockchain storage"); - - // assert genesis state is correct - - let state = blockchain.provider().latest().expect("failed to get latest state"); - - let actual_udc_class_hash = - state.class_hash_of_contract(DEFAULT_UDC_ADDRESS).unwrap().unwrap(); - let actual_udc_class = state.class(actual_udc_class_hash).unwrap().unwrap(); - - let actual_fee_token_class_hash = - state.class_hash_of_contract(DEFAULT_ETH_FEE_TOKEN_ADDRESS).unwrap().unwrap(); - let actual_fee_token_class = state.class(actual_fee_token_class_hash).unwrap().unwrap(); - - assert_eq!(actual_udc_class_hash, DEFAULT_LEGACY_UDC_CLASS_HASH); - assert_eq!(actual_udc_class, DEFAULT_LEGACY_UDC_CLASS.clone()); - - assert_eq!(actual_fee_token_class_hash, DEFAULT_LEGACY_ERC20_CLASS_HASH); - assert_eq!(actual_fee_token_class, DEFAULT_LEGACY_ERC20_CLASS.clone()); - - let block_number = blockchain.provider().latest_number().unwrap(); - let block_hash = blockchain.provider().latest_hash().unwrap(); - let block = - blockchain.provider().block_by_hash(dummy_block.block.hash).unwrap().unwrap(); - - let tx = blockchain.provider().transaction_by_hash(dummy_tx.hash).unwrap().unwrap(); - let tx_exec = - blockchain.provider().transaction_execution(dummy_tx.hash).unwrap().unwrap(); - - assert_eq!(block_hash, dummy_block.block.hash); - assert_eq!(block_number, dummy_block.block.header.number); - assert_eq!(block, dummy_block.block.unseal()); - assert_eq!(tx, dummy_tx); - assert_eq!(tx_exec, TxExecInfo::default()); - } + pub fn provider(&self) -> &BlockchainProvider> { + &self.inner } } diff --git a/crates/katana/core/src/service/block_producer_tests.rs b/crates/katana/core/src/service/block_producer_tests.rs index 21cccaa16f..58971aea80 100644 --- a/crates/katana/core/src/service/block_producer_tests.rs +++ b/crates/katana/core/src/service/block_producer_tests.rs @@ -1,6 +1,6 @@ use arbitrary::{Arbitrary, Unstructured}; use futures::pin_mut; -use katana_chain_spec::DEV; +use katana_chain_spec::ChainSpec; use katana_executor::implementation::noop::NoopExecutorFactory; use katana_primitives::transaction::{ExecutableTx, InvokeTx}; use katana_primitives::Felt; @@ -12,12 +12,13 @@ use crate::backend::gas_oracle::GasOracle; use crate::backend::storage::Blockchain; fn test_backend() -> Arc> { - let chain_spec = Arc::new(DEV.clone()); - let provider = DbProvider::new_ephemeral(); + let chain_spec = Arc::new(ChainSpec::dev()); let executor_factory = NoopExecutorFactory::new(); - let blockchain = Blockchain::new_with_chain(provider, chain_spec.as_ref()).unwrap(); + let blockchain = Blockchain::new(DbProvider::new_ephemeral()); let gas_oracle = GasOracle::fixed(Default::default(), Default::default()); - Arc::new(Backend::new(chain_spec, blockchain, gas_oracle, executor_factory)) + let backend = Arc::new(Backend::new(chain_spec, blockchain, gas_oracle, executor_factory)); + backend.init_genesis().expect("failed to initialize genesis"); + backend } #[tokio::test] diff --git a/crates/katana/core/src/service/messaging/service.rs b/crates/katana/core/src/service/messaging/service.rs index d290b611b5..7e984fc81f 100644 --- a/crates/katana/core/src/service/messaging/service.rs +++ b/crates/katana/core/src/service/messaging/service.rs @@ -85,7 +85,7 @@ impl MessagingService { match messenger.as_ref() { MessengerMode::Ethereum(inner) => { let (block_num, txs) = - inner.gather_messages(from_block, max_block, backend.chain_spec.id).await?; + inner.gather_messages(from_block, max_block, backend.chain_spec.id()).await?; let txs_count = txs.len(); txs.into_iter().for_each(|tx| { @@ -103,7 +103,7 @@ impl MessagingService { #[cfg(feature = "starknet-messaging")] MessengerMode::Starknet(inner) => { let (block_num, txs) = - inner.gather_messages(from_block, max_block, backend.chain_spec.id).await?; + inner.gather_messages(from_block, max_block, backend.chain_spec.id()).await?; let txs_count = txs.len(); txs.into_iter().for_each(|tx| { diff --git a/crates/katana/core/tests/backend.rs b/crates/katana/core/tests/backend.rs new file mode 100644 index 0000000000..adf11a7402 --- /dev/null +++ b/crates/katana/core/tests/backend.rs @@ -0,0 +1,95 @@ +use alloy_primitives::U256; +use katana_chain_spec::rollup::{self, FeeContract}; +use katana_chain_spec::{dev, ChainSpec, SettlementLayer}; +use katana_core::backend::gas_oracle::GasOracle; +use katana_core::backend::storage::{Blockchain, Database}; +use katana_core::backend::Backend; +use katana_executor::implementation::blockifier::BlockifierFactory; +use katana_primitives::chain::ChainId; +use katana_primitives::env::CfgEnv; +use katana_primitives::felt; +use katana_primitives::genesis::allocation::DevAllocationsGenerator; +use katana_primitives::genesis::constant::DEFAULT_PREFUNDED_ACCOUNT_BALANCE; +use katana_primitives::genesis::Genesis; +use katana_provider::providers::db::DbProvider; +use rstest::rstest; +use url::Url; + +fn executor(chain_spec: &ChainSpec) -> BlockifierFactory { + BlockifierFactory::new( + CfgEnv { + chain_id: chain_spec.id(), + validate_max_n_steps: u32::MAX, + invoke_tx_max_n_steps: u32::MAX, + max_recursion_depth: usize::MAX, + ..Default::default() + }, + Default::default(), + ) +} + +fn backend(chain_spec: &ChainSpec) -> Backend { + backend_with_db(chain_spec, DbProvider::new_ephemeral()) +} + +fn backend_with_db(chain_spec: &ChainSpec, provider: impl Database) -> Backend { + Backend::new( + chain_spec.clone().into(), + Blockchain::new(provider), + GasOracle::zero(), + executor(chain_spec), + ) +} + +fn dev_chain_spec() -> dev::ChainSpec { + dev::ChainSpec::default() +} + +fn rollup_chain_spec() -> rollup::ChainSpec { + let accounts = DevAllocationsGenerator::new(10) + .with_balance(U256::from(DEFAULT_PREFUNDED_ACCOUNT_BALANCE)) + .generate(); + + let mut genesis = Genesis::default(); + genesis.extend_allocations(accounts.into_iter().map(|(k, v)| (k, v.into()))); + + let id = ChainId::parse("KATANA").unwrap(); + let fee_contract = FeeContract::default(); + + let settlement = SettlementLayer::Starknet { + id: ChainId::default(), + account: Default::default(), + core_contract: Default::default(), + rpc_url: Url::parse("http://localhost:5050").unwrap(), + }; + + rollup::ChainSpec { id, genesis, settlement, fee_contract } +} + +#[rstest] +#[case::dev(ChainSpec::Dev(dev_chain_spec()))] +#[case::rollup(ChainSpec::Rollup(rollup_chain_spec()))] +fn can_initialize_genesis(#[case] chain: ChainSpec) { + let backend = backend(&chain); + backend.init_genesis().expect("failed to initialize genesis"); +} + +#[test] +fn reinitialize_with_different_rollup_chain_spec() { + let db = DbProvider::new_ephemeral(); + + let chain1 = ChainSpec::Rollup(rollup_chain_spec()); + let backend1 = backend_with_db(&chain1, db.clone()); + backend1.init_genesis().expect("failed to initialize genesis"); + + // Modify the chain spec so that the resultant genesis block hash will be different. + let chain2 = ChainSpec::Rollup({ + let mut chain = rollup_chain_spec(); + chain.genesis.parent_hash = felt!("0x1337"); + chain + }); + + let backend2 = backend_with_db(&chain2, db); + let err = backend2.init_genesis().unwrap_err().to_string(); + assert!(err.as_str().contains("Genesis block hash mismatch")); +} diff --git a/crates/katana/executor/tests/fixtures/mod.rs b/crates/katana/executor/tests/fixtures/mod.rs index 30ea870bf8..0b21b0541c 100644 --- a/crates/katana/executor/tests/fixtures/mod.rs +++ b/crates/katana/executor/tests/fixtures/mod.rs @@ -50,7 +50,7 @@ pub fn contract_class() -> (CompiledClass, ContractClass) { #[rstest::fixture] #[once] pub fn chain() -> ChainSpec { - let mut chain = katana_chain_spec::DEV_UNALLOCATED.clone(); + let mut chain = katana_chain_spec::dev::DEV_UNALLOCATED.clone(); // to generate the exact list of accounts as you would when you just run `katana` w/o // any additional flags @@ -63,12 +63,14 @@ pub fn chain() -> ChainSpec { .generate(); chain.genesis.extend_allocations(accounts.into_iter().map(|(k, v)| (k, v.into()))); - chain + ChainSpec::Dev(chain) } /// Returns a state provider with some prefilled states. #[rstest::fixture] pub fn state_provider(chain: &ChainSpec) -> Box { + let ChainSpec::Dev(chain) = chain else { panic!("should be dev chain spec") }; + let states = chain.state_updates(); let provider = DbProvider::new_ephemeral(); diff --git a/crates/katana/executor/tests/fixtures/transaction.rs b/crates/katana/executor/tests/fixtures/transaction.rs index f990af588f..61f5dc2c8b 100644 --- a/crates/katana/executor/tests/fixtures/transaction.rs +++ b/crates/katana/executor/tests/fixtures/transaction.rs @@ -99,7 +99,7 @@ fn signed() -> bool { #[rstest::fixture] pub fn executable_tx(signed: bool, chain: &ChainSpec, cfg: CfgEnv) -> ExecutableTxWithHash { - let (addr, alloc) = chain.genesis.allocations.first_key_value().expect("should have account"); + let (addr, alloc) = chain.genesis().allocations.first_key_value().expect("should have account"); let GenesisAllocation::Account(account) = alloc else { panic!("should be account"); @@ -122,7 +122,7 @@ pub fn executable_tx_without_max_fee( chain: &ChainSpec, cfg: CfgEnv, ) -> ExecutableTxWithHash { - let (addr, alloc) = chain.genesis.allocations.first_key_value().expect("should have account"); + let (addr, alloc) = chain.genesis().allocations.first_key_value().expect("should have account"); let GenesisAllocation::Account(account) = alloc else { panic!("should be account"); diff --git a/crates/katana/node/src/lib.rs b/crates/katana/node/src/lib.rs index d7f6618c7d..f56c086480 100644 --- a/crates/katana/node/src/lib.rs +++ b/crates/katana/node/src/lib.rs @@ -10,14 +10,14 @@ pub mod version; use std::future::IntoFuture; use std::sync::Arc; -use anyhow::Result; +use anyhow::{Context, Result}; use config::rpc::RpcModuleKind; use config::Config; use dojo_metrics::exporters::prometheus::PrometheusRecorder; use dojo_metrics::{Report, Server as MetricsServer}; use hyper::Method; use jsonrpsee::RpcModule; -use katana_chain_spec::SettlementLayer; +use katana_chain_spec::{ChainSpec, SettlementLayer}; use katana_core::backend::gas_oracle::GasOracle; use katana_core::backend::storage::Blockchain; use katana_core::backend::Backend; @@ -96,7 +96,7 @@ impl Node { /// /// This method will start all the node process, running them until the node is stopped. pub async fn launch(self) -> Result { - let chain = self.backend.chain_spec.id; + let chain = self.backend.chain_spec.id(); info!(%chain, "Starting node."); // TODO: maybe move this to the build stage @@ -161,15 +161,21 @@ pub async fn build(mut config: Config) -> Result { // --- build executor factory + let fee_token_addresses = match config.chain.as_ref() { + ChainSpec::Dev(cs) => { + FeeTokenAddressses { eth: cs.fee_contracts.eth, strk: cs.fee_contracts.strk } + } + ChainSpec::Rollup(cs) => { + FeeTokenAddressses { eth: cs.fee_contract.strk, strk: cs.fee_contract.strk } + } + }; + let cfg_env = CfgEnv { - chain_id: config.chain.id, + fee_token_addresses, + chain_id: config.chain.id(), invoke_tx_max_n_steps: config.execution.invocation_max_steps, validate_max_n_steps: config.execution.validation_max_steps, max_recursion_depth: config.execution.max_recursion_depth, - fee_token_addresses: FeeTokenAddressses { - eth: config.chain.fee_contracts.eth, - strk: config.chain.fee_contracts.strk, - }, }; let execution_flags = ExecutionFlags::new() @@ -182,6 +188,11 @@ pub async fn build(mut config: Config) -> Result { let (blockchain, db, forked_client) = if let Some(cfg) = &config.forking { let chain_spec = Arc::get_mut(&mut config.chain).expect("get mut Arc"); + + let ChainSpec::Dev(chain_spec) = chain_spec else { + return Err(anyhow::anyhow!("Forking is only supported in dev mode for now")); + }; + let (bc, block_num) = Blockchain::new_from_forked(cfg.url.clone(), cfg.block, chain_spec).await?; @@ -191,10 +202,10 @@ pub async fn build(mut config: Config) -> Result { (bc, None, Some(forked_client)) } else if let Some(db_path) = &config.db.dir { let db = katana_db::init_db(db_path)?; - (Blockchain::new_with_db(db.clone(), &config.chain)?, Some(db), None) + (Blockchain::new_with_db(db.clone()), Some(db), None) } else { let db = katana_db::init_ephemeral_db()?; - (Blockchain::new_with_db(db.clone(), &config.chain)?, Some(db), None) + (Blockchain::new_with_db(db.clone()), Some(db), None) }; // --- build l1 gas oracle @@ -203,7 +214,7 @@ pub async fn build(mut config: Config) -> Result { let gas_oracle = if let Some(fixed_prices) = &config.dev.fixed_gas_prices { // Use fixed gas prices if provided in the configuration GasOracle::fixed(fixed_prices.gas_price.clone(), fixed_prices.data_gas_price.clone()) - } else if let Some(settlement) = &config.chain.settlement { + } else if let Some(settlement) = config.chain.settlement() { match settlement { SettlementLayer::Starknet { .. } => GasOracle::sampled_starknet(), SettlementLayer::Ethereum { rpc_url, .. } => { @@ -227,6 +238,8 @@ pub async fn build(mut config: Config) -> Result { chain_spec: config.chain.clone(), }); + backend.init_genesis().context("failed to initialize genesis")?; + // --- build block producer let block_producer = if config.sequencing.block_time.is_some() || config.sequencing.no_mining { diff --git a/crates/katana/primitives/src/genesis/constant.rs b/crates/katana/primitives/src/genesis/constant.rs index 3cd2445361..e6e1cdca11 100644 --- a/crates/katana/primitives/src/genesis/constant.rs +++ b/crates/katana/primitives/src/genesis/constant.rs @@ -90,6 +90,9 @@ lazy_static! { // Default account contract pub static ref DEFAULT_ACCOUNT_CLASS: ContractClass = parse_sierra_class(include_str!("../../../contracts/build/default_account.json")).unwrap(); pub static ref DEFAULT_ACCOUNT_CLASS_CASM: CompiledClass = read_compiled_class_artifact(include_str!("../../../contracts/build/default_account.json")); + + // Genesis account class + pub static ref GENESIS_ACCOUNT_CLASS: ContractClass = read_legacy_class_artifact(include_str!("../../../contracts/build/account.json")); } #[cfg(feature = "controller")] diff --git a/crates/katana/primitives/src/lib.rs b/crates/katana/primitives/src/lib.rs index 25662a8093..4fe12c9235 100644 --- a/crates/katana/primitives/src/lib.rs +++ b/crates/katana/primitives/src/lib.rs @@ -21,6 +21,7 @@ pub mod conversion; pub mod state; pub mod utils; +pub use alloy_primitives::U256; pub use contract::ContractAddress; pub use starknet::macros::felt; pub use starknet_types_core::felt::{Felt, FromStrError}; diff --git a/crates/katana/primitives/src/transaction.rs b/crates/katana/primitives/src/transaction.rs index 918742e710..f34f9133f5 100644 --- a/crates/katana/primitives/src/transaction.rs +++ b/crates/katana/primitives/src/transaction.rs @@ -9,9 +9,9 @@ use crate::contract::{ContractAddress, Nonce}; use crate::da::DataAvailabilityMode; use crate::fee::ResourceBoundsMapping; use crate::utils::transaction::{ - compute_declare_v1_tx_hash, compute_declare_v2_tx_hash, compute_declare_v3_tx_hash, - compute_deploy_account_v1_tx_hash, compute_deploy_account_v3_tx_hash, - compute_invoke_v1_tx_hash, compute_l1_handler_tx_hash, + compute_declare_v0_tx_hash, compute_declare_v1_tx_hash, compute_declare_v2_tx_hash, + compute_declare_v3_tx_hash, compute_deploy_account_v1_tx_hash, + compute_deploy_account_v3_tx_hash, compute_invoke_v1_tx_hash, compute_l1_handler_tx_hash, }; use crate::{utils, Felt}; @@ -114,6 +114,15 @@ pub enum ExecutableTx { } impl ExecutableTx { + pub fn calculate_hash(&self, is_query: bool) -> Felt { + match self { + Self::L1Handler(tx) => tx.calculate_hash(), + Self::Invoke(tx) => tx.calculate_hash(is_query), + Self::Declare(tx) => tx.calculate_hash(is_query), + Self::DeployAccount(tx) => tx.calculate_hash(is_query), + } + } + pub fn tx_ref(&self) -> TxRef<'_> { match self { ExecutableTx::Invoke(tx) => TxRef::Invoke(tx), @@ -429,7 +438,14 @@ impl DeclareTx { /// Compute the hash of the transaction. pub fn calculate_hash(&self, is_query: bool) -> TxHash { match self { - DeclareTx::V0(..) => todo!(), + // v0 declare tx is ignored by the SNOS + DeclareTx::V0(tx) => compute_declare_v0_tx_hash( + Felt::from(tx.sender_address), + tx.class_hash, + tx.max_fee, + tx.chain_id.into(), + is_query, + ), DeclareTx::V1(tx) => compute_declare_v1_tx_hash( Felt::from(tx.sender_address), diff --git a/crates/katana/primitives/src/utils/transaction.rs b/crates/katana/primitives/src/utils/transaction.rs index 9c94d1054a..00209a4be7 100644 --- a/crates/katana/primitives/src/utils/transaction.rs +++ b/crates/katana/primitives/src/utils/transaction.rs @@ -101,6 +101,28 @@ pub fn compute_deploy_account_v3_tx_hash( ]) } +/// Compute the hash of a V0 Declare transaction. +/// +/// Reference: https://github.com/dojoengine/sequencer/blob/6f72e5cc30cae2a0db72b709ee6375ba863cfc58/crates/starknet_api/src/transaction_hash.rs#L471-L488 +pub fn compute_declare_v0_tx_hash( + sender_address: Felt, + class_hash: Felt, + max_fee: u128, + chain_id: Felt, + is_query: bool, +) -> Felt { + compute_hash_on_elements(&[ + PREFIX_DECLARE, + if is_query { QUERY_VERSION_OFFSET + Felt::ZERO } else { Felt::ZERO }, // version + sender_address, + Felt::ZERO, // entry_point_selector + compute_hash_on_elements(&[]), + max_fee.into(), + chain_id, + class_hash, + ]) +} + /// Compute the hash of a V1 Declare transaction. pub fn compute_declare_v1_tx_hash( sender_address: Felt, diff --git a/crates/katana/rpc/rpc/Cargo.toml b/crates/katana/rpc/rpc/Cargo.toml index 5d032a4a0b..fbd3608df6 100644 --- a/crates/katana/rpc/rpc/Cargo.toml +++ b/crates/katana/rpc/rpc/Cargo.toml @@ -34,6 +34,7 @@ url.workspace = true [dev-dependencies] katana-cairo.workspace = true +katana-chain-spec.workspace = true katana-node.workspace = true katana-rpc-api = { workspace = true, features = [ "client" ] } katana-trie.workspace = true diff --git a/crates/katana/rpc/rpc/src/dev.rs b/crates/katana/rpc/rpc/src/dev.rs index 9c48eb1cf0..c412e44cca 100644 --- a/crates/katana/rpc/rpc/src/dev.rs +++ b/crates/katana/rpc/rpc/src/dev.rs @@ -93,6 +93,6 @@ impl DevApiServer for DevApi { } async fn predeployed_accounts(&self) -> Result, Error> { - Ok(self.backend.chain_spec.genesis.accounts().map(|e| Account::new(*e.0, e.1)).collect()) + Ok(self.backend.chain_spec.genesis().accounts().map(|e| Account::new(*e.0, e.1)).collect()) } } diff --git a/crates/katana/rpc/rpc/src/starknet/read.rs b/crates/katana/rpc/rpc/src/starknet/read.rs index a48cfe5f5b..ea80b07a09 100644 --- a/crates/katana/rpc/rpc/src/starknet/read.rs +++ b/crates/katana/rpc/rpc/src/starknet/read.rs @@ -25,7 +25,7 @@ use super::StarknetApi; #[async_trait] impl StarknetApiServer for StarknetApi { async fn chain_id(&self) -> RpcResult { - Ok(self.inner.backend.chain_spec.id.id().into()) + Ok(self.inner.backend.chain_spec.id().id().into()) } async fn get_nonce( @@ -171,7 +171,7 @@ impl StarknetApiServer for StarknetApi { block_id: BlockIdOrTag, ) -> RpcResult> { self.on_cpu_blocking_task(move |this| { - let chain_id = this.inner.backend.chain_spec.id; + let chain_id = this.inner.backend.chain_spec.id(); let transactions = request .into_iter() @@ -234,7 +234,7 @@ impl StarknetApiServer for StarknetApi { block_id: BlockIdOrTag, ) -> RpcResult { self.on_cpu_blocking_task(move |this| { - let chain_id = this.inner.backend.chain_spec.id; + let chain_id = this.inner.backend.chain_spec.id(); let tx = message.into_tx_with_chain_id(chain_id); let hash = tx.calculate_hash(); diff --git a/crates/katana/rpc/rpc/src/starknet/trace.rs b/crates/katana/rpc/rpc/src/starknet/trace.rs index 5f0594bd6f..8ef3434936 100644 --- a/crates/katana/rpc/rpc/src/starknet/trace.rs +++ b/crates/katana/rpc/rpc/src/starknet/trace.rs @@ -27,7 +27,7 @@ impl StarknetApi { transactions: Vec, simulation_flags: Vec, ) -> Result, StarknetApiError> { - let chain_id = self.inner.backend.chain_spec.id; + let chain_id = self.inner.backend.chain_spec.id(); let executables = transactions .into_iter() diff --git a/crates/katana/rpc/rpc/src/starknet/write.rs b/crates/katana/rpc/rpc/src/starknet/write.rs index 775b95fbce..c0f35f58a6 100644 --- a/crates/katana/rpc/rpc/src/starknet/write.rs +++ b/crates/katana/rpc/rpc/src/starknet/write.rs @@ -21,7 +21,7 @@ impl StarknetApi { return Err(StarknetApiError::UnsupportedTransactionVersion); } - let tx = tx.into_tx_with_chain_id(this.inner.backend.chain_spec.id); + let tx = tx.into_tx_with_chain_id(this.inner.backend.chain_spec.id()); let tx = ExecutableTxWithHash::new(ExecutableTx::Invoke(tx)); let hash = this.inner.pool.add_transaction(tx)?; @@ -40,7 +40,7 @@ impl StarknetApi { } let tx = tx - .try_into_tx_with_chain_id(this.inner.backend.chain_spec.id) + .try_into_tx_with_chain_id(this.inner.backend.chain_spec.id()) .map_err(|_| StarknetApiError::InvalidContractClass)?; let class_hash = tx.class_hash(); @@ -61,7 +61,7 @@ impl StarknetApi { return Err(StarknetApiError::UnsupportedTransactionVersion); } - let tx = tx.into_tx_with_chain_id(this.inner.backend.chain_spec.id); + let tx = tx.into_tx_with_chain_id(this.inner.backend.chain_spec.id()); let contract_address = tx.contract_address(); let tx = ExecutableTxWithHash::new(ExecutableTx::DeployAccount(tx)); diff --git a/crates/katana/rpc/rpc/tests/proofs.rs b/crates/katana/rpc/rpc/tests/proofs.rs index c07a8a21ba..3f2f75d261 100644 --- a/crates/katana/rpc/rpc/tests/proofs.rs +++ b/crates/katana/rpc/rpc/tests/proofs.rs @@ -3,6 +3,7 @@ use std::path::PathBuf; use assert_matches::assert_matches; use dojo_test_utils::sequencer::{get_default_test_config, TestSequencer}; use jsonrpsee::http_client::HttpClientBuilder; +use katana_chain_spec::ChainSpec; use katana_node::config::rpc::DEFAULT_RPC_MAX_PROOF_KEYS; use katana_node::config::SequencingConfig; use katana_primitives::block::BlockIdOrTag; @@ -79,7 +80,11 @@ async fn genesis_states() { let cfg = get_default_test_config(SequencingConfig::default()); let sequencer = TestSequencer::start(cfg).await; - let genesis_states = sequencer.backend().chain_spec.state_updates(); + let ChainSpec::Dev(chain_spec) = sequencer.backend().chain_spec.as_ref() else { + panic!("should be dev chain spec") + }; + + let genesis_states = chain_spec.state_updates(); // We need to use the jsonrpsee client because `starknet-rs` doesn't yet support RPC 0.8.0 let client = HttpClientBuilder::default().build(sequencer.url()).unwrap(); diff --git a/crates/katana/storage/provider/Cargo.toml b/crates/katana/storage/provider/Cargo.toml index 6bd74b412f..96725ea48e 100644 --- a/crates/katana/storage/provider/Cargo.toml +++ b/crates/katana/storage/provider/Cargo.toml @@ -7,9 +7,10 @@ version.workspace = true # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -katana-chain-spec.workspace = true +katana-chain-spec = { workspace = true, optional = true } katana-db = { workspace = true, features = [ "test-utils" ] } katana-primitives.workspace = true + katana-trie.workspace = true anyhow.workspace = true @@ -33,10 +34,11 @@ serde_json.workspace = true default = [ "fork", "in-memory" ] fork = [ "dep:futures", "dep:starknet", "dep:tokio", "in-memory" ] in-memory = [ ] -test-utils = [ "dep:alloy-primitives" ] +test-utils = [ "dep:alloy-primitives", "dep:katana-chain-spec" ] [dev-dependencies] alloy-primitives.workspace = true +katana-chain-spec.workspace = true katana-runner.workspace = true lazy_static.workspace = true rand.workspace = true diff --git a/crates/katana/storage/provider/src/providers/in_memory/state.rs b/crates/katana/storage/provider/src/providers/in_memory/state.rs index a309cf275c..f6e5b93f03 100644 --- a/crates/katana/storage/provider/src/providers/in_memory/state.rs +++ b/crates/katana/storage/provider/src/providers/in_memory/state.rs @@ -2,9 +2,15 @@ use std::collections::{HashMap, VecDeque}; use std::sync::Arc; use katana_primitives::block::BlockNumber; +use katana_primitives::class::{ClassHash, CompiledClass, CompiledClassHash, ContractClass}; +use katana_primitives::contract::{Nonce, StorageKey, StorageValue}; +use katana_primitives::{ContractAddress, Felt}; +use katana_trie::MultiProof; use super::cache::{CacheSnapshotWithoutClasses, CacheStateDb, SharedContractClasses}; -use crate::traits::state::StateProvider; +use crate::traits::contract::ContractClassProvider; +use crate::traits::state::{StateProofProvider, StateProvider, StateRootProvider}; +use crate::ProviderResult; #[derive(Debug)] pub struct StateSnapshot { @@ -103,3 +109,92 @@ impl Default for InMemoryStateDb { } } } + +#[derive(Debug)] +pub struct EmptyStateProvider; + +impl StateProvider for EmptyStateProvider { + fn class_hash_of_contract( + &self, + address: ContractAddress, + ) -> ProviderResult> { + let _ = address; + Ok(None) + } + + fn nonce(&self, address: ContractAddress) -> ProviderResult> { + let _ = address; + Ok(None) + } + + fn storage( + &self, + address: ContractAddress, + storage_key: StorageKey, + ) -> ProviderResult> { + let _ = address; + let _ = storage_key; + Ok(None) + } +} + +impl ContractClassProvider for EmptyStateProvider { + fn class(&self, hash: ClassHash) -> ProviderResult> { + let _ = hash; + Ok(None) + } + + fn compiled_class(&self, hash: ClassHash) -> ProviderResult> { + let _ = hash; + Ok(None) + } + + fn compiled_class_hash_of_class_hash( + &self, + hash: ClassHash, + ) -> ProviderResult> { + let _ = hash; + Ok(None) + } +} + +impl StateProofProvider for EmptyStateProvider { + fn class_multiproof(&self, classes: Vec) -> ProviderResult { + let _ = classes; + Ok(MultiProof(Default::default())) + } + + fn contract_multiproof(&self, addresses: Vec) -> ProviderResult { + let _ = addresses; + Ok(MultiProof(Default::default())) + } + + fn storage_multiproof( + &self, + address: ContractAddress, + key: Vec, + ) -> ProviderResult { + let _ = address; + let _ = key; + Ok(MultiProof(Default::default())) + } +} + +impl StateRootProvider for EmptyStateProvider { + fn classes_root(&self) -> ProviderResult { + Ok(Felt::ZERO) + } + + fn contracts_root(&self) -> ProviderResult { + Ok(Felt::ZERO) + } + + fn state_root(&self) -> ProviderResult { + Ok(Felt::ZERO) + } + + fn storage_root(&self, contract: ContractAddress) -> ProviderResult> { + let _ = contract; + Ok(None) + } +} diff --git a/crates/katana/storage/provider/src/test_utils.rs b/crates/katana/storage/provider/src/test_utils.rs index 50889696eb..1bdb271f6f 100644 --- a/crates/katana/storage/provider/src/test_utils.rs +++ b/crates/katana/storage/provider/src/test_utils.rs @@ -1,10 +1,9 @@ use std::sync::Arc; use alloy_primitives::U256; -use katana_chain_spec::ChainSpec; use katana_db::mdbx::test_utils; use katana_primitives::address; -use katana_primitives::block::{BlockHash, FinalityStatus}; +use katana_primitives::block::{Block, BlockHash, FinalityStatus}; use katana_primitives::contract::ContractAddress; use katana_primitives::genesis::allocation::{ DevGenesisAccount, GenesisAccountAlloc, GenesisAllocation, @@ -29,19 +28,19 @@ fn initialize_test_provider(provider: &P) { let hash = BlockHash::ZERO; let status = FinalityStatus::AcceptedOnL2; - let block = chain.block().seal_with_hash_and_status(hash, status); - let states = chain.state_updates(); + let state_updates = chain.state_updates(); + let block = Block::default().seal_with_hash_and_status(hash, status); provider - .insert_block_with_states_and_receipts(block, states, Vec::new(), Vec::new()) + .insert_block_with_states_and_receipts(block, state_updates, Vec::new(), Vec::new()) .expect("Failed to initialize test provider with genesis block and states."); } /// Creates a genesis config specifically for testing purposes. /// This includes: /// - An account with simple `__execute__` function, deployed at address `0x1`. -pub fn create_chain_for_testing() -> ChainSpec { - let mut chain = katana_chain_spec::DEV_UNALLOCATED.clone(); +fn create_chain_for_testing() -> katana_chain_spec::dev::ChainSpec { + let mut chain = katana_chain_spec::dev::DEV_UNALLOCATED.clone(); let class_hash = felt!("0x111"); let address = address!("0x1");