diff --git a/CHANGELOG.md b/CHANGELOG.md index 0731a2adb..071328dc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## Next release +- refactor(rpc): replace starknet-rs by starknet-types-rpc +- fix(fgw): include `l1_to_l2_consumed_message` in L1 handler receipt - feat(v0.8.0-rc0): storage proofs for rpc version v0.8.0 - feat(warp): added warp update to madara - docs(readme): updated README.md docs and added Docker Compose support diff --git a/Cargo.lock b/Cargo.lock index 2c56da39d..6ad8f6ba9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1362,7 +1362,7 @@ dependencies = [ "serde_json", "sha2", "sha3", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "strum 0.25.0", "strum_macros 0.25.3", @@ -1408,7 +1408,7 @@ dependencies = [ "serde", "slotmap", "smallvec", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror 2.0.3", ] @@ -2331,7 +2331,7 @@ dependencies = [ "rand", "sha2", "smol_str 0.2.2", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror 1.0.65", ] @@ -2520,7 +2520,7 @@ dependencies = [ "serde_json", "sha3", "smol_str 0.2.2", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror 1.0.65", ] @@ -2814,7 +2814,7 @@ dependencies = [ "itertools 0.12.1", "num-bigint", "num-traits 0.2.19", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror 1.0.65", ] @@ -2974,7 +2974,7 @@ dependencies = [ "serde", "serde_json", "smol_str 0.2.2", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror 1.0.65", ] @@ -2997,7 +2997,7 @@ dependencies = [ "serde_json", "sha3", "smol_str 0.2.2", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror 1.0.65", ] @@ -3210,7 +3210,7 @@ dependencies = [ "sha2", "sha3", "starknet-crypto 0.6.2", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "thiserror-no-std", "zip", ] @@ -5385,7 +5385,6 @@ dependencies = [ "anyhow", "async-trait", "blockifier", - "chrono", "clap", "fdlimit", "futures", @@ -5419,7 +5418,6 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "starknet-providers", "starknet_api", "thiserror 2.0.3", "tokio", @@ -5507,8 +5505,7 @@ dependencies = [ "rayon", "rstest 0.18.2", "serde", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "tempfile", "thiserror 2.0.3", @@ -5545,8 +5542,7 @@ dependencies = [ "rayon", "rocksdb", "serde", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "tempfile", "thiserror 2.0.3", @@ -5588,7 +5584,8 @@ dependencies = [ "serde_json", "starknet-core", "starknet-signers", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "starknet_api", "tokio", "tracing", @@ -5610,7 +5607,7 @@ dependencies = [ "starknet", "starknet-core", "starknet-providers", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "tempfile", "tokio", "tracing", @@ -5648,7 +5645,7 @@ dependencies = [ "serde", "serde_json", "serial_test", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "tempfile", "thiserror 2.0.3", @@ -5681,8 +5678,8 @@ dependencies = [ "opentelemetry-stdout", "opentelemetry_sdk", "rstest 0.18.2", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "starknet_api", "thiserror 2.0.3", "tokio", @@ -5712,7 +5709,8 @@ dependencies = [ "serde", "serde_json", "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "tokio", "tokio-util", "tower 0.4.13", @@ -5739,8 +5737,8 @@ dependencies = [ "rstest 0.18.2", "serde", "serde_json", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "thiserror 2.0.3", "tokio", "tokio-util", @@ -5769,7 +5767,6 @@ dependencies = [ "mp-state-update", "mp-transactions", "mp-utils", - "once_cell", "opentelemetry", "opentelemetry-appender-tracing", "opentelemetry-otlp", @@ -5780,8 +5777,8 @@ dependencies = [ "proptest-derive", "rstest 0.18.2", "serde_json", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "starknet_api", "thiserror 2.0.3", "tokio", @@ -5817,9 +5814,7 @@ dependencies = [ "rstest 0.18.2", "serde", "serde_json", - "serde_with", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet-types-rpc", "starknet_api", "thiserror 2.0.3", @@ -5847,9 +5842,7 @@ dependencies = [ "mp-block", "mp-chain-config", "mp-class", - "mp-convert", "mp-gateway", - "mp-transactions", "mp-utils", "opentelemetry", "opentelemetry-appender-tracing", @@ -5860,8 +5853,7 @@ dependencies = [ "regex", "rstest 0.18.2", "serde_json", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "tempfile", "thiserror 2.0.3", @@ -5982,8 +5974,7 @@ dependencies = [ "opentelemetry_sdk", "primitive-types", "serde", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet-types-rpc", "thiserror 2.0.3", "tracing", @@ -6005,7 +5996,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "thiserror 2.0.3", "tracing", @@ -6016,6 +6007,7 @@ dependencies = [ name = "mp-class" version = "0.7.0" dependencies = [ + "base64 0.22.1", "blockifier", "cairo-lang-starknet 1.0.0-alpha.6", "cairo-lang-starknet 1.0.0-rc0", @@ -6034,7 +6026,8 @@ dependencies = [ "serde_json", "starknet-core", "starknet-providers", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "thiserror 2.0.3", "tokio", ] @@ -6046,9 +6039,10 @@ dependencies = [ "assert_matches", "primitive-types", "serde", + "serde_json", "serde_with", "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "starknet_api", "thiserror 2.0.3", ] @@ -6058,6 +6052,7 @@ name = "mp-gateway" version = "0.7.0" dependencies = [ "anyhow", + "base64 0.22.1", "http 1.1.0", "hyper 1.5.0", "mc-block-import", @@ -6068,11 +6063,14 @@ dependencies = [ "mp-receipt", "mp-state-update", "mp-transactions", + "primitive-types", "serde", "serde_json", "serde_with", + "sha3", "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "thiserror 2.0.3", "url", ] @@ -6084,10 +6082,12 @@ dependencies = [ "bincode 1.3.3", "blockifier", "cairo-vm", + "primitive-types", "rstest 0.18.2", "serde", "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "starknet_api", "thiserror 2.0.3", "tracing", @@ -6100,8 +6100,8 @@ dependencies = [ "bincode 1.3.3", "mp-convert", "serde", - "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", ] [[package]] @@ -6110,6 +6110,7 @@ version = "0.7.0" dependencies = [ "anyhow", "assert_matches", + "base64 0.22.1", "blockifier", "cairo-lang-starknet-classes", "cairo-lang-utils 2.8.4", @@ -6122,7 +6123,8 @@ dependencies = [ "serde_json", "serde_with", "starknet-core", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", + "starknet-types-rpc", "starknet_api", "thiserror 2.0.3", "tracing", @@ -6149,7 +6151,7 @@ dependencies = [ "serde_yaml", "starknet-core", "starknet-crypto 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "tokio", "tokio-util", "tracing", @@ -8280,7 +8282,7 @@ dependencies = [ "serde_with", "sha3", "starknet-crypto 0.7.2 (git+https://github.com/kasarlabs/starknet-rs.git?branch=fork)", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", ] [[package]] @@ -8338,7 +8340,7 @@ dependencies = [ "rfc6979", "sha2", "starknet-curve 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "zeroize", ] @@ -8356,7 +8358,7 @@ dependencies = [ "rfc6979", "sha2", "starknet-curve 0.5.1 (git+https://github.com/kasarlabs/starknet-rs.git?branch=fork)", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "zeroize", ] @@ -8395,7 +8397,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bcde6bd74269b8161948190ace6cf069ef20ac6e79cd2ba09b320efa7500b6de" dependencies = [ - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", ] [[package]] @@ -8403,7 +8405,7 @@ name = "starknet-curve" version = "0.5.1" source = "git+https://github.com/kasarlabs/starknet-rs.git?branch=fork#70e1ee45dc701afc2a7629bf88bb5d90a93d51a7" dependencies = [ - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", ] [[package]] @@ -8481,14 +8483,26 @@ dependencies = [ "serde", ] +[[package]] +name = "starknet-types-core" +version = "0.1.7" +source = "git+https://github.com/jbcaron/types-rs.git?branch=fork#050be63116750e4ce253a91bfd6aa4bb8db7fe43" +dependencies = [ + "lambdaworks-crypto", + "lambdaworks-math", + "num-bigint", + "num-integer", + "num-traits 0.2.19", + "serde", +] + [[package]] name = "starknet-types-rpc" version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d717a1b5ff67fa9ec13b09381513a4824fdd73ec5440fcc116088be6744aac4" +source = "git+https://github.com/jbcaron/types-rs.git?branch=fork#050be63116750e4ce253a91bfd6aa4bb8db7fe43" dependencies = [ "serde", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/jbcaron/types-rs.git?branch=fork)", ] [[package]] @@ -8509,7 +8523,7 @@ dependencies = [ "serde_json", "sha3", "starknet-crypto 0.5.2", - "starknet-types-core", + "starknet-types-core 0.1.7 (git+https://github.com/kasarlabs/types-rs.git?branch=feat-deserialize-v0.1.7)", "strum 0.24.1", "strum_macros 0.24.3", "thiserror 1.0.65", diff --git a/Cargo.toml b/Cargo.toml index 1741622f4..1786898d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -164,6 +164,7 @@ paste = "1.0.15" anyhow = "1.0" assert_matches = "1.5" async-trait = "0.1" +base64 = "0.22" sha3 = "0.10" bitvec = { version = "1.0", default-features = false, features = ["std"] } clap = { version = "4.4" } @@ -242,4 +243,6 @@ rocksdb = { git = "https://github.com/madara-alliance/rust-rocksdb", branch = "r librocksdb-sys = { git = "https://github.com/madara-alliance/rust-rocksdb", branch = "read-options-set-raw-snapshot" } starknet-types-core = { git = "https://github.com/kasarlabs/types-rs.git", branch = "feat-deserialize-v0.1.7" } +starknet-types-rpc = { git = "https://github.com/jbcaron/types-rs.git", branch = "fork" } + starknet-core = { git = "https://github.com/kasarlabs/starknet-rs.git", branch = "fork" } diff --git a/crates/client/block_import/Cargo.toml b/crates/client/block_import/Cargo.toml index ec9c2e473..13cf872d5 100644 --- a/crates/client/block_import/Cargo.toml +++ b/crates/client/block_import/Cargo.toml @@ -40,7 +40,6 @@ mp-state-update.workspace = true mp-transactions.workspace = true bonsai-trie.workspace = true -starknet-core.workspace = true starknet-types-core.workspace = true starknet_api.workspace = true diff --git a/crates/client/db/Cargo.toml b/crates/client/db/Cargo.toml index 933006767..3d9d08658 100644 --- a/crates/client/db/Cargo.toml +++ b/crates/client/db/Cargo.toml @@ -30,7 +30,6 @@ mp-utils = { workspace = true } # Starknet bonsai-trie = { workspace = true } -starknet-core = { workspace = true } starknet-types-core = { workspace = true } starknet_api = { workspace = true } diff --git a/crates/client/devnet/Cargo.toml b/crates/client/devnet/Cargo.toml index 408dd78d1..de637dad9 100644 --- a/crates/client/devnet/Cargo.toml +++ b/crates/client/devnet/Cargo.toml @@ -47,6 +47,7 @@ blockifier.workspace = true starknet-core.workspace = true starknet-signers.workspace = true starknet-types-core.workspace = true +starknet-types-rpc.workspace = true starknet_api.workspace = true # Other diff --git a/crates/client/devnet/src/lib.rs b/crates/client/devnet/src/lib.rs index 0254df6f0..6dc6eb359 100644 --- a/crates/client/devnet/src/lib.rs +++ b/crates/client/devnet/src/lib.rs @@ -195,17 +195,17 @@ mod tests { use mp_block::header::L1DataAvailabilityMode; use mp_block::{BlockId, BlockTag}; - use mp_class::ClassInfo; + use mp_class::{ClassInfo, FlattenedSierraClass}; + use mp_receipt::{Event, ExecutionResult, FeePayment, InvokeTransactionReceipt, PriceUnit, TransactionReceipt}; use mp_transactions::broadcasted_to_blockifier; use mp_transactions::compute_hash::calculate_contract_address; use rstest::{fixture, rstest}; use starknet_core::types::contract::SierraClass; - use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeclareTransactionV3, BroadcastedDeployAccountTransaction, - BroadcastedDeployAccountTransactionV3, BroadcastedInvokeTransaction, BroadcastedInvokeTransactionV3, - BroadcastedTransaction, DataAvailabilityMode, DeclareTransactionResult, DeployAccountTransactionResult, - FlattenedSierraClass, InvokeTransactionResult, ResourceBounds, ResourceBoundsMapping, + use starknet_types_rpc::{ + AddInvokeTransactionResult, BroadcastedDeclareTxn, BroadcastedDeclareTxnV3, BroadcastedDeployAccountTxn, + BroadcastedInvokeTxn, BroadcastedTxn, ClassAndTxnHash, ContractAndTxnHash, DaMode, DeployAccountTxnV3, + InvokeTxnV3, ResourceBounds, ResourceBoundsMapping, }; use std::sync::Arc; @@ -219,11 +219,11 @@ mod tests { impl DevnetForTesting { pub fn sign_and_add_invoke_tx( &self, - mut tx: BroadcastedInvokeTransaction, + mut tx: BroadcastedInvokeTxn, contract: &DevnetPredeployedContract, - ) -> InvokeTransactionResult { + ) -> AddInvokeTransactionResult { let (blockifier_tx, _classes) = broadcasted_to_blockifier( - BroadcastedTransaction::Invoke(tx.clone()), + BroadcastedTxn::Invoke(tx.clone()), self.backend.chain_config().chain_id.to_felt(), self.backend.chain_config().latest_protocol_version, ) @@ -231,8 +231,10 @@ mod tests { let signature = contract.secret.sign(&transaction_hash(&blockifier_tx)).unwrap(); let tx_signature = match &mut tx { - BroadcastedInvokeTransaction::V1(tx) => &mut tx.signature, - BroadcastedInvokeTransaction::V3(tx) => &mut tx.signature, + BroadcastedInvokeTxn::V0(tx) => &mut tx.signature, + BroadcastedInvokeTxn::V1(tx) => &mut tx.signature, + BroadcastedInvokeTxn::V3(tx) => &mut tx.signature, + _ => unreachable!("the invoke tx is not query only"), }; *tx_signature = vec![signature.r, signature.s]; @@ -243,11 +245,11 @@ mod tests { pub fn sign_and_add_declare_tx( &self, - mut tx: BroadcastedDeclareTransaction, + mut tx: BroadcastedDeclareTxn, contract: &DevnetPredeployedContract, - ) -> DeclareTransactionResult { + ) -> ClassAndTxnHash { let (blockifier_tx, _classes) = broadcasted_to_blockifier( - BroadcastedTransaction::Declare(tx.clone()), + BroadcastedTxn::Declare(tx.clone()), self.backend.chain_config().chain_id.to_felt(), self.backend.chain_config().latest_protocol_version, ) @@ -255,9 +257,10 @@ mod tests { let signature = contract.secret.sign(&transaction_hash(&blockifier_tx)).unwrap(); let tx_signature = match &mut tx { - BroadcastedDeclareTransaction::V1(tx) => &mut tx.signature, - BroadcastedDeclareTransaction::V2(tx) => &mut tx.signature, - BroadcastedDeclareTransaction::V3(tx) => &mut tx.signature, + BroadcastedDeclareTxn::V1(tx) => &mut tx.signature, + BroadcastedDeclareTxn::V2(tx) => &mut tx.signature, + BroadcastedDeclareTxn::V3(tx) => &mut tx.signature, + _ => unreachable!("the declare tx is not query only"), }; *tx_signature = vec![signature.r, signature.s]; @@ -266,11 +269,11 @@ mod tests { pub fn sign_and_add_deploy_account_tx( &self, - mut tx: BroadcastedDeployAccountTransaction, + mut tx: BroadcastedDeployAccountTxn, contract: &DevnetPredeployedContract, - ) -> DeployAccountTransactionResult { + ) -> ContractAndTxnHash { let (blockifier_tx, _classes) = broadcasted_to_blockifier( - BroadcastedTransaction::DeployAccount(tx.clone()), + BroadcastedTxn::DeployAccount(tx.clone()), self.backend.chain_config().chain_id.to_felt(), self.backend.chain_config().latest_protocol_version, ) @@ -278,8 +281,9 @@ mod tests { let signature = contract.secret.sign(&transaction_hash(&blockifier_tx)).unwrap(); let tx_signature = match &mut tx { - BroadcastedDeployAccountTransaction::V1(tx) => &mut tx.signature, - BroadcastedDeployAccountTransaction::V3(tx) => &mut tx.signature, + BroadcastedDeployAccountTxn::V1(tx) => &mut tx.signature, + BroadcastedDeployAccountTxn::V3(tx) => &mut tx.signature, + _ => unreachable!("the deploy account tx is not query only"), }; *tx_signature = vec![signature.r, signature.s]; @@ -349,30 +353,29 @@ mod tests { let sender_address = &chain.contracts.0[0]; let sierra_class: SierraClass = serde_json::from_slice(contract).unwrap(); - let flattened_class: FlattenedSierraClass = sierra_class.clone().flatten().unwrap(); + let flattened_class: FlattenedSierraClass = sierra_class.clone().flatten().unwrap().into(); // starkli class-hash target/dev/madara_contracts_TestContract.compiled_contract_class.json let compiled_contract_class_hash = Felt::from_hex("0x0138105ded3d2e4ea1939a0bc106fb80fd8774c9eb89c1890d4aeac88e6a1b27").unwrap(); - let declare_txn: BroadcastedDeclareTransaction = - BroadcastedDeclareTransaction::V3(BroadcastedDeclareTransactionV3 { - sender_address: sender_address.address, - compiled_class_hash: compiled_contract_class_hash, - signature: vec![], - nonce: Felt::ZERO, - contract_class: Arc::new(flattened_class), - resource_bounds: ResourceBoundsMapping { - l1_gas: ResourceBounds { max_amount: 210000, max_price_per_unit: 10000 }, - l2_gas: ResourceBounds { max_amount: 60000, max_price_per_unit: 10000 }, - }, - tip: 0, - paymaster_data: vec![], - account_deployment_data: vec![], - nonce_data_availability_mode: DataAvailabilityMode::L1, - fee_data_availability_mode: DataAvailabilityMode::L1, - is_query: false, - }); + let declare_txn: BroadcastedDeclareTxn = BroadcastedDeclareTxn::V3(BroadcastedDeclareTxnV3 { + sender_address: sender_address.address, + compiled_class_hash: compiled_contract_class_hash, + signature: vec![], + nonce: Felt::ZERO, + contract_class: flattened_class.into(), + resource_bounds: ResourceBoundsMapping { + l1_gas: ResourceBounds { max_amount: 210000, max_price_per_unit: 10000 }, + l2_gas: ResourceBounds { max_amount: 60000, max_price_per_unit: 10000 }, + }, + tip: 0, + paymaster_data: vec![], + account_deployment_data: vec![], + nonce_data_availability_mode: DaMode::L1, + fee_data_availability_mode: DaMode::L1, + version: starknet_types_rpc::Version::X3, + }); let res = chain.sign_and_add_declare_tx(declare_txn, sender_address); @@ -421,7 +424,7 @@ mod tests { let contract_0 = &chain.contracts.0[0]; let transfer_txn = chain.sign_and_add_invoke_tx( - BroadcastedInvokeTransaction::V3(BroadcastedInvokeTransactionV3 { + BroadcastedInvokeTxn::V3(InvokeTxnV3 { sender_address: contract_0.address, calldata: Multicall::default() .with(Call { @@ -440,9 +443,8 @@ mod tests { tip: 0, paymaster_data: vec![], account_deployment_data: vec![], - nonce_data_availability_mode: starknet_core::types::DataAvailabilityMode::L1, - fee_data_availability_mode: starknet_core::types::DataAvailabilityMode::L1, - is_query: false, + nonce_data_availability_mode: DaMode::L1, + fee_data_availability_mode: DaMode::L1, }), contract_0, ); @@ -462,7 +464,7 @@ mod tests { class_hash: account_class_hash, }; - let deploy_account_txn = BroadcastedDeployAccountTransaction::V3(BroadcastedDeployAccountTransactionV3 { + let deploy_account_txn = BroadcastedDeployAccountTxn::V3(DeployAccountTxnV3 { signature: vec![], nonce: Felt::ZERO, contract_address_salt: Felt::ZERO, @@ -474,9 +476,8 @@ mod tests { }, tip: 0, paymaster_data: vec![], - nonce_data_availability_mode: DataAvailabilityMode::L1, - fee_data_availability_mode: DataAvailabilityMode::L1, - is_query: false, + nonce_data_availability_mode: DaMode::L1, + fee_data_availability_mode: DaMode::L1, }); let res = chain.sign_and_add_deploy_account_tx(deploy_account_txn, &account); @@ -513,7 +514,7 @@ mod tests { assert_eq!(chain.get_bal_strk_eth(contract_1.address), (10_000 * STRK_FRI_DECIMALS, 10_000 * ETH_WEI_DECIMALS)); let result = chain.sign_and_add_invoke_tx( - BroadcastedInvokeTransaction::V3(BroadcastedInvokeTransactionV3 { + BroadcastedInvokeTxn::V3(InvokeTxnV3 { sender_address: contract_0.address, calldata: Multicall::default() .with(Call { @@ -532,9 +533,8 @@ mod tests { tip: 0, paymaster_data: vec![], account_deployment_data: vec![], - nonce_data_availability_mode: starknet_core::types::DataAvailabilityMode::L1, - fee_data_availability_mode: starknet_core::types::DataAvailabilityMode::L1, - is_query: false, + nonce_data_availability_mode: DaMode::L1, + fee_data_availability_mode: DaMode::L1, }), contract_0, ); diff --git a/crates/client/exec/Cargo.toml b/crates/client/exec/Cargo.toml index a247a2ef3..15e22f290 100644 --- a/crates/client/exec/Cargo.toml +++ b/crates/client/exec/Cargo.toml @@ -26,8 +26,8 @@ mp-convert = { workspace = true } # Starknet blockifier = { workspace = true } cairo-vm = { workspace = true } -starknet-core = { workspace = true } starknet-types-core = { workspace = true } +starknet-types-rpc = { workspace = true } starknet_api = { workspace = true } # Other diff --git a/crates/client/exec/src/fee.rs b/crates/client/exec/src/fee.rs index 118766bd5..186febc11 100644 --- a/crates/client/exec/src/fee.rs +++ b/crates/client/exec/src/fee.rs @@ -1,11 +1,12 @@ use crate::{ExecutionContext, ExecutionResult}; use blockifier::transaction::objects::FeeType; +use starknet_types_core::felt::Felt; impl ExecutionContext { pub fn execution_result_to_fee_estimate( &self, executions_result: &ExecutionResult, - ) -> starknet_core::types::FeeEstimate { + ) -> starknet_types_rpc::FeeEstimate { let gas_price = self.block_context.block_info().gas_prices.get_gas_price_by_fee_type(&executions_result.fee_type).get(); let data_gas_price = self @@ -27,10 +28,10 @@ impl ExecutionContext { gas_consumed.saturating_mul(gas_price).saturating_add(data_gas_consumed.saturating_mul(data_gas_price)); let unit = match executions_result.fee_type { - FeeType::Eth => starknet_core::types::PriceUnit::Wei, - FeeType::Strk => starknet_core::types::PriceUnit::Fri, + FeeType::Eth => starknet_types_rpc::PriceUnit::Wei, + FeeType::Strk => starknet_types_rpc::PriceUnit::Fri, }; - starknet_core::types::FeeEstimate { + starknet_types_rpc::FeeEstimate { gas_consumed: gas_consumed.into(), gas_price: gas_price.into(), data_gas_consumed: data_gas_consumed.into(), diff --git a/crates/client/exec/src/trace.rs b/crates/client/exec/src/trace.rs index c8f5f33c0..c3178d532 100644 --- a/crates/client/exec/src/trace.rs +++ b/crates/client/exec/src/trace.rs @@ -4,6 +4,8 @@ use blockifier::state::cached_state::CommitmentStateDiff; use blockifier::{execution::call_info::CallInfo, transaction::transaction_types::TransactionType}; use cairo_vm::types::builtin_name::BuiltinName; use mp_convert::ToFelt; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{FunctionCall, MsgToL1}; use crate::{ExecutionResult, TransactionExecutionError}; @@ -27,7 +29,7 @@ pub enum TryFuntionInvocationFromCallInfoError { pub fn execution_result_to_tx_trace( executions_result: &ExecutionResult, -) -> Result { +) -> Result, ConvertCallInfoToExecuteInvocationError> { let ExecutionResult { tx_type, execution_info, state_diff, .. } = executions_result; let state_diff = match state_diff_is_empty(state_diff) { @@ -48,19 +50,26 @@ pub fn execution_result_to_tx_trace( fee_transfer_invocation.as_ref().map(|value| value.execution_resources.clone()).as_ref(), ); - let execution_resources = starknet_core::types::ExecutionResources { - computation_resources, - data_resources: starknet_core::types::DataResources { - data_availability: starknet_core::types::DataAvailabilityResources { - l1_gas: execution_info.transaction_receipt.da_gas.l1_gas as u64, - l1_data_gas: execution_info.transaction_receipt.da_gas.l1_data_gas as u64, - }, + let execution_resources = starknet_types_rpc::ExecutionResources { + bitwise_builtin_applications: computation_resources.bitwise_builtin_applications, + ec_op_builtin_applications: computation_resources.ec_op_builtin_applications, + ecdsa_builtin_applications: computation_resources.ecdsa_builtin_applications, + keccak_builtin_applications: computation_resources.keccak_builtin_applications, + memory_holes: computation_resources.memory_holes, + pedersen_builtin_applications: computation_resources.pedersen_builtin_applications, + poseidon_builtin_applications: computation_resources.poseidon_builtin_applications, + range_check_builtin_applications: computation_resources.range_check_builtin_applications, + segment_arena_builtin: computation_resources.segment_arena_builtin, + steps: computation_resources.steps, + data_availability: starknet_types_rpc::DataAvailability { + l1_gas: execution_info.transaction_receipt.da_gas.l1_gas, + l1_data_gas: execution_info.transaction_receipt.da_gas.l1_data_gas, }, }; let tx_trace = match tx_type { TransactionType::Declare => { - starknet_core::types::TransactionTrace::Declare(starknet_core::types::DeclareTransactionTrace { + starknet_types_rpc::TransactionTrace::Declare(starknet_types_rpc::DeclareTransactionTrace { validate_invocation, fee_transfer_invocation, state_diff, @@ -68,7 +77,7 @@ pub fn execution_result_to_tx_trace( }) } TransactionType::DeployAccount => { - starknet_core::types::TransactionTrace::DeployAccount(starknet_core::types::DeployAccountTransactionTrace { + starknet_types_rpc::TransactionTrace::DeployAccount(starknet_types_rpc::DeployAccountTransactionTrace { validate_invocation, constructor_invocation: execute_function_invocation .ok_or(ConvertCallInfoToExecuteInvocationError::MissingFunctionInvocation)?, @@ -78,14 +87,14 @@ pub fn execution_result_to_tx_trace( }) } TransactionType::InvokeFunction => { - starknet_core::types::TransactionTrace::Invoke(starknet_core::types::InvokeTransactionTrace { + starknet_types_rpc::TransactionTrace::Invoke(starknet_types_rpc::InvokeTransactionTrace { validate_invocation, execute_invocation: if let Some(e) = &execution_info.revert_error { - starknet_core::types::ExecuteInvocation::Reverted(starknet_core::types::RevertedInvocation { + starknet_types_rpc::ExecuteInvocation::Anon(starknet_types_rpc::RevertedInvocation { revert_reason: e.clone(), }) } else { - starknet_core::types::ExecuteInvocation::Success( + starknet_types_rpc::ExecuteInvocation::FunctionInvocation( execute_function_invocation .ok_or(ConvertCallInfoToExecuteInvocationError::MissingFunctionInvocation)?, ) @@ -96,7 +105,7 @@ pub fn execution_result_to_tx_trace( }) } TransactionType::L1Handler => { - starknet_core::types::TransactionTrace::L1Handler(starknet_core::types::L1HandlerTransactionTrace { + starknet_types_rpc::TransactionTrace::L1Handler(starknet_types_rpc::L1HandlerTransactionTrace { function_invocation: execute_function_invocation .ok_or(ConvertCallInfoToExecuteInvocationError::MissingFunctionInvocation)?, state_diff, @@ -110,7 +119,7 @@ pub fn execution_result_to_tx_trace( fn try_get_funtion_invocation_from_call_info( call_info: &CallInfo, -) -> Result { +) -> Result, TryFuntionInvocationFromCallInfoError> { let messages = collect_call_info_ordered_messages(call_info); let events = collect_call_info_ordered_events(&call_info.execution.events); @@ -119,29 +128,31 @@ fn try_get_funtion_invocation_from_call_info( let entry_point_type = match call_info.call.entry_point_type { starknet_api::deprecated_contract_class::EntryPointType::Constructor => { - starknet_core::types::EntryPointType::Constructor + starknet_types_rpc::EntryPointType::Constructor } starknet_api::deprecated_contract_class::EntryPointType::External => { - starknet_core::types::EntryPointType::External + starknet_types_rpc::EntryPointType::External } starknet_api::deprecated_contract_class::EntryPointType::L1Handler => { - starknet_core::types::EntryPointType::L1Handler + starknet_types_rpc::EntryPointType::L1Handler } }; let call_type = match call_info.call.call_type { - blockifier::execution::entry_point::CallType::Call => starknet_core::types::CallType::Call, - blockifier::execution::entry_point::CallType::Delegate => starknet_core::types::CallType::Delegate, + blockifier::execution::entry_point::CallType::Call => starknet_types_rpc::CallType::Regular, + blockifier::execution::entry_point::CallType::Delegate => starknet_types_rpc::CallType::Delegate, }; // Field `class_hash` into `FunctionInvocation` should be an Option let class_hash = call_info.call.class_hash.map(ToFelt::to_felt).unwrap_or_default(); let computation_resources = computation_resources(&call_info.resources); - Ok(starknet_core::types::FunctionInvocation { - contract_address: call_info.call.storage_address.0.to_felt(), - entry_point_selector: call_info.call.entry_point_selector.0, - calldata: call_info.call.calldata.0.to_vec(), + Ok(starknet_types_rpc::FunctionInvocation { + function_call: FunctionCall { + contract_address: call_info.call.storage_address.0.to_felt(), + entry_point_selector: call_info.call.entry_point_selector.0, + calldata: call_info.call.calldata.0.to_vec(), + }, caller_address: call_info.call.caller_address.0.to_felt(), class_hash, entry_point_type, @@ -154,37 +165,41 @@ fn try_get_funtion_invocation_from_call_info( }) } -fn collect_call_info_ordered_messages(call_info: &CallInfo) -> Vec { +fn collect_call_info_ordered_messages(call_info: &CallInfo) -> Vec> { call_info .execution .l2_to_l1_messages .iter() .enumerate() - .map(|(index, message)| starknet_core::types::OrderedMessage { + .map(|(index, message)| starknet_types_rpc::OrderedMessage { order: index as u64, - payload: message.message.payload.0.to_vec(), - to_address: message.message.to_address.0.to_felt(), - from_address: call_info.call.storage_address.to_felt(), + msg_to_l_1: MsgToL1 { + payload: message.message.payload.0.to_vec(), + to_address: message.message.to_address.0.to_felt(), + from_address: call_info.call.storage_address.to_felt(), + }, }) .collect() } fn collect_call_info_ordered_events( ordered_events: &[blockifier::execution::call_info::OrderedEvent], -) -> Vec { +) -> Vec> { ordered_events .iter() - .map(|event| starknet_core::types::OrderedEvent { + .map(|event| starknet_types_rpc::OrderedEvent { order: event.order as u64, - keys: event.event.keys.iter().map(ToFelt::to_felt).collect(), - data: event.event.data.0.to_vec(), + event: starknet_types_rpc::EventContent { + keys: event.event.keys.iter().map(ToFelt::to_felt).collect(), + data: event.event.data.0.to_vec(), + }, }) .collect() } fn computation_resources( vm_resources: &cairo_vm::vm::runners::cairo_runner::ExecutionResources, -) -> starknet_core::types::ComputationResources { +) -> starknet_types_rpc::ComputationResources { let steps = vm_resources.n_steps as u64; let memory_holes = vm_resources.n_memory_holes as u64; resources_mapping(&vm_resources.builtin_instance_counter, steps, memory_holes) @@ -194,7 +209,7 @@ fn resources_mapping( builtin_mapping: &HashMap, steps: u64, memory_holes: u64, -) -> starknet_core::types::ComputationResources { +) -> starknet_types_rpc::ComputationResources { let memory_holes = match memory_holes { 0 => None, n => Some(n), @@ -209,7 +224,7 @@ fn resources_mapping( let keccak_builtin_applications = builtin_mapping.get(&BuiltinName::keccak).map(|&value| value as u64); let segment_arena_builtin = builtin_mapping.get(&BuiltinName::segment_arena).map(|&value| value as u64); - starknet_core::types::ComputationResources { + starknet_types_rpc::ComputationResources { steps, memory_holes, range_check_builtin_applications, @@ -223,17 +238,17 @@ fn resources_mapping( } } -fn to_state_diff(commitment_state_diff: &CommitmentStateDiff) -> starknet_core::types::StateDiff { - starknet_core::types::StateDiff { +fn to_state_diff(commitment_state_diff: &CommitmentStateDiff) -> starknet_types_rpc::StateDiff { + starknet_types_rpc::StateDiff { storage_diffs: commitment_state_diff .storage_updates .iter() .map(|(address, updates)| { let storage_entries = updates .into_iter() - .map(|(key, value)| starknet_core::types::StorageEntry { key: key.to_felt(), value: *value }) + .map(|(key, value)| starknet_types_rpc::KeyValuePair { key: key.to_felt(), value: *value }) .collect(); - starknet_core::types::ContractStorageDiffItem { address: address.to_felt(), storage_entries } + starknet_types_rpc::ContractStorageDiffItem { address: address.to_felt(), storage_entries } }) .collect(), deprecated_declared_classes: vec![], @@ -243,7 +258,7 @@ fn to_state_diff(commitment_state_diff: &CommitmentStateDiff) -> starknet_core:: nonces: commitment_state_diff .address_to_nonce .iter() - .map(|(address, nonce)| starknet_core::types::NonceUpdate { + .map(|(address, nonce)| starknet_types_rpc::NonceUpdate { contract_address: address.to_felt(), nonce: nonce.to_felt(), }) @@ -259,11 +274,11 @@ fn state_diff_is_empty(commitment_state_diff: &CommitmentStateDiff) -> bool { } fn agregate_execution_ressources( - a: Option<&starknet_core::types::ComputationResources>, - b: Option<&starknet_core::types::ComputationResources>, - c: Option<&starknet_core::types::ComputationResources>, -) -> starknet_core::types::ComputationResources { - starknet_core::types::ComputationResources { + a: Option<&starknet_types_rpc::ComputationResources>, + b: Option<&starknet_types_rpc::ComputationResources>, + c: Option<&starknet_types_rpc::ComputationResources>, +) -> starknet_types_rpc::ComputationResources { + starknet_types_rpc::ComputationResources { steps: a.map_or(0, |x| x.steps) + b.map_or(0, |x| x.steps) + c.map_or(0, |x| x.steps), memory_holes: { let sum = a.and_then(|x| x.memory_holes).unwrap_or_default() diff --git a/crates/client/gateway/client/Cargo.toml b/crates/client/gateway/client/Cargo.toml index 9b8f2a2a1..5f3ed5ab9 100644 --- a/crates/client/gateway/client/Cargo.toml +++ b/crates/client/gateway/client/Cargo.toml @@ -24,6 +24,7 @@ mp-gateway.workspace = true # Starknet starknet-core.workspace = true starknet-types-core.workspace = true +starknet-types-rpc.workspace = true # Other anyhow.workspace = true diff --git a/crates/client/gateway/client/src/methods.rs b/crates/client/gateway/client/src/methods.rs index e2950a447..1c214c875 100644 --- a/crates/client/gateway/client/src/methods.rs +++ b/crates/client/gateway/client/src/methods.rs @@ -15,10 +15,9 @@ use mp_gateway::{ }; use serde::de::DeserializeOwned; use serde_json::Value; -use starknet_core::types::{ - contract::legacy::LegacyContractClass, DeclareTransactionResult, DeployAccountTransactionResult, Felt, - InvokeTransactionResult, -}; +use starknet_core::types::contract::legacy::LegacyContractClass; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{AddInvokeTransactionResult, ClassAndTxnHash, ContractAndTxnHash}; use super::{builder::GatewayProvider, request_builder::RequestBuilder}; @@ -123,21 +122,21 @@ impl GatewayProvider { pub async fn add_invoke_transaction( &self, transaction: UserInvokeFunctionTransaction, - ) -> Result { + ) -> Result, SequencerError> { self.add_transaction(UserTransaction::InvokeFunction(transaction)).await } pub async fn add_declare_transaction( &self, transaction: UserDeclareTransaction, - ) -> Result { + ) -> Result, SequencerError> { self.add_transaction(UserTransaction::Declare(transaction)).await } pub async fn add_deploy_account_transaction( &self, transaction: UserDeployAccountTransaction, - ) -> Result { + ) -> Result, SequencerError> { self.add_transaction(UserTransaction::DeployAccount(transaction)).await } } diff --git a/crates/client/gateway/server/Cargo.toml b/crates/client/gateway/server/Cargo.toml index 09533ae2b..e520a99f0 100644 --- a/crates/client/gateway/server/Cargo.toml +++ b/crates/client/gateway/server/Cargo.toml @@ -25,8 +25,8 @@ mp-gateway.workspace = true mp-utils.workspace = true # Starknet -starknet-core.workspace = true starknet-types-core.workspace = true +starknet-types-rpc.workspace = true # Other anyhow.workspace = true diff --git a/crates/client/gateway/server/src/handler.rs b/crates/client/gateway/server/src/handler.rs index b35dd752e..fc9696ce8 100644 --- a/crates/client/gateway/server/src/handler.rs +++ b/crates/client/gateway/server/src/handler.rs @@ -12,6 +12,9 @@ use mc_rpc::{ use mp_block::{BlockId, BlockTag, MadaraBlock, MadaraMaybePendingBlockInfo, MadaraPendingBlock}; use mp_class::{ClassInfo, ContractClass}; use mp_gateway::error::StarknetError; +use mp_gateway::user_transaction::{ + UserDeclareTransaction, UserDeployAccountTransaction, UserInvokeFunctionTransaction, UserTransaction, +}; use mp_gateway::{ block::{BlockStatus, ProviderBlock, ProviderBlockPending, ProviderBlockSignature}, state_update::{ProviderStateUpdate, ProviderStateUpdatePending}, @@ -19,11 +22,8 @@ use mp_gateway::{ use mp_utils::service::ServiceContext; use serde::Serialize; use serde_json::json; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - BroadcastedTransaction, TransactionTraceWithHash, -}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::TraceBlockTransactionsResult; use super::{ error::{GatewayError, OptionExt, ResultExt}, @@ -236,7 +236,7 @@ pub async fn handle_get_block_traces( #[derive(Serialize)] struct BlockTraces { - traces: Vec, + traces: Vec>, } // TODO: we should probably use the actual service context here instead of @@ -334,43 +334,43 @@ pub async fn handle_add_transaction( ) -> Result, GatewayError> { let whole_body = req.collect().await.or_internal_server_error("Failed to read request body")?.aggregate(); - let transaction = serde_json::from_reader::<_, BroadcastedTransaction>(whole_body.reader()) + let transaction = serde_json::from_reader::<_, UserTransaction>(whole_body.reader()) .map_err(|e| GatewayError::StarknetError(StarknetError::malformed_request(e)))?; let response = match transaction { - BroadcastedTransaction::Declare(tx) => declare_transaction(tx, add_transaction_provider).await, - BroadcastedTransaction::DeployAccount(tx) => deploy_account_transaction(tx, add_transaction_provider).await, - BroadcastedTransaction::Invoke(tx) => invoke_transaction(tx, add_transaction_provider).await, + UserTransaction::Declare(tx) => declare_transaction(tx, add_transaction_provider).await, + UserTransaction::DeployAccount(tx) => deploy_account_transaction(tx, add_transaction_provider).await, + UserTransaction::InvokeFunction(tx) => invoke_transaction(tx, add_transaction_provider).await, }; Ok(response) } async fn declare_transaction( - tx: BroadcastedDeclareTransaction, + tx: UserDeclareTransaction, add_transaction_provider: Arc, ) -> Response { - match add_transaction_provider.add_declare_transaction(tx).await { + match add_transaction_provider.add_declare_transaction(tx.into()).await { Ok(result) => create_json_response(hyper::StatusCode::OK, &result), Err(e) => create_json_response(hyper::StatusCode::OK, &e), } } async fn deploy_account_transaction( - tx: BroadcastedDeployAccountTransaction, + tx: UserDeployAccountTransaction, add_transaction_provider: Arc, ) -> Response { - match add_transaction_provider.add_deploy_account_transaction(tx).await { + match add_transaction_provider.add_deploy_account_transaction(tx.into()).await { Ok(result) => create_json_response(hyper::StatusCode::OK, &result), Err(e) => create_json_response(hyper::StatusCode::OK, &e), } } async fn invoke_transaction( - tx: BroadcastedInvokeTransaction, + tx: UserInvokeFunctionTransaction, add_transaction_provider: Arc, ) -> Response { - match add_transaction_provider.add_invoke_transaction(tx).await { + match add_transaction_provider.add_invoke_transaction(tx.into()).await { Ok(result) => create_json_response(hyper::StatusCode::OK, &result), Err(e) => create_json_response(hyper::StatusCode::OK, &e), } diff --git a/crates/client/mempool/Cargo.toml b/crates/client/mempool/Cargo.toml index d5505af98..01b6ca475 100644 --- a/crates/client/mempool/Cargo.toml +++ b/crates/client/mempool/Cargo.toml @@ -49,8 +49,8 @@ mp-utils.workspace = true # Starknet blockifier.workspace = true -starknet-core.workspace = true starknet-types-core.workspace = true +starknet-types-rpc.workspace = true starknet_api.workspace = true # Other @@ -61,7 +61,6 @@ tokio-util.workspace = true tokio.workspace = true #Instrumentation -once_cell = { workspace = true } opentelemetry = { workspace = true, features = ["metrics", "logs"] } opentelemetry-appender-tracing = { workspace = true, default-features = false } opentelemetry-otlp = { workspace = true, features = [ diff --git a/crates/client/mempool/src/lib.rs b/crates/client/mempool/src/lib.rs index 28445193e..c8111f9c8 100644 --- a/crates/client/mempool/src/lib.rs +++ b/crates/client/mempool/src/lib.rs @@ -19,11 +19,11 @@ use mp_transactions::{ use mp_transactions::{BroadcastedToBlockifierError, L1HandlerTransactionResult}; use starknet_api::core::{ContractAddress, Nonce}; use starknet_api::transaction::TransactionHash; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - BroadcastedTransaction, DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, -}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + AddInvokeTransactionResult, BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, + BroadcastedTxn, ClassAndTxnHash, ContractAndTxnHash, +}; use std::sync::{Arc, RwLock}; pub use inner::TxInsersionError; @@ -61,13 +61,13 @@ impl Error { #[cfg_attr(test, mockall::automock)] pub trait MempoolProvider: Send + Sync { - fn accept_invoke_tx(&self, tx: BroadcastedInvokeTransaction) -> Result; - fn accept_declare_v0_tx(&self, tx: BroadcastedDeclareTransactionV0) -> Result; - fn accept_declare_tx(&self, tx: BroadcastedDeclareTransaction) -> Result; + fn accept_invoke_tx(&self, tx: BroadcastedInvokeTxn) -> Result, Error>; + fn accept_declare_v0_tx(&self, tx: BroadcastedDeclareTransactionV0) -> Result, Error>; + fn accept_declare_tx(&self, tx: BroadcastedDeclareTxn) -> Result, Error>; fn accept_deploy_account_tx( &self, - tx: BroadcastedDeployAccountTransaction, - ) -> Result; + tx: BroadcastedDeployAccountTxn, + ) -> Result, Error>; fn accept_l1_handler_tx(&self, tx: Transaction) -> Result; fn take_txs_chunk + 'static>(&self, dest: &mut I, n: usize) where @@ -179,27 +179,27 @@ fn deployed_contract_address(tx: &Transaction) -> Option { impl MempoolProvider for Mempool { #[tracing::instrument(skip(self), fields(module = "Mempool"))] - fn accept_invoke_tx(&self, tx: BroadcastedInvokeTransaction) -> Result { + fn accept_invoke_tx(&self, tx: BroadcastedInvokeTxn) -> Result, Error> { let (tx, classes) = broadcasted_to_blockifier( - BroadcastedTransaction::Invoke(tx), + BroadcastedTxn::Invoke(tx), self.chain_id(), self.backend.chain_config().latest_protocol_version, )?; - let res = InvokeTransactionResult { transaction_hash: transaction_hash(&tx) }; + let res = AddInvokeTransactionResult { transaction_hash: transaction_hash(&tx) }; self.accept_tx(tx, classes)?; Ok(res) } #[tracing::instrument(skip(self), fields(module = "Mempool"))] - fn accept_declare_v0_tx(&self, tx: BroadcastedDeclareTransactionV0) -> Result { + fn accept_declare_v0_tx(&self, tx: BroadcastedDeclareTransactionV0) -> Result, Error> { let (tx, classes) = broadcasted_declare_v0_to_blockifier( tx, self.chain_id(), self.backend.chain_config().latest_protocol_version, )?; - let res = DeclareTransactionResult { + let res = ClassAndTxnHash { transaction_hash: transaction_hash(&tx), class_hash: declare_class_hash(&tx).expect("Created transaction should be declare"), }; @@ -215,14 +215,14 @@ impl MempoolProvider for Mempool { } #[tracing::instrument(skip(self), fields(module = "Mempool"))] - fn accept_declare_tx(&self, tx: BroadcastedDeclareTransaction) -> Result { + fn accept_declare_tx(&self, tx: BroadcastedDeclareTxn) -> Result, Error> { let (tx, classes) = broadcasted_to_blockifier( - BroadcastedTransaction::Declare(tx), + BroadcastedTxn::Declare(tx), self.chain_id(), self.backend.chain_config().latest_protocol_version, )?; - let res = DeclareTransactionResult { + let res = ClassAndTxnHash { transaction_hash: transaction_hash(&tx), class_hash: declare_class_hash(&tx).expect("Created transaction should be declare"), }; @@ -233,15 +233,15 @@ impl MempoolProvider for Mempool { #[tracing::instrument(skip(self), fields(module = "Mempool"))] fn accept_deploy_account_tx( &self, - tx: BroadcastedDeployAccountTransaction, - ) -> Result { + tx: BroadcastedDeployAccountTxn, + ) -> Result, Error> { let (tx, classes) = broadcasted_to_blockifier( - BroadcastedTransaction::DeployAccount(tx), + BroadcastedTxn::DeployAccount(tx), self.chain_id(), self.backend.chain_config().latest_protocol_version, )?; - let res = DeployAccountTransactionResult { + let res = ContractAndTxnHash { transaction_hash: transaction_hash(&tx), contract_address: deployed_contract_address(&tx).expect("Created transaction should be deploy account"), }; diff --git a/crates/client/rpc/Cargo.toml b/crates/client/rpc/Cargo.toml index ebaaa931e..0d958bfff 100644 --- a/crates/client/rpc/Cargo.toml +++ b/crates/client/rpc/Cargo.toml @@ -40,7 +40,6 @@ mp-utils = { workspace = true } # Starknet blockifier = { workspace = true, default-features = true } -starknet-core = { workspace = true } starknet-types-core = { workspace = true } starknet-types-rpc = { workspace = true } starknet_api = { workspace = true, default-features = true } @@ -54,7 +53,6 @@ jsonrpsee = { workspace = true, default-features = true, features = [ ] } serde = { workspace = true } serde_json = { workspace = true } -serde_with = { workspace = true } thiserror = { workspace = true } tokio = { workspace = true } tokio-util = { workspace = true } diff --git a/crates/client/rpc/src/errors.rs b/crates/client/rpc/src/errors.rs index 4b931d0a9..07782bc07 100644 --- a/crates/client/rpc/src/errors.rs +++ b/crates/client/rpc/src/errors.rs @@ -4,7 +4,7 @@ use mp_gateway::error::{StarknetError, StarknetErrorCode}; use serde::Serialize; use serde_json::json; use starknet_api::StarknetApiError; -use starknet_core::types::Felt; +use starknet_types_core::felt::Felt; use std::fmt::Display; pub type StarknetRpcResult = Result; diff --git a/crates/client/rpc/src/providers/forward_to_provider.rs b/crates/client/rpc/src/providers/forward_to_provider.rs index 0fd9a124b..7b399072a 100644 --- a/crates/client/rpc/src/providers/forward_to_provider.rs +++ b/crates/client/rpc/src/providers/forward_to_provider.rs @@ -3,9 +3,10 @@ use jsonrpsee::core::{async_trait, RpcResult}; use mc_gateway_client::GatewayProvider; use mp_gateway::error::SequencerError; use mp_transactions::BroadcastedDeclareTransactionV0; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + AddInvokeTransactionResult, BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, + ClassAndTxnHash, ContractAndTxnHash, }; use super::AddTransactionProvider; @@ -25,14 +26,20 @@ impl AddTransactionProvider for ForwardToProvider { async fn add_declare_v0_transaction( &self, _declare_v0_transaction: BroadcastedDeclareTransactionV0, - ) -> RpcResult { + ) -> RpcResult> { Err(StarknetRpcApiError::UnimplementedMethod.into()) } async fn add_declare_transaction( &self, - declare_transaction: BroadcastedDeclareTransaction, - ) -> RpcResult { - let sequencer_response = match self.provider.add_declare_transaction(declare_transaction.into()).await { + declare_transaction: BroadcastedDeclareTxn, + ) -> RpcResult> { + let sequencer_response = match self + .provider + .add_declare_transaction( + declare_transaction.try_into().map_err(|_| StarknetRpcApiError::InvalidContractClass)?, + ) + .await + { Ok(response) => response, Err(SequencerError::StarknetError(e)) => { return Err(StarknetRpcApiError::from(e).into()); @@ -44,8 +51,8 @@ impl AddTransactionProvider for ForwardToProvider { } async fn add_deploy_account_transaction( &self, - deploy_account_transaction: BroadcastedDeployAccountTransaction, - ) -> RpcResult { + deploy_account_transaction: BroadcastedDeployAccountTxn, + ) -> RpcResult> { let sequencer_response = match self.provider.add_deploy_account_transaction(deploy_account_transaction.into()).await { Ok(response) => response, @@ -60,8 +67,8 @@ impl AddTransactionProvider for ForwardToProvider { async fn add_invoke_transaction( &self, - invoke_transaction: BroadcastedInvokeTransaction, - ) -> RpcResult { + invoke_transaction: BroadcastedInvokeTxn, + ) -> RpcResult> { let sequencer_response = match self.provider.add_invoke_transaction(invoke_transaction.into()).await { Ok(response) => response, Err(SequencerError::StarknetError(e)) => { diff --git a/crates/client/rpc/src/providers/mempool.rs b/crates/client/rpc/src/providers/mempool.rs index 58721e082..01253775b 100644 --- a/crates/client/rpc/src/providers/mempool.rs +++ b/crates/client/rpc/src/providers/mempool.rs @@ -4,9 +4,10 @@ use jsonrpsee::core::{async_trait, RpcResult}; use mc_mempool::Mempool; use mc_mempool::MempoolProvider; use mp_transactions::BroadcastedDeclareTransactionV0; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, +use starknet_types_core::felt::Felt; +use starknet_types_rpc::AddInvokeTransactionResult; +use starknet_types_rpc::{ + BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, ClassAndTxnHash, ContractAndTxnHash, }; use std::sync::Arc; @@ -47,25 +48,25 @@ impl AddTransactionProvider for MempoolAddTxProvider { async fn add_declare_v0_transaction( &self, declare_v0_transaction: BroadcastedDeclareTransactionV0, - ) -> RpcResult { + ) -> RpcResult> { Ok(self.mempool.accept_declare_v0_tx(declare_v0_transaction).map_err(StarknetRpcApiError::from)?) } async fn add_declare_transaction( &self, - declare_transaction: BroadcastedDeclareTransaction, - ) -> RpcResult { + declare_transaction: BroadcastedDeclareTxn, + ) -> RpcResult> { Ok(self.mempool.accept_declare_tx(declare_transaction).map_err(StarknetRpcApiError::from)?) } async fn add_deploy_account_transaction( &self, - deploy_account_transaction: BroadcastedDeployAccountTransaction, - ) -> RpcResult { + deploy_account_transaction: BroadcastedDeployAccountTxn, + ) -> RpcResult> { Ok(self.mempool.accept_deploy_account_tx(deploy_account_transaction).map_err(StarknetRpcApiError::from)?) } async fn add_invoke_transaction( &self, - invoke_transaction: BroadcastedInvokeTransaction, - ) -> RpcResult { + invoke_transaction: BroadcastedInvokeTxn, + ) -> RpcResult> { Ok(self.mempool.accept_invoke_tx(invoke_transaction).map_err(StarknetRpcApiError::from)?) } } diff --git a/crates/client/rpc/src/providers/mod.rs b/crates/client/rpc/src/providers/mod.rs index e5ee2fd7e..a5f616871 100644 --- a/crates/client/rpc/src/providers/mod.rs +++ b/crates/client/rpc/src/providers/mod.rs @@ -6,9 +6,10 @@ pub use mempool::*; use jsonrpsee::core::{async_trait, RpcResult}; use mp_transactions::BroadcastedDeclareTransactionV0; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + AddInvokeTransactionResult, BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, + ClassAndTxnHash, ContractAndTxnHash, }; #[async_trait] @@ -16,19 +17,19 @@ pub trait AddTransactionProvider: Send + Sync { async fn add_declare_v0_transaction( &self, declare_v0_transaction: BroadcastedDeclareTransactionV0, - ) -> RpcResult; + ) -> RpcResult>; async fn add_declare_transaction( &self, - declare_transaction: BroadcastedDeclareTransaction, - ) -> RpcResult; + declare_transaction: BroadcastedDeclareTxn, + ) -> RpcResult>; async fn add_deploy_account_transaction( &self, - deploy_account_transaction: BroadcastedDeployAccountTransaction, - ) -> RpcResult; + deploy_account_transaction: BroadcastedDeployAccountTxn, + ) -> RpcResult>; async fn add_invoke_transaction( &self, - invoke_transaction: BroadcastedInvokeTransaction, - ) -> RpcResult; + invoke_transaction: BroadcastedInvokeTxn, + ) -> RpcResult>; } diff --git a/crates/client/rpc/src/test_utils.rs b/crates/client/rpc/src/test_utils.rs index b1ad6cf78..c0cd7e2ee 100644 --- a/crates/client/rpc/src/test_utils.rs +++ b/crates/client/rpc/src/test_utils.rs @@ -16,11 +16,11 @@ use mp_state_update::{ use mp_transactions::{BroadcastedDeclareTransactionV0, InvokeTransaction, InvokeTransactionV0, Transaction}; use mp_utils::service::ServiceContext; use rstest::fixture; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, -}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + AddInvokeTransactionResult, BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, + ClassAndTxnHash, ContractAndTxnHash, TxnReceipt, TxnWithHash, +}; use std::sync::Arc; use crate::{providers::AddTransactionProvider, Starknet}; @@ -34,25 +34,25 @@ impl AddTransactionProvider for TestTransactionProvider { async fn add_declare_v0_transaction( &self, _declare_v0_transaction: BroadcastedDeclareTransactionV0, - ) -> RpcResult { + ) -> RpcResult> { unimplemented!() } async fn add_declare_transaction( &self, - _declare_transaction: BroadcastedDeclareTransaction, - ) -> RpcResult { + _declare_transaction: BroadcastedDeclareTxn, + ) -> RpcResult> { unimplemented!() } async fn add_deploy_account_transaction( &self, - _deploy_account_transaction: BroadcastedDeployAccountTransaction, - ) -> RpcResult { + _deploy_account_transaction: BroadcastedDeployAccountTxn, + ) -> RpcResult> { unimplemented!() } async fn add_invoke_transaction( &self, - _invoke_transaction: BroadcastedInvokeTransaction, - ) -> RpcResult { + _invoke_transaction: BroadcastedInvokeTxn, + ) -> RpcResult> { unimplemented!() } } @@ -74,8 +74,8 @@ pub fn rpc_test_setup() -> (Arc, Starknet) { pub struct SampleChainForBlockGetters { pub block_hashes: Vec, pub tx_hashes: Vec, - pub expected_txs: Vec, - pub expected_receipts: Vec, + pub expected_txs: Vec>, + pub expected_receipts: Vec>, } #[fixture] @@ -96,83 +96,98 @@ pub fn make_sample_chain_for_block_getters(backend: &MadaraBackend) -> SampleCha Felt::from_hex_unchecked("0xdd84847784"), ]; let expected_txs = { - use starknet_core::types::{InvokeTransaction, InvokeTransactionV0, Transaction}; + use starknet_types_rpc::{InvokeTxn, InvokeTxnV0, Txn}; vec![ - Transaction::Invoke(InvokeTransaction::V0(InvokeTransactionV0 { - transaction_hash: Felt::from_hex_unchecked("0x8888888"), - max_fee: Felt::from_hex_unchecked("0x12"), - signature: vec![], - contract_address: Felt::from_hex_unchecked("0x4343"), - entry_point_selector: Felt::from_hex_unchecked("0x1212"), - calldata: vec![Felt::from_hex_unchecked("0x2828")], - })), - Transaction::Invoke(InvokeTransaction::V0(InvokeTransactionV0 { - transaction_hash: Felt::from_hex_unchecked("0xdd848484"), - max_fee: Felt::from_hex_unchecked("0xb12"), - signature: vec![], - contract_address: Felt::from_hex_unchecked("0x434b3"), - entry_point_selector: Felt::from_hex_unchecked("0x12123"), - calldata: vec![Felt::from_hex_unchecked("0x2828b")], - })), - Transaction::Invoke(InvokeTransaction::V0(InvokeTransactionV0 { - transaction_hash: Felt::from_hex_unchecked("0xdd84848407"), - max_fee: Felt::from_hex_unchecked("0xb12"), - signature: vec![], - contract_address: Felt::from_hex_unchecked("0x434b3"), - entry_point_selector: Felt::from_hex_unchecked("0x1212223"), - calldata: vec![Felt::from_hex_unchecked("0x2828eeb")], - })), - Transaction::Invoke(InvokeTransaction::V0(InvokeTransactionV0 { - transaction_hash: Felt::from_hex_unchecked("0xdd84847784"), - max_fee: Felt::from_hex_unchecked("0xb12"), - signature: vec![], - contract_address: Felt::from_hex_unchecked("0x434b3"), - entry_point_selector: Felt::from_hex_unchecked("0x12123"), - calldata: vec![Felt::from_hex_unchecked("0x2828b")], - })), + TxnWithHash { + transaction: Txn::Invoke(InvokeTxn::V0(InvokeTxnV0 { + max_fee: Felt::from_hex_unchecked("0x12"), + signature: vec![], + contract_address: Felt::from_hex_unchecked("0x4343"), + entry_point_selector: Felt::from_hex_unchecked("0x1212"), + calldata: vec![Felt::from_hex_unchecked("0x2828")], + })), + transaction_hash: tx_hashes[0], + }, + TxnWithHash { + transaction: Txn::Invoke(InvokeTxn::V0(InvokeTxnV0 { + max_fee: Felt::from_hex_unchecked("0xb12"), + signature: vec![], + contract_address: Felt::from_hex_unchecked("0x434b3"), + entry_point_selector: Felt::from_hex_unchecked("0x12123"), + calldata: vec![Felt::from_hex_unchecked("0x2828b")], + })), + transaction_hash: tx_hashes[1], + }, + TxnWithHash { + transaction: Txn::Invoke(InvokeTxn::V0(InvokeTxnV0 { + max_fee: Felt::from_hex_unchecked("0xb12"), + signature: vec![], + contract_address: Felt::from_hex_unchecked("0x434b3"), + entry_point_selector: Felt::from_hex_unchecked("0x1212223"), + calldata: vec![Felt::from_hex_unchecked("0x2828eeb")], + })), + transaction_hash: tx_hashes[2], + }, + TxnWithHash { + transaction: Txn::Invoke(InvokeTxn::V0(InvokeTxnV0 { + max_fee: Felt::from_hex_unchecked("0xb12"), + signature: vec![], + contract_address: Felt::from_hex_unchecked("0x434b3"), + entry_point_selector: Felt::from_hex_unchecked("0x12123"), + calldata: vec![Felt::from_hex_unchecked("0x2828b")], + })), + transaction_hash: tx_hashes[3], + }, ] }; let expected_receipts = { - use starknet_core::types::{ - ExecutionResult, FeePayment, InvokeTransactionReceipt, PriceUnit, TransactionFinalityStatus, - TransactionReceipt, + use starknet_types_rpc::{ + CommonReceiptProperties, FeePayment, InvokeTxnReceipt, PriceUnit, TxnFinalityStatus, TxnReceipt, }; vec![ - TransactionReceipt::Invoke(InvokeTransactionReceipt { - transaction_hash: Felt::from_hex_unchecked("0x8888888"), - actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x9"), unit: PriceUnit::Wei }, - messages_sent: vec![], - events: vec![], - execution_resources: mp_receipt::ExecutionResources::default().into(), - execution_result: ExecutionResult::Succeeded, - finality_status: TransactionFinalityStatus::AcceptedOnL1, + TxnReceipt::::Invoke(InvokeTxnReceipt { + common_receipt_properties: CommonReceiptProperties { + transaction_hash: Felt::from_hex_unchecked("0x8888888"), + actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x9"), unit: PriceUnit::Wei }, + messages_sent: vec![], + events: vec![], + execution_resources: defaut_execution_resources(), + finality_status: TxnFinalityStatus::L1, + execution_status: starknet_types_rpc::ExecutionStatus::Successful, + }, }), - TransactionReceipt::Invoke(InvokeTransactionReceipt { - transaction_hash: Felt::from_hex_unchecked("0xdd848484"), - actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x94"), unit: PriceUnit::Wei }, - messages_sent: vec![], - events: vec![], - execution_resources: mp_receipt::ExecutionResources::default().into(), - execution_result: ExecutionResult::Succeeded, - finality_status: TransactionFinalityStatus::AcceptedOnL2, + TxnReceipt::::Invoke(InvokeTxnReceipt { + common_receipt_properties: CommonReceiptProperties { + transaction_hash: Felt::from_hex_unchecked("0xdd848484"), + actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x94"), unit: PriceUnit::Wei }, + messages_sent: vec![], + events: vec![], + execution_resources: defaut_execution_resources(), + finality_status: TxnFinalityStatus::L2, + execution_status: starknet_types_rpc::ExecutionStatus::Successful, + }, }), - TransactionReceipt::Invoke(InvokeTransactionReceipt { - transaction_hash: Felt::from_hex_unchecked("0xdd84848407"), - actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x94dd"), unit: PriceUnit::Fri }, - messages_sent: vec![], - events: vec![], - execution_resources: mp_receipt::ExecutionResources::default().into(), - execution_result: ExecutionResult::Reverted { reason: "too bad".into() }, - finality_status: TransactionFinalityStatus::AcceptedOnL2, + TxnReceipt::::Invoke(InvokeTxnReceipt { + common_receipt_properties: CommonReceiptProperties { + transaction_hash: Felt::from_hex_unchecked("0xdd84848407"), + actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x94dd"), unit: PriceUnit::Fri }, + messages_sent: vec![], + events: vec![], + execution_resources: defaut_execution_resources(), + finality_status: TxnFinalityStatus::L2, + execution_status: starknet_types_rpc::ExecutionStatus::Reverted("too bad".into()), + }, }), - TransactionReceipt::Invoke(InvokeTransactionReceipt { - transaction_hash: Felt::from_hex_unchecked("0xdd84847784"), - actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x94"), unit: PriceUnit::Wei }, - messages_sent: vec![], - events: vec![], - execution_resources: mp_receipt::ExecutionResources::default().into(), - execution_result: ExecutionResult::Succeeded, - finality_status: TransactionFinalityStatus::AcceptedOnL2, + TxnReceipt::::Invoke(InvokeTxnReceipt { + common_receipt_properties: CommonReceiptProperties { + transaction_hash: Felt::from_hex_unchecked("0xdd84847784"), + actual_fee: FeePayment { amount: Felt::from_hex_unchecked("0x94"), unit: PriceUnit::Wei }, + messages_sent: vec![], + events: vec![], + execution_resources: defaut_execution_resources(), + finality_status: TxnFinalityStatus::L2, + execution_status: starknet_types_rpc::ExecutionStatus::Successful, + }, }), ] }; @@ -361,6 +376,22 @@ pub fn make_sample_chain_for_block_getters(backend: &MadaraBackend) -> SampleCha SampleChainForBlockGetters { block_hashes, tx_hashes, expected_txs, expected_receipts } } +fn defaut_execution_resources() -> starknet_types_rpc::ExecutionResources { + starknet_types_rpc::ExecutionResources { + bitwise_builtin_applications: None, + ec_op_builtin_applications: None, + ecdsa_builtin_applications: None, + keccak_builtin_applications: None, + memory_holes: None, + pedersen_builtin_applications: None, + poseidon_builtin_applications: None, + range_check_builtin_applications: None, + segment_arena_builtin: None, + steps: 0, + data_availability: starknet_types_rpc::DataAvailability { l1_data_gas: 0, l1_gas: 0 }, + } +} + // This sample chain is used for every rpcs that query info gotten from state updates. pub struct SampleChainForStateUpdates { pub block_hashes: Vec, diff --git a/crates/client/rpc/src/versions/admin/v0_1_0/api.rs b/crates/client/rpc/src/versions/admin/v0_1_0/api.rs index 31e1752af..aa970311a 100644 --- a/crates/client/rpc/src/versions/admin/v0_1_0/api.rs +++ b/crates/client/rpc/src/versions/admin/v0_1_0/api.rs @@ -1,8 +1,8 @@ +use jsonrpsee::core::RpcResult; use m_proc_macros::versioned_rpc; use mp_transactions::BroadcastedDeclareTransactionV0; - -use jsonrpsee::core::RpcResult; -use starknet_core::types::DeclareTransactionResult; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::ClassAndTxnHash; /// This is an admin method, so semver is different! #[versioned_rpc("V0_1_0", "madara")] @@ -11,8 +11,8 @@ pub trait MadaraWriteRpcApi { #[method(name = "addDeclareV0Transaction")] async fn add_declare_v0_transaction( &self, - declare_transaction_v0: BroadcastedDeclareTransactionV0, - ) -> RpcResult; + declare_v0_transaction: BroadcastedDeclareTransactionV0, + ) -> RpcResult>; } #[versioned_rpc("V0_1_0", "madara")] diff --git a/crates/client/rpc/src/versions/admin/v0_1_0/methods/write.rs b/crates/client/rpc/src/versions/admin/v0_1_0/methods/write.rs index fde17c8c5..aa907b3bb 100644 --- a/crates/client/rpc/src/versions/admin/v0_1_0/methods/write.rs +++ b/crates/client/rpc/src/versions/admin/v0_1_0/methods/write.rs @@ -1,6 +1,7 @@ use jsonrpsee::core::{async_trait, RpcResult}; use mp_transactions::BroadcastedDeclareTransactionV0; -use starknet_core::types::DeclareTransactionResult; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::ClassAndTxnHash; use crate::{versions::admin::v0_1_0::MadaraWriteRpcApiV0_1_0Server, Starknet}; @@ -18,7 +19,7 @@ impl MadaraWriteRpcApiV0_1_0Server for Starknet { async fn add_declare_v0_transaction( &self, declare_transaction: BroadcastedDeclareTransactionV0, - ) -> RpcResult { + ) -> RpcResult> { Ok(self.add_transaction_provider.add_declare_v0_transaction(declare_transaction).await?) } } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/api.rs b/crates/client/rpc/src/versions/user/v0_7_1/api.rs index 588dbc5ca..3c843c8b7 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/api.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/api.rs @@ -1,15 +1,15 @@ use jsonrpsee::core::RpcResult; use m_proc_macros::versioned_rpc; use mp_block::BlockId; -use starknet_core::types::{ - BlockHashAndNumber, BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, - BroadcastedInvokeTransaction, BroadcastedTransaction, ContractClass, DeclareTransactionResult, - DeployAccountTransactionResult, EventFilterWithPage, EventsPage, FeeEstimate, FunctionCall, - InvokeTransactionResult, MaybePendingBlockWithReceipts, MaybePendingBlockWithTxHashes, MaybePendingBlockWithTxs, - MaybePendingStateUpdate, MsgFromL1, SimulatedTransaction, SimulationFlag, SimulationFlagForEstimateFee, - SyncStatusType, Transaction, TransactionReceiptWithBlockInfo, TransactionStatus, TransactionTraceWithHash, -}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + AddInvokeTransactionResult, BlockHashAndNumber, BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, + BroadcastedInvokeTxn, BroadcastedTxn, ClassAndTxnHash, ContractAndTxnHash, EventFilterWithPageRequest, EventsChunk, + FeeEstimate, FunctionCall, MaybeDeprecatedContractClass, MaybePendingBlockWithTxHashes, MaybePendingBlockWithTxs, + MaybePendingStateUpdate, MsgFromL1, SimulateTransactionsResult, SimulationFlag, SimulationFlagForEstimateFee, + StarknetGetBlockWithTxsAndReceiptsResult, SyncingStatus, TraceBlockTransactionsResult, + TxnFinalityAndExecutionStatus, TxnReceiptWithBlockInfo, TxnWithHash, +}; // Starknet RPC API trait and types // @@ -17,31 +17,28 @@ use starknet_types_core::felt::Felt; // using the openRPC specification. // This crate uses `jsonrpsee` to define such an API in Rust terms. -/// Starknet write rpc interface. -/// - #[versioned_rpc("V0_7_1", "starknet")] pub trait StarknetWriteRpcApi { /// Submit a new transaction to be added to the chain #[method(name = "addInvokeTransaction", and_versions = ["V0_8_0"])] async fn add_invoke_transaction( &self, - invoke_transaction: BroadcastedInvokeTransaction, - ) -> RpcResult; + invoke_transaction: BroadcastedInvokeTxn, + ) -> RpcResult>; /// Submit a new deploy account transaction #[method(name = "addDeployAccountTransaction", and_versions = ["V0_8_0"])] async fn add_deploy_account_transaction( &self, - deploy_account_transaction: BroadcastedDeployAccountTransaction, - ) -> RpcResult; + deploy_account_transaction: BroadcastedDeployAccountTxn, + ) -> RpcResult>; /// Submit a new class declaration transaction #[method(name = "addDeclareTransaction", and_versions = ["V0_8_0"])] async fn add_declare_transaction( &self, - declare_transaction: BroadcastedDeclareTransaction, - ) -> RpcResult; + declare_transaction: BroadcastedDeclareTxn, + ) -> RpcResult>; } #[versioned_rpc("V0_7_1", "starknet")] @@ -56,11 +53,11 @@ pub trait StarknetReadRpcApi { // Get the most recent accepted block hash and number #[method(name = "blockHashAndNumber", and_versions = ["V0_8_0"])] - fn block_hash_and_number(&self) -> RpcResult; + fn block_hash_and_number(&self) -> RpcResult>; /// Call a contract function at a given block id #[method(name = "call", and_versions = ["V0_8_0"])] - fn call(&self, request: FunctionCall, block_id: BlockId) -> RpcResult>; + fn call(&self, request: FunctionCall, block_id: BlockId) -> RpcResult>; /// Get the chain id #[method(name = "chainId", and_versions = ["V0_8_0"])] @@ -74,30 +71,33 @@ pub trait StarknetReadRpcApi { #[method(name = "estimateFee", and_versions = ["V0_8_0"])] async fn estimate_fee( &self, - request: Vec, + request: Vec>, simulation_flags: Vec, block_id: BlockId, - ) -> RpcResult>; + ) -> RpcResult>>; /// Estimate the L2 fee of a message sent on L1 #[method(name = "estimateMessageFee", and_versions = ["V0_8_0"])] - async fn estimate_message_fee(&self, message: MsgFromL1, block_id: BlockId) -> RpcResult; + async fn estimate_message_fee(&self, message: MsgFromL1, block_id: BlockId) -> RpcResult>; /// Get block information with full transactions and receipts given the block id #[method(name = "getBlockWithReceipts", and_versions = ["V0_8_0"])] - async fn get_block_with_receipts(&self, block_id: BlockId) -> RpcResult; + async fn get_block_with_receipts( + &self, + block_id: BlockId, + ) -> RpcResult>; /// Get block information with transaction hashes given the block id #[method(name = "getBlockWithTxHashes", and_versions = ["V0_8_0"])] - fn get_block_with_tx_hashes(&self, block_id: BlockId) -> RpcResult; + fn get_block_with_tx_hashes(&self, block_id: BlockId) -> RpcResult>; /// Get block information with full transactions given the block id #[method(name = "getBlockWithTxs", and_versions = ["V0_8_0"])] - fn get_block_with_txs(&self, block_id: BlockId) -> RpcResult; + fn get_block_with_txs(&self, block_id: BlockId) -> RpcResult>; /// Get the contract class at a given contract address for a given block id #[method(name = "getClassAt", and_versions = ["V0_8_0"])] - fn get_class_at(&self, block_id: BlockId, contract_address: Felt) -> RpcResult; + fn get_class_at(&self, block_id: BlockId, contract_address: Felt) -> RpcResult>; /// Get the contract class hash in the given block for the contract deployed at the given /// address @@ -106,11 +106,11 @@ pub trait StarknetReadRpcApi { /// Get the contract class definition in the given block associated with the given hash #[method(name = "getClass", and_versions = ["V0_8_0"])] - fn get_class(&self, block_id: BlockId, class_hash: Felt) -> RpcResult; + fn get_class(&self, block_id: BlockId, class_hash: Felt) -> RpcResult>; /// Returns all events matching the given filter #[method(name = "getEvents", and_versions = ["V0_8_0"])] - async fn get_events(&self, filter: EventFilterWithPage) -> RpcResult; + async fn get_events(&self, filter: EventFilterWithPageRequest) -> RpcResult>; /// Get the nonce associated with the given address at the given block #[method(name = "getNonce", and_versions = ["V0_8_0"])] @@ -122,27 +122,27 @@ pub trait StarknetReadRpcApi { /// Get the details of a transaction by a given block id and index #[method(name = "getTransactionByBlockIdAndIndex", and_versions = ["V0_8_0"])] - fn get_transaction_by_block_id_and_index(&self, block_id: BlockId, index: u64) -> RpcResult; + fn get_transaction_by_block_id_and_index(&self, block_id: BlockId, index: u64) -> RpcResult>; /// Returns the information about a transaction by transaction hash. #[method(name = "getTransactionByHash", and_versions = ["V0_8_0"])] - fn get_transaction_by_hash(&self, transaction_hash: Felt) -> RpcResult; + fn get_transaction_by_hash(&self, transaction_hash: Felt) -> RpcResult>; /// Returns the receipt of a transaction by transaction hash. #[method(name = "getTransactionReceipt", and_versions = ["V0_8_0"])] - async fn get_transaction_receipt(&self, transaction_hash: Felt) -> RpcResult; + async fn get_transaction_receipt(&self, transaction_hash: Felt) -> RpcResult>; /// Gets the Transaction Status, Including Mempool Status and Execution Details #[method(name = "getTransactionStatus", and_versions = ["V0_8_0"])] - fn get_transaction_status(&self, transaction_hash: Felt) -> RpcResult; + fn get_transaction_status(&self, transaction_hash: Felt) -> RpcResult; /// Get an object about the sync status, or false if the node is not syncing #[method(name = "syncing", and_versions = ["V0_8_0"])] - async fn syncing(&self) -> RpcResult; + async fn syncing(&self) -> RpcResult>; /// Get the information about the result of executing the requested block #[method(name = "getStateUpdate", and_versions = ["V0_8_0"])] - fn get_state_update(&self, block_id: BlockId) -> RpcResult; + fn get_state_update(&self, block_id: BlockId) -> RpcResult>; } #[versioned_rpc("V0_7_1", "starknet")] @@ -152,15 +152,15 @@ pub trait StarknetTraceRpcApi { async fn simulate_transactions( &self, block_id: BlockId, - transactions: Vec, + transactions: Vec>, simulation_flags: Vec, - ) -> RpcResult>; + ) -> RpcResult>>; #[method(name = "traceBlockTransactions", and_versions = ["V0_8_0"])] /// Returns the execution traces of all transactions included in the given block - async fn trace_block_transactions(&self, block_id: BlockId) -> RpcResult>; + async fn trace_block_transactions(&self, block_id: BlockId) -> RpcResult>>; #[method(name = "traceTransaction", and_versions = ["V0_8_0"])] /// Returns the execution trace of a transaction - async fn trace_transaction(&self, transaction_hash: Felt) -> RpcResult; + async fn trace_transaction(&self, transaction_hash: Felt) -> RpcResult>; } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/block_hash_and_number.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/block_hash_and_number.rs index 85a639241..e2abf6207 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/block_hash_and_number.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/block_hash_and_number.rs @@ -1,5 +1,6 @@ use mp_block::{BlockId, BlockTag}; -use starknet_core::types::BlockHashAndNumber; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::BlockHashAndNumber; use crate::errors::StarknetRpcResult; use crate::{utils::OptionExt, Starknet}; @@ -14,7 +15,7 @@ use crate::{utils::OptionExt, Starknet}; /// /// * `block_hash_and_number` - A tuple containing the latest block hash and number of the current /// network. -pub fn block_hash_and_number(starknet: &Starknet) -> StarknetRpcResult { +pub fn block_hash_and_number(starknet: &Starknet) -> StarknetRpcResult> { let block_info = starknet.get_block_info(&BlockId::Tag(BlockTag::Latest))?; let block_info = block_info.as_nonpending().ok_or_internal_server_error("Latest block is pending")?; diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/call.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/call.rs index 0c02ccf67..265bfaf99 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/call.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/call.rs @@ -2,8 +2,8 @@ use std::sync::Arc; use mc_exec::ExecutionContext; use mp_block::BlockId; -use starknet_core::types::FunctionCall; use starknet_types_core::felt::Felt; +use starknet_types_rpc::FunctionCall; use crate::errors::StarknetRpcApiError; use crate::errors::StarknetRpcResult; @@ -30,7 +30,7 @@ use crate::Starknet; /// * `CONTRACT_NOT_FOUND` - If the specified contract address does not exist. /// * `CONTRACT_ERROR` - If there is an error with the contract or the function call. /// * `BLOCK_NOT_FOUND` - If the specified block does not exist in the blockchain. -pub fn call(starknet: &Starknet, request: FunctionCall, block_id: BlockId) -> StarknetRpcResult> { +pub fn call(starknet: &Starknet, request: FunctionCall, block_id: BlockId) -> StarknetRpcResult> { let block_info = starknet.get_block_info(&block_id)?; let exec_context = ExecutionContext::new_in_block(Arc::clone(&starknet.backend), &block_info)?; diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_fee.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_fee.rs index ebfc71004..52db03551 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_fee.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_fee.rs @@ -1,6 +1,7 @@ use std::sync::Arc; -use starknet_core::types::{BroadcastedTransaction, FeeEstimate, SimulationFlagForEstimateFee}; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{BroadcastedTxn, FeeEstimate, SimulationFlagForEstimateFee}; use mc_exec::ExecutionContext; use mp_block::BlockId; @@ -24,10 +25,10 @@ use crate::Starknet; /// * `fee_estimate` - fee estimate in gwei pub async fn estimate_fee( starknet: &Starknet, - request: Vec, + request: Vec>, simulation_flags: Vec, block_id: BlockId, -) -> StarknetRpcResult> { +) -> StarknetRpcResult>> { let block_info = starknet.get_block_info(&block_id)?; let starknet_version = *block_info.protocol_version(); diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_message_fee.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_message_fee.rs index 7a8dc4127..7011bc842 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_message_fee.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/estimate_message_fee.rs @@ -4,8 +4,8 @@ use mc_exec::ExecutionContext; use mp_block::BlockId; use mp_transactions::L1HandlerTransaction; use starknet_api::transaction::{Fee, TransactionHash}; -use starknet_core::types::{FeeEstimate, MsgFromL1}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{FeeEstimate, MsgFromL1}; use crate::errors::StarknetRpcApiError; use crate::errors::StarknetRpcResult; @@ -31,9 +31,9 @@ use crate::Starknet; /// ContractError : If there is an error with the contract. pub async fn estimate_message_fee( starknet: &Starknet, - message: MsgFromL1, + message: MsgFromL1, block_id: BlockId, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { let block_info = starknet.get_block_info(&block_id)?; if block_info.protocol_version() < &FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW { @@ -54,7 +54,7 @@ pub async fn estimate_message_fee( } pub fn convert_message_into_transaction( - message: MsgFromL1, + message: MsgFromL1, chain_id: Felt, ) -> blockifier::transaction::transaction_execution::Transaction { let l1_handler: L1HandlerTransaction = message.into(); diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_receipts.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_receipts.rs index 17a20f4f9..847816a8f 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_receipts.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_receipts.rs @@ -1,7 +1,8 @@ use mp_block::{BlockId, MadaraMaybePendingBlockInfo}; -use starknet_core::types::{ - BlockStatus, BlockWithReceipts, MaybePendingBlockWithReceipts, PendingBlockWithReceipts, TransactionFinalityStatus, - TransactionWithReceipt, +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + BlockHeader, BlockStatus, BlockWithReceipts, PendingBlockHeader, PendingBlockWithReceipts, + StarknetGetBlockWithTxsAndReceiptsResult, TransactionAndReceipt, TxnFinalityStatus, }; use crate::errors::StarknetRpcResult; @@ -10,12 +11,11 @@ use crate::Starknet; pub fn get_block_with_receipts( starknet: &Starknet, block_id: BlockId, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { tracing::debug!("get_block_with_receipts called with {:?}", block_id); let block = starknet.get_block(&block_id)?; - let transactions_core = Iterator::zip(block.inner.transactions.iter(), block.info.tx_hashes()) - .map(|(tx, hash)| tx.clone().to_core(*hash)); + let transactions = block.inner.transactions.into_iter().map(|tx| tx.into()); let is_on_l1 = if let Some(block_n) = block.info.block_n() { block_n <= starknet.get_l1_last_confirmed_block()? @@ -23,43 +23,46 @@ pub fn get_block_with_receipts( false }; - let finality_status = - if is_on_l1 { TransactionFinalityStatus::AcceptedOnL1 } else { TransactionFinalityStatus::AcceptedOnL2 }; + let finality_status = if is_on_l1 { TxnFinalityStatus::L1 } else { TxnFinalityStatus::L2 }; - let receipts = block.inner.receipts.iter().map(|receipt| receipt.clone().to_starknet_core(finality_status)); + let receipts = block.inner.receipts.into_iter().map(|receipt| receipt.to_starknet_types(finality_status.clone())); - let transactions_with_receipts = Iterator::zip(transactions_core, receipts) - .map(|(transaction, receipt)| TransactionWithReceipt { transaction, receipt }) + let transactions_with_receipts = Iterator::zip(transactions, receipts) + .map(|(transaction, receipt)| TransactionAndReceipt { receipt, transaction }) .collect(); match block.info { MadaraMaybePendingBlockInfo::Pending(block) => { - Ok(MaybePendingBlockWithReceipts::PendingBlock(PendingBlockWithReceipts { + Ok(StarknetGetBlockWithTxsAndReceiptsResult::Pending(PendingBlockWithReceipts { transactions: transactions_with_receipts, - parent_hash: block.header.parent_block_hash, - timestamp: block.header.block_timestamp, - sequencer_address: block.header.sequencer_address, - l1_gas_price: block.header.l1_gas_price.l1_gas_price(), - l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), - l1_da_mode: block.header.l1_da_mode.into(), - starknet_version: block.header.protocol_version.to_string(), + pending_block_header: PendingBlockHeader { + parent_hash: block.header.parent_block_hash, + timestamp: block.header.block_timestamp, + sequencer_address: block.header.sequencer_address, + l1_gas_price: block.header.l1_gas_price.l1_gas_price(), + l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), + l1_da_mode: block.header.l1_da_mode.into(), + starknet_version: block.header.protocol_version.to_string(), + }, })) } MadaraMaybePendingBlockInfo::NotPending(block) => { let status = if is_on_l1 { BlockStatus::AcceptedOnL1 } else { BlockStatus::AcceptedOnL2 }; - Ok(MaybePendingBlockWithReceipts::Block(BlockWithReceipts { - status, - block_hash: block.block_hash, - parent_hash: block.header.parent_block_hash, - block_number: block.header.block_number, - new_root: block.header.global_state_root, - timestamp: block.header.block_timestamp, - sequencer_address: block.header.sequencer_address, - l1_gas_price: block.header.l1_gas_price.l1_gas_price(), - l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), - l1_da_mode: block.header.l1_da_mode.into(), - starknet_version: block.header.protocol_version.to_string(), + Ok(StarknetGetBlockWithTxsAndReceiptsResult::Block(BlockWithReceipts { transactions: transactions_with_receipts, + status, + block_header: BlockHeader { + block_hash: block.block_hash, + parent_hash: block.header.parent_block_hash, + block_number: block.header.block_number, + new_root: block.header.global_state_root, + timestamp: block.header.block_timestamp, + sequencer_address: block.header.sequencer_address, + l1_gas_price: block.header.l1_gas_price.l1_gas_price(), + l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), + l1_da_mode: block.header.l1_da_mode.into(), + starknet_version: block.header.protocol_version.to_string(), + }, })) } } @@ -81,8 +84,7 @@ mod tests { use mp_state_update::StateDiff; use mp_transactions::{InvokeTransaction, InvokeTransactionV0, Transaction}; use rstest::rstest; - use starknet_core::types::{L1DataAvailabilityMode, ResourcePrice}; - use starknet_types_core::felt::Felt; + use starknet_types_rpc::{L1DaMode, ResourcePrice}; use std::sync::Arc; #[rstest] @@ -91,79 +93,93 @@ mod tests { sample_chain_for_block_getters; // Block 0 - let res = MaybePendingBlockWithReceipts::Block(BlockWithReceipts { + let res = StarknetGetBlockWithTxsAndReceiptsResult::Block(BlockWithReceipts { status: BlockStatus::AcceptedOnL1, - block_hash: block_hashes[0], - parent_hash: Felt::ZERO, - block_number: 0, - new_root: Felt::from_hex_unchecked("0x88912"), - timestamp: 43, - sequencer_address: Felt::from_hex_unchecked("0xbabaa"), - l1_gas_price: ResourcePrice { price_in_fri: 12.into(), price_in_wei: 123.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 52.into(), price_in_wei: 44.into() }, - l1_da_mode: L1DataAvailabilityMode::Blob, - starknet_version: "0.13.1.1".into(), - transactions: vec![TransactionWithReceipt { - transaction: expected_txs[0].clone(), + transactions: vec![TransactionAndReceipt { + transaction: expected_txs[0].transaction.clone(), receipt: expected_receipts[0].clone(), }], + block_header: BlockHeader { + block_hash: block_hashes[0], + parent_hash: Felt::ZERO, + block_number: 0, + new_root: Felt::from_hex_unchecked("0x88912"), + timestamp: 43, + sequencer_address: Felt::from_hex_unchecked("0xbabaa"), + l1_gas_price: ResourcePrice { price_in_fri: 12.into(), price_in_wei: 123.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 52.into(), price_in_wei: 44.into() }, + l1_da_mode: L1DaMode::Blob, + starknet_version: "0.13.1.1".into(), + }, }); assert_eq!(get_block_with_receipts(&rpc, BlockId::Number(0)).unwrap(), res); assert_eq!(get_block_with_receipts(&rpc, BlockId::Hash(block_hashes[0])).unwrap(), res); // Block 1 - let res = MaybePendingBlockWithReceipts::Block(BlockWithReceipts { + let res = StarknetGetBlockWithTxsAndReceiptsResult::Block(BlockWithReceipts { status: BlockStatus::AcceptedOnL2, - block_hash: block_hashes[1], - parent_hash: block_hashes[0], - block_number: 1, - new_root: Felt::ZERO, - timestamp: 0, - sequencer_address: Felt::ZERO, - l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_da_mode: L1DataAvailabilityMode::Calldata, - starknet_version: "0.13.2".into(), transactions: vec![], + block_header: BlockHeader { + block_hash: block_hashes[1], + parent_hash: block_hashes[0], + block_number: 1, + new_root: Felt::ZERO, + timestamp: 0, + sequencer_address: Felt::ZERO, + l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_da_mode: L1DaMode::Calldata, + starknet_version: "0.13.2".into(), + }, }); assert_eq!(get_block_with_receipts(&rpc, BlockId::Number(1)).unwrap(), res); assert_eq!(get_block_with_receipts(&rpc, BlockId::Hash(block_hashes[1])).unwrap(), res); // Block 2 - let res = MaybePendingBlockWithReceipts::Block(BlockWithReceipts { + let res = StarknetGetBlockWithTxsAndReceiptsResult::Block(BlockWithReceipts { status: BlockStatus::AcceptedOnL2, - block_hash: block_hashes[2], - parent_hash: block_hashes[1], - block_number: 2, - new_root: Felt::ZERO, - timestamp: 0, - sequencer_address: Felt::ZERO, - l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_da_mode: L1DataAvailabilityMode::Blob, - starknet_version: "0.13.2".into(), transactions: vec![ - TransactionWithReceipt { transaction: expected_txs[1].clone(), receipt: expected_receipts[1].clone() }, - TransactionWithReceipt { transaction: expected_txs[2].clone(), receipt: expected_receipts[2].clone() }, + TransactionAndReceipt { + transaction: expected_txs[1].transaction.clone(), + receipt: expected_receipts[1].clone(), + }, + TransactionAndReceipt { + transaction: expected_txs[2].transaction.clone(), + receipt: expected_receipts[2].clone(), + }, ], + block_header: BlockHeader { + block_hash: block_hashes[2], + parent_hash: block_hashes[1], + block_number: 2, + new_root: Felt::ZERO, + timestamp: 0, + sequencer_address: Felt::ZERO, + l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_da_mode: L1DaMode::Blob, + starknet_version: "0.13.2".into(), + }, }); assert_eq!(get_block_with_receipts(&rpc, BlockId::Tag(BlockTag::Latest)).unwrap(), res); assert_eq!(get_block_with_receipts(&rpc, BlockId::Number(2)).unwrap(), res); assert_eq!(get_block_with_receipts(&rpc, BlockId::Hash(block_hashes[2])).unwrap(), res); // Pending - let res = MaybePendingBlockWithReceipts::PendingBlock(PendingBlockWithReceipts { - parent_hash: block_hashes[2], - timestamp: 0, - sequencer_address: Felt::ZERO, - l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_da_mode: L1DataAvailabilityMode::Blob, - starknet_version: "0.13.2".into(), - transactions: vec![TransactionWithReceipt { - transaction: expected_txs[3].clone(), + let res = StarknetGetBlockWithTxsAndReceiptsResult::Pending(PendingBlockWithReceipts { + transactions: vec![TransactionAndReceipt { + transaction: expected_txs[3].transaction.clone(), receipt: expected_receipts[3].clone(), }], + pending_block_header: PendingBlockHeader { + parent_hash: block_hashes[2], + timestamp: 0, + sequencer_address: Felt::ZERO, + l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_da_mode: L1DaMode::Blob, + starknet_version: "0.13.2".into(), + }, }); assert_eq!(get_block_with_receipts(&rpc, BlockId::Tag(BlockTag::Pending)).unwrap(), res); } @@ -235,15 +251,17 @@ mod tests { ) .unwrap(); - let res = MaybePendingBlockWithReceipts::PendingBlock(PendingBlockWithReceipts { - parent_hash: Felt::from_hex_unchecked("0x1777177171"), - sequencer_address: Felt::from_hex_unchecked("0xbabaa"), - timestamp: 43, - starknet_version: StarknetVersion::V0_13_1_1.to_string(), - l1_data_gas_price: ResourcePrice { price_in_fri: 52.into(), price_in_wei: 44.into() }, - l1_gas_price: ResourcePrice { price_in_fri: 12.into(), price_in_wei: 123.into() }, - l1_da_mode: starknet_core::types::L1DataAvailabilityMode::Blob, + let res = StarknetGetBlockWithTxsAndReceiptsResult::Pending(PendingBlockWithReceipts { transactions: vec![], + pending_block_header: PendingBlockHeader { + parent_hash: Felt::from_hex_unchecked("0x1777177171"), + sequencer_address: Felt::from_hex_unchecked("0xbabaa"), + timestamp: 43, + starknet_version: StarknetVersion::V0_13_1_1.to_string(), + l1_data_gas_price: ResourcePrice { price_in_fri: 52.into(), price_in_wei: 44.into() }, + l1_gas_price: ResourcePrice { price_in_fri: 12.into(), price_in_wei: 123.into() }, + l1_da_mode: L1DaMode::Blob, + }, }); assert_eq!(get_block_with_receipts(&rpc, BlockId::Tag(BlockTag::Pending)).unwrap(), res); } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_tx_hashes.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_tx_hashes.rs index a61550823..9222c6afc 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_tx_hashes.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_tx_hashes.rs @@ -1,5 +1,9 @@ use mp_block::{BlockId, MadaraMaybePendingBlockInfo}; -use starknet_core::types::{BlockStatus, BlockWithTxHashes, MaybePendingBlockWithTxHashes, PendingBlockWithTxHashes}; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + BlockHeader, BlockStatus, BlockWithTxHashes, MaybePendingBlockWithTxHashes, PendingBlockHeader, + PendingBlockWithTxHashes, +}; use crate::errors::StarknetRpcResult; use crate::Starknet; @@ -20,22 +24,24 @@ use crate::Starknet; pub fn get_block_with_tx_hashes( starknet: &Starknet, block_id: BlockId, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { let block = starknet.get_block_info(&block_id)?; let block_txs_hashes = block.tx_hashes().to_vec(); match block { MadaraMaybePendingBlockInfo::Pending(block) => { - Ok(MaybePendingBlockWithTxHashes::PendingBlock(PendingBlockWithTxHashes { + Ok(MaybePendingBlockWithTxHashes::Pending(PendingBlockWithTxHashes { transactions: block_txs_hashes, - parent_hash: block.header.parent_block_hash, - timestamp: block.header.block_timestamp, - sequencer_address: block.header.sequencer_address, - l1_gas_price: block.header.l1_gas_price.l1_gas_price(), - l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), - l1_da_mode: block.header.l1_da_mode.into(), - starknet_version: block.header.protocol_version.to_string(), + pending_block_header: PendingBlockHeader { + parent_hash: block.header.parent_block_hash, + timestamp: block.header.block_timestamp, + sequencer_address: block.header.sequencer_address, + l1_gas_price: block.header.l1_gas_price.l1_gas_price(), + l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), + l1_da_mode: block.header.l1_da_mode.into(), + starknet_version: block.header.protocol_version.to_string(), + }, })) } MadaraMaybePendingBlockInfo::NotPending(block) => { @@ -47,16 +53,18 @@ pub fn get_block_with_tx_hashes( Ok(MaybePendingBlockWithTxHashes::Block(BlockWithTxHashes { transactions: block_txs_hashes, status, - block_hash: block.block_hash, - parent_hash: block.header.parent_block_hash, - block_number: block.header.block_number, - new_root: block.header.global_state_root, - timestamp: block.header.block_timestamp, - sequencer_address: block.header.sequencer_address, - l1_gas_price: block.header.l1_gas_price.l1_gas_price(), - l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), - l1_da_mode: block.header.l1_da_mode.into(), - starknet_version: block.header.protocol_version.to_string(), + block_header: BlockHeader { + block_hash: block.block_hash, + parent_hash: block.header.parent_block_hash, + block_number: block.header.block_number, + new_root: block.header.global_state_root, + timestamp: block.header.block_timestamp, + sequencer_address: block.header.sequencer_address, + l1_gas_price: block.header.l1_gas_price.l1_gas_price(), + l1_data_gas_price: block.header.l1_gas_price.l1_data_gas_price(), + l1_da_mode: block.header.l1_da_mode.into(), + starknet_version: block.header.protocol_version.to_string(), + }, })) } } @@ -71,8 +79,8 @@ mod tests { }; use mp_block::BlockTag; use rstest::rstest; - use starknet_core::types::{L1DataAvailabilityMode, ResourcePrice}; use starknet_types_core::felt::Felt; + use starknet_types_rpc::{BlockHeader, L1DaMode, ResourcePrice}; #[rstest] fn test_get_block_with_tx_hashes(sample_chain_for_block_getters: (SampleChainForBlockGetters, Starknet)) { @@ -80,18 +88,20 @@ mod tests { // Block 0 let res = MaybePendingBlockWithTxHashes::Block(BlockWithTxHashes { - status: BlockStatus::AcceptedOnL1, - block_hash: block_hashes[0], - parent_hash: Felt::ZERO, - block_number: 0, - new_root: Felt::from_hex_unchecked("0x88912"), - timestamp: 43, - sequencer_address: Felt::from_hex_unchecked("0xbabaa"), - l1_gas_price: ResourcePrice { price_in_fri: 12.into(), price_in_wei: 123.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 52.into(), price_in_wei: 44.into() }, - l1_da_mode: L1DataAvailabilityMode::Blob, - starknet_version: "0.13.1.1".into(), transactions: vec![tx_hashes[0]], + status: BlockStatus::AcceptedOnL1, + block_header: BlockHeader { + block_hash: block_hashes[0], + parent_hash: Felt::ZERO, + block_number: 0, + new_root: Felt::from_hex_unchecked("0x88912"), + timestamp: 43, + sequencer_address: Felt::from_hex_unchecked("0xbabaa"), + l1_gas_price: ResourcePrice { price_in_fri: 12.into(), price_in_wei: 123.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 52.into(), price_in_wei: 44.into() }, + l1_da_mode: L1DaMode::Blob, + starknet_version: "0.13.1.1".into(), + }, }); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Number(0)).unwrap(), res); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Hash(block_hashes[0])).unwrap(), res); @@ -99,17 +109,19 @@ mod tests { // Block 1 let res = MaybePendingBlockWithTxHashes::Block(BlockWithTxHashes { status: BlockStatus::AcceptedOnL2, - block_hash: block_hashes[1], - parent_hash: block_hashes[0], - block_number: 1, - new_root: Felt::ZERO, - timestamp: 0, - sequencer_address: Felt::ZERO, - l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_da_mode: L1DataAvailabilityMode::Calldata, - starknet_version: "0.13.2".into(), transactions: vec![], + block_header: BlockHeader { + block_hash: block_hashes[1], + parent_hash: block_hashes[0], + block_number: 1, + new_root: Felt::ZERO, + timestamp: 0, + sequencer_address: Felt::ZERO, + l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_da_mode: L1DaMode::Calldata, + starknet_version: "0.13.2".into(), + }, }); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Number(1)).unwrap(), res); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Hash(block_hashes[1])).unwrap(), res); @@ -117,32 +129,36 @@ mod tests { // Block 2 let res = MaybePendingBlockWithTxHashes::Block(BlockWithTxHashes { status: BlockStatus::AcceptedOnL2, - block_hash: block_hashes[2], - parent_hash: block_hashes[1], - block_number: 2, - new_root: Felt::ZERO, - timestamp: 0, - sequencer_address: Felt::ZERO, - l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_da_mode: L1DataAvailabilityMode::Blob, - starknet_version: "0.13.2".into(), transactions: vec![tx_hashes[1], tx_hashes[2]], + block_header: BlockHeader { + block_hash: block_hashes[2], + parent_hash: block_hashes[1], + block_number: 2, + new_root: Felt::ZERO, + timestamp: 0, + sequencer_address: Felt::ZERO, + l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_da_mode: L1DaMode::Blob, + starknet_version: "0.13.2".into(), + }, }); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Tag(BlockTag::Latest)).unwrap(), res); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Number(2)).unwrap(), res); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Hash(block_hashes[2])).unwrap(), res); // Pending - let res = MaybePendingBlockWithTxHashes::PendingBlock(PendingBlockWithTxHashes { - parent_hash: block_hashes[2], - timestamp: 0, - sequencer_address: Felt::ZERO, - l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, - l1_da_mode: L1DataAvailabilityMode::Blob, - starknet_version: "0.13.2".into(), + let res = MaybePendingBlockWithTxHashes::Pending(PendingBlockWithTxHashes { transactions: vec![tx_hashes[3]], + pending_block_header: PendingBlockHeader { + parent_hash: block_hashes[2], + timestamp: 0, + sequencer_address: Felt::ZERO, + l1_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_data_gas_price: ResourcePrice { price_in_fri: 0.into(), price_in_wei: 0.into() }, + l1_da_mode: L1DaMode::Blob, + starknet_version: "0.13.2".into(), + }, }); assert_eq!(get_block_with_tx_hashes(&rpc, BlockId::Tag(BlockTag::Pending)).unwrap(), res); } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_txs.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_txs.rs index 40c2d6c3c..ae12b33ec 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_txs.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_block_with_txs.rs @@ -1,6 +1,10 @@ use jsonrpsee::core::RpcResult; use mp_block::{BlockId, MadaraMaybePendingBlockInfo}; -use starknet_core::types::{BlockStatus, BlockWithTxs, MaybePendingBlockWithTxs, PendingBlockWithTxs}; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + BlockHeader, BlockStatus, BlockWithTxs, MaybePendingBlockWithTxs, PendingBlockHeader, PendingBlockWithTxs, + TxnWithHash, +}; use crate::Starknet; @@ -22,17 +26,17 @@ use crate::Starknet; /// the block, this can include either a confirmed block or a pending block with its /// transactions. In case the specified block is not found, returns a `StarknetRpcApiError` with /// `BlockNotFound`. -pub fn get_block_with_txs(starknet: &Starknet, block_id: BlockId) -> RpcResult { +pub fn get_block_with_txs(starknet: &Starknet, block_id: BlockId) -> RpcResult> { let block = starknet.get_block(&block_id)?; - let transactions_core = Iterator::zip(block.inner.transactions.iter(), block.info.tx_hashes()) - .map(|(transaction, hash)| transaction.clone().to_core(*hash)) + let transactions_with_hash = Iterator::zip(block.inner.transactions.into_iter(), block.info.tx_hashes()) + .map(|(transaction, hash)| TxnWithHash { transaction: transaction.into(), transaction_hash: *hash }) .collect(); match block.info { - MadaraMaybePendingBlockInfo::Pending(block) => { - Ok(MaybePendingBlockWithTxs::PendingBlock(PendingBlockWithTxs { - transactions: transactions_core, + MadaraMaybePendingBlockInfo::Pending(block) => Ok(MaybePendingBlockWithTxs::Pending(PendingBlockWithTxs { + transactions: transactions_with_hash, + pending_block_header: PendingBlockHeader { parent_hash: block.header.parent_block_hash, timestamp: block.header.block_timestamp, sequencer_address: block.header.sequencer_address, @@ -40,8 +44,8 @@ pub fn get_block_with_txs(starknet: &Starknet, block_id: BlockId) -> RpcResult { let status = if block.header.block_number <= starknet.get_l1_last_confirmed_block()? { BlockStatus::AcceptedOnL1 @@ -49,18 +53,20 @@ pub fn get_block_with_txs(starknet: &Starknet, block_id: BlockId) -> RpcResult StarknetRpcResult { +pub fn get_class( + starknet: &Starknet, + block_id: BlockId, + class_hash: Felt, +) -> StarknetRpcResult> { let class_data = starknet .backend .get_class_info(&block_id, &class_hash) diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_class_at.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_class_at.rs index 1dbd3f27a..c6b1cf429 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_class_at.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_class_at.rs @@ -1,6 +1,6 @@ use mp_block::BlockId; -use starknet_core::types::ContractClass; use starknet_types_core::felt::Felt; +use starknet_types_rpc::MaybeDeprecatedContractClass; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; use crate::utils::{OptionExt, ResultExt}; @@ -29,7 +29,7 @@ pub fn get_class_at( starknet: &Starknet, block_id: BlockId, contract_address: Felt, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { let resolved_block_id = starknet .backend .resolve_block_id(&block_id) diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_events.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_events.rs index 81dd2175a..5c37a57cb 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_events.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_events.rs @@ -1,6 +1,6 @@ use mp_block::{BlockId, BlockTag, MadaraMaybePendingBlock, MadaraMaybePendingBlockInfo}; -use starknet_core::types::{EmittedEvent, EventFilterWithPage, EventsPage}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{EmittedEvent, Event, EventContent, EventFilterWithPageRequest, EventsChunk}; use crate::constants::{MAX_EVENTS_CHUNK_SIZE, MAX_EVENTS_KEYS}; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; @@ -27,10 +27,13 @@ use crate::Starknet; /// block in which they occurred, and the transaction that triggered them. In case of /// errors, such as `PAGE_SIZE_TOO_BIG`, `INVALID_CONTINUATION_TOKEN`, `BLOCK_NOT_FOUND`, or /// `TOO_MANY_KEYS_IN_FILTER`, returns a `StarknetRpcApiError` indicating the specific issue. -pub async fn get_events(starknet: &Starknet, filter: EventFilterWithPage) -> StarknetRpcResult { - let from_address = filter.event_filter.address; - let keys = filter.event_filter.keys.unwrap_or_default(); - let chunk_size = filter.result_page_request.chunk_size; +pub async fn get_events( + starknet: &Starknet, + filter: EventFilterWithPageRequest, +) -> StarknetRpcResult> { + let from_address = filter.address; + let keys = filter.keys.unwrap_or_default(); + let chunk_size = filter.chunk_size; if keys.len() > MAX_EVENTS_KEYS { return Err(StarknetRpcApiError::TooManyKeysInFilter); @@ -40,21 +43,20 @@ pub async fn get_events(starknet: &Starknet, filter: EventFilterWithPage) -> Sta } // Get the block numbers for the requested range - let (from_block, to_block, latest_block) = - block_range(starknet, filter.event_filter.from_block, filter.event_filter.to_block)?; + let (from_block, to_block, latest_block) = block_range(starknet, filter.from_block, filter.to_block)?; - let continuation_token = match filter.result_page_request.continuation_token { + let continuation_token = match filter.continuation_token { Some(token) => ContinuationToken::parse(token).map_err(|_| StarknetRpcApiError::InvalidContinuationToken)?, None => ContinuationToken { block_n: from_block, event_n: 0 }, }; // Verify that the requested range is valid if from_block > to_block { - return Ok(EventsPage { events: vec![], continuation_token: None }); + return Ok(EventsChunk { events: vec![], continuation_token: None }); } let from_block = continuation_token.block_n; - let mut filtered_events: Vec = Vec::new(); + let mut filtered_events: Vec> = Vec::new(); for current_block in from_block..=to_block { let (_pending, block) = if current_block <= latest_block { @@ -63,9 +65,9 @@ pub async fn get_events(starknet: &Starknet, filter: EventFilterWithPage) -> Sta (true, starknet.get_block(&BlockId::Tag(BlockTag::Pending))?) }; - let block_filtered_events: Vec = get_block_events(starknet, &block) + let block_filtered_events: Vec> = get_block_events(starknet, &block) .into_iter() - .filter(|event| event_match_filter(event, from_address, &keys)) + .filter(|event| event_match_filter(&event.event, from_address, &keys)) .collect(); if current_block == from_block && (block_filtered_events.len() as u64) < continuation_token.event_n { @@ -73,7 +75,7 @@ pub async fn get_events(starknet: &Starknet, filter: EventFilterWithPage) -> Sta } #[allow(clippy::iter_skip_zero)] - let block_filtered_reduced_events: Vec = block_filtered_events + let block_filtered_reduced_events: Vec> = block_filtered_events .into_iter() .skip(if current_block == from_block { continuation_token.event_n as usize } else { 0 }) .take(chunk_size as usize - filtered_events.len()) @@ -88,54 +90,41 @@ pub async fn get_events(starknet: &Starknet, filter: EventFilterWithPage) -> Sta if current_block == from_block { continuation_token.event_n + chunk_size } else { num_events as u64 }; let token = Some(ContinuationToken { block_n: current_block, event_n }.to_string()); - return Ok(EventsPage { events: filtered_events, continuation_token: token }); + return Ok(EventsChunk { events: filtered_events, continuation_token: token }); } } - Ok(EventsPage { events: filtered_events, continuation_token: None }) + Ok(EventsChunk { events: filtered_events, continuation_token: None }) } #[inline] -fn event_match_filter(event: &EmittedEvent, address: Option, keys: &[Vec]) -> bool { +fn event_match_filter(event: &Event, address: Option, keys: &[Vec]) -> bool { let match_from_address = address.map_or(true, |addr| addr == event.from_address); - let match_keys = keys - .iter() - .enumerate() - .all(|(i, keys)| event.keys.len() > i && (keys.is_empty() || keys.contains(&event.keys[i]))); + let match_keys = keys.iter().enumerate().all(|(i, keys)| { + event.event_content.keys.len() > i && (keys.is_empty() || keys.contains(&event.event_content.keys[i])) + }); match_from_address && match_keys } fn block_range( starknet: &Starknet, - from_block: Option, - to_block: Option, + from_block: Option, + to_block: Option, ) -> StarknetRpcResult<(u64, u64, u64)> { let latest_block_n = starknet.get_block_n(&BlockId::Tag(BlockTag::Latest))?; let from_block_n = match from_block { - Some(starknet_core::types::BlockId::Tag(starknet_core::types::BlockTag::Pending)) => latest_block_n + 1, - Some(block_id) => starknet.get_block_n(&to_block_id(block_id))?, + Some(BlockId::Tag(BlockTag::Pending)) => latest_block_n + 1, + Some(block_id) => starknet.get_block_n(&block_id)?, None => 0, }; let to_block_n = match to_block { - Some(starknet_core::types::BlockId::Tag(starknet_core::types::BlockTag::Pending)) => latest_block_n + 1, - Some(block_id) => starknet.get_block_n(&to_block_id(block_id))?, + Some(BlockId::Tag(BlockTag::Pending)) => latest_block_n + 1, + Some(block_id) => starknet.get_block_n(&block_id)?, None => latest_block_n, }; Ok((from_block_n, to_block_n, latest_block_n)) } -// TODO: this is a temporary solution until we use all types of starknet_types_rpc -fn to_block_id(block_id: starknet_core::types::BlockId) -> BlockId { - match block_id { - starknet_core::types::BlockId::Hash(hash) => BlockId::Hash(hash), - starknet_core::types::BlockId::Number(number) => BlockId::Number(number), - starknet_core::types::BlockId::Tag(tag) => BlockId::Tag(match tag { - starknet_core::types::BlockTag::Latest => BlockTag::Latest, - starknet_core::types::BlockTag::Pending => BlockTag::Pending, - }), - } -} - -fn get_block_events(_starknet: &Starknet, block: &MadaraMaybePendingBlock) -> Vec { +fn get_block_events(_starknet: &Starknet, block: &MadaraMaybePendingBlock) -> Vec> { let (block_hash, block_number) = match &block.info { MadaraMaybePendingBlockInfo::Pending(_) => (None, None), MadaraMaybePendingBlockInfo::NotPending(block) => (Some(block.block_hash), Some(block.header.block_number)), @@ -148,9 +137,10 @@ fn get_block_events(_starknet: &Starknet, block: &MadaraMaybePendingBlock) -> Ve tx_hash_and_events .map(|(transaction_hash, event)| EmittedEvent { - from_address: event.from_address, - keys: event.keys.clone(), - data: event.data.clone(), + event: Event { + from_address: event.from_address, + event_content: EventContent { keys: event.keys.clone(), data: event.data.clone() }, + }, block_hash, block_number, transaction_hash, diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_state_update.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_state_update.rs index d2b3b8cfe..8284cc3af 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_state_update.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_state_update.rs @@ -1,6 +1,6 @@ use mp_block::{BlockId, BlockTag}; -use starknet_core::types::{MaybePendingStateUpdate, PendingStateUpdate, StateUpdate}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{MaybePendingStateUpdate, PendingStateUpdate, StateUpdate}; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; use crate::utils::OptionExt; @@ -26,7 +26,7 @@ use mc_db::db_block_id::DbBlockId; /// the state of the network as a result of the block's execution. This can include a confirmed /// state update or a pending state update. If the block is not found, returns a /// `StarknetRpcApiError` with `BlockNotFound`. -pub fn get_state_update(starknet: &Starknet, block_id: BlockId) -> StarknetRpcResult { +pub fn get_state_update(starknet: &Starknet, block_id: BlockId) -> StarknetRpcResult> { let resolved_block_id = starknet .backend .resolve_block_id(&block_id) @@ -55,7 +55,7 @@ pub fn get_state_update(starknet: &Starknet, block_id: BlockId) -> StarknetRpcRe // The pending block is actually genesis, so old root is zero (huh?) Felt::ZERO }; - Ok(MaybePendingStateUpdate::PendingUpdate(PendingStateUpdate { old_root, state_diff: state_diff.into() })) + Ok(MaybePendingStateUpdate::Pending(PendingStateUpdate { old_root, state_diff: state_diff.into() })) } false => { let block_info = &starknet.get_block_info(&resolved_block_id)?; @@ -73,7 +73,7 @@ pub fn get_state_update(starknet: &Starknet, block_id: BlockId) -> StarknetRpcRe Felt::ZERO }; - Ok(MaybePendingStateUpdate::Update(StateUpdate { + Ok(MaybePendingStateUpdate::Block(StateUpdate { block_hash: block_info.block_hash, old_root, new_root: block_info.header.global_state_root, @@ -95,7 +95,7 @@ mod tests { sample_chain_for_state_updates; // Block 0 - let res = MaybePendingStateUpdate::Update(StateUpdate { + let res = MaybePendingStateUpdate::Block(StateUpdate { block_hash: block_hashes[0], old_root: Felt::ZERO, new_root: state_roots[0], @@ -105,7 +105,7 @@ mod tests { assert_eq!(get_state_update(&rpc, BlockId::Hash(block_hashes[0])).unwrap(), res); // Block 1 - let res = MaybePendingStateUpdate::Update(StateUpdate { + let res = MaybePendingStateUpdate::Block(StateUpdate { block_hash: block_hashes[1], old_root: state_roots[0], new_root: state_roots[1], @@ -115,7 +115,7 @@ mod tests { assert_eq!(get_state_update(&rpc, BlockId::Hash(block_hashes[1])).unwrap(), res); // Block 2 - let res = MaybePendingStateUpdate::Update(StateUpdate { + let res = MaybePendingStateUpdate::Block(StateUpdate { block_hash: block_hashes[2], old_root: state_roots[1], new_root: state_roots[2], @@ -126,7 +126,7 @@ mod tests { assert_eq!(get_state_update(&rpc, BlockId::Tag(BlockTag::Latest)).unwrap(), res); // Pending - let res = MaybePendingStateUpdate::PendingUpdate(PendingStateUpdate { + let res = MaybePendingStateUpdate::Pending(PendingStateUpdate { old_root: state_roots[2], state_diff: state_diffs[3].clone().into(), }); diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_block_id_and_index.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_block_id_and_index.rs index 4c0c2df8b..440ba0ada 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_block_id_and_index.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_block_id_and_index.rs @@ -1,5 +1,6 @@ use mp_block::BlockId; -use starknet_core::types::Transaction; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::TxnWithHash; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; use crate::Starknet; @@ -28,12 +29,13 @@ pub fn get_transaction_by_block_id_and_index( starknet: &Starknet, block_id: BlockId, index: u64, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { let block = starknet.get_block(&block_id)?; let transaction_hash = block.info.tx_hashes().get(index as usize).ok_or(StarknetRpcApiError::InvalidTxnIndex)?; - let transaction = block.inner.transactions.get(index as usize).ok_or(StarknetRpcApiError::InvalidTxnIndex)?; + let transaction = + block.inner.transactions.into_iter().nth(index as usize).ok_or(StarknetRpcApiError::InvalidTxnIndex)?; - Ok(transaction.clone().to_core(*transaction_hash)) + Ok(TxnWithHash { transaction: transaction.into(), transaction_hash: *transaction_hash }) } #[cfg(test)] diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_hash.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_hash.rs index 65aae0b1a..77c01c5bf 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_hash.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_by_hash.rs @@ -1,5 +1,5 @@ -use starknet_core::types::Transaction; use starknet_types_core::felt::Felt; +use starknet_types_rpc::TxnWithHash; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; use crate::utils::{OptionExt, ResultExt}; @@ -32,7 +32,7 @@ use crate::Starknet; /// - `BLOCK_NOT_FOUND` if the specified block is not found. /// - `TOO_MANY_KEYS_IN_FILTER` if there are too many keys in the filter, which may exceed the /// system's capacity. -pub fn get_transaction_by_hash(starknet: &Starknet, transaction_hash: Felt) -> StarknetRpcResult { +pub fn get_transaction_by_hash(starknet: &Starknet, transaction_hash: Felt) -> StarknetRpcResult> { let (block, tx_index) = starknet .backend .find_tx_hash_block(&transaction_hash) @@ -41,9 +41,11 @@ pub fn get_transaction_by_hash(starknet: &Starknet, transaction_hash: Felt) -> S let transaction = block .inner .transactions - .get(tx_index.0 as usize) + .into_iter() + .nth(tx_index.0 as usize) .ok_or_internal_server_error("Storage block transaction mismatch")?; - Ok(transaction.clone().to_core(transaction_hash)) + + Ok(TxnWithHash { transaction: transaction.into(), transaction_hash }) } #[cfg(test)] diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_receipt.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_receipt.rs index 1d8579a97..cf6a58fbd 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_receipt.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_receipt.rs @@ -1,6 +1,6 @@ use mp_block::MadaraMaybePendingBlockInfo; -use starknet_core::types::{TransactionFinalityStatus, TransactionReceiptWithBlockInfo}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{TxnFinalityStatus, TxnReceiptWithBlockInfo}; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; @@ -32,7 +32,7 @@ use crate::Starknet; pub fn get_transaction_receipt( starknet: &Starknet, transaction_hash: Felt, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { let (block, tx_index) = starknet .backend .find_tx_hash_block(&transaction_hash) @@ -45,26 +45,22 @@ pub fn get_transaction_receipt( false }; - let finality_status = - if is_on_l1 { TransactionFinalityStatus::AcceptedOnL1 } else { TransactionFinalityStatus::AcceptedOnL2 }; + let finality_status = if is_on_l1 { TxnFinalityStatus::L1 } else { TxnFinalityStatus::L2 }; - let receipt = block + let transaction_receipt = block .inner .receipts .get(tx_index.0 as usize) .ok_or(StarknetRpcApiError::TxnHashNotFound)? .clone() - .to_starknet_core(finality_status); - - let block = match block.info { - MadaraMaybePendingBlockInfo::Pending(_) => starknet_core::types::ReceiptBlock::Pending, - MadaraMaybePendingBlockInfo::NotPending(block) => starknet_core::types::ReceiptBlock::Block { - block_hash: block.block_hash, - block_number: block.header.block_number, - }, + .to_starknet_types(finality_status); + + let (block_number, block_hash) = match block.info { + MadaraMaybePendingBlockInfo::Pending(_) => (None, None), + MadaraMaybePendingBlockInfo::NotPending(block) => (Some(block.header.block_number), Some(block.block_hash)), }; - Ok(TransactionReceiptWithBlockInfo { receipt, block }) + Ok(TxnReceiptWithBlockInfo:: { transaction_receipt, block_hash, block_number }) } #[cfg(test)] @@ -72,7 +68,6 @@ mod tests { use super::*; use crate::test_utils::{sample_chain_for_block_getters, SampleChainForBlockGetters}; use rstest::rstest; - use starknet_core::types::ReceiptBlock; #[rstest] fn test_get_transaction_receipt(sample_chain_for_block_getters: (SampleChainForBlockGetters, Starknet)) { @@ -80,29 +75,35 @@ mod tests { sample_chain_for_block_getters; // Block 0 - let res = TransactionReceiptWithBlockInfo { - receipt: expected_receipts[0].clone(), - block: ReceiptBlock::Block { block_hash: block_hashes[0], block_number: 0 }, + let res = TxnReceiptWithBlockInfo:: { + transaction_receipt: expected_receipts[0].clone(), + block_hash: Some(block_hashes[0]), + block_number: Some(0), }; assert_eq!(get_transaction_receipt(&rpc, tx_hashes[0]).unwrap(), res); // Block 1 // Block 2 - let res = TransactionReceiptWithBlockInfo { - receipt: expected_receipts[1].clone(), - block: ReceiptBlock::Block { block_hash: block_hashes[2], block_number: 2 }, + let res = TxnReceiptWithBlockInfo:: { + transaction_receipt: expected_receipts[1].clone(), + block_hash: Some(block_hashes[2]), + block_number: Some(2), }; assert_eq!(get_transaction_receipt(&rpc, tx_hashes[1]).unwrap(), res); - let res = TransactionReceiptWithBlockInfo { - receipt: expected_receipts[2].clone(), - block: ReceiptBlock::Block { block_hash: block_hashes[2], block_number: 2 }, + let res = TxnReceiptWithBlockInfo:: { + transaction_receipt: expected_receipts[2].clone(), + block_hash: Some(block_hashes[2]), + block_number: Some(2), }; assert_eq!(get_transaction_receipt(&rpc, tx_hashes[2]).unwrap(), res); // Pending - let res = - TransactionReceiptWithBlockInfo { receipt: expected_receipts[3].clone(), block: ReceiptBlock::Pending }; + let res = TxnReceiptWithBlockInfo:: { + transaction_receipt: expected_receipts[3].clone(), + block_hash: None, + block_number: None, + }; assert_eq!(get_transaction_receipt(&rpc, tx_hashes[3]).unwrap(), res); } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_status.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_status.rs index d8bf407f9..8201d2e32 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_status.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/get_transaction_status.rs @@ -1,6 +1,7 @@ use mp_block::MadaraMaybePendingBlockInfo; use mp_receipt::ExecutionResult; -use starknet_core::types::{Felt, TransactionExecutionStatus, TransactionStatus}; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{TxnExecutionStatus, TxnFinalityAndExecutionStatus, TxnStatus}; use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; use crate::utils::ResultExt; @@ -24,7 +25,10 @@ use crate::Starknet; /// confirmed, pending, or rejected. /// - `execution_status`: The execution status of the transaction, providing details on the /// execution outcome if the transaction has been processed. -pub fn get_transaction_status(starknet: &Starknet, transaction_hash: Felt) -> StarknetRpcResult { +pub fn get_transaction_status( + starknet: &Starknet, + transaction_hash: Felt, +) -> StarknetRpcResult { let (block, tx_index) = starknet .backend .find_tx_hash_block(&transaction_hash) @@ -36,20 +40,22 @@ pub fn get_transaction_status(starknet: &Starknet, transaction_hash: Felt) -> St let tx_receipt = block.inner.receipts.get(tx_index.0 as usize).ok_or(StarknetRpcApiError::TxnHashNotFound)?; let tx_execution_status = match tx_receipt.execution_result() { - ExecutionResult::Reverted { .. } => TransactionExecutionStatus::Reverted, - ExecutionResult::Succeeded => TransactionExecutionStatus::Succeeded, + ExecutionResult::Reverted { .. } => TxnExecutionStatus::Reverted, + ExecutionResult::Succeeded => TxnExecutionStatus::Succeeded, }; - match block.info { - MadaraMaybePendingBlockInfo::Pending(_) => Ok(TransactionStatus::AcceptedOnL2(tx_execution_status)), + let finality_status = match block.info { + MadaraMaybePendingBlockInfo::Pending(_) => TxnStatus::AcceptedOnL2, MadaraMaybePendingBlockInfo::NotPending(block) => { if block.header.block_number <= starknet.get_l1_last_confirmed_block()? { - Ok(TransactionStatus::AcceptedOnL1(tx_execution_status)) + TxnStatus::AcceptedOnL1 } else { - Ok(TransactionStatus::AcceptedOnL2(tx_execution_status)) + TxnStatus::AcceptedOnL2 } } - } + }; + + Ok(TxnFinalityAndExecutionStatus { finality_status, execution_status: Some(tx_execution_status) }) } #[cfg(test)] @@ -65,7 +71,10 @@ mod tests { // Block 0 assert_eq!( get_transaction_status(&rpc, tx_hashes[0]).unwrap(), - TransactionStatus::AcceptedOnL1(TransactionExecutionStatus::Succeeded) + TxnFinalityAndExecutionStatus { + finality_status: TxnStatus::AcceptedOnL1, + execution_status: Some(TxnExecutionStatus::Succeeded) + } ); // Block 1 @@ -73,17 +82,26 @@ mod tests { // Block 2 assert_eq!( get_transaction_status(&rpc, tx_hashes[1]).unwrap(), - TransactionStatus::AcceptedOnL2(TransactionExecutionStatus::Succeeded) + TxnFinalityAndExecutionStatus { + finality_status: TxnStatus::AcceptedOnL2, + execution_status: Some(TxnExecutionStatus::Succeeded) + } ); assert_eq!( get_transaction_status(&rpc, tx_hashes[2]).unwrap(), - TransactionStatus::AcceptedOnL2(TransactionExecutionStatus::Reverted) + TxnFinalityAndExecutionStatus { + finality_status: TxnStatus::AcceptedOnL2, + execution_status: Some(TxnExecutionStatus::Reverted) + } ); // Pending assert_eq!( get_transaction_status(&rpc, tx_hashes[3]).unwrap(), - TransactionStatus::AcceptedOnL2(TransactionExecutionStatus::Succeeded) + TxnFinalityAndExecutionStatus { + finality_status: TxnStatus::AcceptedOnL2, + execution_status: Some(TxnExecutionStatus::Succeeded) + } ); } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/lib.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/lib.rs index 59fa33ccf..e80b6ce2b 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/lib.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/lib.rs @@ -1,13 +1,14 @@ use jsonrpsee::core::{async_trait, RpcResult}; use mp_block::BlockId; use mp_chain_config::RpcVersion; -use starknet_core::types::{ - BlockHashAndNumber, BroadcastedTransaction, ContractClass, EventFilterWithPage, EventsPage, FeeEstimate, - FunctionCall, MaybePendingBlockWithReceipts, MaybePendingBlockWithTxHashes, MaybePendingBlockWithTxs, - MaybePendingStateUpdate, MsgFromL1, SimulationFlagForEstimateFee, SyncStatusType, Transaction, - TransactionReceiptWithBlockInfo, TransactionStatus, -}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + BlockHashAndNumber, EventFilterWithPageRequest, EventsChunk, FeeEstimate, FunctionCall, + MaybeDeprecatedContractClass, MaybePendingBlockWithTxHashes, MaybePendingBlockWithTxs, MaybePendingStateUpdate, + MsgFromL1, StarknetGetBlockWithTxsAndReceiptsResult, SyncingStatus, TxnFinalityAndExecutionStatus, + TxnReceiptWithBlockInfo, TxnWithHash, +}; +use starknet_types_rpc::{BroadcastedTxn, SimulationFlagForEstimateFee}; use super::block_hash_and_number::*; use super::call::*; @@ -43,11 +44,11 @@ impl StarknetReadRpcApiV0_7_1Server for Starknet { Ok(self.current_block_number()?) } - fn block_hash_and_number(&self) -> RpcResult { + fn block_hash_and_number(&self) -> RpcResult> { Ok(block_hash_and_number(self)?) } - fn call(&self, request: FunctionCall, block_id: BlockId) -> RpcResult> { + fn call(&self, request: FunctionCall, block_id: BlockId) -> RpcResult> { Ok(call(self, request, block_id)?) } @@ -61,30 +62,33 @@ impl StarknetReadRpcApiV0_7_1Server for Starknet { async fn estimate_fee( &self, - request: Vec, + request: Vec>, simulation_flags: Vec, block_id: BlockId, - ) -> RpcResult> { + ) -> RpcResult>> { Ok(estimate_fee(self, request, simulation_flags, block_id).await?) } - async fn estimate_message_fee(&self, message: MsgFromL1, block_id: BlockId) -> RpcResult { + async fn estimate_message_fee(&self, message: MsgFromL1, block_id: BlockId) -> RpcResult> { Ok(estimate_message_fee(self, message, block_id).await?) } - async fn get_block_with_receipts(&self, block_id: BlockId) -> RpcResult { + async fn get_block_with_receipts( + &self, + block_id: BlockId, + ) -> RpcResult> { Ok(get_block_with_receipts(self, block_id)?) } - fn get_block_with_tx_hashes(&self, block_id: BlockId) -> RpcResult { + fn get_block_with_tx_hashes(&self, block_id: BlockId) -> RpcResult> { Ok(get_block_with_tx_hashes(self, block_id)?) } - fn get_block_with_txs(&self, block_id: BlockId) -> RpcResult { + fn get_block_with_txs(&self, block_id: BlockId) -> RpcResult> { get_block_with_txs(self, block_id) } - fn get_class_at(&self, block_id: BlockId, contract_address: Felt) -> RpcResult { + fn get_class_at(&self, block_id: BlockId, contract_address: Felt) -> RpcResult> { Ok(get_class_at(self, block_id, contract_address)?) } @@ -92,11 +96,11 @@ impl StarknetReadRpcApiV0_7_1Server for Starknet { Ok(get_class_hash_at(self, block_id, contract_address)?) } - fn get_class(&self, block_id: BlockId, class_hash: Felt) -> RpcResult { + fn get_class(&self, block_id: BlockId, class_hash: Felt) -> RpcResult> { Ok(get_class(self, block_id, class_hash)?) } - async fn get_events(&self, filter: EventFilterWithPage) -> RpcResult { + async fn get_events(&self, filter: EventFilterWithPageRequest) -> RpcResult> { Ok(get_events(self, filter).await?) } @@ -108,27 +112,27 @@ impl StarknetReadRpcApiV0_7_1Server for Starknet { Ok(get_storage_at(self, contract_address, key, block_id)?) } - fn get_transaction_by_block_id_and_index(&self, block_id: BlockId, index: u64) -> RpcResult { + fn get_transaction_by_block_id_and_index(&self, block_id: BlockId, index: u64) -> RpcResult> { Ok(get_transaction_by_block_id_and_index(self, block_id, index)?) } - fn get_transaction_by_hash(&self, transaction_hash: Felt) -> RpcResult { + fn get_transaction_by_hash(&self, transaction_hash: Felt) -> RpcResult> { Ok(get_transaction_by_hash(self, transaction_hash)?) } - async fn get_transaction_receipt(&self, transaction_hash: Felt) -> RpcResult { + async fn get_transaction_receipt(&self, transaction_hash: Felt) -> RpcResult> { Ok(get_transaction_receipt(self, transaction_hash)?) } - fn get_transaction_status(&self, transaction_hash: Felt) -> RpcResult { + fn get_transaction_status(&self, transaction_hash: Felt) -> RpcResult { Ok(get_transaction_status(self, transaction_hash)?) } - async fn syncing(&self) -> RpcResult { + async fn syncing(&self) -> RpcResult> { Ok(syncing(self).await?) } - fn get_state_update(&self, block_id: BlockId) -> RpcResult { + fn get_state_update(&self, block_id: BlockId) -> RpcResult> { Ok(get_state_update(self, block_id)?) } } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/syncing.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/syncing.rs index b91b9ca33..c7efac0f2 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/read/syncing.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/read/syncing.rs @@ -1,5 +1,6 @@ use mp_block::{BlockId, BlockTag}; -use starknet_core::types::{SyncStatus, SyncStatusType}; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{SyncStatus, SyncingStatus}; use crate::errors::StarknetRpcResult; use crate::utils::{OptionExt, ResultExt}; @@ -15,16 +16,16 @@ use crate::Starknet; /// /// * `Syncing` - An Enum that can either be a `mc_rpc_core::SyncStatus` struct representing the /// sync status, or a `Boolean` (`false`) indicating that the node is not currently synchronizing. -pub async fn syncing(starknet: &Starknet) -> StarknetRpcResult { +pub async fn syncing(starknet: &Starknet) -> StarknetRpcResult> { // obtain best seen (highest) block number - let Some(current_block_info) = starknet .backend .get_block_info(&BlockId::Tag(BlockTag::Latest)) .or_internal_server_error("Error getting latest block")? else { - return Ok(SyncStatusType::NotSyncing); // TODO: This doesn't really make sense? This can only happen when there are no block in the db at all. + return Ok(SyncingStatus::NotSyncing); // TODO: This doesn't really make sense? This can only happen when there are no block in the db at all. }; + let current_block_info = current_block_info.as_nonpending().ok_or_internal_server_error("Latest block cannot be pending")?; let starting_block_num = 0; // TODO(rpc): fix this // starknet.starting_block; @@ -35,10 +36,10 @@ pub async fn syncing(starknet: &Starknet) -> StarknetRpcResult { let current_block_num = current_block_info.header.block_number; let current_block_hash = current_block_info.block_hash; - Ok(SyncStatusType::Syncing(SyncStatus { + Ok(SyncingStatus::Syncing(SyncStatus { starting_block_num, starting_block_hash, - highest_block_num: current_block_num, // TODO(merge): is this correct,,? + highest_block_num: current_block_num, // TODO(merge): is this correct? highest_block_hash: current_block_hash, current_block_num, current_block_hash, diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/mod.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/mod.rs index 49673d51e..8fadb0da4 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/mod.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/mod.rs @@ -5,8 +5,8 @@ pub(crate) mod trace_transaction; use jsonrpsee::core::{async_trait, RpcResult}; use mp_block::BlockId; use simulate_transactions::simulate_transactions; -use starknet_core::types::{BroadcastedTransaction, SimulatedTransaction, SimulationFlag, TransactionTraceWithHash}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{BroadcastedTxn, SimulateTransactionsResult, SimulationFlag, TraceBlockTransactionsResult}; use trace_block_transactions::trace_block_transactions; use trace_transaction::trace_transaction; @@ -17,17 +17,17 @@ impl StarknetTraceRpcApiV0_7_1Server for Starknet { async fn simulate_transactions( &self, block_id: BlockId, - transactions: Vec, + transactions: Vec>, simulation_flags: Vec, - ) -> RpcResult> { + ) -> RpcResult>> { Ok(simulate_transactions(self, block_id, transactions, simulation_flags).await?) } - async fn trace_block_transactions(&self, block_id: BlockId) -> RpcResult> { + async fn trace_block_transactions(&self, block_id: BlockId) -> RpcResult>> { Ok(trace_block_transactions(self, block_id).await?) } - async fn trace_transaction(&self, transaction_hash: Felt) -> RpcResult { + async fn trace_transaction(&self, transaction_hash: Felt) -> RpcResult> { Ok(trace_transaction(self, transaction_hash).await?) } } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/simulate_transactions.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/simulate_transactions.rs index 3c8a9785e..317541aa1 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/simulate_transactions.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/simulate_transactions.rs @@ -1,19 +1,21 @@ -use super::trace_transaction::FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW; -use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; -use crate::utils::ResultExt; -use crate::Starknet; use mc_exec::{execution_result_to_tx_trace, ExecutionContext}; use mp_block::BlockId; use mp_transactions::broadcasted_to_blockifier; -use starknet_core::types::{BroadcastedTransaction, SimulatedTransaction, SimulationFlag}; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{BroadcastedTxn, SimulateTransactionsResult, SimulationFlag}; use std::sync::Arc; +use super::trace_transaction::FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW; +use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; +use crate::utils::ResultExt; +use crate::Starknet; + pub async fn simulate_transactions( starknet: &Starknet, block_id: BlockId, - transactions: Vec, + transactions: Vec>, simulation_flags: Vec, -) -> StarknetRpcResult> { +) -> StarknetRpcResult>> { let block_info = starknet.get_block_info(&block_id)?; let starknet_version = *block_info.protocol_version(); @@ -36,7 +38,7 @@ pub async fn simulate_transactions( let simulated_transactions = execution_resuls .iter() .map(|result| { - Ok(SimulatedTransaction { + Ok(SimulateTransactionsResult { transaction_trace: execution_result_to_tx_trace(result) .or_internal_server_error("Converting execution infos to tx trace")?, fee_estimation: exec_context.execution_result_to_fee_estimate(result), diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_block_transactions.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_block_transactions.rs index cae8bc41a..0ddfe57e9 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_block_transactions.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_block_transactions.rs @@ -1,19 +1,21 @@ -use super::trace_transaction::FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW; -use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; -use crate::utils::transaction::to_blockifier_transactions; -use crate::utils::ResultExt; -use crate::Starknet; use mc_exec::{execution_result_to_tx_trace, ExecutionContext}; use mp_block::BlockId; use mp_convert::ToFelt; use starknet_api::transaction::TransactionHash; -use starknet_core::types::TransactionTraceWithHash; +use starknet_types_core::felt::Felt; +use starknet_types_rpc::TraceBlockTransactionsResult; use std::sync::Arc; +use super::trace_transaction::FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW; +use crate::errors::{StarknetRpcApiError, StarknetRpcResult}; +use crate::utils::transaction::to_blockifier_transactions; +use crate::utils::ResultExt; +use crate::Starknet; + pub async fn trace_block_transactions( starknet: &Starknet, block_id: BlockId, -) -> StarknetRpcResult> { +) -> StarknetRpcResult>> { let block = starknet.get_block(&block_id)?; if block.info.protocol_version() < &FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW { @@ -40,7 +42,7 @@ pub async fn trace_block_transactions( let transaction_hash = result.hash.to_felt(); let trace_root = execution_result_to_tx_trace(&result) .or_internal_server_error("Converting execution infos to tx trace")?; - Ok(TransactionTraceWithHash { trace_root, transaction_hash }) + Ok(TraceBlockTransactionsResult { trace_root, transaction_hash }) }) .collect::, StarknetRpcApiError>>()?; diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_transaction.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_transaction.rs index 07a9d9d6d..d82ac500c 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_transaction.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/trace/trace_transaction.rs @@ -7,8 +7,8 @@ use mc_exec::execution_result_to_tx_trace; use mc_exec::ExecutionContext; use mp_chain_config::StarknetVersion; use starknet_api::transaction::TransactionHash; -use starknet_core::types::TransactionTraceWithHash; use starknet_types_core::felt::Felt; +use starknet_types_rpc::TraceBlockTransactionsResult; use std::sync::Arc; // For now, we fallback to the sequencer - that is what pathfinder and juno do too, but this is temporary @@ -17,7 +17,7 @@ pub const FALLBACK_TO_SEQUENCER_WHEN_VERSION_BELOW: StarknetVersion = StarknetVe pub async fn trace_transaction( starknet: &Starknet, transaction_hash: Felt, -) -> StarknetRpcResult { +) -> StarknetRpcResult> { let (block, tx_index) = starknet .backend .find_tx_hash_block(&transaction_hash) @@ -50,5 +50,5 @@ pub async fn trace_transaction( let trace = execution_result_to_tx_trace(&execution_result) .or_internal_server_error("Converting execution infos to tx trace")?; - Ok(TransactionTraceWithHash { transaction_hash, trace_root: trace }) + Ok(TraceBlockTransactionsResult { transaction_hash, trace_root: trace }) } diff --git a/crates/client/rpc/src/versions/user/v0_7_1/methods/write/mod.rs b/crates/client/rpc/src/versions/user/v0_7_1/methods/write/mod.rs index e3f14fe37..08b18af20 100644 --- a/crates/client/rpc/src/versions/user/v0_7_1/methods/write/mod.rs +++ b/crates/client/rpc/src/versions/user/v0_7_1/methods/write/mod.rs @@ -1,8 +1,9 @@ use crate::{versions::user::v0_7_1::StarknetWriteRpcApiV0_7_1Server, Starknet}; use jsonrpsee::core::{async_trait, RpcResult}; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeployAccountTransaction, BroadcastedInvokeTransaction, - DeclareTransactionResult, DeployAccountTransactionResult, InvokeTransactionResult, +use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + AddInvokeTransactionResult, BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, + ClassAndTxnHash, ContractAndTxnHash, }; #[async_trait] @@ -18,8 +19,8 @@ impl StarknetWriteRpcApiV0_7_1Server for Starknet { /// * `declare_transaction_result` - the result of the declare transaction async fn add_declare_transaction( &self, - declare_transaction: BroadcastedDeclareTransaction, - ) -> RpcResult { + declare_transaction: BroadcastedDeclareTxn, + ) -> RpcResult> { Ok(self.add_transaction_provider.add_declare_transaction(declare_transaction).await?) } @@ -35,8 +36,8 @@ impl StarknetWriteRpcApiV0_7_1Server for Starknet { /// * `contract_address` - address of the deployed contract account async fn add_deploy_account_transaction( &self, - deploy_account_transaction: BroadcastedDeployAccountTransaction, - ) -> RpcResult { + deploy_account_transaction: BroadcastedDeployAccountTxn, + ) -> RpcResult> { Ok(self.add_transaction_provider.add_deploy_account_transaction(deploy_account_transaction).await?) } @@ -51,8 +52,8 @@ impl StarknetWriteRpcApiV0_7_1Server for Starknet { /// * `transaction_hash` - transaction hash corresponding to the invocation async fn add_invoke_transaction( &self, - invoke_transaction: BroadcastedInvokeTransaction, - ) -> RpcResult { + invoke_transaction: BroadcastedInvokeTxn, + ) -> RpcResult> { Ok(self.add_transaction_provider.add_invoke_transaction(invoke_transaction).await?) } } diff --git a/crates/client/rpc/src/versions/user/v0_8_0/api.rs b/crates/client/rpc/src/versions/user/v0_8_0/api.rs index ae476f26b..799e22a34 100644 --- a/crates/client/rpc/src/versions/user/v0_8_0/api.rs +++ b/crates/client/rpc/src/versions/user/v0_8_0/api.rs @@ -2,54 +2,32 @@ use jsonrpsee::core::RpcResult; use m_proc_macros::versioned_rpc; use mp_block::BlockId; use serde::{Deserialize, Serialize}; -use serde_with::serde_as; -use starknet_core::serde::unsigned_field_element::UfeHex; use starknet_types_core::felt::Felt; pub(crate) type NewHead = starknet_types_rpc::BlockHeader; -#[serde_as] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct ContractStorageKeysItem { - #[serde_as(as = "UfeHex")] pub contract_address: Felt, - #[serde_as(as = "Vec")] pub storage_keys: Vec, } -#[serde_as] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[serde(untagged)] pub enum MerkleNode { - Binary { - #[serde_as(as = "UfeHex")] - left: Felt, - #[serde_as(as = "UfeHex")] - right: Felt, - }, - Edge { - #[serde_as(as = "UfeHex")] - child: Felt, - #[serde_as(as = "UfeHex")] - path: Felt, - length: usize, - }, + Binary { left: Felt, right: Felt }, + Edge { child: Felt, path: Felt, length: usize }, } -#[serde_as] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct NodeHashToNodeMappingItem { - #[serde_as(as = "UfeHex")] pub node_hash: Felt, pub node: MerkleNode, } -#[serde_as] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct ContractLeavesDataItem { - #[serde_as(as = "UfeHex")] pub nonce: Felt, - #[serde_as(as = "UfeHex")] pub class_hash: Felt, } @@ -59,18 +37,13 @@ pub struct ContractsProof { pub contract_leaves_data: Vec, } -#[serde_as] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct GlobalRoots { - #[serde_as(as = "UfeHex")] pub contracts_tree_root: Felt, - #[serde_as(as = "UfeHex")] pub classes_tree_root: Felt, - #[serde_as(as = "UfeHex")] pub block_hash: Felt, } -#[serde_as] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct GetStorageProofResult { pub classes_proof: Vec, diff --git a/crates/client/rpc/src/versions/user/v0_8_0/methods/read/get_storage_proof.rs b/crates/client/rpc/src/versions/user/v0_8_0/methods/read/get_storage_proof.rs index f154aeeab..e4bf2d155 100644 --- a/crates/client/rpc/src/versions/user/v0_8_0/methods/read/get_storage_proof.rs +++ b/crates/client/rpc/src/versions/user/v0_8_0/methods/read/get_storage_proof.rs @@ -11,7 +11,7 @@ use bitvec::{array::BitArray, order::Msb0, slice::BitSlice}; use jsonrpsee::core::RpcResult; use mc_db::{bonsai_identifier, db_block_id::DbBlockId, BasicId, GlobalTrie}; use mp_block::{BlockId, BlockTag}; -use starknet_core::types::Felt; +use starknet_types_core::felt::Felt; use starknet_types_core::hash::StarkHash; use std::iter; diff --git a/crates/client/sync/Cargo.toml b/crates/client/sync/Cargo.toml index 4dec773a9..09843cdc2 100644 --- a/crates/client/sync/Cargo.toml +++ b/crates/client/sync/Cargo.toml @@ -41,13 +41,10 @@ mc-telemetry.workspace = true mp-block.workspace = true mp-chain-config.workspace = true mp-class.workspace = true -mp-convert.workspace = true mp-gateway.workspace = true -mp-transactions.workspace = true mp-utils.workspace = true # Starknet -starknet-core.workspace = true starknet-types-core.workspace = true starknet_api.workspace = true diff --git a/crates/client/sync/test-data/block_0.json b/crates/client/sync/test-data/block_0.json index f2ca15730..004266a5b 100644 --- a/crates/client/sync/test-data/block_0.json +++ b/crates/client/sync/test-data/block_0.json @@ -1 +1 @@ -{"signature":["0x7760328cdb34f4586b46c1f395df1ea752900181a3d49cf59102d1bdb68f339","0x5e94d2e46a57561a906d2f98e3259a9d7703e02dfbe1067c016a2a0975f140d"],"unverified_block_number":0,"header":{"parent_block_hash":"0x0","sequencer_address":"0x0","block_timestamp":1637069048,"protocol_version":[0,0,0,0],"l1_gas_price":{"eth_l1_gas_price":0,"strk_l1_gas_price":0,"eth_l1_data_gas_price":1,"strk_l1_data_gas_price":1},"l1_da_mode":"CALLDATA"},"state_diff":{"storage_diffs":[{"address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","storage_entries":[{"key":"0x5","value":"0x22b"},{"key":"0x313ad57fdf765addc71329abf8d74ac2bce6d46da8c2b9b82255a5076620300","value":"0x4e7e989d58a17cd279eca440c5eaa829efb6f9967aaad89022acbe644c39b36"},{"key":"0x313ad57fdf765addc71329abf8d74ac2bce6d46da8c2b9b82255a5076620301","value":"0x453ae0c9610197b18b13645c44d3d0a407083d96562e8752aab3fab616cecb0"},{"key":"0x5aee31408163292105d875070f98cb48275b8c87e80380b78d30647e05854d5","value":"0x7e5"},{"key":"0x6cf6c2f36d36b08e591e4489e92ca882bb67b9c39a3afccf011972a8de467f0","value":"0x7ab344d88124307c07b56f6c59c12f4543e9c96398727854a322dea82c73240"}]},{"address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","storage_entries":[{"key":"0xdf28e613c065616a2e79ca72f9c1908e17b8c913972a9993da77588dc9cae9","value":"0x1432126ac23c7028200e443169c2286f99cdb5a7bf22e607bcd724efa059040"},{"key":"0x5f750dc13ed239fa6fc43ff6e10ae9125a33bd05ec034fc3bb4dd168df3505f","value":"0x7c7"}]},{"address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","storage_entries":[{"key":"0x5","value":"0x65"},{"key":"0xcfc2e2866fd08bfb4ac73b70e0c136e326ae18fc797a2c090c8811c695577e","value":"0x5f1dd5a5aef88e0498eeca4e7b2ea0fa7110608c11531278742f0b5499af4b3"},{"key":"0x5aee31408163292105d875070f98cb48275b8c87e80380b78d30647e05854d5","value":"0x7c7"},{"key":"0x5fac6815fddf6af1ca5e592359862ede14f171e1544fd9e792288164097c35d","value":"0x299e2f4b5a873e95e65eb03d31e532ea2cde43b498b50cd3161145db5542a5"},{"key":"0x5fac6815fddf6af1ca5e592359862ede14f171e1544fd9e792288164097c35e","value":"0x3d6897cf23da3bf4fd35cc7a43ccaf7c5eaf8f7c5b9031ac9b09a929204175f"}]},{"address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","storage_entries":[{"key":"0x1e2cd4b3588e8f6f9c4e89fb0e293bf92018c96d7a93ee367d29a284223b6ff","value":"0x71d1e9d188c784a0bde95c1d508877a0d93e9102b37213d1e13f3ebc54a7751"},{"key":"0x449908c349e90f81ab13042b1e49dc251eb6e3e51092d9a40f86859f7f415b0","value":"0x6cb6104279e754967a721b52bcf5be525fdc11fa6db6ef5c3a4db832acf7804"},{"key":"0x48cba68d4e86764105adcdcf641ab67b581a55a4f367203647549c8bf1feea2","value":"0x362d24a3b030998ac75e838955dfee19ec5b6eceb235b9bfbeccf51b6304d0b"},{"key":"0x5bdaf1d47b176bfcd1114809af85a46b9c4376e87e361d86536f0288a284b65","value":"0x28dff6722aa73281b2cf84cac09950b71fa90512db294d2042119abdd9f4b87"},{"key":"0x5bdaf1d47b176bfcd1114809af85a46b9c4376e87e361d86536f0288a284b66","value":"0x57a8f8a019ccab5bfc6ff86c96b1392257abb8d5d110c01d326b94247af161c"},{"key":"0x5f750dc13ed239fa6fc43ff6e10ae9125a33bd05ec034fc3bb4dd168df3505f","value":"0x7e5"}]},{"address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","storage_entries":[{"key":"0x5","value":"0x64"},{"key":"0x2f50710449a06a9fa789b3c029a63bd0b1f722f46505828a9f815cf91b31d8","value":"0x2a222e62eabe91abdb6838fa8b267ffe81a6eb575f61e96ec9aa4460c0925a2"}]}],"deprecated_declared_classes":[],"declared_classes":[],"deployed_contracts":[{"address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}],"replaced_classes":[],"nonces":[]},"transactions":[{"Deploy":{"version":"0x0","contract_address_salt":"0x546c86dc6e40a5e5492b782d8964e9a4274ff6ecb16d31eb09cee45a3564015","constructor_calldata":["0x6cf6c2f36d36b08e591e4489e92ca882bb67b9c39a3afccf011972a8de467f0","0x7ab344d88124307c07b56f6c59c12f4543e9c96398727854a322dea82c73240"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Deploy":{"version":"0x0","contract_address_salt":"0x12afa0f342ece0468ca9810f0ea59f9c7204af32d1b8b0d318c4f2fe1f384e","constructor_calldata":["0xcfc2e2866fd08bfb4ac73b70e0c136e326ae18fc797a2c090c8811c695577e","0x5f1dd5a5aef88e0498eeca4e7b2ea0fa7110608c11531278742f0b5499af4b3"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","entry_point_selector":"0x12ead94ae9d3f9d2bdb6b847cf255f1f398193a1f88884a0ae8e18f24a037b6","calldata":["0xc84dd7fd43a7defb5b7a15c4fbbe11cbba6db1ba"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","0x0"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","entry_point_selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","calldata":["0x7dbfec95c10bbc2fd3f37a89ae6e027826134f955251d11c784a6b34fdf50","0x2","0x4e7e989d58a17cd279eca440c5eaa829efb6f9967aaad89022acbe644c39b36","0x453ae0c9610197b18b13645c44d3d0a407083d96562e8752aab3fab616cecb0"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c","calldata":["0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","0x4","0x4be52041fee36ab5199771acf4b5d260d223297e588654e5c9477df2efa542a","0x2","0x299e2f4b5a873e95e65eb03d31e532ea2cde43b498b50cd3161145db5542a5","0x3d6897cf23da3bf4fd35cc7a43ccaf7c5eaf8f7c5b9031ac9b09a929204175f"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","0x1"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x19a35a6e95cb7a3318dbb244f20975a1cd8587cc6b5259f15f61d7beb7ee43b","calldata":["0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","0x5aee31408163292105d875070f98cb48275b8c87e80380b78d30647e05854d5"]}}},{"Deploy":{"version":"0x0","contract_address_salt":"0x5098705e4d57a8620e5b387855ef4dc82f0ccd84b7299dc1179b87517249127","constructor_calldata":["0x48cba68d4e86764105adcdcf641ab67b581a55a4f367203647549c8bf1feea2","0x362d24a3b030998ac75e838955dfee19ec5b6eceb235b9bfbeccf51b6304d0b"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Deploy":{"version":"0x0","contract_address_salt":"0x60bc7461113e4af46fd52e5ecbc5c3f4be92ed7f1329d53721f9bfbc0370cc","constructor_calldata":["0x2f50710449a06a9fa789b3c029a63bd0b1f722f46505828a9f815cf91b31d8","0x2a222e62eabe91abdb6838fa8b267ffe81a6eb575f61e96ec9aa4460c0925a2"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3","calldata":["0x1e2cd4b3588e8f6f9c4e89fb0e293bf92018c96d7a93ee367d29a284223b6ff","0x71d1e9d188c784a0bde95c1d508877a0d93e9102b37213d1e13f3ebc54a7751"]}}},{"Deploy":{"version":"0x0","contract_address_salt":"0x63d1a6f8130958509e2e695c25b147f43f66f56bba49fddb7ee363d8f57a774","constructor_calldata":["0xdf28e613c065616a2e79ca72f9c1908e17b8c913972a9993da77588dc9cae9","0x1432126ac23c7028200e443169c2286f99cdb5a7bf22e607bcd724efa059040"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","0x1"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","0x0"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","calldata":["0x1a7cf8b8027ec2d8fd04f1277f3f8ae6379ca957c5fec9ee7f59d56d86a26e4","0x2","0x28dff6722aa73281b2cf84cac09950b71fa90512db294d2042119abdd9f4b87","0x57a8f8a019ccab5bfc6ff86c96b1392257abb8d5d110c01d326b94247af161c"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","entry_point_selector":"0x19a35a6e95cb7a3318dbb244f20975a1cd8587cc6b5259f15f61d7beb7ee43b","calldata":["0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","0x5f750dc13ed239fa6fc43ff6e10ae9125a33bd05ec034fc3bb4dd168df3505f"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3","calldata":["0x449908c349e90f81ab13042b1e49dc251eb6e3e51092d9a40f86859f7f415b0","0x2670b3a8266d5046696a4b79f7433d117d3a19166f15bbd8585822c4e9b7491"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3","calldata":["0x449908c349e90f81ab13042b1e49dc251eb6e3e51092d9a40f86859f7f415b0","0x6cb6104279e754967a721b52bcf5be525fdc11fa6db6ef5c3a4db832acf7804"]}}}],"receipts":[{"Deploy":{"transaction_hash":"0xe0a2e45a80bb827967e096bcf58874f6c01c191e0a0530624cba66a508ae75","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6"}},{"Deploy":{"transaction_hash":"0x12c96ae3c050771689eb261c9bf78fac2580708c7f1f3d69a9647d8be59f1e1","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280"}},{"Invoke":{"transaction_hash":"0xce54bbc5647e1c1ea4276c01a708523f740db0ff5474c77734f73beec2624","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[{"from_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","to_address":"0xc84dd7fd43a7defb5b7a15c4fbbe11cbba6db1ba","payload":["0xc","0x22"]}],"events":[],"execution_resources":{"steps":31,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x1c924916a84ef42a3d25d29c5d1085fe212de04feadc6e88d4c7a6e5b9039bf","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":238,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0xa66c346e273cc49510ef2e1620a1a7922135cb86ab227b86e0afd12243bd90","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":165,"memory_holes":null,"range_check_builtin_applications":7,"pedersen_builtin_applications":2,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5c71675616b49fb9d16cac8beaaa65f62dc5a532e92785055c15c825166dbbf","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":209,"memory_holes":null,"range_check_builtin_applications":8,"pedersen_builtin_applications":2,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x60e05c41a6622592a2e2eff90a9f2e495296a3be9596e7bc4dfbafce00d7a6a","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[{"from_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","to_address":"0x1","payload":["0xc","0x22"]}],"events":[],"execution_resources":{"steps":332,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5634f2847140263ba59480ad4781dacc9991d0365145489b27a198ebed2f969","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":178,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Deploy":{"transaction_hash":"0xb049c384cf75174150a2540835cc2abdcca1d3a3750298a1741a621983e35a","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae"}},{"Deploy":{"transaction_hash":"0x227f3d9d5ce6680bdf2991576c1a90aca8184ca26055bae92d16c58e3e13340","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c"}},{"Invoke":{"transaction_hash":"0x376ff82431b52ca1fbc4942de80bc1b01d8e5cd1eeab5a277b601b510f2cab2","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":25,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Deploy":{"transaction_hash":"0x25f20c74821d84f62989a71fceef08c967837b63bae31b279a11343f10d874a","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52"}},{"Invoke":{"transaction_hash":"0x2d10272a8ba726793fd15aa23a1e3c42447d7483ebb0b49df8b987590fe0055","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[{"from_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","to_address":"0x1","payload":["0xc","0x22"]}],"events":[],"execution_resources":{"steps":332,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0xb05ba5cd0b9e0464d2c1790ad93a159c6ef0594513758bca9111e74e4099d4","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":238,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x4d16393d940fb4a97f20b9034e2a5e954201fee827b2b5c6daa38ec272e7c9c","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":169,"memory_holes":null,"range_check_builtin_applications":7,"pedersen_builtin_applications":2,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x9e80672edd4927a79f5384e656416b066f8ef58238227ac0fcea01952b70b5","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":178,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x387b5b63e40d4426754895fe52adf668cf8fde2a02aa9b6d761873f31af3462","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":25,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x4f0cdff0d72fc758413a16db2bc7580dfec7889a8b921f0fe08641fa265e997","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":25,"memory_holes":null,"range_check_builtin_applications":null,"pedersen_builtin_applications":null,"poseidon_builtin_applications":null,"ec_op_builtin_applications":null,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}}],"declared_classes":[{"Legacy":{"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8","contract_class":{"program":[31,139,8,0,0,0,0,0,2,255,237,189,13,143,220,198,209,63,248,85,246,244,199,33,118,110,35,176,95,73,26,79,14,112,108,61,137,1,39,206,217,74,158,255,93,18,12,230,133,187,26,100,53,179,153,25,89,82,2,127,247,107,206,144,28,114,216,205,238,170,174,158,93,39,50,96,91,218,101,255,186,170,186,186,222,250,237,95,47,230,135,195,110,189,120,119,168,246,47,190,248,203,223,110,95,44,222,173,31,14,235,77,253,183,23,143,213,170,218,237,171,205,139,219,23,187,249,230,190,154,45,223,84,203,191,155,191,45,214,135,247,235,125,245,194,124,191,154,31,230,245,183,217,7,153,229,69,150,177,252,238,238,174,254,215,124,150,125,96,199,255,242,172,88,180,63,54,255,86,199,31,202,44,19,230,251,204,252,160,254,229,178,255,67,214,252,112,117,250,97,193,117,251,195,186,197,241,135,162,249,85,198,205,143,248,224,87,214,238,248,128,186,85,15,195,78,93,145,205,27,34,238,58,224,230,135,203,203,31,102,13,31,189,31,102,221,15,87,157,48,12,31,178,161,97,85,255,191,39,161,137,95,205,51,221,35,252,68,93,13,221,253,195,178,59,216,63,139,134,68,222,50,115,38,49,88,116,178,101,115,252,171,176,49,95,218,134,119,217,9,144,129,135,134,151,45,192,153,18,150,29,165,218,252,155,145,201,46,82,101,18,208,165,39,21,116,222,14,114,122,18,92,162,233,148,248,60,131,167,225,250,243,123,168,27,178,16,221,108,235,171,86,107,9,150,185,167,185,148,35,98,88,230,249,167,143,151,13,241,50,209,205,206,105,165,158,178,55,19,198,83,143,127,51,105,143,186,158,87,253,225,134,252,195,90,11,68,174,37,213,202,173,16,67,96,24,197,103,238,25,111,6,98,32,146,162,21,71,39,241,4,188,229,228,3,64,160,43,75,103,155,185,123,40,242,59,252,63,213,121,242,89,181,243,26,67,177,42,154,121,50,230,186,112,202,99,241,228,54,116,53,209,91,184,97,149,66,51,189,212,75,243,255,59,93,229,50,231,230,239,34,151,125,59,89,11,191,60,219,201,115,216,85,255,112,222,255,33,111,126,184,232,255,80,52,63,28,68,109,178,249,225,200,2,150,103,189,234,155,81,53,248,85,243,67,61,248,33,128,105,169,149,97,90,233,92,179,220,252,185,21,194,191,55,211,185,86,185,108,89,53,127,230,146,105,169,235,17,87,185,200,197,37,243,131,88,116,108,164,248,165,211,92,161,105,82,194,252,151,229,202,12,72,165,197,115,162,236,114,86,60,27,137,201,188,48,82,43,141,2,87,181,10,231,170,166,9,72,143,112,211,211,75,149,48,68,42,35,42,125,119,20,154,33,87,25,210,204,159,70,38,101,105,155,93,203,144,168,168,71,222,50,158,188,220,252,169,172,205,192,37,129,11,27,129,163,252,147,135,230,159,41,50,91,213,151,135,8,201,108,195,133,116,156,142,82,174,78,202,222,8,203,8,78,46,5,187,20,213,220,38,170,249,165,81,228,205,15,151,151,150,114,110,227,114,126,86,71,120,34,53,102,200,12,50,91,46,114,161,22,172,184,19,119,181,7,16,139,130,47,86,101,62,23,124,161,213,138,169,140,149,11,45,153,177,69,76,220,21,58,147,43,86,101,250,174,82,197,226,154,174,93,230,83,209,133,37,104,165,39,33,95,246,122,171,152,141,132,149,255,135,241,229,146,171,100,163,131,222,230,79,33,238,229,114,50,35,105,115,208,252,162,230,145,128,144,124,138,144,163,50,4,255,240,78,217,126,184,8,214,144,210,166,12,115,219,15,23,169,99,237,101,191,183,194,175,33,87,42,229,44,70,197,194,226,66,67,174,52,133,22,243,190,44,50,155,128,178,128,113,31,150,8,151,195,176,201,38,250,231,166,39,234,178,244,51,138,169,46,3,45,198,45,28,132,255,208,106,74,69,235,146,139,233,31,38,16,192,221,228,172,30,215,223,237,82,57,87,196,43,116,76,221,86,254,106,144,30,50,111,167,195,168,242,103,37,44,115,81,187,176,217,231,213,120,246,5,43,130,147,187,4,163,180,242,212,134,26,101,179,70,30,65,63,180,196,163,214,160,108,0,50,143,243,12,79,18,59,20,28,104,116,28,108,185,117,123,66,99,131,148,115,90,183,61,106,153,32,216,98,63,115,221,203,109,99,28,238,151,82,187,160,97,166,50,15,9,220,175,18,170,232,194,23,88,218,37,155,122,2,107,209,15,99,109,57,77,216,15,173,142,248,200,150,180,253,112,158,90,13,86,189,222,22,88,19,36,82,155,32,129,180,75,214,2,213,211,57,202,133,63,209,129,252,144,194,88,57,73,38,151,82,85,54,11,202,25,19,109,127,253,80,238,88,223,106,85,101,80,35,106,11,129,131,26,209,96,85,190,213,202,22,98,88,4,116,90,222,185,95,160,185,41,251,45,170,194,40,223,188,152,11,177,50,53,113,118,87,206,245,220,212,132,178,101,198,43,83,37,92,230,162,42,84,185,170,76,205,157,23,197,50,207,238,74,110,74,213,139,69,183,62,213,227,237,156,35,142,182,120,208,203,188,90,122,45,122,25,236,210,72,179,170,167,140,198,42,13,52,112,18,103,224,56,165,217,234,153,194,148,182,172,186,11,179,101,43,91,56,117,105,209,159,34,240,74,28,161,84,119,221,2,192,120,19,21,247,206,182,240,153,145,122,18,112,113,177,215,108,49,191,220,128,102,152,91,148,196,69,136,213,179,41,66,240,21,184,34,109,219,133,225,53,13,176,76,203,99,47,18,76,120,17,54,225,43,124,156,146,118,194,63,27,191,82,173,202,235,228,238,79,147,145,43,156,158,196,134,250,137,28,195,149,84,162,169,120,3,131,239,139,112,120,233,14,114,217,148,109,29,196,157,149,59,238,164,180,118,79,99,195,38,74,199,9,23,2,143,10,168,131,3,161,32,187,104,81,234,120,77,31,207,161,187,84,73,222,124,210,22,184,8,153,40,142,39,160,113,113,125,185,20,109,88,221,241,201,3,205,103,232,182,189,140,47,122,115,114,5,172,190,36,152,147,37,46,145,112,103,23,87,246,23,43,191,242,50,54,177,51,70,37,82,165,140,1,231,250,4,145,137,150,142,86,171,220,150,36,157,70,95,45,22,165,148,89,197,243,162,40,231,66,203,197,114,161,243,98,193,140,41,45,171,229,138,9,153,207,151,171,106,181,92,220,9,93,21,66,150,242,174,80,249,114,169,204,144,107,112,125,56,56,188,127,222,238,120,98,126,7,68,87,9,230,55,187,230,206,151,59,62,101,208,220,5,244,43,248,92,139,218,240,209,62,133,14,99,105,251,85,179,213,62,209,108,172,212,10,24,7,79,216,10,171,92,19,144,156,255,155,68,166,203,159,121,214,244,51,172,239,174,238,56,124,175,161,83,180,28,185,231,68,76,149,114,129,123,78,176,85,0,71,239,78,106,19,232,255,220,171,255,86,209,135,215,152,125,187,106,160,83,163,252,183,158,26,77,137,234,211,212,248,52,53,146,76,13,122,141,149,109,30,217,45,4,223,245,227,95,39,201,89,187,132,49,208,198,208,29,55,83,179,121,9,140,149,202,196,177,18,47,189,249,116,229,223,17,149,188,106,205,131,247,128,60,73,125,187,210,17,59,206,86,207,96,29,36,241,194,231,170,108,119,185,156,29,85,111,220,45,106,246,179,15,222,239,244,207,60,120,79,173,18,197,39,149,248,164,18,67,149,200,63,169,196,207,77,37,230,200,130,80,222,156,2,75,176,66,147,104,25,102,165,132,187,46,237,63,167,133,77,227,236,210,171,38,22,8,134,21,140,128,53,33,250,49,152,79,148,240,115,255,249,191,59,65,153,243,158,175,82,176,16,83,41,154,243,166,137,67,221,39,137,106,187,133,152,159,235,118,190,128,61,186,202,253,171,230,58,1,250,217,209,157,83,160,175,239,84,43,224,18,122,170,133,198,188,117,108,231,137,209,41,79,123,79,67,180,1,0,177,179,44,38,82,110,222,238,26,151,69,47,242,168,128,7,131,254,147,108,195,252,103,110,27,18,47,66,45,171,68,97,200,178,40,39,165,230,188,206,97,225,95,163,12,183,51,203,85,192,100,114,104,128,219,8,119,147,47,161,230,86,124,112,74,140,95,55,159,224,79,145,100,84,234,231,58,87,109,87,125,42,154,211,176,176,0,193,58,40,156,227,252,120,192,5,137,195,241,198,221,61,104,165,121,158,61,121,114,80,244,183,225,84,119,255,169,30,52,116,239,252,207,228,176,204,117,148,103,185,40,129,250,123,205,221,161,203,197,226,223,164,44,21,120,130,254,249,149,165,184,229,122,23,5,92,120,79,184,110,191,112,153,254,37,169,233,15,159,140,57,195,45,223,255,108,110,83,233,102,127,101,95,199,126,110,23,167,84,252,103,235,22,174,119,30,124,209,110,69,9,56,15,62,188,239,176,29,113,247,54,92,14,95,237,183,92,38,190,202,203,76,233,140,45,57,203,115,33,117,206,152,20,43,169,242,187,108,181,48,52,231,119,69,81,8,198,248,124,177,18,114,81,242,165,156,47,76,225,244,110,85,101,75,241,212,103,191,151,194,127,155,199,51,211,136,165,10,214,136,85,224,30,108,244,6,14,93,48,177,18,165,190,91,45,88,89,84,101,53,95,149,66,86,242,46,159,171,146,207,139,69,81,204,51,85,86,82,205,23,89,181,208,85,165,234,141,234,85,97,20,100,145,61,249,224,179,213,165,237,28,157,7,200,68,107,235,87,151,43,116,203,160,41,211,49,246,124,52,104,94,61,27,13,42,230,124,46,120,206,231,37,151,37,95,85,43,189,204,140,246,44,11,181,186,43,151,74,48,33,77,129,73,148,133,210,245,69,211,119,198,140,220,137,101,185,44,11,189,146,236,201,21,40,211,94,235,177,120,94,214,163,61,214,245,92,253,9,91,152,33,23,119,85,118,39,231,76,47,170,149,170,20,19,98,161,150,243,242,46,19,243,5,83,101,174,23,11,190,186,227,11,189,226,90,204,151,130,229,217,162,88,232,57,123,114,127,178,184,227,169,252,73,162,29,150,139,34,15,214,8,255,141,51,237,77,239,237,15,121,203,71,89,140,30,222,113,106,80,118,122,82,166,161,132,7,106,220,83,220,196,181,40,6,86,16,123,127,142,50,113,94,161,84,158,153,196,64,177,146,179,114,177,144,243,149,46,141,234,51,125,103,252,235,178,18,186,190,69,185,204,202,21,187,43,230,198,223,222,173,150,133,208,50,239,228,89,182,178,233,9,237,42,58,191,146,211,58,63,142,27,46,117,190,126,207,170,90,188,187,159,173,55,119,219,23,95,108,222,61,60,220,190,120,179,222,28,246,47,190,248,215,139,236,197,23,127,249,215,139,249,114,89,237,247,235,197,67,53,219,47,183,143,199,119,179,94,236,15,243,221,223,223,207,119,213,203,229,124,189,219,190,92,110,223,190,221,110,94,206,31,30,182,181,10,78,253,186,249,200,116,189,220,174,170,23,95,188,120,91,189,221,238,62,254,101,254,248,183,155,95,223,236,171,251,183,149,233,255,229,124,181,250,236,115,3,117,247,176,125,63,59,236,230,203,191,175,55,247,179,211,235,91,134,168,199,238,103,245,95,239,119,219,119,143,47,190,200,110,95,108,239,238,246,213,193,252,241,167,219,23,187,234,174,218,85,155,101,53,91,175,106,134,126,250,233,39,211,43,227,96,182,12,133,203,199,143,110,190,78,191,111,63,59,115,246,227,219,153,225,165,218,157,122,248,236,95,191,216,252,226,139,27,67,203,203,135,106,243,19,148,57,62,205,92,16,109,47,87,123,211,92,133,49,82,83,249,226,139,60,240,227,253,110,249,226,11,125,18,49,207,174,38,226,205,205,175,126,125,195,254,186,169,165,186,220,110,14,235,205,187,106,102,58,251,104,132,103,212,137,221,172,239,110,54,55,255,247,77,118,83,61,236,171,155,12,47,116,133,22,250,108,118,168,222,62,26,153,176,44,80,152,151,156,152,166,236,54,193,8,223,237,230,111,141,20,203,20,10,177,169,62,28,102,77,7,140,99,180,72,92,117,162,126,88,31,154,121,26,49,51,245,39,37,185,178,146,72,184,146,204,15,111,38,84,196,252,246,229,124,191,175,118,135,217,102,123,152,253,179,218,109,123,154,114,183,219,190,189,153,104,58,123,119,88,63,236,111,214,111,31,183,187,195,77,131,99,28,106,117,95,237,254,186,25,254,253,179,218,104,253,56,127,120,87,125,222,254,234,166,251,209,205,255,121,243,199,239,191,249,253,171,155,255,227,215,55,217,237,205,221,47,46,104,186,185,155,175,31,170,213,23,55,255,234,154,252,100,12,94,246,242,23,64,237,21,72,191,98,145,211,137,12,51,146,162,25,156,50,229,224,108,82,14,203,252,60,36,217,205,127,253,250,56,46,243,110,76,254,235,166,247,62,232,172,121,66,244,229,98,251,110,179,58,14,149,25,136,227,176,204,127,186,89,239,111,182,239,14,55,219,187,83,19,240,240,72,130,225,49,145,151,25,20,25,40,214,151,125,222,30,15,59,211,84,157,198,83,230,9,199,147,171,108,182,88,31,34,6,181,30,192,191,110,254,186,249,95,55,95,109,119,187,106,121,216,24,50,111,142,124,188,252,235,230,52,171,126,221,124,119,158,123,183,167,49,253,188,29,220,110,220,79,13,254,235,56,244,127,250,227,31,95,125,63,251,205,119,127,250,195,215,245,0,255,171,153,111,167,193,221,175,87,85,61,192,135,55,213,105,144,111,254,98,102,44,255,229,47,13,75,159,191,252,69,67,210,252,97,249,238,97,126,88,111,55,55,119,219,221,241,227,83,71,230,39,47,79,1,204,155,245,253,155,219,83,128,184,125,111,72,93,173,127,124,187,93,245,73,173,255,248,195,239,190,249,239,215,80,31,149,199,171,81,51,64,71,42,141,211,43,33,163,90,51,100,218,20,160,54,35,61,228,57,168,125,99,141,120,227,42,116,80,224,127,252,211,166,58,180,192,251,195,118,55,191,175,6,58,236,248,230,229,102,187,123,59,127,88,255,179,154,153,236,101,103,122,233,41,243,255,186,249,115,181,91,223,125,108,7,254,221,219,199,122,228,141,2,109,78,138,83,157,148,99,255,102,253,120,179,168,14,239,171,106,211,232,208,237,205,151,95,127,221,104,223,205,124,179,58,233,169,209,153,222,143,79,22,170,247,131,75,109,254,236,132,101,244,185,247,145,49,108,199,31,179,207,143,184,159,241,155,95,222,116,223,53,211,226,248,139,191,110,110,154,127,122,173,205,183,38,178,62,125,118,123,243,215,191,158,62,250,197,72,10,159,125,126,179,156,111,140,147,48,124,221,188,219,87,171,155,247,235,195,155,35,215,203,119,102,162,110,14,55,38,150,49,66,173,243,190,95,156,166,194,122,63,219,27,148,135,54,134,63,90,83,3,55,164,31,21,211,23,231,169,192,166,167,66,240,56,31,73,51,174,52,71,105,73,199,172,65,40,113,8,163,169,34,138,147,210,23,217,83,42,125,51,146,181,62,141,199,177,81,180,216,49,228,207,102,12,13,55,198,95,171,103,167,3,44,203,81,74,240,113,191,52,4,237,167,181,160,249,232,101,253,223,89,157,146,152,193,234,59,241,230,131,217,27,99,71,30,170,221,240,187,207,218,114,207,175,219,63,220,222,180,13,12,11,191,174,181,165,247,119,168,211,43,241,51,221,202,86,147,164,153,168,86,105,184,80,142,127,59,17,172,68,68,243,217,222,140,186,193,224,24,140,230,15,221,92,253,66,101,8,152,187,119,155,101,237,172,102,251,234,193,196,89,91,163,108,138,33,112,154,31,155,214,10,223,250,164,236,74,54,202,206,202,244,202,190,50,108,223,207,15,102,182,213,212,187,149,125,240,93,98,101,103,89,188,182,15,232,109,180,157,25,163,166,21,92,44,61,117,215,60,162,121,163,238,154,97,48,198,234,94,34,96,44,234,174,51,4,78,167,238,90,226,91,159,212,93,139,182,154,125,5,219,126,95,29,142,36,152,74,246,216,199,95,234,252,248,227,212,138,207,226,21,127,76,116,171,253,204,228,78,25,82,74,189,1,47,35,33,154,81,111,61,186,144,215,25,245,125,245,143,119,181,40,67,7,126,244,125,234,177,231,52,99,63,162,187,29,126,147,51,230,18,47,174,179,6,228,34,30,229,164,4,57,111,148,64,178,43,77,253,75,43,234,153,252,23,159,167,86,1,65,52,253,47,200,110,53,192,172,66,228,5,90,86,61,5,200,163,65,154,241,215,237,248,23,215,25,255,195,7,227,131,239,55,243,195,187,93,229,25,251,254,167,169,199,93,210,140,123,159,228,118,204,141,117,45,56,74,62,231,241,46,88,20,192,105,172,139,172,25,107,117,5,55,223,164,150,179,93,53,95,77,140,115,255,179,212,99,172,226,199,184,79,110,59,190,202,72,54,7,203,228,101,23,69,22,18,222,248,172,24,26,221,184,81,138,166,28,207,180,190,158,82,188,223,173,15,85,128,86,28,191,75,173,22,154,78,45,142,244,182,122,97,228,89,10,184,88,206,138,81,102,136,214,131,193,45,57,2,161,169,116,151,172,81,140,2,85,234,126,107,62,54,152,211,138,209,126,244,114,95,109,86,179,230,111,179,195,118,246,192,166,180,99,244,113,106,21,193,215,126,38,56,108,245,36,175,211,109,141,20,211,203,199,249,199,135,173,49,177,6,67,70,98,52,201,49,203,4,22,104,160,124,44,83,88,28,243,223,110,22,176,172,9,81,121,174,220,138,56,155,189,157,175,55,179,153,25,217,193,31,223,239,230,143,143,213,110,63,250,171,153,102,63,206,235,33,92,154,133,214,67,181,75,178,135,140,247,195,10,101,45,46,79,209,100,52,164,43,92,152,8,238,221,252,161,29,162,58,1,8,110,185,51,100,174,13,21,181,173,43,17,237,102,199,93,24,172,174,51,64,218,174,55,171,234,67,221,142,135,183,59,41,78,238,111,81,207,156,122,103,152,113,91,97,223,178,250,219,60,236,91,94,211,144,133,125,43,234,111,89,216,183,178,254,214,39,69,179,216,248,126,189,175,26,81,104,31,25,143,213,202,252,162,218,180,162,243,137,99,188,30,159,251,164,178,171,211,200,195,238,221,178,214,226,58,125,153,252,122,104,3,242,38,188,16,153,160,156,188,199,37,190,154,162,109,162,137,219,15,10,114,239,188,237,145,227,158,179,165,190,13,107,101,230,206,217,250,149,60,188,85,187,99,166,148,97,109,78,67,84,170,201,175,143,154,171,234,239,242,137,239,134,90,91,102,19,159,94,104,108,89,78,124,59,94,181,207,166,160,251,154,202,51,54,241,229,80,75,203,166,20,38,20,163,212,210,15,219,93,59,45,246,105,212,180,191,252,172,153,87,79,251,4,57,21,149,139,236,54,176,89,107,229,103,38,50,155,25,91,207,121,17,216,244,52,152,188,156,254,252,168,123,186,38,137,77,125,56,80,62,46,212,212,183,67,237,227,66,76,125,60,86,63,33,39,191,239,235,159,208,83,159,14,20,144,139,38,198,145,25,39,53,147,117,15,201,181,80,244,106,230,66,249,141,229,37,81,110,77,28,57,236,233,182,125,195,201,181,128,182,29,170,178,86,144,246,167,97,28,5,35,182,54,71,165,46,234,175,11,239,215,67,205,214,204,219,224,66,189,85,233,109,97,217,24,149,249,27,245,21,61,247,147,53,212,118,93,54,218,46,37,109,68,191,58,151,190,234,76,34,173,214,247,75,197,74,4,196,246,14,234,220,234,95,230,183,24,140,115,236,205,71,190,61,8,225,52,74,165,6,180,173,149,90,176,186,85,17,220,106,168,220,165,8,110,120,161,228,101,25,220,114,188,173,37,203,194,27,247,148,94,100,60,184,221,64,249,69,214,212,85,164,46,40,149,223,232,97,19,255,37,81,246,126,237,212,175,235,29,49,78,221,22,172,184,13,105,211,55,233,130,201,208,54,77,36,44,152,14,105,113,26,24,150,79,124,123,212,111,94,127,85,58,191,26,232,179,96,220,249,225,80,127,5,203,156,95,142,245,149,49,247,199,125,253,228,238,239,134,250,200,155,85,1,89,144,102,104,247,109,119,51,163,37,70,29,77,233,217,76,140,77,26,237,244,109,72,14,161,204,34,235,81,120,234,108,58,144,124,147,76,40,65,90,175,50,210,217,125,156,61,110,215,155,67,18,33,202,222,150,31,174,189,82,236,145,227,158,228,163,234,133,163,213,73,220,163,96,165,255,245,112,114,169,98,226,211,139,233,53,170,63,245,191,29,15,186,202,167,62,239,15,244,40,194,236,127,57,156,100,186,49,250,74,147,234,196,161,218,31,218,19,35,251,43,76,52,201,33,19,109,130,58,139,220,71,69,191,201,230,253,113,200,27,225,106,198,105,61,234,185,46,157,70,154,10,84,100,234,211,227,156,114,50,99,183,129,205,140,155,236,215,217,69,89,6,182,60,142,151,204,178,233,207,143,30,83,215,31,242,169,15,135,243,186,204,167,190,189,152,216,163,224,118,240,241,88,195,74,61,249,125,79,165,100,38,167,62,29,204,109,153,53,187,231,244,212,137,38,228,220,118,109,132,38,84,194,158,239,228,50,108,78,95,238,99,118,168,226,168,104,227,105,108,20,242,188,205,83,242,28,221,250,180,96,33,57,135,35,140,246,120,202,81,160,234,71,177,108,241,148,60,3,193,156,84,75,4,53,58,206,180,188,238,67,6,127,94,212,159,171,224,207,203,250,243,34,244,115,89,31,93,24,5,79,150,207,7,147,95,142,130,117,75,139,161,9,144,44,128,227,145,33,144,60,160,163,129,57,24,85,9,45,13,134,70,161,45,232,233,66,146,27,5,215,134,113,66,163,80,194,141,194,229,118,111,135,81,208,236,22,212,120,104,20,84,142,110,221,24,5,197,225,8,99,163,32,11,48,138,205,40,168,12,4,115,82,45,29,212,232,56,15,121,221,135,12,254,92,212,159,171,224,207,101,253,121,17,252,185,170,63,47,253,159,15,141,130,212,254,22,23,70,65,6,112,60,54,10,42,160,163,129,81,208,194,223,96,104,20,116,99,20,114,78,154,5,172,170,199,237,126,157,38,60,80,12,182,194,212,208,226,158,255,133,190,245,183,168,171,62,111,235,242,89,221,64,134,53,168,15,120,247,102,104,193,253,205,78,163,82,40,231,151,71,189,173,93,101,145,59,190,25,42,107,145,57,62,187,208,208,210,245,221,88,45,139,210,245,105,95,23,75,230,248,106,168,128,69,83,154,200,101,65,238,149,38,207,117,16,42,100,191,236,206,195,92,147,245,64,134,93,63,85,166,110,225,8,70,253,170,15,143,198,170,87,171,254,97,56,1,135,58,29,63,203,100,112,203,163,138,214,135,8,51,29,216,102,160,178,42,99,129,205,46,85,184,12,108,55,82,105,149,101,161,77,123,42,174,178,34,176,213,240,36,95,150,55,42,159,179,36,42,63,117,168,133,80,235,21,78,235,109,71,81,28,138,111,207,150,252,32,118,221,231,25,10,237,52,102,156,65,26,215,51,160,62,44,173,184,8,111,54,156,4,172,8,111,57,156,7,138,233,240,166,227,169,192,114,64,235,254,108,224,42,188,225,112,66,240,230,108,107,94,202,52,62,192,125,192,135,112,62,228,72,47,48,62,151,227,152,14,162,188,197,96,216,103,131,200,49,96,167,241,18,5,160,237,113,46,176,250,0,115,22,220,106,56,21,132,10,110,120,49,19,132,8,110,57,158,8,66,134,55,238,207,3,201,131,219,93,156,240,110,138,198,69,130,80,232,216,77,187,169,190,222,117,182,222,31,140,110,126,76,50,21,52,188,38,239,162,207,61,27,116,113,139,197,233,175,224,42,173,99,112,182,135,55,213,206,146,142,43,45,177,176,39,101,208,57,176,253,113,158,241,186,101,9,106,57,156,107,154,131,26,95,204,55,157,129,90,143,231,92,206,96,0,253,121,151,195,72,31,206,189,188,89,114,46,202,146,124,238,237,234,181,89,163,31,102,2,164,153,110,57,120,186,245,72,114,207,176,50,191,5,52,173,183,230,87,143,135,55,117,67,5,108,232,156,69,165,0,32,157,70,178,212,254,38,199,185,34,235,143,11,223,199,195,233,81,50,223,247,23,51,162,40,125,13,70,147,64,219,147,145,65,155,158,222,235,204,75,211,80,213,203,102,171,91,41,74,234,173,110,233,118,251,228,12,162,227,29,45,78,229,214,60,187,13,105,115,222,184,163,89,17,210,226,52,132,172,156,248,246,168,125,186,166,129,57,191,26,168,157,102,218,249,225,80,223,52,147,206,47,199,138,198,133,251,227,190,134,113,55,232,240,250,6,222,84,19,203,130,52,179,221,85,203,119,187,253,250,199,227,93,80,41,149,76,67,148,204,66,149,91,221,70,5,96,95,107,163,120,166,42,127,119,182,133,122,20,63,7,64,180,186,59,138,73,61,109,79,195,41,69,80,171,163,62,231,245,247,42,224,251,161,102,143,82,9,91,147,11,29,31,237,98,183,181,25,107,187,204,67,154,245,245,94,134,16,55,156,1,178,189,188,32,203,72,173,235,122,179,220,85,115,35,182,132,218,223,63,185,81,122,213,127,72,145,91,243,71,107,18,19,13,251,129,185,30,45,203,185,27,158,100,63,138,93,71,13,142,154,90,212,159,202,233,79,135,74,58,90,34,186,248,250,66,63,71,43,130,23,159,143,85,115,180,100,117,217,162,175,149,163,132,229,226,227,161,66,234,246,48,125,166,120,154,172,178,190,236,210,12,221,110,158,38,153,44,144,201,228,153,44,183,110,150,252,22,216,188,214,208,221,241,166,162,2,215,244,180,230,171,11,129,104,126,225,16,10,6,196,56,105,68,25,216,236,56,89,202,186,31,21,222,64,215,183,169,21,26,208,128,213,13,74,64,3,94,243,144,1,26,136,186,65,144,188,135,211,62,15,162,234,98,242,231,121,72,163,177,9,40,131,132,60,48,4,101,144,152,135,230,160,60,150,90,205,52,90,175,204,140,92,223,173,235,179,40,199,73,116,154,245,47,127,115,18,193,111,78,155,28,235,95,173,12,234,122,115,188,188,183,190,249,192,126,63,241,241,47,221,214,200,75,148,219,23,135,143,143,181,89,152,63,172,231,251,23,63,157,173,204,203,223,205,247,111,34,59,235,67,76,244,244,77,125,0,229,203,205,234,207,181,149,60,50,125,247,206,200,101,115,188,156,223,249,217,109,109,202,22,141,148,154,51,44,255,122,113,162,160,233,234,174,122,56,188,24,26,169,31,187,62,6,95,126,86,127,122,123,83,255,247,243,23,253,11,28,76,147,102,127,114,199,64,51,204,125,14,126,255,241,171,118,223,157,65,110,190,171,233,223,63,206,77,109,193,254,233,203,47,119,247,110,110,47,191,235,179,219,17,149,133,17,245,242,155,183,143,15,235,229,250,16,218,227,224,251,168,158,191,63,109,48,14,232,179,249,50,170,183,31,190,249,255,94,125,247,223,179,111,191,251,234,203,111,127,232,13,197,241,52,239,139,102,244,79,138,96,107,254,191,191,251,126,246,213,119,127,250,195,235,87,223,255,48,251,225,213,183,175,190,122,253,221,247,110,24,94,191,172,164,115,161,139,92,8,19,201,151,154,41,198,69,153,243,146,21,58,19,133,169,89,153,146,177,144,185,144,162,52,139,102,165,16,92,20,50,231,92,100,166,76,202,181,202,184,202,165,89,140,114,16,116,122,177,40,116,246,245,95,57,154,152,110,61,252,225,150,209,137,126,2,111,223,13,235,181,121,5,37,148,173,225,219,41,97,93,12,206,177,30,59,90,154,66,163,41,54,214,65,149,9,134,30,151,199,141,246,29,88,187,225,42,4,47,120,222,142,27,13,108,214,184,170,230,55,95,131,99,167,23,159,187,13,165,197,156,201,192,25,53,224,1,106,70,220,141,7,130,24,249,220,105,57,212,27,139,6,190,211,242,249,47,7,114,235,184,230,24,174,195,77,152,173,89,148,61,27,0,6,26,55,22,130,117,25,123,58,68,8,98,248,2,179,151,16,236,79,249,205,227,56,179,104,239,38,232,237,33,173,183,144,158,166,167,238,120,122,241,151,229,124,127,248,236,238,241,228,162,127,249,203,207,255,102,68,134,128,44,207,144,71,196,191,220,153,60,232,255,186,17,13,238,231,47,234,140,172,17,66,71,254,11,160,68,15,111,31,201,37,90,99,146,74,180,17,168,97,254,179,95,169,207,41,248,63,158,85,207,93,179,23,200,120,3,134,101,89,181,44,215,229,233,161,18,205,79,60,179,142,231,191,225,153,238,43,252,172,118,95,7,154,129,183,224,198,15,190,242,73,2,61,171,60,19,21,45,221,64,7,9,19,237,37,40,86,176,217,79,189,48,226,146,253,163,96,53,133,138,225,60,62,72,36,253,46,210,73,163,54,50,14,130,163,4,20,24,61,128,36,114,137,153,78,42,57,133,142,152,226,67,75,68,188,237,105,193,176,60,51,221,217,222,50,200,226,68,114,221,148,12,41,70,189,15,152,144,125,78,49,230,33,17,48,136,251,62,96,58,125,47,144,206,38,64,172,2,164,85,175,77,234,25,92,180,233,127,92,191,117,53,251,243,151,223,254,233,85,72,137,64,74,198,52,227,133,80,133,52,139,175,69,193,164,22,34,231,172,200,204,143,5,215,66,229,185,82,82,240,60,43,74,179,20,80,50,83,252,230,101,105,170,10,138,149,5,207,85,153,23,194,20,9,220,244,76,101,99,227,47,225,9,201,0,227,183,175,94,7,115,207,178,194,48,33,53,47,149,56,62,13,110,6,79,10,33,141,40,120,46,101,97,138,158,74,136,186,126,98,138,37,204,252,185,208,185,46,203,76,112,38,152,40,74,145,213,98,48,213,146,211,125,152,118,130,130,146,82,119,139,72,113,124,255,234,171,63,125,255,195,55,127,126,53,131,168,69,174,149,204,148,40,121,102,20,32,227,153,206,234,159,148,194,200,64,102,204,20,143,76,29,61,43,148,169,89,155,250,144,102,166,126,100,150,60,57,55,191,230,50,43,141,180,50,163,76,138,49,35,79,55,101,211,105,171,237,219,72,89,252,0,81,141,92,228,245,203,232,70,25,140,198,171,178,84,121,89,24,253,16,146,11,83,56,203,89,93,72,51,191,50,149,181,50,151,204,136,161,52,117,52,51,47,120,45,180,210,44,204,41,193,152,249,133,100,110,17,96,202,129,3,128,215,175,126,120,61,51,141,191,157,253,207,55,175,127,55,251,242,251,239,191,252,127,67,152,51,75,57,245,124,215,245,227,238,102,236,138,130,11,201,138,188,84,102,110,235,50,103,57,51,163,94,168,44,23,74,40,83,41,52,26,32,37,47,140,54,148,89,97,184,147,76,148,102,194,8,37,156,164,157,55,92,56,202,91,236,120,167,238,84,125,203,142,7,176,39,23,109,162,171,91,29,63,211,229,159,176,114,142,131,82,184,185,112,180,125,142,37,44,7,221,16,83,48,106,21,105,20,206,120,152,250,149,3,42,166,124,21,6,9,137,128,10,53,78,138,25,171,111,106,194,151,175,28,152,204,94,191,98,225,245,27,39,251,199,21,89,88,249,198,135,133,21,162,58,51,44,40,202,55,14,58,99,171,55,225,176,241,218,148,149,4,213,27,156,162,98,165,27,83,189,9,197,196,10,54,251,169,239,36,173,153,138,36,208,176,152,218,68,32,100,66,9,40,10,9,96,74,19,30,44,44,203,93,14,105,130,75,70,82,154,152,38,20,94,153,8,193,75,201,61,39,24,113,116,97,34,0,47,161,178,107,164,29,13,17,171,160,80,170,201,224,24,34,208,19,80,66,81,10,188,22,165,216,239,48,232,225,138,59,30,6,253,118,183,65,58,211,181,172,224,128,116,173,195,3,164,107,23,109,6,9,76,96,150,86,7,231,240,204,14,145,188,156,105,133,39,108,142,182,207,62,97,59,211,13,73,216,70,173,134,124,86,144,241,97,8,90,163,211,186,123,231,53,187,104,239,225,132,4,89,61,105,137,150,179,250,118,151,136,180,206,142,89,208,166,117,125,246,79,151,96,54,55,209,14,54,89,99,61,73,16,58,86,208,103,119,154,149,35,169,116,49,218,81,56,55,191,186,233,253,164,221,188,73,37,169,221,253,108,98,238,196,72,169,65,38,150,208,95,46,69,132,245,193,78,194,233,166,228,8,54,137,44,48,9,50,78,19,9,166,233,177,98,162,104,212,173,193,194,10,85,157,249,206,200,171,47,35,58,53,33,207,26,175,72,249,57,172,77,201,116,116,45,100,12,133,101,57,251,169,31,120,18,7,242,103,50,73,139,108,147,176,4,190,93,19,219,144,240,176,1,43,93,178,34,219,4,102,66,13,147,4,26,70,86,100,115,67,38,148,128,162,144,64,116,145,109,140,117,61,151,28,199,52,89,48,139,47,178,1,185,231,4,35,78,83,100,179,227,37,84,118,77,27,139,81,21,217,82,29,72,25,116,98,187,43,193,185,116,207,37,160,22,100,59,252,30,94,45,113,182,142,94,206,31,158,138,245,23,88,130,150,255,121,224,145,60,47,143,240,186,146,23,229,217,87,152,108,28,64,106,77,19,237,35,183,9,216,144,163,43,75,33,119,105,160,141,103,0,56,200,146,106,219,218,44,47,163,170,77,86,76,145,121,171,77,40,88,199,222,4,142,204,142,221,87,154,212,143,161,97,253,253,36,42,118,188,206,251,21,4,253,126,5,27,197,164,73,85,96,7,4,202,76,82,162,65,205,147,120,137,147,37,90,65,232,88,97,159,87,231,234,8,130,56,225,8,186,205,135,82,44,81,105,24,76,42,154,86,42,209,9,217,20,42,86,12,189,165,106,153,96,255,195,4,201,145,73,154,23,57,165,68,56,169,102,132,196,196,56,129,12,144,19,206,20,73,43,15,146,68,214,135,156,80,28,57,210,119,133,168,158,160,157,140,145,59,72,220,144,9,197,139,47,65,239,253,59,46,52,100,199,197,30,177,227,98,255,84,59,46,82,38,211,251,136,173,25,251,159,233,214,140,61,106,107,198,126,106,107,6,34,73,222,211,109,186,216,211,111,186,216,147,108,186,16,182,213,19,29,183,233,194,142,89,196,166,193,118,216,146,54,13,190,124,88,90,75,188,5,183,96,97,199,230,188,72,76,115,195,130,131,206,232,72,105,31,183,94,42,108,229,109,77,191,154,181,79,179,94,186,39,91,47,181,235,58,201,122,41,106,198,99,165,75,150,198,239,137,214,75,97,26,166,8,52,140,44,101,223,211,172,151,194,36,160,41,36,16,157,158,239,227,214,75,133,117,105,139,232,190,132,105,66,35,83,241,61,193,122,41,144,123,78,48,226,52,105,230,62,126,189,20,166,236,57,210,142,134,136,85,80,40,85,100,74,121,9,148,80,148,248,68,210,122,161,178,115,229,86,66,86,110,173,247,194,134,103,83,238,230,195,76,115,231,207,138,234,131,230,221,37,200,190,164,241,246,10,203,193,97,55,21,250,197,1,207,81,253,48,207,62,93,181,178,0,201,92,167,0,34,147,88,43,116,96,62,43,96,168,100,169,109,8,58,200,118,245,30,6,234,213,1,227,22,123,173,152,42,122,177,215,14,235,95,236,13,135,61,239,189,85,185,213,122,115,180,167,10,24,184,217,114,123,218,251,147,78,55,78,93,196,43,136,146,180,181,133,169,187,217,75,188,87,159,134,197,138,161,167,37,154,188,226,96,37,121,202,111,34,165,80,67,98,5,112,174,150,75,111,181,156,78,2,83,17,1,94,8,71,212,132,130,144,180,154,64,90,148,9,237,129,192,161,144,108,184,64,249,42,2,153,147,149,106,194,224,19,106,163,166,213,70,178,2,78,16,122,66,185,12,46,191,188,141,116,136,61,100,70,43,238,232,106,209,36,44,72,190,253,151,160,88,39,134,60,193,110,142,41,154,35,107,72,126,232,148,50,225,180,147,145,102,67,135,31,58,225,52,84,196,18,33,169,181,121,161,19,10,4,114,73,41,84,253,96,33,90,189,211,98,191,190,223,204,77,230,93,205,14,91,247,163,22,47,170,15,230,231,155,249,195,139,166,20,37,153,103,119,131,19,123,186,2,229,105,134,121,150,39,236,254,1,119,199,65,53,158,192,230,3,250,135,79,72,93,176,1,126,3,233,151,23,5,177,196,149,163,208,205,29,110,193,120,42,70,222,134,240,74,145,27,18,115,151,167,27,173,121,96,0,150,228,6,192,65,140,146,232,189,159,151,183,217,173,28,239,132,194,36,183,62,82,69,70,202,185,129,67,115,94,116,156,171,180,156,79,26,35,32,219,39,44,44,207,173,11,58,154,232,248,213,10,55,153,244,246,11,40,167,1,1,233,196,85,39,88,112,118,2,188,251,64,83,117,167,169,174,83,30,242,26,116,48,217,110,190,145,206,227,38,28,79,8,94,219,98,242,210,112,212,116,90,164,194,211,81,160,94,8,28,114,200,72,19,25,199,238,167,176,144,61,4,16,237,25,186,1,83,36,233,109,0,173,224,98,103,40,102,58,25,112,162,241,199,38,109,97,144,233,38,173,4,228,106,48,201,10,44,178,223,30,40,36,116,136,65,32,74,48,235,29,25,190,103,82,129,10,81,35,162,39,130,95,168,245,76,232,19,24,204,191,253,148,192,40,161,46,235,59,152,125,9,117,192,9,129,169,99,246,65,187,246,33,9,51,96,163,254,207,232,80,123,240,233,117,130,99,234,224,243,232,153,189,117,243,110,183,2,251,151,139,230,144,25,164,203,225,88,28,213,152,147,133,18,231,173,197,213,14,85,3,117,130,128,152,44,198,75,3,229,216,95,196,49,25,27,219,198,239,147,237,179,217,186,197,50,43,67,22,64,111,131,149,164,3,230,140,86,126,81,241,69,220,158,75,152,224,32,174,25,166,121,28,130,12,26,19,44,50,19,29,116,73,22,98,99,55,134,198,28,42,132,13,49,176,184,242,227,220,252,172,141,98,252,97,2,23,185,47,76,24,32,250,130,5,203,199,3,151,188,90,27,198,3,138,193,183,167,47,67,118,120,178,246,165,105,64,36,226,41,49,15,185,8,140,71,38,26,93,169,76,207,224,101,122,142,143,121,64,50,244,70,62,214,207,49,241,207,16,8,23,5,13,49,78,193,12,43,128,6,194,1,2,122,173,176,183,107,60,111,77,5,151,154,198,219,89,9,44,41,184,44,241,92,178,142,203,60,5,151,211,246,39,136,199,19,4,150,193,110,20,69,78,178,45,206,74,29,162,50,228,66,73,199,167,140,25,71,204,242,136,13,33,29,123,42,134,189,171,45,133,76,116,155,78,52,121,170,133,135,62,25,186,236,44,137,186,246,2,72,159,14,38,218,53,67,174,212,83,44,128,12,135,56,46,53,156,198,74,167,49,58,60,65,4,234,128,192,33,135,140,106,148,163,138,72,65,221,64,233,6,8,244,82,50,108,132,20,18,58,100,136,226,124,45,190,232,60,198,193,14,77,128,0,113,165,230,20,143,27,205,247,251,106,119,152,109,54,38,180,8,191,192,118,126,120,51,108,25,208,195,246,48,251,103,181,219,226,58,105,27,79,244,179,88,31,222,175,247,213,236,195,118,23,220,71,211,102,208,118,162,139,43,62,254,116,252,176,255,190,186,191,112,32,124,15,64,141,48,167,75,7,142,207,49,151,16,101,109,65,96,54,223,172,102,227,40,177,235,243,155,250,163,47,55,171,63,215,179,102,143,56,208,57,38,58,168,86,224,105,246,28,215,48,198,36,123,50,122,103,3,120,78,63,134,194,100,245,99,20,204,26,128,27,5,180,86,152,141,125,171,40,72,46,145,24,19,136,155,10,129,220,247,193,211,73,160,14,1,28,164,34,133,18,19,6,251,209,210,73,2,112,8,165,15,204,219,130,191,160,121,37,103,44,2,116,188,58,13,149,78,146,144,136,21,40,74,14,138,42,143,70,171,54,122,91,75,189,190,255,203,182,100,95,63,112,57,233,121,207,109,60,62,247,242,67,172,183,13,218,8,192,66,93,77,143,170,48,119,234,106,240,159,87,118,239,139,194,231,160,199,159,34,92,115,15,4,229,148,123,237,81,238,216,210,30,148,73,89,222,138,61,206,175,248,138,101,159,180,43,149,243,156,93,166,19,137,78,87,185,234,115,19,229,174,39,112,210,9,70,97,117,5,239,72,29,32,233,120,132,92,248,212,71,110,119,51,114,127,48,2,22,31,124,41,127,220,58,157,196,64,139,249,171,234,161,186,159,31,170,227,193,66,84,1,96,136,48,81,0,88,85,143,219,253,250,48,142,63,30,216,236,141,137,238,31,170,46,252,208,165,158,14,63,26,172,233,208,99,240,209,48,236,120,91,199,129,33,121,238,221,110,251,150,250,89,231,150,174,160,192,195,250,241,149,130,14,158,254,72,94,104,208,209,138,193,19,112,92,124,6,15,54,90,0,76,160,209,182,61,45,80,203,28,100,33,70,141,33,6,66,101,227,27,67,243,140,100,195,90,75,215,244,148,153,100,169,105,138,101,168,181,120,71,163,64,97,241,78,84,33,86,233,135,77,177,252,136,142,31,154,215,0,91,170,66,76,213,36,91,3,128,116,163,37,49,163,117,165,232,214,218,93,58,81,168,84,139,195,125,50,152,106,9,201,25,187,254,226,112,43,210,152,240,218,133,145,110,100,0,139,193,80,89,163,204,47,58,98,183,1,164,19,27,36,90,135,202,13,182,142,90,153,21,169,143,179,199,237,122,115,240,47,52,41,223,65,150,30,218,116,204,57,250,16,30,130,244,33,130,66,68,103,131,43,214,166,82,172,7,245,249,242,196,125,150,79,227,4,143,137,255,250,237,123,126,216,241,16,133,114,53,221,84,239,103,240,12,211,142,0,42,109,247,246,193,243,118,58,42,154,59,8,250,212,93,201,149,59,187,196,202,164,19,201,228,54,250,68,94,180,207,13,218,23,184,64,210,73,4,116,22,181,28,87,111,20,147,4,39,60,250,200,76,118,154,205,8,238,2,4,78,26,142,245,97,47,227,44,66,156,53,240,143,6,200,24,212,143,108,143,143,200,129,11,79,22,152,137,234,211,241,107,203,5,138,184,110,199,87,37,78,118,124,247,120,92,190,126,12,223,236,180,171,238,215,251,227,74,229,176,189,167,163,125,245,143,119,181,188,227,37,59,70,242,116,125,248,48,27,92,153,128,234,117,0,226,233,48,240,144,178,204,139,233,216,238,62,236,25,179,251,248,151,203,66,143,41,223,195,222,19,187,15,120,66,12,25,159,5,146,233,137,206,238,167,94,253,50,70,34,129,224,48,241,219,125,212,35,75,247,81,239,42,9,203,35,128,71,205,141,47,120,221,199,191,249,113,31,253,204,7,140,63,80,216,160,45,87,88,20,156,196,1,223,71,60,235,113,31,241,146,7,140,39,144,243,125,99,34,79,30,236,134,234,175,155,38,19,214,120,189,89,238,170,249,190,10,190,55,162,100,211,38,121,8,56,109,151,109,223,166,52,206,23,253,5,89,232,169,54,201,205,244,69,231,30,91,109,255,26,158,76,95,224,96,236,241,5,4,198,40,59,32,32,115,49,183,220,148,122,84,224,120,203,124,65,221,227,174,250,17,145,249,187,81,176,108,230,29,155,36,201,255,5,129,104,47,52,129,147,110,64,33,174,8,38,67,142,68,102,231,55,1,51,154,107,174,45,239,24,7,24,113,233,169,153,218,94,71,158,180,146,206,6,67,19,9,120,52,137,124,223,160,141,196,32,15,224,109,248,28,55,228,219,136,246,184,143,137,38,112,31,98,3,195,56,18,27,142,73,168,183,155,217,195,124,81,61,240,227,3,178,71,157,86,231,163,24,199,95,189,128,192,40,60,76,204,226,88,8,30,200,62,90,110,155,43,101,25,127,69,100,46,45,192,154,228,162,1,235,115,247,216,123,232,189,96,233,164,41,163,153,198,58,87,31,88,58,158,53,196,15,90,14,140,150,170,36,40,228,194,148,147,35,145,187,103,40,203,60,75,229,186,17,185,170,27,37,221,176,131,34,101,179,118,179,154,189,53,115,111,126,31,16,154,168,194,19,154,244,225,166,99,146,241,151,3,71,125,216,206,136,211,203,65,135,65,161,133,187,69,242,212,114,208,181,39,50,176,125,11,15,9,6,40,129,177,0,119,2,204,234,202,250,12,52,85,108,237,33,147,68,202,241,86,61,85,230,20,119,217,14,72,123,156,127,124,216,206,87,168,179,227,86,32,44,147,188,99,82,217,30,200,2,31,26,31,16,135,118,119,78,20,44,155,221,218,95,65,177,22,218,71,102,173,4,117,38,73,124,198,128,119,191,5,243,203,175,135,145,78,124,104,127,81,223,184,251,192,32,75,82,77,195,189,13,102,162,12,186,7,44,74,41,233,243,80,65,139,82,123,138,69,41,226,28,121,15,91,189,218,63,209,234,213,62,116,245,106,63,181,122,21,234,181,98,214,165,246,81,235,82,251,184,117,41,203,28,149,138,228,145,73,130,183,232,227,159,159,135,241,7,186,165,92,90,214,112,84,73,100,193,241,235,82,49,47,204,195,164,5,179,216,198,84,214,86,214,84,120,87,168,237,3,3,128,41,43,221,124,247,126,183,62,84,81,61,157,16,38,186,58,190,216,214,238,249,10,72,91,164,231,208,245,0,111,218,49,88,62,133,155,173,33,72,144,53,159,104,242,156,223,17,11,243,108,67,230,60,110,195,250,241,229,198,135,119,15,7,170,196,113,216,31,198,207,12,17,174,180,77,115,162,83,80,44,201,44,177,164,156,58,100,157,228,220,69,159,140,238,18,7,229,180,250,9,143,93,12,229,26,83,95,158,70,74,55,72,128,91,243,250,192,172,236,196,78,178,97,226,130,253,201,57,27,34,191,19,0,86,108,1,74,5,231,206,114,11,216,148,159,210,156,7,248,169,1,104,128,179,178,124,63,176,150,237,123,224,222,4,160,62,95,215,61,30,30,112,183,119,157,94,135,62,173,221,215,222,150,245,153,89,27,168,218,155,85,2,221,140,244,90,242,161,56,194,125,239,68,187,228,41,149,133,128,16,39,105,109,129,140,86,134,88,104,47,56,132,241,170,94,40,111,29,16,104,250,91,182,206,29,167,32,193,205,206,19,52,130,239,119,246,97,165,227,89,198,89,188,151,161,179,63,152,237,241,246,240,84,172,235,72,214,131,141,88,40,239,99,192,116,204,171,72,230,209,117,7,15,86,58,142,33,231,43,251,200,221,59,220,218,249,174,9,214,112,180,217,112,109,83,235,35,11,155,229,71,127,8,81,100,50,52,132,176,224,135,70,19,206,166,152,58,105,45,193,237,225,77,181,155,193,131,5,64,122,233,36,28,24,2,120,33,158,227,134,163,105,242,131,99,137,137,198,49,97,133,13,54,46,194,176,33,198,249,160,41,68,208,177,111,203,251,65,69,70,82,233,155,38,54,226,237,52,16,48,86,24,172,173,229,22,140,211,38,96,54,162,97,6,7,33,21,71,7,233,84,69,82,11,7,94,1,15,71,5,189,184,101,185,40,161,16,50,189,142,68,215,118,130,145,211,105,5,96,23,161,178,28,64,46,120,208,92,188,37,28,64,78,55,128,4,97,168,15,54,221,200,65,118,239,13,236,40,239,236,104,70,176,125,15,104,162,33,251,247,96,10,135,69,238,34,244,130,83,108,58,132,41,51,97,236,255,146,218,30,195,45,49,80,172,72,83,252,126,125,120,51,155,239,118,243,128,116,135,101,172,12,205,119,206,184,161,105,206,101,139,97,118,179,243,135,231,245,84,52,223,133,62,132,8,59,129,17,118,191,159,149,27,96,202,227,106,249,188,51,157,30,213,193,9,206,184,77,76,94,211,67,139,75,103,122,64,253,115,17,186,61,23,193,50,62,117,48,194,11,148,199,0,77,77,132,112,113,215,40,160,61,209,22,231,113,178,6,164,213,219,33,133,17,165,91,11,80,66,118,101,172,233,37,10,126,39,0,19,114,15,184,99,174,200,108,200,66,164,114,105,248,195,51,126,180,132,18,85,241,124,199,199,226,14,180,132,108,67,170,194,64,77,226,112,131,100,185,82,122,114,53,89,133,132,70,3,208,128,192,200,242,253,127,242,106,242,80,28,225,113,213,68,187,235,172,38,15,9,8,9,144,172,45,144,225,209,16,11,29,28,13,97,34,86,147,29,64,160,245,38,75,118,175,21,97,60,98,167,17,23,146,76,96,165,227,25,30,148,92,144,25,93,173,245,224,165,99,93,71,178,78,176,154,236,3,76,199,188,138,100,62,46,116,112,99,165,227,24,180,154,92,216,86,147,157,7,100,17,134,195,117,45,224,84,240,144,139,144,45,211,99,228,128,8,194,213,104,224,247,170,15,143,70,45,171,21,245,41,80,23,5,225,158,219,215,248,58,238,219,66,69,136,15,119,55,67,58,114,11,32,218,155,91,176,98,23,45,253,144,160,250,103,239,28,118,187,93,52,23,5,89,174,104,161,54,116,30,128,68,48,2,197,10,161,187,91,92,40,178,5,108,11,189,113,14,192,3,152,142,119,200,185,84,152,106,113,164,19,176,94,211,58,233,6,10,22,234,6,46,176,67,29,129,181,217,149,93,193,37,13,64,103,48,217,252,138,238,224,146,142,96,135,224,104,24,227,18,46,33,227,156,194,37,90,124,38,16,6,11,178,13,218,50,131,11,73,235,28,46,41,38,114,15,94,88,172,32,58,35,89,48,90,7,113,73,49,129,139,152,130,76,199,63,200,73,128,84,12,233,36,28,55,93,79,122,9,85,4,122,137,17,120,160,155,112,180,187,174,159,24,19,1,115,20,158,246,215,243,20,99,66,66,93,133,179,101,132,175,24,99,70,57,139,49,28,141,145,12,192,5,89,9,203,137,239,227,60,34,180,146,99,146,173,147,155,66,22,182,91,237,113,194,232,12,155,102,164,190,211,66,115,180,207,152,198,76,167,14,32,167,1,146,45,194,105,236,170,89,253,34,198,188,254,165,255,124,66,144,171,232,65,6,56,136,209,215,3,75,186,170,30,15,111,158,201,25,132,62,165,225,190,195,217,234,217,238,191,233,83,28,226,90,44,223,35,29,74,31,9,237,70,250,32,167,103,67,149,128,27,74,43,10,104,227,179,26,14,215,113,254,20,116,187,237,250,4,78,206,146,48,30,79,16,32,6,45,151,78,22,132,62,112,64,221,187,183,111,63,98,247,180,187,128,176,163,217,49,75,152,31,246,105,188,91,27,147,75,193,108,31,8,196,172,180,237,20,205,85,18,110,169,206,114,4,96,166,211,110,25,37,130,232,221,90,83,96,233,152,6,156,78,208,150,0,169,240,223,245,26,0,12,154,151,60,106,152,226,34,78,23,82,186,241,129,156,65,232,35,159,207,32,104,69,112,6,1,54,246,28,137,28,96,167,64,208,32,189,2,46,235,190,223,26,219,244,110,115,104,111,203,61,125,92,107,205,254,113,62,241,177,39,154,30,125,137,136,194,250,24,189,203,117,130,95,198,113,223,207,51,121,35,88,191,219,176,208,218,217,34,146,105,95,192,107,249,54,178,71,84,160,219,7,168,221,219,40,119,107,143,88,20,190,157,0,151,72,0,37,59,127,62,200,101,214,155,85,245,129,172,126,55,234,16,174,31,227,102,255,6,151,174,141,24,132,104,110,191,65,170,87,231,198,29,146,104,250,203,73,245,10,100,253,132,1,113,189,220,182,65,184,160,89,56,31,145,119,173,75,230,166,59,78,39,30,149,234,162,185,62,25,237,113,71,86,178,39,184,103,110,36,218,168,32,223,139,150,110,172,100,120,48,222,7,22,186,19,191,34,137,198,199,34,168,246,177,66,172,246,180,130,59,114,199,178,50,19,146,23,60,103,101,86,100,38,62,207,138,66,105,145,51,19,245,170,204,252,46,203,114,197,37,203,10,41,52,55,81,165,150,133,228,82,112,205,51,35,45,38,115,201,179,188,40,88,150,183,55,210,147,170,61,75,54,162,12,61,162,41,222,95,28,116,176,217,238,222,154,79,254,89,161,158,0,62,29,192,181,128,132,118,127,190,191,215,18,163,149,37,32,70,171,145,0,49,218,249,243,43,197,104,199,14,225,49,218,184,217,149,98,52,6,143,209,56,190,250,46,96,114,132,196,116,253,6,222,152,238,226,189,11,240,58,193,168,227,232,216,238,136,50,235,206,186,255,56,223,29,171,238,25,222,198,59,17,65,54,191,119,203,168,106,107,12,60,43,8,108,107,15,89,183,37,23,206,114,114,219,234,144,3,35,151,44,195,75,182,232,248,23,196,146,21,29,114,145,70,178,145,249,72,15,3,43,189,46,22,41,75,242,124,228,72,222,83,228,35,227,142,211,137,39,93,62,210,35,67,202,206,122,76,213,17,147,211,161,179,110,70,76,197,113,215,72,140,142,99,76,150,24,89,209,210,41,141,196,25,164,0,53,224,72,83,215,185,39,166,211,152,186,214,224,183,21,199,136,113,26,64,97,7,41,64,150,177,28,163,215,124,38,161,210,105,37,100,209,7,24,219,112,44,180,223,185,163,161,203,14,154,230,17,176,193,176,93,237,241,21,107,175,215,120,137,165,223,111,175,191,113,142,202,25,36,71,61,66,1,146,212,222,247,152,44,213,245,82,151,35,201,97,152,116,236,68,34,60,175,181,180,251,15,79,108,79,18,129,100,182,131,22,145,171,109,39,172,232,108,245,4,19,25,250,247,65,64,30,193,114,144,141,19,221,254,50,166,239,41,130,127,75,207,233,4,148,39,139,186,185,45,84,225,9,162,127,196,176,146,133,221,118,184,116,195,5,184,31,10,56,0,60,114,166,208,132,199,22,44,172,48,3,120,102,177,60,147,4,200,99,172,116,250,83,64,98,77,110,139,144,57,197,203,234,3,232,118,209,134,139,4,97,236,73,184,65,33,82,232,72,193,247,148,194,198,168,206,173,193,79,32,127,216,238,6,251,170,166,207,50,8,38,166,35,218,62,220,116,44,59,254,114,28,197,206,230,155,213,108,28,43,116,24,223,212,31,125,185,89,253,185,22,199,30,17,99,13,136,8,138,83,221,45,6,228,47,214,135,247,235,125,21,225,254,127,115,66,176,196,168,199,226,236,191,73,4,44,131,71,199,19,251,218,190,133,71,189,3,20,76,188,59,0,72,161,4,126,230,251,189,130,140,77,62,54,54,98,92,124,232,5,20,40,30,66,172,124,143,146,188,93,64,23,147,17,200,53,72,41,68,71,74,153,132,20,136,173,70,164,81,150,230,233,244,3,148,64,141,41,3,91,254,64,142,27,220,180,124,59,168,132,139,226,74,89,164,187,207,116,114,42,146,229,143,61,50,116,217,209,225,154,177,242,26,116,48,213,9,68,228,215,223,87,55,24,223,152,20,118,18,40,157,174,228,128,228,21,54,250,2,135,28,50,158,12,109,0,119,213,62,139,24,150,186,53,118,44,2,188,109,20,95,44,138,47,134,230,43,192,117,227,249,66,103,243,78,148,116,83,169,132,36,219,176,185,164,144,208,33,147,9,118,86,104,32,87,131,135,74,224,71,32,216,65,9,16,29,143,205,220,95,126,136,176,24,31,178,132,10,39,209,211,234,67,132,177,248,192,18,178,20,182,47,232,253,110,254,248,104,104,49,164,153,114,228,108,191,190,55,171,145,239,118,213,236,176,5,20,92,164,243,82,210,16,124,71,5,38,188,41,32,131,14,2,157,46,177,192,33,168,233,115,21,25,32,141,131,235,64,23,85,148,103,89,214,217,85,135,160,171,237,85,39,253,105,76,137,47,21,105,252,176,130,42,57,65,136,179,89,119,131,248,124,121,120,55,127,152,77,113,143,80,38,71,7,16,171,38,44,7,159,165,184,60,121,241,151,206,170,253,205,252,159,221,252,234,166,247,147,238,40,69,148,153,27,48,179,187,159,1,74,23,120,120,82,73,253,229,82,84,84,30,160,79,123,120,252,136,65,78,32,15,235,197,254,183,244,58,217,10,59,94,214,245,134,107,193,72,85,175,129,196,138,151,117,66,136,75,36,3,169,61,125,182,154,213,177,196,120,155,84,23,76,185,35,22,219,198,168,160,190,3,60,33,66,254,216,98,55,112,198,171,163,34,10,178,129,72,93,216,131,19,145,92,120,44,81,157,109,48,153,84,155,231,75,121,205,13,35,65,226,70,21,222,80,200,201,199,146,7,87,205,160,163,195,233,140,221,174,190,173,240,20,41,58,151,17,2,130,121,204,120,156,123,70,187,5,175,172,178,222,58,131,143,13,26,105,2,30,26,2,65,226,101,36,59,25,233,184,29,32,16,122,169,35,253,1,44,177,44,142,162,200,136,162,120,120,157,19,12,155,214,114,225,194,212,16,179,69,168,102,51,243,249,118,85,111,127,175,103,238,75,83,75,88,62,126,12,62,228,125,250,188,109,21,16,172,117,59,156,166,235,80,165,96,97,117,168,35,94,88,221,169,247,41,190,142,115,2,1,213,149,44,77,98,251,15,172,27,13,62,78,86,39,178,92,123,250,31,80,249,57,201,54,166,210,115,66,32,172,236,76,2,130,222,240,180,220,161,113,156,145,9,43,57,99,226,77,105,5,112,191,102,56,28,169,36,40,42,53,35,90,209,30,207,138,148,128,95,68,37,6,165,83,240,74,76,43,129,227,101,192,58,74,117,26,8,172,248,88,199,164,160,172,180,180,212,1,42,43,173,218,135,57,231,232,202,201,24,37,225,140,195,87,74,78,100,134,120,182,0,110,209,181,13,20,187,12,205,46,69,81,192,142,148,156,233,240,34,64,206,108,240,37,253,44,12,77,249,47,226,176,16,233,226,82,122,8,231,151,9,125,159,72,156,44,240,9,251,16,2,203,113,103,113,37,35,205,155,6,212,197,134,103,232,244,219,203,41,50,249,62,145,21,157,108,143,97,210,90,4,64,228,1,50,7,28,175,34,87,77,165,127,172,47,169,110,179,120,127,66,205,149,14,73,168,7,168,33,105,181,165,1,54,185,29,66,1,82,236,137,134,52,180,4,165,219,214,38,159,54,103,60,89,138,62,28,15,124,162,62,196,33,75,215,131,96,65,155,202,228,112,4,142,179,94,139,203,4,171,243,132,127,139,74,216,221,228,155,60,123,181,54,116,96,220,72,0,42,86,36,221,229,109,253,39,197,45,57,39,135,230,156,126,154,103,15,213,134,84,67,6,192,88,129,116,7,60,149,158,40,103,160,178,141,73,202,177,187,113,2,64,211,138,130,78,12,200,32,107,18,47,1,239,136,42,143,23,121,186,202,67,15,206,49,224,86,243,25,157,72,92,14,95,93,95,226,25,193,76,104,128,176,26,208,29,153,87,132,91,130,172,52,50,42,102,25,129,27,40,18,51,203,169,152,229,104,102,187,107,53,35,31,122,244,211,40,168,152,21,104,102,187,107,52,52,79,204,172,164,98,86,162,153,213,29,179,42,29,179,193,37,230,97,46,10,75,93,35,203,205,110,172,132,193,0,182,232,60,36,246,170,155,242,38,186,78,46,168,84,91,241,6,78,76,117,150,125,242,109,169,164,91,241,134,66,142,175,181,79,227,37,31,183,240,138,123,96,162,117,1,223,11,254,62,167,30,235,104,243,23,86,219,119,20,125,194,199,20,87,231,135,73,99,88,233,183,145,28,35,37,108,213,223,14,132,151,66,23,236,228,121,178,160,61,114,13,96,2,140,152,111,212,90,192,144,188,200,21,1,55,88,90,187,133,203,85,67,76,138,136,85,159,43,174,15,28,133,13,188,107,171,12,216,114,55,194,245,175,17,56,154,224,42,243,99,176,224,117,2,79,83,42,122,2,214,10,156,141,62,109,209,35,171,255,143,101,140,93,1,24,35,17,173,1,4,3,131,118,41,91,22,59,69,57,189,205,74,70,172,4,76,51,97,42,179,160,183,162,49,192,164,210,137,45,250,122,169,166,184,109,10,219,95,90,73,157,130,121,212,93,84,161,12,161,66,17,47,98,2,177,96,78,170,34,38,110,112,229,28,101,21,96,11,97,54,49,31,139,92,5,201,212,111,160,176,99,197,58,166,201,54,99,218,168,12,172,152,141,163,51,104,56,23,85,53,155,70,75,104,37,112,117,179,49,185,81,155,54,61,112,201,217,103,209,236,199,22,150,252,136,201,133,0,56,209,217,131,23,237,194,156,204,120,186,105,28,82,249,153,8,225,33,98,71,30,220,132,136,164,95,252,113,81,29,39,44,92,1,200,13,133,22,133,238,68,65,119,110,206,73,38,85,204,143,63,142,233,101,29,81,4,26,211,23,85,6,154,134,75,107,101,112,161,87,128,137,225,241,74,116,205,74,80,157,222,214,38,102,107,217,37,218,255,101,187,81,180,20,1,101,160,115,187,128,2,208,229,199,200,82,75,15,38,188,232,227,106,20,79,67,72,161,103,252,249,167,13,161,79,85,16,234,141,5,186,20,212,195,160,42,2,249,33,65,245,114,109,169,151,151,98,122,139,84,76,249,199,65,126,76,225,199,15,73,42,145,232,146,143,155,94,220,241,85,47,96,90,246,49,41,138,157,98,92,200,224,198,74,192,55,102,139,35,98,138,133,111,113,196,204,95,96,161,102,32,224,99,93,69,69,234,104,3,130,29,159,110,3,98,73,182,154,63,164,47,180,44,211,139,134,194,163,170,184,82,140,3,39,225,20,71,22,97,122,132,94,113,227,146,179,219,228,2,74,182,105,169,175,248,237,147,82,34,19,79,179,103,169,47,223,232,178,210,4,86,242,225,2,236,85,130,13,64,148,233,9,42,37,217,146,132,48,33,35,55,15,65,4,48,40,31,141,40,197,10,5,89,50,178,128,160,25,47,58,198,21,93,177,104,76,96,124,86,128,223,38,228,101,23,83,32,234,81,22,87,26,114,0,165,181,20,184,48,47,192,76,136,24,101,185,98,57,104,85,61,110,247,235,195,184,20,244,192,102,111,204,50,241,67,213,85,130,114,22,112,23,124,131,231,175,2,13,62,196,85,95,90,136,224,234,143,181,65,92,223,1,85,159,139,79,63,85,124,158,168,226,211,142,3,182,218,211,182,39,170,244,120,224,32,118,79,89,138,225,199,217,154,168,202,99,35,189,46,199,188,173,203,217,36,130,56,163,145,202,129,162,184,225,32,247,110,183,125,139,174,113,133,96,166,21,68,188,16,80,94,223,129,147,128,87,68,101,7,51,173,130,43,59,168,57,11,171,236,156,133,91,23,100,100,17,161,150,13,0,118,92,88,199,32,217,145,210,51,109,129,213,156,54,210,9,11,136,162,170,56,54,140,132,211,23,87,193,105,137,188,98,245,198,218,101,114,193,164,170,220,12,20,92,119,42,206,167,242,199,132,165,155,86,184,177,101,27,23,78,242,113,10,47,217,64,37,207,177,198,37,164,94,51,10,239,253,146,197,213,105,96,92,247,11,53,67,18,49,82,192,21,104,46,1,240,220,242,142,91,186,195,92,23,212,197,69,241,232,170,76,0,159,136,178,76,75,86,84,73,198,6,146,214,10,224,98,179,16,19,32,176,234,113,197,90,76,181,57,236,62,206,30,183,235,205,193,127,60,75,137,204,95,141,233,33,250,43,50,163,143,113,149,145,62,76,112,101,198,217,40,158,134,128,10,141,229,243,79,85,154,39,170,210,244,199,2,91,169,233,99,16,85,107,2,32,33,166,81,90,238,183,60,206,104,103,246,135,175,214,56,72,71,185,132,9,44,82,246,39,114,118,56,203,129,9,98,223,252,134,91,234,168,68,209,133,147,64,150,113,201,98,159,208,43,38,140,206,110,147,11,40,85,210,216,39,134,235,142,154,39,202,25,251,242,141,205,27,167,176,146,15,23,143,208,231,144,36,207,26,33,132,137,2,151,236,129,244,164,159,235,141,41,197,10,5,151,243,217,64,208,140,231,29,227,116,105,159,133,192,248,144,0,157,254,249,217,69,100,127,125,202,162,50,64,23,80,218,249,28,158,5,2,173,41,143,81,150,43,38,130,247,198,102,4,62,140,37,75,238,79,3,59,60,127,18,120,241,41,46,253,58,131,4,39,128,142,38,177,253,7,36,127,163,143,63,221,186,65,150,204,157,101,139,77,229,206,8,68,137,156,23,16,116,10,173,176,188,1,88,242,100,15,99,217,137,143,56,92,225,5,36,149,70,236,170,179,149,90,148,99,115,34,37,224,23,115,249,3,70,175,96,139,195,125,9,28,223,16,151,81,202,211,64,96,197,215,61,67,94,74,170,5,226,62,117,129,21,128,179,223,13,117,208,81,217,191,29,37,225,140,195,229,254,103,50,163,238,89,112,192,36,103,151,161,217,141,205,136,221,72,201,153,6,220,167,208,131,231,93,124,238,60,236,44,240,211,48,36,207,182,4,99,33,226,69,222,155,208,55,64,188,19,237,212,195,96,78,66,113,242,192,165,216,99,8,44,215,1,3,14,79,176,71,228,197,6,106,248,43,17,96,172,114,188,110,71,101,217,118,152,180,54,2,23,139,4,204,18,142,215,151,97,134,61,202,125,219,140,183,16,128,140,247,34,107,15,207,67,109,13,7,153,33,48,117,99,167,212,13,99,1,45,153,23,15,206,188,46,248,128,39,228,83,0,145,233,249,5,52,36,89,183,55,29,12,80,80,150,92,43,244,209,184,76,188,201,19,145,176,247,134,76,96,197,18,152,58,179,80,188,89,243,135,230,151,113,38,203,143,13,178,99,185,37,37,40,44,123,121,1,230,203,10,105,121,36,38,38,135,242,74,97,86,151,5,15,41,229,220,244,144,92,218,113,114,57,166,137,2,31,11,184,0,177,108,119,254,172,40,200,243,206,167,40,24,95,244,73,150,193,120,112,177,226,239,98,149,194,123,19,67,172,248,147,101,31,238,126,210,73,69,146,164,34,235,205,114,87,205,77,217,33,112,173,129,101,89,192,98,195,16,213,31,113,217,190,199,197,21,23,72,193,161,206,84,59,18,74,2,2,27,123,139,79,75,17,100,75,17,23,2,198,174,71,92,192,16,45,74,132,161,130,30,80,182,100,132,167,249,155,104,105,98,130,133,136,245,137,48,84,90,193,196,174,82,184,105,70,133,218,211,112,41,88,71,44,88,224,212,13,22,109,143,4,81,199,126,170,136,215,169,6,7,43,74,118,230,151,108,241,98,68,99,224,10,198,133,75,247,132,141,23,189,196,172,101,76,64,165,156,157,184,21,141,11,98,163,150,53,166,176,210,115,206,226,56,143,205,15,60,112,233,249,231,145,252,7,36,5,174,200,44,88,40,184,132,96,96,97,202,179,64,74,239,14,64,43,193,17,18,194,45,82,56,112,176,34,224,103,157,96,140,108,169,194,78,36,73,12,135,94,180,8,224,26,177,37,240,130,186,168,245,138,9,172,196,51,30,23,144,248,167,79,188,238,92,177,216,179,171,150,239,118,251,245,143,85,29,255,134,230,238,101,30,144,186,91,144,253,249,187,179,17,46,117,182,193,5,103,242,222,198,116,52,5,228,244,19,205,62,37,246,100,137,189,77,202,216,236,222,134,69,148,226,3,160,65,70,84,141,141,232,113,174,39,186,250,199,199,134,201,202,247,213,195,29,58,225,135,226,147,202,42,54,243,15,32,30,119,5,116,48,112,90,113,32,18,14,15,229,168,248,35,0,51,129,28,48,85,17,196,228,12,190,64,8,53,243,97,21,23,187,160,143,229,146,156,72,135,27,48,236,120,177,142,113,178,210,139,157,206,192,250,139,45,54,131,135,115,81,149,24,31,94,66,19,129,171,198,216,8,142,42,201,120,1,147,139,128,194,74,198,214,102,66,48,147,11,34,124,31,106,110,185,187,181,44,88,202,89,29,82,253,153,140,225,97,178,71,214,129,0,114,233,87,129,220,132,199,202,12,87,15,154,2,195,202,163,179,254,133,32,75,235,39,232,164,11,252,241,197,33,31,247,136,210,144,141,192,168,250,144,15,48,173,213,1,132,103,32,147,195,41,84,233,138,101,34,227,236,86,179,183,38,71,154,223,7,212,135,116,22,112,185,115,31,210,95,24,26,127,141,171,190,12,112,130,75,65,238,86,4,84,4,20,127,108,223,127,170,250,144,85,125,6,226,197,150,123,6,32,68,117,158,16,76,208,241,121,139,1,212,153,74,182,143,195,73,191,169,49,28,182,232,186,78,32,44,169,100,98,203,57,46,154,81,78,113,10,44,1,215,136,106,5,74,211,96,5,133,11,33,28,55,239,234,88,93,106,80,176,66,100,29,171,100,119,19,95,16,24,88,59,24,56,108,128,115,143,170,22,56,129,18,206,68,92,153,96,64,105,84,125,192,141,148,156,105,22,195,116,108,69,96,18,44,57,235,60,138,245,128,84,221,30,113,5,74,3,121,75,147,178,60,10,163,153,255,229,109,11,173,104,193,224,242,113,43,10,154,247,162,227,157,238,169,109,27,133,4,49,25,254,170,38,47,195,136,228,123,64,90,84,214,237,68,74,59,179,113,241,133,119,178,196,42,204,85,19,237,240,219,154,116,22,146,101,7,223,214,180,167,184,173,105,15,191,173,105,79,121,91,211,30,114,91,211,254,211,109,77,9,115,234,216,219,154,246,212,183,53,237,73,111,107,178,24,183,227,140,76,180,87,98,79,125,91,211,158,244,182,38,159,52,226,211,231,3,229,30,8,15,92,90,214,81,161,59,213,101,85,123,146,203,170,194,120,198,92,86,133,152,86,193,187,28,80,115,22,90,148,184,184,198,138,71,233,102,3,129,29,155,238,32,182,230,116,229,8,240,77,88,251,208,155,176,246,36,55,97,237,227,111,194,130,77,105,108,9,130,228,38,172,61,193,77,88,24,118,241,22,44,190,242,64,114,19,22,134,105,142,103,58,168,230,16,126,98,124,31,125,95,85,223,76,136,78,0,69,64,181,1,121,66,124,31,127,89,213,62,238,178,170,62,203,178,101,57,207,8,115,70,146,203,170,246,4,151,85,121,89,69,149,23,72,110,168,218,199,223,80,5,158,187,184,0,196,59,47,162,148,228,138,85,133,131,65,236,110,247,15,120,14,168,222,0,233,171,44,12,48,253,213,5,203,231,184,12,127,8,20,92,101,152,104,70,65,71,64,181,193,218,224,211,211,64,145,245,9,100,121,98,56,24,216,18,197,16,133,168,76,17,4,10,170,195,10,203,165,249,185,76,242,62,144,147,120,148,171,152,68,35,21,65,228,27,65,151,132,6,102,70,67,187,12,49,226,81,25,146,27,41,129,76,227,178,164,33,169,87,124,45,104,162,227,228,66,74,246,94,80,143,24,33,58,106,202,137,235,121,19,190,23,52,148,112,108,86,56,141,150,124,200,194,247,166,3,7,97,112,143,108,56,178,108,75,63,170,32,187,125,249,66,196,1,25,173,35,228,9,29,68,228,58,58,76,192,131,155,152,109,4,227,229,131,75,114,237,48,88,9,4,40,2,139,116,119,81,201,238,4,84,66,150,121,156,238,7,4,165,129,12,163,215,214,193,70,42,134,225,176,203,148,149,86,192,180,17,122,161,178,183,241,53,46,85,118,24,53,204,197,202,83,252,224,50,91,250,11,150,167,224,161,89,239,191,225,69,203,83,252,97,47,91,158,194,164,184,112,25,136,15,178,75,124,188,250,164,116,30,115,233,178,29,178,32,185,116,25,38,9,236,197,203,168,94,146,75,61,94,62,199,213,73,21,231,1,93,160,88,246,121,231,12,51,170,37,207,41,122,175,86,181,37,190,140,25,130,141,29,138,46,46,209,138,234,66,230,73,178,83,39,36,52,151,51,195,36,36,105,179,147,99,172,105,220,79,77,220,33,224,32,159,96,129,17,221,0,56,48,144,179,180,137,8,81,134,104,176,232,105,162,45,25,69,161,177,146,181,213,167,141,137,100,27,19,45,66,142,42,255,15,161,40,215,0,130,144,65,166,39,31,14,197,105,138,143,34,169,206,79,70,47,4,184,57,216,221,119,127,65,198,83,97,216,88,241,240,78,60,114,114,123,152,64,196,155,65,148,79,165,54,4,130,57,194,99,133,211,109,230,23,108,122,155,35,199,184,247,105,250,155,159,163,183,189,34,186,72,43,38,114,17,181,142,186,190,219,172,90,26,215,158,64,70,227,62,146,235,18,35,21,20,62,111,158,132,76,32,5,204,225,91,31,114,204,38,90,12,56,79,9,46,48,224,86,247,71,81,21,191,84,143,99,58,155,211,76,193,6,11,171,100,221,225,100,193,73,83,99,43,153,5,33,203,5,129,27,23,233,89,46,9,89,46,209,44,139,142,101,157,156,101,153,209,177,108,176,176,44,203,142,229,60,61,203,140,144,101,134,87,108,221,242,172,178,164,60,67,118,178,12,171,11,33,213,173,97,111,209,123,90,220,112,9,195,147,136,141,45,67,122,163,206,1,248,240,146,11,128,32,62,35,41,106,78,67,38,23,3,96,35,72,88,186,121,1,223,19,53,62,231,12,46,149,58,138,81,160,17,64,150,73,251,210,233,12,188,204,189,231,19,156,116,71,105,102,212,102,14,59,22,90,26,93,236,42,203,148,177,107,252,182,142,9,60,90,230,17,135,25,44,4,70,157,106,240,224,165,181,59,184,212,208,59,173,104,20,233,218,43,102,199,206,247,166,38,81,223,220,80,151,112,215,251,131,33,225,163,127,185,163,16,37,100,185,195,210,7,100,229,195,217,60,118,201,193,6,140,88,15,241,194,164,160,19,180,74,50,1,240,105,193,36,193,130,137,77,222,241,107,39,54,84,242,101,20,64,39,16,83,173,217,216,84,31,173,72,162,91,32,194,25,138,184,25,2,213,9,169,212,104,235,191,1,92,108,15,111,170,29,229,226,2,190,207,180,130,76,37,196,200,152,41,0,61,129,92,16,165,117,204,132,15,46,173,163,172,9,118,1,210,46,242,227,19,26,156,92,241,27,88,236,24,182,149,235,66,50,250,98,151,157,98,112,221,203,22,113,198,132,171,68,213,48,31,114,66,115,19,91,24,179,145,78,84,35,243,66,39,23,11,173,59,163,171,156,133,160,39,23,78,120,17,77,91,118,211,21,178,184,142,149,128,149,209,38,179,21,236,200,224,138,107,16,169,217,107,107,110,102,232,100,27,91,113,155,130,197,74,171,243,68,42,75,80,50,153,160,56,69,2,132,174,200,121,37,18,85,144,179,145,74,84,155,243,65,167,181,108,128,48,19,100,214,56,173,202,61,73,193,238,253,250,240,198,164,69,187,121,64,157,142,101,66,66,10,117,103,108,72,125,238,178,85,108,185,171,135,135,168,198,185,90,19,82,5,170,189,141,219,125,42,185,37,40,185,245,196,28,95,105,235,129,145,23,216,252,216,16,219,90,176,241,86,45,150,73,150,120,171,178,131,137,186,204,181,139,242,59,211,192,88,201,240,78,50,253,141,47,148,69,130,73,186,35,183,40,251,177,177,114,57,63,0,47,100,170,162,162,155,250,168,39,139,193,29,36,150,17,177,124,34,195,55,55,104,10,49,32,202,131,126,232,152,250,32,10,157,99,208,237,54,151,44,207,25,140,227,177,54,88,82,205,148,6,13,171,15,236,44,86,69,95,68,24,81,170,51,74,190,117,70,225,74,244,53,248,102,164,124,51,52,223,226,204,119,121,13,190,57,41,223,28,205,183,60,79,240,236,26,124,11,82,190,5,154,111,125,230,91,36,230,27,188,130,208,75,129,17,105,51,209,122,129,3,48,101,152,17,187,78,208,35,153,104,121,192,133,152,94,10,36,1,41,221,106,192,4,104,122,89,132,175,2,132,38,69,147,123,105,61,93,112,27,11,138,39,53,34,176,5,6,91,73,6,56,198,184,229,4,144,108,236,235,9,35,218,163,5,23,187,122,96,65,195,202,228,28,84,42,153,54,154,38,90,44,112,33,210,10,32,106,145,160,71,34,209,218,128,3,49,177,157,3,228,150,48,11,196,73,52,234,218,107,1,171,234,161,186,159,31,170,35,29,1,23,148,212,247,64,5,45,4,12,128,3,151,1,44,109,34,202,237,67,52,216,18,192,68,91,50,138,66,203,255,214,86,159,138,255,180,197,255,161,144,163,74,255,67,40,202,194,127,16,50,232,228,67,105,57,161,157,171,116,85,127,55,7,241,23,148,132,97,99,197,211,157,24,203,25,249,5,37,65,148,227,171,255,225,240,88,225,116,167,102,198,239,118,16,92,80,50,77,63,201,30,98,88,23,105,197,68,46,34,162,11,74,128,125,36,215,37,70,42,40,124,48,59,9,153,64,10,152,11,74,124,200,81,23,148,32,192,121,74,112,129,1,183,186,63,138,148,241,82,61,142,23,17,112,154,41,216,96,97,149,172,187,160,68,211,214,226,173,100,10,66,150,5,129,27,207,210,179,44,9,89,150,104,150,187,11,74,114,145,158,101,69,200,178,66,179,220,29,180,205,101,122,150,53,33,203,26,175,216,221,5,37,69,158,148,103,200,50,203,176,186,0,174,71,196,47,177,184,225,18,134,39,17,235,43,67,122,227,87,87,38,240,146,11,128,32,62,35,89,88,153,134,76,46,6,192,5,37,97,233,38,205,5,37,23,82,9,93,248,112,20,163,64,35,128,188,160,164,180,221,164,80,200,176,69,15,27,221,81,154,25,181,224,97,199,66,75,163,139,93,11,157,50,118,141,95,236,152,192,163,101,30,187,212,49,36,48,126,161,195,141,151,214,238,224,82,67,239,180,162,81,164,107,175,113,220,87,167,101,150,106,215,47,18,77,47,116,228,50,244,38,246,49,122,224,106,135,171,97,196,2,131,5,18,182,238,225,3,160,165,45,116,5,196,221,244,211,50,8,237,50,136,69,210,81,107,33,22,60,202,5,145,112,120,136,185,85,150,183,190,114,233,185,206,55,118,101,196,195,138,41,177,86,31,30,77,101,213,100,94,81,149,110,68,63,164,178,35,41,119,79,51,129,119,215,126,220,4,178,64,212,115,81,26,138,88,152,178,202,227,88,168,40,9,181,175,1,196,138,150,117,2,160,173,111,89,105,133,84,63,44,113,7,46,92,137,175,131,120,48,19,206,240,136,98,136,133,232,248,138,136,15,52,185,40,24,145,40,72,106,35,1,184,201,5,194,169,4,18,90,195,152,10,39,225,226,194,85,51,6,6,140,119,162,10,188,18,194,201,1,133,16,35,234,26,19,128,104,225,180,203,23,57,245,13,16,110,98,105,35,82,116,153,195,47,6,108,153,195,66,101,124,173,195,3,154,214,142,224,98,39,239,204,35,84,174,39,169,122,88,54,199,120,234,30,245,234,81,120,221,227,2,31,82,249,176,54,141,173,47,92,130,34,170,31,147,16,212,244,129,42,32,142,198,159,106,32,9,106,32,151,178,142,175,130,92,34,146,215,65,2,59,0,217,97,203,205,216,121,145,95,161,18,50,197,12,109,45,4,218,19,169,252,232,170,33,19,108,68,186,116,15,114,2,121,96,42,34,24,77,197,86,68,198,18,57,158,130,103,164,90,216,64,98,197,219,85,69,138,146,190,42,50,166,22,92,23,25,239,169,197,133,52,68,181,145,41,212,132,51,62,182,58,114,73,54,81,125,100,18,54,185,56,24,153,56,232,106,36,62,228,228,66,225,116,66,1,213,73,156,65,39,70,104,200,90,73,110,203,216,74,9,168,149,216,185,160,17,102,108,189,196,5,137,22,81,87,42,40,117,130,164,214,65,46,117,244,138,175,154,120,69,17,85,53,185,164,147,168,110,50,5,155,214,182,224,98,44,239,60,36,85,178,167,168,157,236,171,127,188,171,169,132,108,26,209,18,80,60,25,117,0,168,158,56,218,70,150,39,198,168,240,250,137,7,131,156,66,72,5,197,217,250,83,9,133,190,132,50,22,118,116,13,101,12,73,93,68,9,238,1,100,147,149,197,38,107,153,190,138,50,205,13,105,25,5,222,21,169,4,201,234,40,147,124,196,249,120,47,116,2,137,96,42,41,24,109,69,86,82,108,34,57,214,61,50,90,77,108,48,177,2,238,106,41,90,147,215,82,108,228,66,139,41,227,80,5,29,228,208,148,83,166,97,19,206,252,200,122,202,152,110,154,130,138,7,55,185,64,24,157,64,200,74,42,126,232,228,98,225,132,98,129,20,85,38,226,80,148,220,144,101,21,101,75,231,114,22,94,86,113,241,65,36,208,200,194,138,27,19,45,165,174,156,224,63,74,75,40,3,242,152,22,95,91,241,10,35,166,182,50,38,148,166,184,50,141,155,214,202,224,226,46,239,116,164,85,180,107,151,87,118,149,233,209,200,161,166,210,255,72,112,153,5,22,85,122,176,129,165,148,81,139,136,242,68,31,11,86,54,113,182,36,162,38,180,68,98,105,243,169,48,66,91,24,233,139,56,170,28,210,7,162,44,130,4,224,130,222,108,210,150,119,149,202,44,237,123,189,46,30,76,21,98,85,61,30,222,208,74,166,67,37,149,11,217,133,71,19,100,83,62,194,11,239,38,173,184,8,69,133,15,62,38,0,19,112,143,121,93,23,49,61,195,95,215,197,204,125,68,33,105,40,229,99,169,71,82,40,113,131,132,29,169,238,157,190,146,246,206,234,33,145,144,82,81,63,236,2,134,105,241,101,33,23,88,66,51,16,81,12,234,83,27,95,2,114,162,37,103,62,218,101,144,148,123,166,0,147,139,0,240,182,109,110,131,47,147,205,222,224,154,145,53,48,7,136,28,249,104,45,64,28,163,242,208,152,228,40,57,69,148,130,108,72,88,49,180,54,189,204,136,211,114,11,145,68,65,60,254,205,89,31,223,216,82,79,159,186,248,2,143,11,45,173,93,1,132,88,32,163,194,163,213,231,138,181,156,15,219,58,172,127,183,57,52,245,129,233,58,142,168,31,124,242,213,113,250,144,254,26,206,248,107,92,197,100,128,19,92,187,113,183,34,160,34,160,102,99,251,62,184,94,227,24,255,211,55,139,119,235,7,163,43,251,151,191,57,33,252,230,244,247,95,66,10,60,97,29,252,110,190,127,99,65,255,15,40,7,13,70,15,91,10,26,128,16,149,129,66,48,33,198,149,23,99,3,40,250,143,191,217,110,240,141,40,1,57,233,55,165,136,245,102,85,125,152,205,55,171,217,7,119,200,245,77,253,209,151,155,213,159,107,250,246,40,81,93,116,69,42,46,75,169,195,65,122,176,15,113,241,129,242,202,83,96,9,4,129,168,122,160,52,18,86,152,184,16,66,93,74,224,58,118,42,54,40,88,33,182,65,156,240,63,49,138,84,156,192,98,196,32,110,0,196,24,47,83,56,180,48,225,99,43,22,192,217,220,85,44,80,220,0,85,159,233,78,35,212,148,70,224,105,1,171,16,125,68,17,54,188,232,162,12,106,124,89,168,76,251,188,36,24,92,241,57,154,16,240,200,198,214,145,38,193,146,143,88,120,13,9,58,6,60,202,228,134,84,144,236,105,66,160,160,113,149,35,152,16,250,181,35,11,177,104,201,224,106,70,86,20,60,243,188,99,158,110,199,144,141,68,130,88,31,93,41,10,224,24,81,43,26,208,22,85,39,114,34,165,181,27,184,128,52,196,104,200,40,149,73,91,33,114,52,51,34,223,46,79,255,29,149,138,154,2,145,125,155,143,31,207,90,39,10,109,22,92,170,9,0,156,170,28,65,155,83,210,101,175,37,133,55,28,20,149,128,117,16,134,35,25,80,16,113,160,53,17,251,203,47,191,253,118,246,221,31,94,77,128,252,138,101,58,103,89,206,75,149,49,149,11,101,254,84,40,158,21,146,103,172,148,74,100,130,151,89,46,114,153,101,146,43,165,138,162,80,133,105,82,114,33,253,4,12,3,227,224,121,54,25,94,135,207,187,150,138,54,129,249,112,122,253,203,54,255,152,46,33,51,208,130,12,153,137,206,230,3,109,251,224,43,209,213,26,240,209,191,187,172,211,71,30,174,143,54,10,17,83,220,11,115,181,154,45,110,90,218,232,7,89,148,9,128,225,88,215,191,153,125,244,143,56,21,23,116,70,166,143,154,186,72,129,36,5,18,235,48,203,154,21,211,174,210,155,250,60,93,189,194,74,137,243,5,206,83,178,166,144,228,184,227,82,128,200,63,132,196,224,32,188,116,3,39,3,114,79,8,169,199,106,247,71,106,1,52,168,209,98,200,227,175,161,5,145,61,101,203,208,178,56,130,38,23,133,36,22,197,135,36,178,248,112,29,97,8,82,97,80,139,225,99,66,251,32,240,246,97,58,122,13,139,27,124,17,48,52,76,244,216,167,254,66,242,244,236,237,47,15,7,6,45,2,24,166,170,240,200,230,66,76,175,150,223,61,70,201,185,15,48,16,242,219,16,121,60,134,198,60,213,114,246,184,93,111,14,166,191,63,214,255,191,24,172,127,16,224,28,183,4,16,224,168,243,184,228,17,227,114,130,13,205,255,44,244,4,166,124,238,218,61,78,33,250,0,3,133,216,85,251,119,15,135,160,249,68,157,198,9,244,56,252,176,190,55,162,127,183,139,51,70,35,148,225,76,169,246,251,249,125,21,114,232,233,241,221,98,246,247,10,146,244,0,50,216,213,186,62,111,177,92,214,71,30,191,54,127,254,242,248,199,64,142,29,141,7,140,6,81,126,251,98,83,189,159,53,30,198,175,43,143,187,234,199,176,175,113,250,48,154,88,97,226,176,204,199,103,82,167,120,99,230,231,229,44,199,148,152,134,243,60,208,216,28,59,175,255,195,93,101,37,1,41,42,157,225,32,181,164,203,86,207,107,104,78,132,33,42,71,174,214,3,246,234,223,211,111,192,195,21,89,122,4,131,42,68,227,118,8,63,19,77,114,124,57,168,7,70,59,44,48,25,118,125,131,82,3,203,242,86,116,193,7,184,129,193,66,131,154,44,245,8,12,33,224,58,79,79,180,211,170,8,27,166,6,43,114,144,84,170,170,70,143,210,15,52,12,127,72,165,144,17,133,172,30,121,31,105,184,252,152,138,203,136,116,252,237,252,240,230,229,124,191,175,118,135,25,87,217,204,84,16,198,27,246,255,190,217,190,223,204,12,173,203,55,245,254,154,118,223,190,204,33,14,220,210,19,196,147,59,155,15,28,66,80,116,136,243,7,54,2,126,247,205,111,127,55,251,205,119,127,250,195,215,110,175,160,132,169,163,48,86,22,130,137,82,107,33,75,179,144,175,56,47,184,100,140,51,145,23,34,147,176,110,17,17,131,23,102,232,87,97,59,236,233,4,10,10,14,38,0,98,23,201,109,208,63,252,238,155,255,126,237,30,103,33,51,51,166,66,235,146,103,165,40,164,25,105,45,204,210,176,206,114,41,88,174,11,206,152,84,26,216,103,116,228,97,67,253,211,31,255,248,234,123,159,222,178,34,43,185,50,58,43,133,16,153,54,171,219,70,117,205,122,183,214,50,203,107,166,10,165,51,110,86,191,165,80,44,51,43,224,134,219,130,9,198,180,226,50,55,11,230,70,22,146,107,149,105,14,84,239,211,126,102,22,97,116,167,80,33,54,216,114,208,77,198,156,250,4,147,203,147,8,129,99,133,208,238,224,242,63,184,70,41,4,145,68,8,2,43,132,246,118,43,197,174,41,4,153,68,8,18,43,132,246,61,120,37,174,41,4,149,68,8,10,43,4,213,10,65,93,83,8,58,137,16,52,86,8,186,21,130,190,142,16,222,172,239,223,16,75,224,8,137,100,191,141,205,165,243,38,125,25,122,223,2,128,226,135,237,123,98,25,212,136,41,69,64,202,62,226,204,64,4,58,185,88,108,201,233,45,120,190,185,158,176,146,253,197,233,207,41,196,61,153,85,33,133,124,194,76,37,90,162,140,248,161,114,214,174,5,54,247,125,168,176,105,239,131,229,42,194,23,243,144,34,246,34,77,17,251,130,184,200,180,244,161,122,78,25,233,67,133,79,70,31,170,20,121,232,67,69,156,14,26,192,57,209,172,62,66,129,238,75,181,157,153,160,47,226,93,208,184,160,99,119,145,140,93,50,219,149,200,77,62,196,93,213,4,17,133,10,247,144,106,28,150,139,60,109,68,186,217,184,188,3,47,177,222,97,179,193,122,135,182,37,212,59,196,26,74,211,111,164,225,191,68,120,90,195,111,168,65,27,254,115,91,74,195,111,80,105,13,191,1,164,50,252,71,40,200,244,151,227,233,207,203,180,150,208,208,152,198,18,90,128,83,137,2,144,43,88,96,69,54,153,43,48,130,92,97,179,153,138,150,11,188,61,140,8,152,123,141,159,101,204,124,162,47,218,122,62,179,200,249,68,80,132,13,77,20,63,159,128,169,45,41,101,20,221,162,129,110,168,179,204,246,34,109,32,125,34,115,65,202,244,34,25,211,130,146,233,84,126,36,54,168,134,8,4,16,84,235,113,80,45,131,238,44,14,134,101,237,66,130,76,92,62,222,108,15,179,127,86,187,173,51,100,151,104,23,213,32,163,189,212,160,253,83,108,103,232,40,136,117,69,86,28,82,27,222,246,128,119,47,23,8,73,168,35,118,50,45,236,108,190,217,26,83,49,95,84,15,199,133,225,163,222,158,67,171,227,47,94,224,49,5,21,38,101,189,248,2,20,98,20,133,37,190,150,9,188,196,224,222,11,135,121,129,21,4,250,136,32,179,50,110,56,176,39,171,253,33,224,138,134,219,23,15,213,38,100,67,254,126,183,244,194,225,182,226,15,25,193,152,37,55,64,244,140,31,64,127,187,221,62,254,247,238,72,11,130,176,115,107,212,56,1,7,128,99,153,132,89,91,91,83,90,161,19,216,215,1,222,105,9,60,139,49,89,86,60,208,53,66,227,29,38,44,197,190,130,33,161,103,235,159,181,214,159,241,112,235,239,2,99,209,96,245,171,48,235,205,59,19,16,111,31,63,26,113,145,141,205,8,56,118,144,44,129,43,209,232,76,153,1,48,223,171,253,1,203,106,235,61,75,95,70,17,205,241,93,107,73,67,78,70,184,77,41,88,56,119,77,67,148,120,218,93,113,76,78,92,229,7,227,33,228,106,176,244,4,196,140,228,68,8,1,30,157,26,43,145,234,82,197,125,47,31,140,228,58,163,39,145,70,111,83,125,56,204,40,230,0,202,66,244,122,39,180,137,103,61,100,112,37,140,27,147,169,240,8,44,157,26,44,145,18,202,8,251,185,171,238,215,251,227,253,133,245,3,158,119,143,199,171,12,30,157,87,233,177,92,65,50,17,7,58,36,39,153,132,136,13,11,93,224,136,140,33,8,42,21,189,160,0,219,3,50,200,36,204,111,141,202,133,172,119,60,46,67,190,196,101,19,46,138,81,113,252,241,79,155,234,112,158,166,199,51,245,251,151,63,188,250,195,215,179,223,191,250,225,135,47,127,251,106,246,250,187,217,183,108,246,195,171,111,95,125,245,250,187,239,167,78,62,95,226,53,247,128,78,227,77,29,131,118,19,88,109,86,191,63,253,229,245,246,91,246,195,199,253,87,166,35,28,109,118,40,20,89,123,131,53,107,254,54,59,108,103,167,232,221,110,61,180,199,122,0,58,241,24,17,48,210,240,50,202,249,199,135,237,124,229,205,142,143,161,211,233,219,89,200,195,31,245,49,16,211,167,231,69,76,75,105,118,186,248,1,97,54,204,182,161,17,7,98,68,190,113,194,200,152,245,25,70,4,22,194,134,67,122,161,181,105,150,14,154,131,76,57,44,188,70,245,0,58,175,90,142,15,75,177,188,32,169,96,64,136,247,205,252,120,241,180,61,96,165,115,190,96,76,7,189,89,146,66,60,193,183,130,19,244,146,78,78,50,153,22,65,175,21,143,239,37,157,148,52,224,5,28,235,44,46,184,99,251,144,30,94,10,72,60,6,126,63,27,63,2,189,62,210,13,128,138,82,211,189,137,193,12,193,47,191,252,250,107,239,161,93,252,141,213,178,40,131,168,248,253,151,255,123,246,131,137,128,235,152,248,155,215,175,126,63,171,253,157,155,32,126,113,226,217,5,107,187,130,32,228,206,121,203,245,5,144,24,184,237,126,179,221,189,53,159,255,179,234,107,92,208,37,8,58,3,70,196,206,46,129,241,176,7,103,184,225,205,252,134,108,27,65,56,33,184,72,53,16,239,42,155,220,194,105,131,6,170,94,164,203,139,142,158,128,39,146,80,214,13,127,10,51,35,227,88,63,60,196,174,247,159,219,104,139,153,57,75,18,195,250,8,47,210,202,165,136,150,75,161,175,45,151,222,246,151,110,181,50,159,220,171,130,3,63,175,94,102,25,61,122,183,117,167,228,244,224,221,30,158,146,72,46,83,174,35,86,19,143,216,72,53,108,163,46,157,145,172,236,132,19,189,222,215,145,70,42,145,52,232,72,161,180,11,129,69,118,229,169,105,200,222,191,109,106,153,137,196,114,194,199,26,173,86,91,248,149,5,19,181,97,24,223,77,170,73,5,56,134,210,151,126,171,151,186,140,223,60,220,87,247,118,243,112,174,210,224,150,89,34,220,226,202,106,248,33,149,226,125,136,158,145,114,242,117,221,152,124,54,252,84,83,56,191,31,83,9,242,35,185,32,107,109,130,189,150,29,176,238,244,85,253,106,214,87,223,253,225,245,247,95,126,245,122,176,188,230,200,255,179,66,9,158,11,153,43,206,51,153,115,89,104,86,154,186,176,44,120,22,216,165,249,239,87,219,77,45,138,3,32,191,178,54,191,72,170,254,241,174,178,108,177,2,130,126,223,192,12,205,168,25,212,71,35,138,42,30,189,193,65,220,58,15,34,63,78,178,103,33,244,4,220,190,240,237,93,58,170,237,98,247,28,120,200,50,92,157,131,44,155,174,67,23,227,234,137,210,150,104,102,251,234,161,90,30,182,187,160,109,206,129,223,102,161,175,52,192,6,62,118,96,58,253,25,168,254,33,104,96,216,81,147,15,193,227,18,124,27,189,147,246,175,141,73,249,237,151,175,95,205,142,150,38,192,192,48,166,115,85,202,76,27,163,34,120,166,11,46,88,105,60,128,102,50,208,192,12,47,192,15,170,59,58,175,192,7,148,30,219,238,127,251,234,245,145,217,87,223,207,234,18,239,171,31,126,8,96,187,148,101,86,179,153,23,76,148,34,51,246,84,26,255,39,139,76,100,166,14,173,10,150,113,45,5,128,128,214,164,135,147,160,185,241,178,165,18,58,43,50,37,75,38,115,198,153,226,101,158,49,67,80,125,237,35,43,185,177,242,89,1,160,227,135,87,255,207,159,94,253,225,43,144,44,152,42,13,41,166,27,97,248,46,141,115,49,66,80,194,16,85,152,176,161,148,154,213,191,170,9,81,82,20,121,56,45,175,77,165,251,155,223,254,225,203,215,127,250,254,85,8,25,210,136,191,40,25,47,180,226,194,4,36,185,145,136,209,67,206,243,220,252,165,204,67,197,80,29,234,9,92,237,190,60,219,53,160,1,24,65,80,249,189,75,96,122,223,55,238,97,228,255,88,180,145,113,177,17,47,105,171,31,68,56,16,70,197,24,218,137,76,12,196,133,139,175,118,136,253,48,17,12,54,158,45,110,122,92,128,80,78,144,33,116,154,41,114,217,71,162,73,98,103,133,66,226,207,96,162,56,100,72,195,157,117,178,0,35,86,18,54,127,168,5,109,18,188,56,119,50,66,33,156,48,151,216,73,102,204,184,147,52,83,198,197,12,137,212,159,126,210,56,197,72,196,159,109,218,236,219,175,174,58,111,94,127,232,158,242,194,49,215,7,32,156,45,61,216,36,19,101,128,63,53,71,4,133,104,163,166,135,85,20,79,53,51,108,114,139,231,202,58,31,250,122,233,77,223,187,175,103,1,167,186,227,243,119,207,38,124,123,234,36,69,157,182,154,20,46,215,133,41,233,74,81,154,162,174,73,111,11,147,217,73,145,155,252,41,52,121,106,183,38,125,255,234,203,175,67,114,54,147,157,150,153,46,133,48,9,107,157,57,215,101,228,172,224,90,103,176,254,254,231,251,111,94,135,36,137,220,36,165,133,233,72,101,188,48,69,107,149,213,28,106,173,77,218,44,66,89,116,158,34,0,234,154,243,12,193,120,31,125,208,6,112,1,220,75,15,171,173,65,246,221,247,172,148,68,170,241,169,80,255,125,117,218,73,12,149,108,175,53,149,233,239,97,210,219,253,1,248,200,232,243,104,163,111,33,62,74,170,86,115,15,168,3,35,60,3,39,224,28,237,22,236,227,147,236,166,32,31,29,255,179,91,31,34,216,56,53,79,63,118,183,47,2,223,22,141,85,239,227,38,238,101,111,141,202,122,120,42,3,111,21,181,226,67,247,137,78,128,224,86,107,4,116,181,134,35,86,107,50,204,106,77,188,221,31,10,9,185,129,53,0,236,250,167,172,28,84,129,247,173,78,194,252,76,22,153,134,180,211,108,115,181,99,159,54,91,150,145,187,6,166,177,33,27,7,108,199,59,178,68,155,162,236,84,123,205,76,148,76,58,116,164,80,186,195,28,89,150,230,108,150,135,110,130,115,89,65,61,36,19,143,76,162,51,129,206,35,78,64,151,157,36,147,145,78,33,163,96,103,25,37,164,113,47,201,164,164,82,72,41,193,182,156,40,121,238,206,56,145,70,220,249,248,82,126,220,72,167,250,151,175,128,88,36,149,127,243,227,88,241,199,138,189,37,131,94,121,123,82,7,75,60,133,164,9,78,176,6,116,144,204,8,228,128,179,171,190,105,97,153,21,121,196,209,213,78,44,43,99,10,239,231,135,106,182,236,110,243,176,100,127,189,155,240,128,217,223,0,31,155,253,89,64,62,101,127,211,66,138,204,254,38,192,158,48,251,27,82,133,206,254,172,48,63,147,236,111,72,59,109,246,55,196,110,46,210,200,136,66,49,7,56,232,224,122,102,49,146,206,123,3,137,18,192,33,221,212,9,160,3,29,43,149,206,39,49,158,56,3,180,19,78,153,1,78,245,144,78,62,50,137,214,164,73,1,61,157,164,19,146,78,33,164,84,57,160,175,151,116,98,82,41,196,244,244,73,160,131,158,120,75,94,62,211,44,112,200,240,147,101,129,118,50,18,168,239,19,166,129,86,30,41,211,64,119,7,233,236,0,36,15,244,206,140,84,137,96,125,185,229,120,67,180,53,27,244,62,55,3,232,4,155,18,186,144,8,46,200,155,234,35,50,173,242,33,62,97,110,101,33,13,157,96,185,177,158,116,255,189,133,44,218,4,202,210,65,147,232,48,162,96,102,170,7,144,1,99,22,51,195,117,218,84,202,66,124,132,51,181,156,19,138,23,38,202,171,50,139,51,24,63,214,51,56,203,140,224,47,153,240,41,221,171,167,151,4,98,181,230,181,183,8,229,207,39,207,242,115,50,31,107,201,5,173,94,214,251,238,40,168,155,40,63,107,197,34,247,180,151,189,80,248,218,73,204,167,246,182,151,196,197,249,91,7,218,19,31,226,177,146,150,192,235,94,118,209,120,69,65,233,119,157,125,128,204,154,176,24,31,153,93,193,243,94,146,31,233,123,71,135,16,41,68,138,242,191,150,183,242,216,248,5,81,140,255,29,242,152,112,16,200,125,240,84,63,9,132,139,241,194,214,137,192,174,227,133,173,199,178,236,110,152,197,184,225,81,63,49,126,216,1,70,237,136,199,221,16,120,98,15,232,19,187,226,49,117,81,190,216,9,247,212,71,3,237,196,209,187,227,113,31,141,175,228,132,254,120,162,19,144,133,227,22,59,36,68,122,135,60,166,63,206,35,91,142,57,147,72,21,229,147,185,205,109,48,2,159,124,201,101,202,129,160,246,202,211,29,37,144,47,198,45,91,167,131,188,142,91,62,124,152,13,14,136,90,61,178,84,49,30,185,223,69,140,51,30,227,80,251,225,65,15,4,46,216,141,247,196,222,119,64,88,148,227,181,33,253,124,142,31,143,56,160,119,204,3,248,198,93,74,66,159,108,199,7,89,54,105,75,11,242,244,238,120,64,122,156,39,30,222,158,16,43,70,148,255,149,22,255,32,21,129,255,237,241,150,72,232,212,94,215,217,71,2,129,98,28,174,85,225,139,73,135,43,40,28,110,115,159,235,108,215,156,19,183,58,91,37,176,206,182,15,143,117,180,99,12,204,193,219,120,47,53,160,35,210,21,187,177,158,208,13,15,136,66,187,96,27,202,83,156,244,30,208,65,235,68,7,208,141,131,83,68,14,212,142,13,178,82,202,98,75,148,74,235,60,7,100,211,238,112,180,66,99,5,210,153,109,37,210,60,187,96,165,154,254,102,139,24,25,226,118,235,89,181,202,121,102,75,182,57,33,142,67,74,225,71,132,113,195,107,80,98,100,142,138,223,194,244,182,39,114,168,184,19,136,153,50,112,115,226,167,155,253,18,18,180,249,166,132,101,70,144,6,109,239,219,91,76,172,81,155,102,177,81,219,17,63,54,108,235,129,224,226,182,192,75,80,226,47,63,28,82,76,20,225,89,192,158,65,136,119,162,42,58,198,27,192,80,150,190,134,29,164,137,222,78,216,77,136,165,137,131,149,11,112,144,193,210,22,179,162,197,117,226,183,19,221,105,2,184,33,54,86,36,157,13,215,44,237,241,157,33,217,9,221,219,184,131,116,178,81,16,255,102,85,68,237,240,111,42,145,127,123,57,105,253,163,68,126,66,78,39,108,127,42,97,32,222,206,215,155,217,126,185,61,254,106,54,59,254,117,102,136,122,220,173,143,92,101,31,138,172,247,15,99,25,236,159,193,158,96,3,191,49,252,239,78,231,91,131,185,30,51,45,226,223,215,2,160,138,36,168,245,92,112,60,143,113,82,181,197,187,245,195,97,189,217,191,252,221,124,255,230,55,167,191,252,18,71,131,179,234,170,134,139,103,145,216,246,25,9,103,242,115,31,25,150,165,199,146,192,228,0,96,101,26,88,128,170,241,241,187,133,206,131,200,220,173,107,38,106,90,62,126,108,255,247,237,118,251,248,223,59,99,208,126,102,4,136,46,1,138,127,113,206,6,107,57,150,64,133,119,166,146,193,101,228,235,219,178,117,206,191,127,221,207,146,101,37,130,151,215,133,149,81,176,34,155,204,147,89,247,212,219,52,178,37,185,23,4,190,9,2,43,210,192,42,20,172,106,97,243,248,105,104,137,117,156,155,62,101,26,88,145,6,86,161,96,91,217,74,78,42,91,214,62,170,41,117,60,110,62,150,194,120,221,28,46,92,8,172,36,134,29,212,55,19,1,159,45,14,12,188,77,139,100,73,58,116,173,55,87,25,41,108,235,252,20,35,133,109,245,87,9,82,216,118,186,41,69,10,171,91,88,157,6,54,168,254,251,57,224,209,93,216,67,225,183,79,253,84,50,232,161,234,219,231,248,218,238,109,202,151,107,159,252,205,105,214,90,129,156,253,60,222,178,6,61,9,15,23,67,161,255,29,159,222,38,194,253,213,77,6,197,198,95,36,123,155,232,234,213,219,68,151,3,223,166,186,147,249,246,201,175,159,76,121,63,232,109,162,251,189,111,159,219,149,179,41,47,251,188,77,117,147,215,109,170,187,175,110,83,93,208,118,155,236,102,188,219,103,112,255,79,202,43,154,110,83,221,180,120,251,236,46,254,74,122,225,210,237,51,184,195,34,245,165,35,183,169,174,146,73,122,77,199,237,51,56,64,117,133,163,111,183,169,14,55,38,61,38,118,251,12,14,157,167,191,43,224,54,213,77,16,73,79,214,223,62,131,131,16,105,207,172,220,166,58,129,148,244,164,199,109,170,157,206,183,207,96,19,101,194,77,174,183,169,182,204,223,62,183,93,211,73,247,172,222,166,218,166,117,155,106,219,205,237,179,218,60,69,225,116,227,118,101,121,192,115,155,60,8,86,128,97,192,34,21,112,248,150,159,223,172,15,239,215,251,10,178,235,199,70,73,206,200,54,254,96,224,69,90,120,73,7,111,65,87,200,177,242,107,185,173,210,149,107,130,42,6,8,88,166,2,6,5,92,32,100,141,68,238,12,85,78,80,189,182,2,23,220,161,75,122,168,169,222,189,66,182,218,75,161,8,118,139,129,128,147,237,77,132,145,33,9,249,59,226,178,172,204,132,228,5,55,107,110,89,145,153,213,183,204,44,193,105,145,179,34,207,84,102,126,151,101,185,226,146,153,53,59,161,121,81,72,45,205,234,157,20,92,215,75,120,202,196,224,102,45,47,47,138,186,86,26,182,166,214,39,44,111,9,43,25,124,159,28,157,224,253,100,48,156,224,133,238,144,213,4,131,105,144,33,52,219,42,87,37,197,158,76,16,48,196,156,193,144,211,205,95,16,25,18,39,57,217,46,10,242,204,85,239,21,215,96,48,128,14,158,140,67,164,58,43,214,33,23,62,154,233,161,177,68,23,45,50,19,212,68,251,161,177,68,151,29,178,119,12,129,208,186,219,253,58,185,159,57,249,4,208,221,136,51,77,43,60,205,59,228,156,24,89,116,200,20,90,106,169,164,115,86,198,199,234,48,224,218,144,126,86,35,55,65,7,121,7,5,68,83,65,200,121,50,69,5,145,161,113,67,115,54,212,252,250,174,8,70,7,79,198,33,114,190,156,253,5,47,41,12,100,31,186,13,97,185,32,177,189,182,99,18,34,39,152,229,32,96,153,10,88,36,147,69,145,12,57,157,221,0,145,161,113,99,162,187,224,64,186,60,184,66,138,46,0,90,94,67,118,1,116,136,100,194,227,8,135,216,235,33,63,31,134,162,8,108,250,200,157,209,163,88,174,235,35,155,53,226,22,90,121,5,158,0,155,95,67,169,66,8,129,200,207,118,162,108,188,245,190,87,248,5,200,15,140,61,121,196,47,82,134,24,98,120,66,57,130,170,255,129,240,24,111,6,35,92,0,14,249,120,161,109,7,4,130,235,192,96,186,65,103,136,48,180,115,12,237,157,53,84,57,237,108,238,242,71,85,164,2,30,109,192,187,152,61,144,131,162,129,61,196,11,188,203,126,53,163,149,75,151,38,80,28,173,233,3,171,14,88,80,132,242,62,228,147,160,59,228,191,161,14,202,244,123,209,93,47,196,14,139,169,78,83,114,18,135,15,196,78,231,240,129,132,36,147,95,118,123,211,94,121,242,114,190,250,113,94,95,81,178,220,190,219,28,170,93,115,173,20,184,203,110,254,229,57,177,54,59,176,143,208,89,168,222,90,182,59,113,146,229,55,16,176,72,5,12,217,230,14,67,214,201,38,3,136,12,133,147,92,87,46,241,31,11,11,65,214,182,123,26,4,77,84,13,198,78,25,85,99,136,1,68,213,24,120,65,13,143,137,170,97,132,131,162,106,31,116,84,84,13,166,27,22,85,35,104,231,100,180,219,192,113,193,141,101,139,31,39,89,118,239,3,231,221,77,44,130,34,182,129,65,167,11,109,96,116,164,18,94,63,176,57,94,83,89,95,126,185,133,4,53,253,222,138,174,55,69,236,61,236,208,176,144,198,178,181,79,176,169,107,109,58,201,124,179,89,85,31,190,220,172,254,92,127,25,114,92,2,214,87,9,17,10,8,185,72,166,190,32,50,114,128,246,130,128,117,194,125,178,112,125,73,194,162,76,5,44,112,192,93,205,93,176,146,98,193,2,6,45,175,161,208,1,116,164,19,30,102,193,162,215,67,222,86,25,4,151,209,62,45,110,210,4,144,194,112,98,44,68,135,92,62,49,147,1,164,32,153,100,234,124,247,90,78,17,249,0,177,249,53,166,90,8,33,16,249,21,182,155,235,74,154,132,19,140,157,50,225,196,16,195,19,202,17,114,131,43,98,198,133,209,131,201,80,97,156,30,147,163,136,184,208,215,91,204,169,74,20,56,46,241,179,92,46,37,36,163,157,191,172,219,84,40,156,23,193,73,228,72,135,96,167,219,174,5,36,132,167,147,31,251,252,58,115,214,79,75,63,17,253,176,221,181,213,245,61,32,19,29,244,199,187,254,72,22,139,252,216,176,92,212,114,154,73,56,207,115,66,182,22,129,128,35,147,92,80,95,160,13,96,32,228,28,39,30,217,1,147,20,43,172,200,150,157,9,207,27,210,158,210,226,96,45,158,7,230,207,74,219,125,193,20,94,166,127,48,175,75,82,242,146,34,200,134,65,243,100,68,67,116,87,100,182,59,137,9,174,225,130,1,199,89,35,88,95,69,50,241,228,56,241,240,110,72,157,43,111,28,73,115,0,52,96,242,8,219,203,21,37,35,73,177,224,216,160,101,23,20,60,79,11,47,168,225,17,57,16,144,112,200,42,157,23,58,102,149,14,78,247,9,61,194,200,32,216,145,100,236,216,192,81,249,155,176,220,86,38,74,65,107,28,68,119,15,189,243,94,76,142,84,210,0,232,84,68,15,22,204,234,119,176,112,201,202,160,79,221,245,73,113,70,197,15,13,74,85,132,229,244,148,244,95,76,25,64,39,8,56,217,182,26,24,25,42,21,127,144,74,70,31,57,239,144,41,118,254,193,144,57,78,24,126,96,134,37,185,83,119,46,8,214,166,128,208,242,26,42,26,64,7,114,14,6,32,35,214,166,6,61,116,35,79,177,32,52,64,46,58,100,69,139,204,100,231,17,132,32,158,97,33,216,252,26,74,21,66,8,68,126,150,131,115,82,40,154,20,1,140,157,112,21,6,69,12,79,40,71,88,66,17,6,143,73,40,96,132,131,18,10,31,116,84,66,129,1,199,69,224,150,107,79,37,197,10,232,0,184,219,8,46,229,213,15,165,67,9,225,233,120,100,72,213,245,99,15,207,5,172,102,251,246,234,214,217,97,139,201,10,6,157,119,239,109,249,143,158,210,96,195,242,2,203,201,48,169,100,252,46,38,24,176,72,5,12,10,20,165,37,186,85,36,165,89,203,166,127,169,51,26,87,10,198,134,85,219,48,240,60,45,188,160,134,199,56,71,24,225,32,231,232,131,142,114,142,96,186,105,213,37,102,79,60,10,28,231,216,45,23,23,75,138,147,144,3,224,206,47,233,130,216,200,120,161,251,46,207,180,152,29,63,1,184,56,101,123,81,50,207,168,217,176,66,195,28,156,182,61,206,72,240,2,40,12,24,84,24,210,22,63,84,144,84,95,65,200,16,181,182,61,129,89,76,109,134,238,180,239,30,161,125,160,222,4,142,141,110,218,219,14,231,1,68,126,45,72,109,95,167,15,119,12,150,23,65,101,65,112,218,94,88,54,180,201,146,211,4,63,96,108,152,55,195,192,243,180,240,130,26,30,19,252,192,8,7,5,63,62,232,168,224,7,3,142,11,32,10,219,179,189,146,118,54,117,143,118,202,178,164,240,14,48,104,22,107,197,251,239,66,102,221,27,196,156,160,30,14,67,230,201,144,65,113,143,101,183,156,202,74,138,120,2,132,156,174,148,84,142,131,15,197,36,133,226,130,144,33,147,173,180,196,162,138,51,226,225,62,107,18,87,196,226,8,128,6,200,67,90,246,80,41,65,83,199,128,99,39,92,18,64,17,195,19,202,17,228,248,3,225,17,142,223,139,60,114,160,24,231,41,109,219,222,148,160,152,27,64,232,100,215,46,131,232,232,39,235,213,230,176,251,56,123,220,174,55,135,112,87,59,232,173,179,144,130,226,202,26,63,52,40,93,151,150,221,83,74,78,221,88,147,102,120,64,100,0,66,147,62,48,107,143,145,42,69,144,130,247,145,207,26,165,202,107,175,72,3,233,128,112,104,217,138,163,180,10,41,50,28,170,253,225,204,81,248,188,1,245,40,112,172,176,14,56,143,169,10,92,13,178,136,44,52,244,81,219,44,67,229,4,123,154,165,101,221,87,229,210,31,157,164,128,78,25,156,96,136,225,105,121,21,212,240,152,224,196,135,76,19,156,244,122,17,162,235,166,188,246,202,60,144,14,142,155,71,1,200,140,194,208,246,186,148,157,169,41,8,106,1,64,100,158,12,25,20,84,89,214,184,85,65,240,96,17,12,88,34,73,238,172,122,105,173,115,3,247,30,74,203,173,164,170,204,9,6,80,90,234,93,154,100,247,182,180,172,84,234,140,102,239,28,28,27,84,243,70,193,243,180,240,130,26,30,227,93,96,132,67,106,222,94,232,152,154,55,10,28,231,25,45,139,230,58,35,216,13,55,0,110,115,76,205,56,241,68,245,66,15,23,205,55,171,217,219,106,191,159,223,3,106,222,131,238,138,174,59,106,147,99,135,134,37,226,150,229,109,205,9,78,147,194,128,85,42,96,153,10,24,100,83,64,200,57,18,153,117,147,145,83,28,142,150,150,213,119,45,104,142,142,194,177,97,190,13,3,207,211,194,11,106,248,187,228,67,10,242,109,62,232,40,223,6,166,155,86,93,98,54,179,161,104,231,73,105,23,24,218,59,227,34,40,138,152,150,77,40,154,226,48,139,29,88,18,62,249,16,216,67,188,192,69,7,174,105,229,34,59,224,156,22,88,117,192,20,251,28,189,200,36,79,62,12,134,179,147,140,204,137,25,240,66,103,151,197,149,227,113,229,229,118,83,163,67,150,128,250,157,118,98,147,37,53,63,86,104,88,228,153,91,22,16,180,162,40,16,91,182,255,104,69,240,132,36,12,88,165,2,150,169,128,65,177,4,8,57,71,34,159,99,90,173,41,98,90,203,22,25,61,222,58,141,139,105,193,216,176,32,5,3,207,211,194,11,106,248,187,228,67,10,138,105,125,208,81,49,45,152,110,90,117,137,138,105,49,180,243,164,180,11,12,237,103,227,66,177,108,93,90,2,67,146,245,78,43,48,163,140,105,195,122,136,23,120,23,211,230,130,86,46,93,120,149,75,90,224,46,206,201,41,174,191,240,34,211,196,180,165,45,240,44,36,49,3,94,232,81,76,187,170,30,170,251,249,161,58,6,183,128,152,182,180,5,158,133,166,230,199,10,13,139,105,75,91,76,91,16,228,89,202,178,35,79,151,58,62,66,132,1,139,84,192,144,0,17,134,172,83,145,172,82,45,249,247,201,232,44,102,73,145,83,247,145,219,217,155,103,140,86,61,207,183,196,231,140,17,4,237,80,108,126,141,113,9,33,4,34,63,203,70,196,156,209,44,36,195,177,19,110,106,66,17,195,19,202,17,148,198,4,194,35,210,24,32,225,144,52,198,11,29,147,198,192,233,6,165,49,24,218,57,25,237,100,231,204,149,229,10,199,156,229,180,118,227,124,109,123,206,41,174,151,131,98,243,116,100,39,219,159,15,35,164,31,208,174,170,199,237,126,13,168,204,14,187,226,93,87,20,165,230,0,108,80,28,171,44,27,162,115,65,176,33,26,6,12,217,152,214,71,214,29,114,65,112,150,4,134,12,153,188,150,141,172,185,164,89,97,135,99,195,236,50,6,158,167,133,23,212,240,24,55,14,35,28,228,198,125,208,81,110,28,3,142,115,133,150,187,212,114,41,104,103,83,183,205,51,151,36,105,19,4,122,84,245,168,207,76,215,5,143,106,55,155,175,86,187,106,15,216,48,61,232,185,205,5,115,149,81,51,101,133,134,185,12,203,150,227,92,17,92,192,2,3,6,185,12,105,49,236,154,81,184,12,16,50,68,201,45,187,60,115,45,105,92,6,24,27,230,50,48,240,60,45,188,160,134,199,184,12,24,225,32,151,225,131,142,114,25,24,112,156,203,176,108,56,206,181,166,157,77,103,187,158,83,156,251,7,65,91,93,198,190,250,199,187,106,179,68,121,13,219,21,97,121,46,168,249,178,66,195,188,134,101,103,108,94,48,2,175,1,2,6,121,13,109,177,237,5,197,253,22,48,100,136,158,231,54,97,228,52,94,3,140,13,243,26,24,120,158,22,94,80,195,99,188,6,140,112,144,215,240,65,71,121,13,12,56,206,107,88,54,175,230,69,73,59,155,206,166,189,164,88,94,5,65,219,19,141,102,199,32,194,105,228,54,203,94,106,106,182,172,208,48,167,97,217,122,86,100,4,151,25,195,128,69,42,96,13,17,45,8,89,225,72,238,84,177,96,36,153,103,97,57,140,85,48,138,155,47,129,208,144,89,111,217,148,84,112,18,154,65,200,72,146,187,141,148,5,215,196,52,7,64,3,136,214,150,53,248,66,72,130,245,12,24,50,79,69,50,68,22,204,6,76,243,64,58,28,27,20,183,161,224,121,90,120,65,13,143,136,219,128,132,67,226,54,47,116,76,220,6,167,155,86,93,98,214,121,81,224,168,152,83,91,214,121,11,138,167,214,181,101,221,172,144,20,171,91,48,228,68,36,219,79,191,236,15,219,221,252,190,170,99,218,253,122,127,48,197,144,143,225,225,172,182,92,106,84,144,20,206,189,200,160,96,86,91,86,94,10,127,121,59,128,76,16,176,72,5,12,9,102,97,200,10,71,242,57,152,37,121,74,92,91,150,39,138,156,226,85,96,24,50,100,102,74,91,240,150,43,98,154,3,160,33,68,91,202,205,69,65,18,23,130,144,121,42,146,145,178,232,132,92,80,4,223,150,170,105,81,210,92,252,10,199,134,69,16,24,120,158,22,94,80,195,99,2,78,24,225,160,128,211,7,29,21,112,130,233,166,85,151,168,128,19,3,142,11,56,181,197,18,148,4,181,3,157,219,88,160,184,126,30,134,156,136,228,81,192,185,171,102,245,149,187,115,179,224,6,136,49,45,37,230,50,163,88,62,244,34,195,98,76,75,145,176,204,8,238,153,131,1,67,30,105,131,33,75,28,201,237,34,91,73,82,123,132,33,67,20,219,82,32,44,57,197,62,21,24,50,146,228,78,127,185,32,6,22,29,50,197,253,6,185,165,140,87,18,93,120,4,199,6,121,51,20,60,79,11,47,168,225,17,193,15,144,112,72,240,227,133,142,9,126,80,224,168,0,162,223,83,55,81,41,110,226,201,153,141,5,138,0,2,134,156,136,228,203,183,100,129,143,226,228,150,66,97,41,41,34,7,47,50,40,114,200,45,69,188,82,18,184,97,24,176,72,5,12,169,78,193,144,1,213,169,220,82,246,42,73,30,164,205,45,37,164,82,83,44,0,194,144,33,147,176,95,65,234,194,40,146,39,39,115,75,61,166,204,105,94,168,131,99,195,28,60,6,158,167,133,23,212,240,24,7,15,35,28,228,224,125,208,81,14,30,76,55,173,186,196,84,55,80,224,184,224,196,82,231,44,41,110,248,200,45,5,154,178,160,200,168,96,200,137,72,238,7,39,187,106,249,110,183,95,255,88,205,48,97,138,165,188,84,22,20,251,136,189,200,176,48,197,82,250,41,75,130,109,196,48,96,200,54,226,62,114,222,33,83,172,193,192,144,25,78,24,221,51,121,44,35,41,120,229,150,122,143,129,38,114,206,112,112,152,185,69,225,243,196,248,130,28,31,227,160,129,164,131,60,180,23,59,202,69,163,208,113,126,206,242,138,172,233,138,194,209,21,150,119,200,12,116,73,60,101,253,216,125,159,180,222,44,119,213,124,95,129,221,145,237,89,86,150,49,106,3,228,192,134,185,164,210,166,62,140,34,93,132,33,203,100,200,32,59,0,131,206,211,65,3,238,131,42,50,27,178,179,58,6,113,210,64,104,192,148,47,152,21,153,230,140,40,2,28,228,73,113,248,60,49,190,32,199,71,204,32,40,233,16,79,234,199,142,241,164,8,202,137,149,38,38,221,45,152,205,57,11,69,59,83,249,25,89,39,67,206,9,239,12,13,237,34,94,232,226,140,94,210,138,230,156,195,200,140,22,89,157,145,41,130,19,63,52,201,197,161,253,110,244,185,27,10,167,196,109,83,84,81,44,187,3,161,83,17,109,223,194,252,126,125,120,51,155,239,118,115,192,206,229,130,219,12,142,162,56,95,232,135,6,197,184,133,176,9,72,19,60,242,4,68,150,201,144,69,50,100,72,136,11,132,214,56,162,207,230,80,83,156,250,116,64,71,61,85,124,69,204,216,247,143,29,176,165,29,150,99,96,207,174,32,39,168,48,247,145,217,217,252,231,20,143,137,65,177,121,58,178,65,42,44,109,243,174,160,48,67,48,100,145,12,89,167,19,135,194,17,125,158,44,36,87,124,59,160,227,76,198,245,48,163,205,144,180,217,139,146,34,222,149,214,137,231,188,168,90,32,7,45,4,155,167,35,155,37,36,59,9,118,47,11,160,20,202,40,195,64,42,33,0,190,78,98,46,153,129,245,213,174,127,49,83,151,38,208,120,203,202,183,65,86,4,238,0,134,44,146,33,131,220,1,12,90,225,136,150,103,100,18,151,110,133,102,89,148,233,190,30,38,139,117,7,202,226,14,24,19,180,147,227,60,199,25,167,120,2,0,138,205,211,145,13,210,53,109,155,32,156,224,118,22,32,178,76,134,44,146,33,231,233,4,173,113,68,159,167,33,47,136,181,163,7,93,70,89,141,171,97,138,44,214,18,217,97,89,108,126,172,109,6,142,100,97,77,91,45,133,36,49,112,64,108,158,142,108,144,10,231,182,121,39,41,230,29,12,89,37,67,150,201,144,69,58,65,23,233,160,115,156,60,122,138,87,16,43,94,15,58,206,206,93,13,83,69,219,78,59,108,180,237,180,195,218,85,129,69,234,129,146,132,212,158,243,60,69,177,124,106,71,182,223,219,201,1,218,96,123,217,150,177,156,196,131,0,177,33,30,4,8,61,156,200,127,251,233,167,255,31,40,99,59,131,51,192,5,0],"entry_points_by_type":{"CONSTRUCTOR":[{"offset":293,"selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}],"EXTERNAL":[{"offset":1034,"selector":"0x5fbd85570830519219bb4ad6951316f96fce363f86909d1f8adb1fdc836471"},{"offset":339,"selector":"0x7772be8b80a8a33dc6c1f9a6ab820c02e537c73e859de67f288c70f92571bb"},{"offset":931,"selector":"0x8a2a3272a92492ded6c04f7c85df9c53134cef398564465f12af3c9c986d41"},{"offset":787,"selector":"0xbd7daa40535813d892224da817610f4c7e6fe8983abe588a4227586262d9d3"},{"offset":741,"selector":"0xe8f69bd941db5b0bff2e416c63d46f067fcdfad558c528f9fd102ba368cb5f"},{"offset":605,"selector":"0x12ead94ae9d3f9d2bdb6b847cf255f1f398193a1f88884a0ae8e18f24a037b6"},{"offset":839,"selector":"0x19a35a6e95cb7a3318dbb244f20975a1cd8587cc6b5259f15f61d7beb7ee43b"},{"offset":435,"selector":"0x1ae1a515cf2d214b29bdf63a79ee2d490efd4dd1acc99d383a8e549c3cecb5d"},{"offset":972,"selector":"0x1b1343fe0f4a16bed5e5133b5ca9f03ab15976bb2df2b6d263ac3170b8b6a13"},{"offset":530,"selector":"0x1cad42b55a5b2c7366b371db59448730766dfef74c0156c9c6f332c8c5e34d9"},{"offset":574,"selector":"0x1eaab699414d786ce9dbfd4e86815f66680647efd13f9334ac97148e4e30e82"},{"offset":890,"selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64"},{"offset":492,"selector":"0x26813d396fdb198e9ead934e4f7a592a8b88a059e45ab0eb6ee53494e8d45b0"},{"offset":631,"selector":"0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c"},{"offset":668,"selector":"0x29cef374bfc7ad2628f04d9a18ac3c3a259c1eb3ce3d3c77bbab281c42649fc"},{"offset":391,"selector":"0x30f842021fbf02caf80d09a113997c1e00a32870eee0c6136bed27acb348bea"},{"offset":256,"selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f"},{"offset":764,"selector":"0x33ce93a3eececa5c9fc70da05f4aff3b00e1820b79587924d514bc76788991a"},{"offset":1002,"selector":"0x34c4c150632e67baf44fc50e9a685184d72a822510a26a66f72058b5e7b2892"},{"offset":460,"selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3"}],"L1_HANDLER":[{"offset":715,"selector":"0xc73f681176fc7b3f9693986fd7b14581e8d540519e27400e88b8713932be01"}]},"abi":[{"Struct":{"type":"struct","name":"IndexAndValues","size":3,"members":[{"name":"index","type":"felt","offset":0},{"name":"values","type":"(felt, felt)","offset":1}]}},{"Function":{"type":"function","name":"advance_counter","inputs":[{"name":"index","type":"felt"},{"name":"diffs_len","type":"felt"},{"name":"diffs","type":"felt*"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"constructor","name":"constructor","inputs":[{"name":"address","type":"felt"},{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"xor_counters","inputs":[{"name":"index_and_x","type":"IndexAndValues"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"call_xor_counters","inputs":[{"name":"address","type":"felt"},{"name":"index_and_x","type":"IndexAndValues"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"add_signature_to_counters","inputs":[{"name":"index","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"set_value","inputs":[{"name":"address","type":"felt"},{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"get_value","inputs":[{"name":"address","type":"felt"}],"outputs":[{"name":"res","type":"felt"}],"stateMutability":null}},{"Function":{"type":"function","name":"entry_point","inputs":[],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_builtins","inputs":[],"outputs":[{"name":"result","type":"felt"}],"stateMutability":null}},{"Function":{"type":"function","name":"send_message","inputs":[{"name":"to_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_call_contract","inputs":[{"name":"contract_address","type":"felt"},{"name":"function_selector","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_delegate_call","inputs":[{"name":"contract_address","type":"felt"},{"name":"function_selector","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"l1_handler","name":"deposit","inputs":[{"name":"from_address","type":"felt"},{"name":"amount","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_get_caller_address","inputs":[{"name":"expected_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_get_sequencer_address","inputs":[{"name":"expected_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_get_contract_address","inputs":[{"name":"expected_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_call_storage_consistency","inputs":[{"name":"other_contract_address","type":"felt"},{"name":"address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_re_entrance","inputs":[{"name":"other_contract_address","type":"felt"},{"name":"depth","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"add_value","inputs":[{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"recursive_add_value","inputs":[{"name":"self_address","type":"felt"},{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"increase_value","inputs":[{"name":"address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_call_with_array","inputs":[{"name":"self_address","type":"felt"},{"name":"arr_len","type":"felt"},{"name":"arr","type":"felt*"}],"outputs":[],"stateMutability":null}}]}}}],"commitments":{"transaction_count":null,"transaction_commitment":null,"event_count":null,"event_commitment":null,"state_diff_length":null,"state_diff_commitment":null,"receipt_commitment":null,"global_state_root":"0x21870ba80540e7831fb21c591ee93481f5ae1bb71ff85a86ddd465be4eddee6","block_hash":"0x47c3637b57c2b079b93c61539950c17e868a28f46cdef28f88521067f21e943"}} \ No newline at end of file +{"signature":["0x7760328cdb34f4586b46c1f395df1ea752900181a3d49cf59102d1bdb68f339","0x5e94d2e46a57561a906d2f98e3259a9d7703e02dfbe1067c016a2a0975f140d"],"unverified_block_number":0,"header":{"parent_block_hash":"0x0","sequencer_address":"0x0","block_timestamp":1637069048,"protocol_version":[0,0,0,0],"l1_gas_price":{"eth_l1_gas_price":0,"strk_l1_gas_price":0,"eth_l1_data_gas_price":1,"strk_l1_data_gas_price":1},"l1_da_mode":"CALLDATA"},"state_diff":{"storage_diffs":[{"address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","storage_entries":[{"key":"0x5","value":"0x22b"},{"key":"0x313ad57fdf765addc71329abf8d74ac2bce6d46da8c2b9b82255a5076620300","value":"0x4e7e989d58a17cd279eca440c5eaa829efb6f9967aaad89022acbe644c39b36"},{"key":"0x313ad57fdf765addc71329abf8d74ac2bce6d46da8c2b9b82255a5076620301","value":"0x453ae0c9610197b18b13645c44d3d0a407083d96562e8752aab3fab616cecb0"},{"key":"0x5aee31408163292105d875070f98cb48275b8c87e80380b78d30647e05854d5","value":"0x7e5"},{"key":"0x6cf6c2f36d36b08e591e4489e92ca882bb67b9c39a3afccf011972a8de467f0","value":"0x7ab344d88124307c07b56f6c59c12f4543e9c96398727854a322dea82c73240"}]},{"address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","storage_entries":[{"key":"0xdf28e613c065616a2e79ca72f9c1908e17b8c913972a9993da77588dc9cae9","value":"0x1432126ac23c7028200e443169c2286f99cdb5a7bf22e607bcd724efa059040"},{"key":"0x5f750dc13ed239fa6fc43ff6e10ae9125a33bd05ec034fc3bb4dd168df3505f","value":"0x7c7"}]},{"address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","storage_entries":[{"key":"0x5","value":"0x65"},{"key":"0xcfc2e2866fd08bfb4ac73b70e0c136e326ae18fc797a2c090c8811c695577e","value":"0x5f1dd5a5aef88e0498eeca4e7b2ea0fa7110608c11531278742f0b5499af4b3"},{"key":"0x5aee31408163292105d875070f98cb48275b8c87e80380b78d30647e05854d5","value":"0x7c7"},{"key":"0x5fac6815fddf6af1ca5e592359862ede14f171e1544fd9e792288164097c35d","value":"0x299e2f4b5a873e95e65eb03d31e532ea2cde43b498b50cd3161145db5542a5"},{"key":"0x5fac6815fddf6af1ca5e592359862ede14f171e1544fd9e792288164097c35e","value":"0x3d6897cf23da3bf4fd35cc7a43ccaf7c5eaf8f7c5b9031ac9b09a929204175f"}]},{"address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","storage_entries":[{"key":"0x1e2cd4b3588e8f6f9c4e89fb0e293bf92018c96d7a93ee367d29a284223b6ff","value":"0x71d1e9d188c784a0bde95c1d508877a0d93e9102b37213d1e13f3ebc54a7751"},{"key":"0x449908c349e90f81ab13042b1e49dc251eb6e3e51092d9a40f86859f7f415b0","value":"0x6cb6104279e754967a721b52bcf5be525fdc11fa6db6ef5c3a4db832acf7804"},{"key":"0x48cba68d4e86764105adcdcf641ab67b581a55a4f367203647549c8bf1feea2","value":"0x362d24a3b030998ac75e838955dfee19ec5b6eceb235b9bfbeccf51b6304d0b"},{"key":"0x5bdaf1d47b176bfcd1114809af85a46b9c4376e87e361d86536f0288a284b65","value":"0x28dff6722aa73281b2cf84cac09950b71fa90512db294d2042119abdd9f4b87"},{"key":"0x5bdaf1d47b176bfcd1114809af85a46b9c4376e87e361d86536f0288a284b66","value":"0x57a8f8a019ccab5bfc6ff86c96b1392257abb8d5d110c01d326b94247af161c"},{"key":"0x5f750dc13ed239fa6fc43ff6e10ae9125a33bd05ec034fc3bb4dd168df3505f","value":"0x7e5"}]},{"address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","storage_entries":[{"key":"0x5","value":"0x64"},{"key":"0x2f50710449a06a9fa789b3c029a63bd0b1f722f46505828a9f815cf91b31d8","value":"0x2a222e62eabe91abdb6838fa8b267ffe81a6eb575f61e96ec9aa4460c0925a2"}]}],"deprecated_declared_classes":[],"declared_classes":[],"deployed_contracts":[{"address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"},{"address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}],"replaced_classes":[],"nonces":[]},"transactions":[{"Deploy":{"version":"0x0","contract_address_salt":"0x546c86dc6e40a5e5492b782d8964e9a4274ff6ecb16d31eb09cee45a3564015","constructor_calldata":["0x6cf6c2f36d36b08e591e4489e92ca882bb67b9c39a3afccf011972a8de467f0","0x7ab344d88124307c07b56f6c59c12f4543e9c96398727854a322dea82c73240"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Deploy":{"version":"0x0","contract_address_salt":"0x12afa0f342ece0468ca9810f0ea59f9c7204af32d1b8b0d318c4f2fe1f384e","constructor_calldata":["0xcfc2e2866fd08bfb4ac73b70e0c136e326ae18fc797a2c090c8811c695577e","0x5f1dd5a5aef88e0498eeca4e7b2ea0fa7110608c11531278742f0b5499af4b3"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","entry_point_selector":"0x12ead94ae9d3f9d2bdb6b847cf255f1f398193a1f88884a0ae8e18f24a037b6","calldata":["0xc84dd7fd43a7defb5b7a15c4fbbe11cbba6db1ba"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","0x0"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","entry_point_selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","calldata":["0x7dbfec95c10bbc2fd3f37a89ae6e027826134f955251d11c784a6b34fdf50","0x2","0x4e7e989d58a17cd279eca440c5eaa829efb6f9967aaad89022acbe644c39b36","0x453ae0c9610197b18b13645c44d3d0a407083d96562e8752aab3fab616cecb0"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c","calldata":["0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","0x4","0x4be52041fee36ab5199771acf4b5d260d223297e588654e5c9477df2efa542a","0x2","0x299e2f4b5a873e95e65eb03d31e532ea2cde43b498b50cd3161145db5542a5","0x3d6897cf23da3bf4fd35cc7a43ccaf7c5eaf8f7c5b9031ac9b09a929204175f"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","0x1"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","entry_point_selector":"0x19a35a6e95cb7a3318dbb244f20975a1cd8587cc6b5259f15f61d7beb7ee43b","calldata":["0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","0x5aee31408163292105d875070f98cb48275b8c87e80380b78d30647e05854d5"]}}},{"Deploy":{"version":"0x0","contract_address_salt":"0x5098705e4d57a8620e5b387855ef4dc82f0ccd84b7299dc1179b87517249127","constructor_calldata":["0x48cba68d4e86764105adcdcf641ab67b581a55a4f367203647549c8bf1feea2","0x362d24a3b030998ac75e838955dfee19ec5b6eceb235b9bfbeccf51b6304d0b"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Deploy":{"version":"0x0","contract_address_salt":"0x60bc7461113e4af46fd52e5ecbc5c3f4be92ed7f1329d53721f9bfbc0370cc","constructor_calldata":["0x2f50710449a06a9fa789b3c029a63bd0b1f722f46505828a9f815cf91b31d8","0x2a222e62eabe91abdb6838fa8b267ffe81a6eb575f61e96ec9aa4460c0925a2"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3","calldata":["0x1e2cd4b3588e8f6f9c4e89fb0e293bf92018c96d7a93ee367d29a284223b6ff","0x71d1e9d188c784a0bde95c1d508877a0d93e9102b37213d1e13f3ebc54a7751"]}}},{"Deploy":{"version":"0x0","contract_address_salt":"0x63d1a6f8130958509e2e695c25b147f43f66f56bba49fddb7ee363d8f57a774","constructor_calldata":["0xdf28e613c065616a2e79ca72f9c1908e17b8c913972a9993da77588dc9cae9","0x1432126ac23c7028200e443169c2286f99cdb5a7bf22e607bcd724efa059040"],"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8"}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","0x1"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c","entry_point_selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64","calldata":["0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","0x0"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f","calldata":["0x1a7cf8b8027ec2d8fd04f1277f3f8ae6379ca957c5fec9ee7f59d56d86a26e4","0x2","0x28dff6722aa73281b2cf84cac09950b71fa90512db294d2042119abdd9f4b87","0x57a8f8a019ccab5bfc6ff86c96b1392257abb8d5d110c01d326b94247af161c"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","entry_point_selector":"0x19a35a6e95cb7a3318dbb244f20975a1cd8587cc6b5259f15f61d7beb7ee43b","calldata":["0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","0x5f750dc13ed239fa6fc43ff6e10ae9125a33bd05ec034fc3bb4dd168df3505f"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3","calldata":["0x449908c349e90f81ab13042b1e49dc251eb6e3e51092d9a40f86859f7f415b0","0x2670b3a8266d5046696a4b79f7433d117d3a19166f15bbd8585822c4e9b7491"]}}},{"Invoke":{"V0":{"max_fee":"0x0","signature":[],"contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae","entry_point_selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3","calldata":["0x449908c349e90f81ab13042b1e49dc251eb6e3e51092d9a40f86859f7f415b0","0x6cb6104279e754967a721b52bcf5be525fdc11fa6db6ef5c3a4db832acf7804"]}}}],"receipts":[{"Deploy":{"transaction_hash":"0xe0a2e45a80bb827967e096bcf58874f6c01c191e0a0530624cba66a508ae75","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6"}},{"Deploy":{"transaction_hash":"0x12c96ae3c050771689eb261c9bf78fac2580708c7f1f3d69a9647d8be59f1e1","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280"}},{"Invoke":{"transaction_hash":"0xce54bbc5647e1c1ea4276c01a708523f740db0ff5474c77734f73beec2624","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[{"from_address":"0x20cfa74ee3564b4cd5435cdace0f9c4d43b939620e4a0bb5076105df0a626c6","to_address":"0xc84dd7fd43a7defb5b7a15c4fbbe11cbba6db1ba","payload":["0xc","0x22"]}],"events":[],"execution_resources":{"steps":31,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x1c924916a84ef42a3d25d29c5d1085fe212de04feadc6e88d4c7a6e5b9039bf","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":238,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0xa66c346e273cc49510ef2e1620a1a7922135cb86ab227b86e0afd12243bd90","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":165,"memory_holes":0,"range_check_builtin_applications":7,"pedersen_builtin_applications":2,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5c71675616b49fb9d16cac8beaaa65f62dc5a532e92785055c15c825166dbbf","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":209,"memory_holes":0,"range_check_builtin_applications":8,"pedersen_builtin_applications":2,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x60e05c41a6622592a2e2eff90a9f2e495296a3be9596e7bc4dfbafce00d7a6a","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[{"from_address":"0x31c9cdb9b00cb35cf31c05855c0ec3ecf6f7952a1ce6e3c53c3455fcd75a280","to_address":"0x1","payload":["0xc","0x22"]}],"events":[],"execution_resources":{"steps":332,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5634f2847140263ba59480ad4781dacc9991d0365145489b27a198ebed2f969","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":178,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Deploy":{"transaction_hash":"0xb049c384cf75174150a2540835cc2abdcca1d3a3750298a1741a621983e35a","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x6ee3440b08a9c805305449ec7f7003f27e9f7e287b83610952ec36bdc5a6bae"}},{"Deploy":{"transaction_hash":"0x227f3d9d5ce6680bdf2991576c1a90aca8184ca26055bae92d16c58e3e13340","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x735596016a37ee972c42adef6a3cf628c19bb3794369c65d2c82ba034aecf2c"}},{"Invoke":{"transaction_hash":"0x376ff82431b52ca1fbc4942de80bc1b01d8e5cd1eeab5a277b601b510f2cab2","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":25,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Deploy":{"transaction_hash":"0x25f20c74821d84f62989a71fceef08c967837b63bae31b279a11343f10d874a","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":29,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded","contract_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52"}},{"Invoke":{"transaction_hash":"0x2d10272a8ba726793fd15aa23a1e3c42447d7483ebb0b49df8b987590fe0055","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[{"from_address":"0x31c887d82502ceb218c06ebb46198da3f7b92864a8223746bc836dda3e34b52","to_address":"0x1","payload":["0xc","0x22"]}],"events":[],"execution_resources":{"steps":332,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0xb05ba5cd0b9e0464d2c1790ad93a159c6ef0594513758bca9111e74e4099d4","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":238,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x4d16393d940fb4a97f20b9034e2a5e954201fee827b2b5c6daa38ec272e7c9c","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":169,"memory_holes":0,"range_check_builtin_applications":7,"pedersen_builtin_applications":2,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x9e80672edd4927a79f5384e656416b066f8ef58238227ac0fcea01952b70b5","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":178,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x387b5b63e40d4426754895fe52adf668cf8fde2a02aa9b6d761873f31af3462","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":25,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x4f0cdff0d72fc758413a16db2bc7580dfec7889a8b921f0fe08641fa265e997","actual_fee":{"amount":"0x0","unit":"Wei"},"messages_sent":[],"events":[],"execution_resources":{"steps":25,"memory_holes":0,"range_check_builtin_applications":0,"pedersen_builtin_applications":0,"poseidon_builtin_applications":0,"ec_op_builtin_applications":0,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":0},"total_gas_consumed":{"l1_gas":0,"l1_data_gas":0}},"execution_result":"Succeeded"}}],"declared_classes":[{"Legacy":{"class_hash":"0x10455c752b86932ce552f2b0fe81a880746649b9aee7e0d842bf3f52378f9f8","contract_class":{"program":[31,139,8,0,0,0,0,0,2,255,237,189,13,143,220,198,209,63,248,85,246,244,199,33,118,110,35,176,95,73,26,79,14,112,108,61,137,1,39,206,217,74,158,255,93,18,12,230,133,187,26,100,53,179,153,25,89,82,2,127,247,107,206,144,28,114,216,205,238,170,174,158,93,39,50,96,91,218,101,255,186,170,186,186,222,250,237,95,47,230,135,195,110,189,120,119,168,246,47,190,248,203,223,110,95,44,222,173,31,14,235,77,253,183,23,143,213,170,218,237,171,205,139,219,23,187,249,230,190,154,45,223,84,203,191,155,191,45,214,135,247,235,125,245,194,124,191,154,31,230,245,183,217,7,153,229,69,150,177,252,238,238,174,254,215,124,150,125,96,199,255,242,172,88,180,63,54,255,86,199,31,202,44,19,230,251,204,252,160,254,229,178,255,67,214,252,112,117,250,97,193,117,251,195,186,197,241,135,162,249,85,198,205,143,248,224,87,214,238,248,128,186,85,15,195,78,93,145,205,27,34,238,58,224,230,135,203,203,31,102,13,31,189,31,102,221,15,87,157,48,12,31,178,161,97,85,255,191,39,161,137,95,205,51,221,35,252,68,93,13,221,253,195,178,59,216,63,139,134,68,222,50,115,38,49,88,116,178,101,115,252,171,176,49,95,218,134,119,217,9,144,129,135,134,151,45,192,153,18,150,29,165,218,252,155,145,201,46,82,101,18,208,165,39,21,116,222,14,114,122,18,92,162,233,148,248,60,131,167,225,250,243,123,168,27,178,16,221,108,235,171,86,107,9,150,185,167,185,148,35,98,88,230,249,167,143,151,13,241,50,209,205,206,105,165,158,178,55,19,198,83,143,127,51,105,143,186,158,87,253,225,134,252,195,90,11,68,174,37,213,202,173,16,67,96,24,197,103,238,25,111,6,98,32,146,162,21,71,39,241,4,188,229,228,3,64,160,43,75,103,155,185,123,40,242,59,252,63,213,121,242,89,181,243,26,67,177,42,154,121,50,230,186,112,202,99,241,228,54,116,53,209,91,184,97,149,66,51,189,212,75,243,255,59,93,229,50,231,230,239,34,151,125,59,89,11,191,60,219,201,115,216,85,255,112,222,255,33,111,126,184,232,255,80,52,63,28,68,109,178,249,225,200,2,150,103,189,234,155,81,53,248,85,243,67,61,248,33,128,105,169,149,97,90,233,92,179,220,252,185,21,194,191,55,211,185,86,185,108,89,53,127,230,146,105,169,235,17,87,185,200,197,37,243,131,88,116,108,164,248,165,211,92,161,105,82,194,252,151,229,202,12,72,165,197,115,162,236,114,86,60,27,137,201,188,48,82,43,141,2,87,181,10,231,170,166,9,72,143,112,211,211,75,149,48,68,42,35,42,125,119,20,154,33,87,25,210,204,159,70,38,101,105,155,93,203,144,168,168,71,222,50,158,188,220,252,169,172,205,192,37,129,11,27,129,163,252,147,135,230,159,41,50,91,213,151,135,8,201,108,195,133,116,156,142,82,174,78,202,222,8,203,8,78,46,5,187,20,213,220,38,170,249,165,81,228,205,15,151,151,150,114,110,227,114,126,86,71,120,34,53,102,200,12,50,91,46,114,161,22,172,184,19,119,181,7,16,139,130,47,86,101,62,23,124,161,213,138,169,140,149,11,45,153,177,69,76,220,21,58,147,43,86,101,250,174,82,197,226,154,174,93,230,83,209,133,37,104,165,39,33,95,246,122,171,152,141,132,149,255,135,241,229,146,171,100,163,131,222,230,79,33,238,229,114,50,35,105,115,208,252,162,230,145,128,144,124,138,144,163,50,4,255,240,78,217,126,184,8,214,144,210,166,12,115,219,15,23,169,99,237,101,191,183,194,175,33,87,42,229,44,70,197,194,226,66,67,174,52,133,22,243,190,44,50,155,128,178,128,113,31,150,8,151,195,176,201,38,250,231,166,39,234,178,244,51,138,169,46,3,45,198,45,28,132,255,208,106,74,69,235,146,139,233,31,38,16,192,221,228,172,30,215,223,237,82,57,87,196,43,116,76,221,86,254,106,144,30,50,111,167,195,168,242,103,37,44,115,81,187,176,217,231,213,120,246,5,43,130,147,187,4,163,180,242,212,134,26,101,179,70,30,65,63,180,196,163,214,160,108,0,50,143,243,12,79,18,59,20,28,104,116,28,108,185,117,123,66,99,131,148,115,90,183,61,106,153,32,216,98,63,115,221,203,109,99,28,238,151,82,187,160,97,166,50,15,9,220,175,18,170,232,194,23,88,218,37,155,122,2,107,209,15,99,109,57,77,216,15,173,142,248,200,150,180,253,112,158,90,13,86,189,222,22,88,19,36,82,155,32,129,180,75,214,2,213,211,57,202,133,63,209,129,252,144,194,88,57,73,38,151,82,85,54,11,202,25,19,109,127,253,80,238,88,223,106,85,101,80,35,106,11,129,131,26,209,96,85,190,213,202,22,98,88,4,116,90,222,185,95,160,185,41,251,45,170,194,40,223,188,152,11,177,50,53,113,118,87,206,245,220,212,132,178,101,198,43,83,37,92,230,162,42,84,185,170,76,205,157,23,197,50,207,238,74,110,74,213,139,69,183,62,213,227,237,156,35,142,182,120,208,203,188,90,122,45,122,25,236,210,72,179,170,167,140,198,42,13,52,112,18,103,224,56,165,217,234,153,194,148,182,172,186,11,179,101,43,91,56,117,105,209,159,34,240,74,28,161,84,119,221,2,192,120,19,21,247,206,182,240,153,145,122,18,112,113,177,215,108,49,191,220,128,102,152,91,148,196,69,136,213,179,41,66,240,21,184,34,109,219,133,225,53,13,176,76,203,99,47,18,76,120,17,54,225,43,124,156,146,118,194,63,27,191,82,173,202,235,228,238,79,147,145,43,156,158,196,134,250,137,28,195,149,84,162,169,120,3,131,239,139,112,120,233,14,114,217,148,109,29,196,157,149,59,238,164,180,118,79,99,195,38,74,199,9,23,2,143,10,168,131,3,161,32,187,104,81,234,120,77,31,207,161,187,84,73,222,124,210,22,184,8,153,40,142,39,160,113,113,125,185,20,109,88,221,241,201,3,205,103,232,182,189,140,47,122,115,114,5,172,190,36,152,147,37,46,145,112,103,23,87,246,23,43,191,242,50,54,177,51,70,37,82,165,140,1,231,250,4,145,137,150,142,86,171,220,150,36,157,70,95,45,22,165,148,89,197,243,162,40,231,66,203,197,114,161,243,98,193,140,41,45,171,229,138,9,153,207,151,171,106,181,92,220,9,93,21,66,150,242,174,80,249,114,169,204,144,107,112,125,56,56,188,127,222,238,120,98,126,7,68,87,9,230,55,187,230,206,151,59,62,101,208,220,5,244,43,248,92,139,218,240,209,62,133,14,99,105,251,85,179,213,62,209,108,172,212,10,24,7,79,216,10,171,92,19,144,156,255,155,68,166,203,159,121,214,244,51,172,239,174,238,56,124,175,161,83,180,28,185,231,68,76,149,114,129,123,78,176,85,0,71,239,78,106,19,232,255,220,171,255,86,209,135,215,152,125,187,106,160,83,163,252,183,158,26,77,137,234,211,212,248,52,53,146,76,13,122,141,149,109,30,217,45,4,223,245,227,95,39,201,89,187,132,49,208,198,208,29,55,83,179,121,9,140,149,202,196,177,18,47,189,249,116,229,223,17,149,188,106,205,131,247,128,60,73,125,187,210,17,59,206,86,207,96,29,36,241,194,231,170,108,119,185,156,29,85,111,220,45,106,246,179,15,222,239,244,207,60,120,79,173,18,197,39,149,248,164,18,67,149,200,63,169,196,207,77,37,230,200,130,80,222,156,2,75,176,66,147,104,25,102,165,132,187,46,237,63,167,133,77,227,236,210,171,38,22,8,134,21,140,128,53,33,250,49,152,79,148,240,115,255,249,191,59,65,153,243,158,175,82,176,16,83,41,154,243,166,137,67,221,39,137,106,187,133,152,159,235,118,190,128,61,186,202,253,171,230,58,1,250,217,209,157,83,160,175,239,84,43,224,18,122,170,133,198,188,117,108,231,137,209,41,79,123,79,67,180,1,0,177,179,44,38,82,110,222,238,26,151,69,47,242,168,128,7,131,254,147,108,195,252,103,110,27,18,47,66,45,171,68,97,200,178,40,39,165,230,188,206,97,225,95,163,12,183,51,203,85,192,100,114,104,128,219,8,119,147,47,161,230,86,124,112,74,140,95,55,159,224,79,145,100,84,234,231,58,87,109,87,125,42,154,211,176,176,0,193,58,40,156,227,252,120,192,5,137,195,241,198,221,61,104,165,121,158,61,121,114,80,244,183,225,84,119,255,169,30,52,116,239,252,207,228,176,204,117,148,103,185,40,129,250,123,205,221,161,203,197,226,223,164,44,21,120,130,254,249,149,165,184,229,122,23,5,92,120,79,184,110,191,112,153,254,37,169,233,15,159,140,57,195,45,223,255,108,110,83,233,102,127,101,95,199,126,110,23,167,84,252,103,235,22,174,119,30,124,209,110,69,9,56,15,62,188,239,176,29,113,247,54,92,14,95,237,183,92,38,190,202,203,76,233,140,45,57,203,115,33,117,206,152,20,43,169,242,187,108,181,48,52,231,119,69,81,8,198,248,124,177,18,114,81,242,165,156,47,76,225,244,110,85,101,75,241,212,103,191,151,194,127,155,199,51,211,136,165,10,214,136,85,224,30,108,244,6,14,93,48,177,18,165,190,91,45,88,89,84,101,53,95,149,66,86,242,46,159,171,146,207,139,69,81,204,51,85,86,82,205,23,89,181,208,85,165,234,141,234,85,97,20,100,145,61,249,224,179,213,165,237,28,157,7,200,68,107,235,87,151,43,116,203,160,41,211,49,246,124,52,104,94,61,27,13,42,230,124,46,120,206,231,37,151,37,95,85,43,189,204,140,246,44,11,181,186,43,151,74,48,33,77,129,73,148,133,210,245,69,211,119,198,140,220,137,101,185,44,11,189,146,236,201,21,40,211,94,235,177,120,94,214,163,61,214,245,92,253,9,91,152,33,23,119,85,118,39,231,76,47,170,149,170,20,19,98,161,150,243,242,46,19,243,5,83,101,174,23,11,190,186,227,11,189,226,90,204,151,130,229,217,162,88,232,57,123,114,127,178,184,227,169,252,73,162,29,150,139,34,15,214,8,255,141,51,237,77,239,237,15,121,203,71,89,140,30,222,113,106,80,118,122,82,166,161,132,7,106,220,83,220,196,181,40,6,86,16,123,127,142,50,113,94,161,84,158,153,196,64,177,146,179,114,177,144,243,149,46,141,234,51,125,103,252,235,178,18,186,190,69,185,204,202,21,187,43,230,198,223,222,173,150,133,208,50,239,228,89,182,178,233,9,237,42,58,191,146,211,58,63,142,27,46,117,190,126,207,170,90,188,187,159,173,55,119,219,23,95,108,222,61,60,220,190,120,179,222,28,246,47,190,248,215,139,236,197,23,127,249,215,139,249,114,89,237,247,235,197,67,53,219,47,183,143,199,119,179,94,236,15,243,221,223,223,207,119,213,203,229,124,189,219,190,92,110,223,190,221,110,94,206,31,30,182,181,10,78,253,186,249,200,116,189,220,174,170,23,95,188,120,91,189,221,238,62,254,101,254,248,183,155,95,223,236,171,251,183,149,233,255,229,124,181,250,236,115,3,117,247,176,125,63,59,236,230,203,191,175,55,247,179,211,235,91,134,168,199,238,103,245,95,239,119,219,119,143,47,190,200,110,95,108,239,238,246,213,193,252,241,167,219,23,187,234,174,218,85,155,101,53,91,175,106,134,126,250,233,39,211,43,227,96,182,12,133,203,199,143,110,190,78,191,111,63,59,115,246,227,219,153,225,165,218,157,122,248,236,95,191,216,252,226,139,27,67,203,203,135,106,243,19,148,57,62,205,92,16,109,47,87,123,211,92,133,49,82,83,249,226,139,60,240,227,253,110,249,226,11,125,18,49,207,174,38,226,205,205,175,126,125,195,254,186,169,165,186,220,110,14,235,205,187,106,102,58,251,104,132,103,212,137,221,172,239,110,54,55,255,247,77,118,83,61,236,171,155,12,47,116,133,22,250,108,118,168,222,62,26,153,176,44,80,152,151,156,152,166,236,54,193,8,223,237,230,111,141,20,203,20,10,177,169,62,28,102,77,7,140,99,180,72,92,117,162,126,88,31,154,121,26,49,51,245,39,37,185,178,146,72,184,146,204,15,111,38,84,196,252,246,229,124,191,175,118,135,217,102,123,152,253,179,218,109,123,154,114,183,219,190,189,153,104,58,123,119,88,63,236,111,214,111,31,183,187,195,77,131,99,28,106,117,95,237,254,186,25,254,253,179,218,104,253,56,127,120,87,125,222,254,234,166,251,209,205,255,121,243,199,239,191,249,253,171,155,255,227,215,55,217,237,205,221,47,46,104,186,185,155,175,31,170,213,23,55,255,234,154,252,100,12,94,246,242,23,64,237,21,72,191,98,145,211,137,12,51,146,162,25,156,50,229,224,108,82,14,203,252,60,36,217,205,127,253,250,56,46,243,110,76,254,235,166,247,62,232,172,121,66,244,229,98,251,110,179,58,14,149,25,136,227,176,204,127,186,89,239,111,182,239,14,55,219,187,83,19,240,240,72,130,225,49,145,151,25,20,25,40,214,151,125,222,30,15,59,211,84,157,198,83,230,9,199,147,171,108,182,88,31,34,6,181,30,192,191,110,254,186,249,95,55,95,109,119,187,106,121,216,24,50,111,142,124,188,252,235,230,52,171,126,221,124,119,158,123,183,167,49,253,188,29,220,110,220,79,13,254,235,56,244,127,250,227,31,95,125,63,251,205,119,127,250,195,215,245,0,255,171,153,111,167,193,221,175,87,85,61,192,135,55,213,105,144,111,254,98,102,44,255,229,47,13,75,159,191,252,69,67,210,252,97,249,238,97,126,88,111,55,55,119,219,221,241,227,83,71,230,39,47,79,1,204,155,245,253,155,219,83,128,184,125,111,72,93,173,127,124,187,93,245,73,173,255,248,195,239,190,249,239,215,80,31,149,199,171,81,51,64,71,42,141,211,43,33,163,90,51,100,218,20,160,54,35,61,228,57,168,125,99,141,120,227,42,116,80,224,127,252,211,166,58,180,192,251,195,118,55,191,175,6,58,236,248,230,229,102,187,123,59,127,88,255,179,154,153,236,101,103,122,233,41,243,255,186,249,115,181,91,223,125,108,7,254,221,219,199,122,228,141,2,109,78,138,83,157,148,99,255,102,253,120,179,168,14,239,171,106,211,232,208,237,205,151,95,127,221,104,223,205,124,179,58,233,169,209,153,222,143,79,22,170,247,131,75,109,254,236,132,101,244,185,247,145,49,108,199,31,179,207,143,184,159,241,155,95,222,116,223,53,211,226,248,139,191,110,110,154,127,122,173,205,183,38,178,62,125,118,123,243,215,191,158,62,250,197,72,10,159,125,126,179,156,111,140,147,48,124,221,188,219,87,171,155,247,235,195,155,35,215,203,119,102,162,110,14,55,38,150,49,66,173,243,190,95,156,166,194,122,63,219,27,148,135,54,134,63,90,83,3,55,164,31,21,211,23,231,169,192,166,167,66,240,56,31,73,51,174,52,71,105,73,199,172,65,40,113,8,163,169,34,138,147,210,23,217,83,42,125,51,146,181,62,141,199,177,81,180,216,49,228,207,102,12,13,55,198,95,171,103,167,3,44,203,81,74,240,113,191,52,4,237,167,181,160,249,232,101,253,223,89,157,146,152,193,234,59,241,230,131,217,27,99,71,30,170,221,240,187,207,218,114,207,175,219,63,220,222,180,13,12,11,191,174,181,165,247,119,168,211,43,241,51,221,202,86,147,164,153,168,86,105,184,80,142,127,59,17,172,68,68,243,217,222,140,186,193,224,24,140,230,15,221,92,253,66,101,8,152,187,119,155,101,237,172,102,251,234,193,196,89,91,163,108,138,33,112,154,31,155,214,10,223,250,164,236,74,54,202,206,202,244,202,190,50,108,223,207,15,102,182,213,212,187,149,125,240,93,98,101,103,89,188,182,15,232,109,180,157,25,163,166,21,92,44,61,117,215,60,162,121,163,238,154,97,48,198,234,94,34,96,44,234,174,51,4,78,167,238,90,226,91,159,212,93,139,182,154,125,5,219,126,95,29,142,36,152,74,246,216,199,95,234,252,248,227,212,138,207,226,21,127,76,116,171,253,204,228,78,25,82,74,189,1,47,35,33,154,81,111,61,186,144,215,25,245,125,245,143,119,181,40,67,7,126,244,125,234,177,231,52,99,63,162,187,29,126,147,51,230,18,47,174,179,6,228,34,30,229,164,4,57,111,148,64,178,43,77,253,75,43,234,153,252,23,159,167,86,1,65,52,253,47,200,110,53,192,172,66,228,5,90,86,61,5,200,163,65,154,241,215,237,248,23,215,25,255,195,7,227,131,239,55,243,195,187,93,229,25,251,254,167,169,199,93,210,140,123,159,228,118,204,141,117,45,56,74,62,231,241,46,88,20,192,105,172,139,172,25,107,117,5,55,223,164,150,179,93,53,95,77,140,115,255,179,212,99,172,226,199,184,79,110,59,190,202,72,54,7,203,228,101,23,69,22,18,222,248,172,24,26,221,184,81,138,166,28,207,180,190,158,82,188,223,173,15,85,128,86,28,191,75,173,22,154,78,45,142,244,182,122,97,228,89,10,184,88,206,138,81,102,136,214,131,193,45,57,2,161,169,116,151,172,81,140,2,85,234,126,107,62,54,152,211,138,209,126,244,114,95,109,86,179,230,111,179,195,118,246,192,166,180,99,244,113,106,21,193,215,126,38,56,108,245,36,175,211,109,141,20,211,203,199,249,199,135,173,49,177,6,67,70,98,52,201,49,203,4,22,104,160,124,44,83,88,28,243,223,110,22,176,172,9,81,121,174,220,138,56,155,189,157,175,55,179,153,25,217,193,31,223,239,230,143,143,213,110,63,250,171,153,102,63,206,235,33,92,154,133,214,67,181,75,178,135,140,247,195,10,101,45,46,79,209,100,52,164,43,92,152,8,238,221,252,161,29,162,58,1,8,110,185,51,100,174,13,21,181,173,43,17,237,102,199,93,24,172,174,51,64,218,174,55,171,234,67,221,142,135,183,59,41,78,238,111,81,207,156,122,103,152,113,91,97,223,178,250,219,60,236,91,94,211,144,133,125,43,234,111,89,216,183,178,254,214,39,69,179,216,248,126,189,175,26,81,104,31,25,143,213,202,252,162,218,180,162,243,137,99,188,30,159,251,164,178,171,211,200,195,238,221,178,214,226,58,125,153,252,122,104,3,242,38,188,16,153,160,156,188,199,37,190,154,162,109,162,137,219,15,10,114,239,188,237,145,227,158,179,165,190,13,107,101,230,206,217,250,149,60,188,85,187,99,166,148,97,109,78,67,84,170,201,175,143,154,171,234,239,242,137,239,134,90,91,102,19,159,94,104,108,89,78,124,59,94,181,207,166,160,251,154,202,51,54,241,229,80,75,203,166,20,38,20,163,212,210,15,219,93,59,45,246,105,212,180,191,252,172,153,87,79,251,4,57,21,149,139,236,54,176,89,107,229,103,38,50,155,25,91,207,121,17,216,244,52,152,188,156,254,252,168,123,186,38,137,77,125,56,80,62,46,212,212,183,67,237,227,66,76,125,60,86,63,33,39,191,239,235,159,208,83,159,14,20,144,139,38,198,145,25,39,53,147,117,15,201,181,80,244,106,230,66,249,141,229,37,81,110,77,28,57,236,233,182,125,195,201,181,128,182,29,170,178,86,144,246,167,97,28,5,35,182,54,71,165,46,234,175,11,239,215,67,205,214,204,219,224,66,189,85,233,109,97,217,24,149,249,27,245,21,61,247,147,53,212,118,93,54,218,46,37,109,68,191,58,151,190,234,76,34,173,214,247,75,197,74,4,196,246,14,234,220,234,95,230,183,24,140,115,236,205,71,190,61,8,225,52,74,165,6,180,173,149,90,176,186,85,17,220,106,168,220,165,8,110,120,161,228,101,25,220,114,188,173,37,203,194,27,247,148,94,100,60,184,221,64,249,69,214,212,85,164,46,40,149,223,232,97,19,255,37,81,246,126,237,212,175,235,29,49,78,221,22,172,184,13,105,211,55,233,130,201,208,54,77,36,44,152,14,105,113,26,24,150,79,124,123,212,111,94,127,85,58,191,26,232,179,96,220,249,225,80,127,5,203,156,95,142,245,149,49,247,199,125,253,228,238,239,134,250,200,155,85,1,89,144,102,104,247,109,119,51,163,37,70,29,77,233,217,76,140,77,26,237,244,109,72,14,161,204,34,235,81,120,234,108,58,144,124,147,76,40,65,90,175,50,210,217,125,156,61,110,215,155,67,18,33,202,222,150,31,174,189,82,236,145,227,158,228,163,234,133,163,213,73,220,163,96,165,255,245,112,114,169,98,226,211,139,233,53,170,63,245,191,29,15,186,202,167,62,239,15,244,40,194,236,127,57,156,100,186,49,250,74,147,234,196,161,218,31,218,19,35,251,43,76,52,201,33,19,109,130,58,139,220,71,69,191,201,230,253,113,200,27,225,106,198,105,61,234,185,46,157,70,154,10,84,100,234,211,227,156,114,50,99,183,129,205,140,155,236,215,217,69,89,6,182,60,142,151,204,178,233,207,143,30,83,215,31,242,169,15,135,243,186,204,167,190,189,152,216,163,224,118,240,241,88,195,74,61,249,125,79,165,100,38,167,62,29,204,109,153,53,187,231,244,212,137,38,228,220,118,109,132,38,84,194,158,239,228,50,108,78,95,238,99,118,168,226,168,104,227,105,108,20,242,188,205,83,242,28,221,250,180,96,33,57,135,35,140,246,120,202,81,160,234,71,177,108,241,148,60,3,193,156,84,75,4,53,58,206,180,188,238,67,6,127,94,212,159,171,224,207,203,250,243,34,244,115,89,31,93,24,5,79,150,207,7,147,95,142,130,117,75,139,161,9,144,44,128,227,145,33,144,60,160,163,129,57,24,85,9,45,13,134,70,161,45,232,233,66,146,27,5,215,134,113,66,163,80,194,141,194,229,118,111,135,81,208,236,22,212,120,104,20,84,142,110,221,24,5,197,225,8,99,163,32,11,48,138,205,40,168,12,4,115,82,45,29,212,232,56,15,121,221,135,12,254,92,212,159,171,224,207,101,253,121,17,252,185,170,63,47,253,159,15,141,130,212,254,22,23,70,65,6,112,60,54,10,42,160,163,129,81,208,194,223,96,104,20,116,99,20,114,78,154,5,172,170,199,237,126,157,38,60,80,12,182,194,212,208,226,158,255,133,190,245,183,168,171,62,111,235,242,89,221,64,134,53,168,15,120,247,102,104,193,253,205,78,163,82,40,231,151,71,189,173,93,101,145,59,190,25,42,107,145,57,62,187,208,208,210,245,221,88,45,139,210,245,105,95,23,75,230,248,106,168,128,69,83,154,200,101,65,238,149,38,207,117,16,42,100,191,236,206,195,92,147,245,64,134,93,63,85,166,110,225,8,70,253,170,15,143,198,170,87,171,254,97,56,1,135,58,29,63,203,100,112,203,163,138,214,135,8,51,29,216,102,160,178,42,99,129,205,46,85,184,12,108,55,82,105,149,101,161,77,123,42,174,178,34,176,213,240,36,95,150,55,42,159,179,36,42,63,117,168,133,80,235,21,78,235,109,71,81,28,138,111,207,150,252,32,118,221,231,25,10,237,52,102,156,65,26,215,51,160,62,44,173,184,8,111,54,156,4,172,8,111,57,156,7,138,233,240,166,227,169,192,114,64,235,254,108,224,42,188,225,112,66,240,230,108,107,94,202,52,62,192,125,192,135,112,62,228,72,47,48,62,151,227,152,14,162,188,197,96,216,103,131,200,49,96,167,241,18,5,160,237,113,46,176,250,0,115,22,220,106,56,21,132,10,110,120,49,19,132,8,110,57,158,8,66,134,55,238,207,3,201,131,219,93,156,240,110,138,198,69,130,80,232,216,77,187,169,190,222,117,182,222,31,140,110,126,76,50,21,52,188,38,239,162,207,61,27,116,113,139,197,233,175,224,42,173,99,112,182,135,55,213,206,146,142,43,45,177,176,39,101,208,57,176,253,113,158,241,186,101,9,106,57,156,107,154,131,26,95,204,55,157,129,90,143,231,92,206,96,0,253,121,151,195,72,31,206,189,188,89,114,46,202,146,124,238,237,234,181,89,163,31,102,2,164,153,110,57,120,186,245,72,114,207,176,50,191,5,52,173,183,230,87,143,135,55,117,67,5,108,232,156,69,165,0,32,157,70,178,212,254,38,199,185,34,235,143,11,223,199,195,233,81,50,223,247,23,51,162,40,125,13,70,147,64,219,147,145,65,155,158,222,235,204,75,211,80,213,203,102,171,91,41,74,234,173,110,233,118,251,228,12,162,227,29,45,78,229,214,60,187,13,105,115,222,184,163,89,17,210,226,52,132,172,156,248,246,168,125,186,166,129,57,191,26,168,157,102,218,249,225,80,223,52,147,206,47,199,138,198,133,251,227,190,134,113,55,232,240,250,6,222,84,19,203,130,52,179,221,85,203,119,187,253,250,199,227,93,80,41,149,76,67,148,204,66,149,91,221,70,5,96,95,107,163,120,166,42,127,119,182,133,122,20,63,7,64,180,186,59,138,73,61,109,79,195,41,69,80,171,163,62,231,245,247,42,224,251,161,102,143,82,9,91,147,11,29,31,237,98,183,181,25,107,187,204,67,154,245,245,94,134,16,55,156,1,178,189,188,32,203,72,173,235,122,179,220,85,115,35,182,132,218,223,63,185,81,122,213,127,72,145,91,243,71,107,18,19,13,251,129,185,30,45,203,185,27,158,100,63,138,93,71,13,142,154,90,212,159,202,233,79,135,74,58,90,34,186,248,250,66,63,71,43,130,23,159,143,85,115,180,100,117,217,162,175,149,163,132,229,226,227,161,66,234,246,48,125,166,120,154,172,178,190,236,210,12,221,110,158,38,153,44,144,201,228,153,44,183,110,150,252,22,216,188,214,208,221,241,166,162,2,215,244,180,230,171,11,129,104,126,225,16,10,6,196,56,105,68,25,216,236,56,89,202,186,31,21,222,64,215,183,169,21,26,208,128,213,13,74,64,3,94,243,144,1,26,136,186,65,144,188,135,211,62,15,162,234,98,242,231,121,72,163,177,9,40,131,132,60,48,4,101,144,152,135,230,160,60,150,90,205,52,90,175,204,140,92,223,173,235,179,40,199,73,116,154,245,47,127,115,18,193,111,78,155,28,235,95,173,12,234,122,115,188,188,183,190,249,192,126,63,241,241,47,221,214,200,75,148,219,23,135,143,143,181,89,152,63,172,231,251,23,63,157,173,204,203,223,205,247,111,34,59,235,67,76,244,244,77,125,0,229,203,205,234,207,181,149,60,50,125,247,206,200,101,115,188,156,223,249,217,109,109,202,22,141,148,154,51,44,255,122,113,162,160,233,234,174,122,56,188,24,26,169,31,187,62,6,95,126,86,127,122,123,83,255,247,243,23,253,11,28,76,147,102,127,114,199,64,51,204,125,14,126,255,241,171,118,223,157,65,110,190,171,233,223,63,206,77,109,193,254,233,203,47,119,247,110,110,47,191,235,179,219,17,149,133,17,245,242,155,183,143,15,235,229,250,16,218,227,224,251,168,158,191,63,109,48,14,232,179,249,50,170,183,31,190,249,255,94,125,247,223,179,111,191,251,234,203,111,127,232,13,197,241,52,239,139,102,244,79,138,96,107,254,191,191,251,126,246,213,119,127,250,195,235,87,223,255,48,251,225,213,183,175,190,122,253,221,247,110,24,94,191,172,164,115,161,139,92,8,19,201,151,154,41,198,69,153,243,146,21,58,19,133,169,89,153,146,177,144,185,144,162,52,139,102,165,16,92,20,50,231,92,100,166,76,202,181,202,184,202,165,89,140,114,16,116,122,177,40,116,246,245,95,57,154,152,110,61,252,225,150,209,137,126,2,111,223,13,235,181,121,5,37,148,173,225,219,41,97,93,12,206,177,30,59,90,154,66,163,41,54,214,65,149,9,134,30,151,199,141,246,29,88,187,225,42,4,47,120,222,142,27,13,108,214,184,170,230,55,95,131,99,167,23,159,187,13,165,197,156,201,192,25,53,224,1,106,70,220,141,7,130,24,249,220,105,57,212,27,139,6,190,211,242,249,47,7,114,235,184,230,24,174,195,77,152,173,89,148,61,27,0,6,26,55,22,130,117,25,123,58,68,8,98,248,2,179,151,16,236,79,249,205,227,56,179,104,239,38,232,237,33,173,183,144,158,166,167,238,120,122,241,151,229,124,127,248,236,238,241,228,162,127,249,203,207,255,102,68,134,128,44,207,144,71,196,191,220,153,60,232,255,186,17,13,238,231,47,234,140,172,17,66,71,254,11,160,68,15,111,31,201,37,90,99,146,74,180,17,168,97,254,179,95,169,207,41,248,63,158,85,207,93,179,23,200,120,3,134,101,89,181,44,215,229,233,161,18,205,79,60,179,142,231,191,225,153,238,43,252,172,118,95,7,154,129,183,224,198,15,190,242,73,2,61,171,60,19,21,45,221,64,7,9,19,237,37,40,86,176,217,79,189,48,226,146,253,163,96,53,133,138,225,60,62,72,36,253,46,210,73,163,54,50,14,130,163,4,20,24,61,128,36,114,137,153,78,42,57,133,142,152,226,67,75,68,188,237,105,193,176,60,51,221,217,222,50,200,226,68,114,221,148,12,41,70,189,15,152,144,125,78,49,230,33,17,48,136,251,62,96,58,125,47,144,206,38,64,172,2,164,85,175,77,234,25,92,180,233,127,92,191,117,53,251,243,151,223,254,233,85,72,137,64,74,198,52,227,133,80,133,52,139,175,69,193,164,22,34,231,172,200,204,143,5,215,66,229,185,82,82,240,60,43,74,179,20,80,50,83,252,230,101,105,170,10,138,149,5,207,85,153,23,194,20,9,220,244,76,101,99,227,47,225,9,201,0,227,183,175,94,7,115,207,178,194,48,33,53,47,149,56,62,13,110,6,79,10,33,141,40,120,46,101,97,138,158,74,136,186,126,98,138,37,204,252,185,208,185,46,203,76,112,38,152,40,74,145,213,98,48,213,146,211,125,152,118,130,130,146,82,119,139,72,113,124,255,234,171,63,125,255,195,55,127,126,53,131,168,69,174,149,204,148,40,121,102,20,32,227,153,206,234,159,148,194,200,64,102,204,20,143,76,29,61,43,148,169,89,155,250,144,102,166,126,100,150,60,57,55,191,230,50,43,141,180,50,163,76,138,49,35,79,55,101,211,105,171,237,219,72,89,252,0,81,141,92,228,245,203,232,70,25,140,198,171,178,84,121,89,24,253,16,146,11,83,56,203,89,93,72,51,191,50,149,181,50,151,204,136,161,52,117,52,51,47,120,45,180,210,44,204,41,193,152,249,133,100,110,17,96,202,129,3,128,215,175,126,120,61,51,141,191,157,253,207,55,175,127,55,251,242,251,239,191,252,127,67,152,51,75,57,245,124,215,245,227,238,102,236,138,130,11,201,138,188,84,102,110,235,50,103,57,51,163,94,168,44,23,74,40,83,41,52,26,32,37,47,140,54,148,89,97,184,147,76,148,102,194,8,37,156,164,157,55,92,56,202,91,236,120,167,238,84,125,203,142,7,176,39,23,109,162,171,91,29,63,211,229,159,176,114,142,131,82,184,185,112,180,125,142,37,44,7,221,16,83,48,106,21,105,20,206,120,152,250,149,3,42,166,124,21,6,9,137,128,10,53,78,138,25,171,111,106,194,151,175,28,152,204,94,191,98,225,245,27,39,251,199,21,89,88,249,198,135,133,21,162,58,51,44,40,202,55,14,58,99,171,55,225,176,241,218,148,149,4,213,27,156,162,98,165,27,83,189,9,197,196,10,54,251,169,239,36,173,153,138,36,208,176,152,218,68,32,100,66,9,40,10,9,96,74,19,30,44,44,203,93,14,105,130,75,70,82,154,152,38,20,94,153,8,193,75,201,61,39,24,113,116,97,34,0,47,161,178,107,164,29,13,17,171,160,80,170,201,224,24,34,208,19,80,66,81,10,188,22,165,216,239,48,232,225,138,59,30,6,253,118,183,65,58,211,181,172,224,128,116,173,195,3,164,107,23,109,6,9,76,96,150,86,7,231,240,204,14,145,188,156,105,133,39,108,142,182,207,62,97,59,211,13,73,216,70,173,134,124,86,144,241,97,8,90,163,211,186,123,231,53,187,104,239,225,132,4,89,61,105,137,150,179,250,118,151,136,180,206,142,89,208,166,117,125,246,79,151,96,54,55,209,14,54,89,99,61,73,16,58,86,208,103,119,154,149,35,169,116,49,218,81,56,55,191,186,233,253,164,221,188,73,37,169,221,253,108,98,238,196,72,169,65,38,150,208,95,46,69,132,245,193,78,194,233,166,228,8,54,137,44,48,9,50,78,19,9,166,233,177,98,162,104,212,173,193,194,10,85,157,249,206,200,171,47,35,58,53,33,207,26,175,72,249,57,172,77,201,116,116,45,100,12,133,101,57,251,169,31,120,18,7,242,103,50,73,139,108,147,176,4,190,93,19,219,144,240,176,1,43,93,178,34,219,4,102,66,13,147,4,26,70,86,100,115,67,38,148,128,162,144,64,116,145,109,140,117,61,151,28,199,52,89,48,139,47,178,1,185,231,4,35,78,83,100,179,227,37,84,118,77,27,139,81,21,217,82,29,72,25,116,98,187,43,193,185,116,207,37,160,22,100,59,252,30,94,45,113,182,142,94,206,31,158,138,245,23,88,130,150,255,121,224,145,60,47,143,240,186,146,23,229,217,87,152,108,28,64,106,77,19,237,35,183,9,216,144,163,43,75,33,119,105,160,141,103,0,56,200,146,106,219,218,44,47,163,170,77,86,76,145,121,171,77,40,88,199,222,4,142,204,142,221,87,154,212,143,161,97,253,253,36,42,118,188,206,251,21,4,253,126,5,27,197,164,73,85,96,7,4,202,76,82,162,65,205,147,120,137,147,37,90,65,232,88,97,159,87,231,234,8,130,56,225,8,186,205,135,82,44,81,105,24,76,42,154,86,42,209,9,217,20,42,86,12,189,165,106,153,96,255,195,4,201,145,73,154,23,57,165,68,56,169,102,132,196,196,56,129,12,144,19,206,20,73,43,15,146,68,214,135,156,80,28,57,210,119,133,168,158,160,157,140,145,59,72,220,144,9,197,139,47,65,239,253,59,46,52,100,199,197,30,177,227,98,255,84,59,46,82,38,211,251,136,173,25,251,159,233,214,140,61,106,107,198,126,106,107,6,34,73,222,211,109,186,216,211,111,186,216,147,108,186,16,182,213,19,29,183,233,194,142,89,196,166,193,118,216,146,54,13,190,124,88,90,75,188,5,183,96,97,199,230,188,72,76,115,195,130,131,206,232,72,105,31,183,94,42,108,229,109,77,191,154,181,79,179,94,186,39,91,47,181,235,58,201,122,41,106,198,99,165,75,150,198,239,137,214,75,97,26,166,8,52,140,44,101,223,211,172,151,194,36,160,41,36,16,157,158,239,227,214,75,133,117,105,139,232,190,132,105,66,35,83,241,61,193,122,41,144,123,78,48,226,52,105,230,62,126,189,20,166,236,57,210,142,134,136,85,80,40,85,100,74,121,9,148,80,148,248,68,210,122,161,178,115,229,86,66,86,110,173,247,194,134,103,83,238,230,195,76,115,231,207,138,234,131,230,221,37,200,190,164,241,246,10,203,193,97,55,21,250,197,1,207,81,253,48,207,62,93,181,178,0,201,92,167,0,34,147,88,43,116,96,62,43,96,168,100,169,109,8,58,200,118,245,30,6,234,213,1,227,22,123,173,152,42,122,177,215,14,235,95,236,13,135,61,239,189,85,185,213,122,115,180,167,10,24,184,217,114,123,218,251,147,78,55,78,93,196,43,136,146,180,181,133,169,187,217,75,188,87,159,134,197,138,161,167,37,154,188,226,96,37,121,202,111,34,165,80,67,98,5,112,174,150,75,111,181,156,78,2,83,17,1,94,8,71,212,132,130,144,180,154,64,90,148,9,237,129,192,161,144,108,184,64,249,42,2,153,147,149,106,194,224,19,106,163,166,213,70,178,2,78,16,122,66,185,12,46,191,188,141,116,136,61,100,70,43,238,232,106,209,36,44,72,190,253,151,160,88,39,134,60,193,110,142,41,154,35,107,72,126,232,148,50,225,180,147,145,102,67,135,31,58,225,52,84,196,18,33,169,181,121,161,19,10,4,114,73,41,84,253,96,33,90,189,211,98,191,190,223,204,77,230,93,205,14,91,247,163,22,47,170,15,230,231,155,249,195,139,166,20,37,153,103,119,131,19,123,186,2,229,105,134,121,150,39,236,254,1,119,199,65,53,158,192,230,3,250,135,79,72,93,176,1,126,3,233,151,23,5,177,196,149,163,208,205,29,110,193,120,42,70,222,134,240,74,145,27,18,115,151,167,27,173,121,96,0,150,228,6,192,65,140,146,232,189,159,151,183,217,173,28,239,132,194,36,183,62,82,69,70,202,185,129,67,115,94,116,156,171,180,156,79,26,35,32,219,39,44,44,207,173,11,58,154,232,248,213,10,55,153,244,246,11,40,167,1,1,233,196,85,39,88,112,118,2,188,251,64,83,117,167,169,174,83,30,242,26,116,48,217,110,190,145,206,227,38,28,79,8,94,219,98,242,210,112,212,116,90,164,194,211,81,160,94,8,28,114,200,72,19,25,199,238,167,176,144,61,4,16,237,25,186,1,83,36,233,109,0,173,224,98,103,40,102,58,25,112,162,241,199,38,109,97,144,233,38,173,4,228,106,48,201,10,44,178,223,30,40,36,116,136,65,32,74,48,235,29,25,190,103,82,129,10,81,35,162,39,130,95,168,245,76,232,19,24,204,191,253,148,192,40,161,46,235,59,152,125,9,117,192,9,129,169,99,246,65,187,246,33,9,51,96,163,254,207,232,80,123,240,233,117,130,99,234,224,243,232,153,189,117,243,110,183,2,251,151,139,230,144,25,164,203,225,88,28,213,152,147,133,18,231,173,197,213,14,85,3,117,130,128,152,44,198,75,3,229,216,95,196,49,25,27,219,198,239,147,237,179,217,186,197,50,43,67,22,64,111,131,149,164,3,230,140,86,126,81,241,69,220,158,75,152,224,32,174,25,166,121,28,130,12,26,19,44,50,19,29,116,73,22,98,99,55,134,198,28,42,132,13,49,176,184,242,227,220,252,172,141,98,252,97,2,23,185,47,76,24,32,250,130,5,203,199,3,151,188,90,27,198,3,138,193,183,167,47,67,118,120,178,246,165,105,64,36,226,41,49,15,185,8,140,71,38,26,93,169,76,207,224,101,122,142,143,121,64,50,244,70,62,214,207,49,241,207,16,8,23,5,13,49,78,193,12,43,128,6,194,1,2,122,173,176,183,107,60,111,77,5,151,154,198,219,89,9,44,41,184,44,241,92,178,142,203,60,5,151,211,246,39,136,199,19,4,150,193,110,20,69,78,178,45,206,74,29,162,50,228,66,73,199,167,140,25,71,204,242,136,13,33,29,123,42,134,189,171,45,133,76,116,155,78,52,121,170,133,135,62,25,186,236,44,137,186,246,2,72,159,14,38,218,53,67,174,212,83,44,128,12,135,56,46,53,156,198,74,167,49,58,60,65,4,234,128,192,33,135,140,106,148,163,138,72,65,221,64,233,6,8,244,82,50,108,132,20,18,58,100,136,226,124,45,190,232,60,198,193,14,77,128,0,113,165,230,20,143,27,205,247,251,106,119,152,109,54,38,180,8,191,192,118,126,120,51,108,25,208,195,246,48,251,103,181,219,226,58,105,27,79,244,179,88,31,222,175,247,213,236,195,118,23,220,71,211,102,208,118,162,139,43,62,254,116,252,176,255,190,186,191,112,32,124,15,64,141,48,167,75,7,142,207,49,151,16,101,109,65,96,54,223,172,102,227,40,177,235,243,155,250,163,47,55,171,63,215,179,102,143,56,208,57,38,58,168,86,224,105,246,28,215,48,198,36,123,50,122,103,3,120,78,63,134,194,100,245,99,20,204,26,128,27,5,180,86,152,141,125,171,40,72,46,145,24,19,136,155,10,129,220,247,193,211,73,160,14,1,28,164,34,133,18,19,6,251,209,210,73,2,112,8,165,15,204,219,130,191,160,121,37,103,44,2,116,188,58,13,149,78,146,144,136,21,40,74,14,138,42,143,70,171,54,122,91,75,189,190,255,203,182,100,95,63,112,57,233,121,207,109,60,62,247,242,67,172,183,13,218,8,192,66,93,77,143,170,48,119,234,106,240,159,87,118,239,139,194,231,160,199,159,34,92,115,15,4,229,148,123,237,81,238,216,210,30,148,73,89,222,138,61,206,175,248,138,101,159,180,43,149,243,156,93,166,19,137,78,87,185,234,115,19,229,174,39,112,210,9,70,97,117,5,239,72,29,32,233,120,132,92,248,212,71,110,119,51,114,127,48,2,22,31,124,41,127,220,58,157,196,64,139,249,171,234,161,186,159,31,170,227,193,66,84,1,96,136,48,81,0,88,85,143,219,253,250,48,142,63,30,216,236,141,137,238,31,170,46,252,208,165,158,14,63,26,172,233,208,99,240,209,48,236,120,91,199,129,33,121,238,221,110,251,150,250,89,231,150,174,160,192,195,250,241,149,130,14,158,254,72,94,104,208,209,138,193,19,112,92,124,6,15,54,90,0,76,160,209,182,61,45,80,203,28,100,33,70,141,33,6,66,101,227,27,67,243,140,100,195,90,75,215,244,148,153,100,169,105,138,101,168,181,120,71,163,64,97,241,78,84,33,86,233,135,77,177,252,136,142,31,154,215,0,91,170,66,76,213,36,91,3,128,116,163,37,49,163,117,165,232,214,218,93,58,81,168,84,139,195,125,50,152,106,9,201,25,187,254,226,112,43,210,152,240,218,133,145,110,100,0,139,193,80,89,163,204,47,58,98,183,1,164,19,27,36,90,135,202,13,182,142,90,153,21,169,143,179,199,237,122,115,240,47,52,41,223,65,150,30,218,116,204,57,250,16,30,130,244,33,130,66,68,103,131,43,214,166,82,172,7,245,249,242,196,125,150,79,227,4,143,137,255,250,237,123,126,216,241,16,133,114,53,221,84,239,103,240,12,211,142,0,42,109,247,246,193,243,118,58,42,154,59,8,250,212,93,201,149,59,187,196,202,164,19,201,228,54,250,68,94,180,207,13,218,23,184,64,210,73,4,116,22,181,28,87,111,20,147,4,39,60,250,200,76,118,154,205,8,238,2,4,78,26,142,245,97,47,227,44,66,156,53,240,143,6,200,24,212,143,108,143,143,200,129,11,79,22,152,137,234,211,241,107,203,5,138,184,110,199,87,37,78,118,124,247,120,92,190,126,12,223,236,180,171,238,215,251,227,74,229,176,189,167,163,125,245,143,119,181,188,227,37,59,70,242,116,125,248,48,27,92,153,128,234,117,0,226,233,48,240,144,178,204,139,233,216,238,62,236,25,179,251,248,151,203,66,143,41,223,195,222,19,187,15,120,66,12,25,159,5,146,233,137,206,238,167,94,253,50,70,34,129,224,48,241,219,125,212,35,75,247,81,239,42,9,203,35,128,71,205,141,47,120,221,199,191,249,113,31,253,204,7,140,63,80,216,160,45,87,88,20,156,196,1,223,71,60,235,113,31,241,146,7,140,39,144,243,125,99,34,79,30,236,134,234,175,155,38,19,214,120,189,89,238,170,249,190,10,190,55,162,100,211,38,121,8,56,109,151,109,223,166,52,206,23,253,5,89,232,169,54,201,205,244,69,231,30,91,109,255,26,158,76,95,224,96,236,241,5,4,198,40,59,32,32,115,49,183,220,148,122,84,224,120,203,124,65,221,227,174,250,17,145,249,187,81,176,108,230,29,155,36,201,255,5,129,104,47,52,129,147,110,64,33,174,8,38,67,142,68,102,231,55,1,51,154,107,174,45,239,24,7,24,113,233,169,153,218,94,71,158,180,146,206,6,67,19,9,120,52,137,124,223,160,141,196,32,15,224,109,248,28,55,228,219,136,246,184,143,137,38,112,31,98,3,195,56,18,27,142,73,168,183,155,217,195,124,81,61,240,227,3,178,71,157,86,231,163,24,199,95,189,128,192,40,60,76,204,226,88,8,30,200,62,90,110,155,43,101,25,127,69,100,46,45,192,154,228,162,1,235,115,247,216,123,232,189,96,233,164,41,163,153,198,58,87,31,88,58,158,53,196,15,90,14,140,150,170,36,40,228,194,148,147,35,145,187,103,40,203,60,75,229,186,17,185,170,27,37,221,176,131,34,101,179,118,179,154,189,53,115,111,126,31,16,154,168,194,19,154,244,225,166,99,146,241,151,3,71,125,216,206,136,211,203,65,135,65,161,133,187,69,242,212,114,208,181,39,50,176,125,11,15,9,6,40,129,177,0,119,2,204,234,202,250,12,52,85,108,237,33,147,68,202,241,86,61,85,230,20,119,217,14,72,123,156,127,124,216,206,87,168,179,227,86,32,44,147,188,99,82,217,30,200,2,31,26,31,16,135,118,119,78,20,44,155,221,218,95,65,177,22,218,71,102,173,4,117,38,73,124,198,128,119,191,5,243,203,175,135,145,78,124,104,127,81,223,184,251,192,32,75,82,77,195,189,13,102,162,12,186,7,44,74,41,233,243,80,65,139,82,123,138,69,41,226,28,121,15,91,189,218,63,209,234,213,62,116,245,106,63,181,122,21,234,181,98,214,165,246,81,235,82,251,184,117,41,203,28,149,138,228,145,73,130,183,232,227,159,159,135,241,7,186,165,92,90,214,112,84,73,100,193,241,235,82,49,47,204,195,164,5,179,216,198,84,214,86,214,84,120,87,168,237,3,3,128,41,43,221,124,247,126,183,62,84,81,61,157,16,38,186,58,190,216,214,238,249,10,72,91,164,231,208,245,0,111,218,49,88,62,133,155,173,33,72,144,53,159,104,242,156,223,17,11,243,108,67,230,60,110,195,250,241,229,198,135,119,15,7,170,196,113,216,31,198,207,12,17,174,180,77,115,162,83,80,44,201,44,177,164,156,58,100,157,228,220,69,159,140,238,18,7,229,180,250,9,143,93,12,229,26,83,95,158,70,74,55,72,128,91,243,250,192,172,236,196,78,178,97,226,130,253,201,57,27,34,191,19,0,86,108,1,74,5,231,206,114,11,216,148,159,210,156,7,248,169,1,104,128,179,178,124,63,176,150,237,123,224,222,4,160,62,95,215,61,30,30,112,183,119,157,94,135,62,173,221,215,222,150,245,153,89,27,168,218,155,85,2,221,140,244,90,242,161,56,194,125,239,68,187,228,41,149,133,128,16,39,105,109,129,140,86,134,88,104,47,56,132,241,170,94,40,111,29,16,104,250,91,182,206,29,167,32,193,205,206,19,52,130,239,119,246,97,165,227,89,198,89,188,151,161,179,63,152,237,241,246,240,84,172,235,72,214,131,141,88,40,239,99,192,116,204,171,72,230,209,117,7,15,86,58,142,33,231,43,251,200,221,59,220,218,249,174,9,214,112,180,217,112,109,83,235,35,11,155,229,71,127,8,81,100,50,52,132,176,224,135,70,19,206,166,152,58,105,45,193,237,225,77,181,155,193,131,5,64,122,233,36,28,24,2,120,33,158,227,134,163,105,242,131,99,137,137,198,49,97,133,13,54,46,194,176,33,198,249,160,41,68,208,177,111,203,251,65,69,70,82,233,155,38,54,226,237,52,16,48,86,24,172,173,229,22,140,211,38,96,54,162,97,6,7,33,21,71,7,233,84,69,82,11,7,94,1,15,71,5,189,184,101,185,40,161,16,50,189,142,68,215,118,130,145,211,105,5,96,23,161,178,28,64,46,120,208,92,188,37,28,64,78,55,128,4,97,168,15,54,221,200,65,118,239,13,236,40,239,236,104,70,176,125,15,104,162,33,251,247,96,10,135,69,238,34,244,130,83,108,58,132,41,51,97,236,255,146,218,30,195,45,49,80,172,72,83,252,126,125,120,51,155,239,118,243,128,116,135,101,172,12,205,119,206,184,161,105,206,101,139,97,118,179,243,135,231,245,84,52,223,133,62,132,8,59,129,17,118,191,159,149,27,96,202,227,106,249,188,51,157,30,213,193,9,206,184,77,76,94,211,67,139,75,103,122,64,253,115,17,186,61,23,193,50,62,117,48,194,11,148,199,0,77,77,132,112,113,215,40,160,61,209,22,231,113,178,6,164,213,219,33,133,17,165,91,11,80,66,118,101,172,233,37,10,126,39,0,19,114,15,184,99,174,200,108,200,66,164,114,105,248,195,51,126,180,132,18,85,241,124,199,199,226,14,180,132,108,67,170,194,64,77,226,112,131,100,185,82,122,114,53,89,133,132,70,3,208,128,192,200,242,253,127,242,106,242,80,28,225,113,213,68,187,235,172,38,15,9,8,9,144,172,45,144,225,209,16,11,29,28,13,97,34,86,147,29,64,160,245,38,75,118,175,21,97,60,98,167,17,23,146,76,96,165,227,25,30,148,92,144,25,93,173,245,224,165,99,93,71,178,78,176,154,236,3,76,199,188,138,100,62,46,116,112,99,165,227,24,180,154,92,216,86,147,157,7,100,17,134,195,117,45,224,84,240,144,139,144,45,211,99,228,128,8,194,213,104,224,247,170,15,143,70,45,171,21,245,41,80,23,5,225,158,219,215,248,58,238,219,66,69,136,15,119,55,67,58,114,11,32,218,155,91,176,98,23,45,253,144,160,250,103,239,28,118,187,93,52,23,5,89,174,104,161,54,116,30,128,68,48,2,197,10,161,187,91,92,40,178,5,108,11,189,113,14,192,3,152,142,119,200,185,84,152,106,113,164,19,176,94,211,58,233,6,10,22,234,6,46,176,67,29,129,181,217,149,93,193,37,13,64,103,48,217,252,138,238,224,146,142,96,135,224,104,24,227,18,46,33,227,156,194,37,90,124,38,16,6,11,178,13,218,50,131,11,73,235,28,46,41,38,114,15,94,88,172,32,58,35,89,48,90,7,113,73,49,129,139,152,130,76,199,63,200,73,128,84,12,233,36,28,55,93,79,122,9,85,4,122,137,17,120,160,155,112,180,187,174,159,24,19,1,115,20,158,246,215,243,20,99,66,66,93,133,179,101,132,175,24,99,70,57,139,49,28,141,145,12,192,5,89,9,203,137,239,227,60,34,180,146,99,146,173,147,155,66,22,182,91,237,113,194,232,12,155,102,164,190,211,66,115,180,207,152,198,76,167,14,32,167,1,146,45,194,105,236,170,89,253,34,198,188,254,165,255,124,66,144,171,232,65,6,56,136,209,215,3,75,186,170,30,15,111,158,201,25,132,62,165,225,190,195,217,234,217,238,191,233,83,28,226,90,44,223,35,29,74,31,9,237,70,250,32,167,103,67,149,128,27,74,43,10,104,227,179,26,14,215,113,254,20,116,187,237,250,4,78,206,146,48,30,79,16,32,6,45,151,78,22,132,62,112,64,221,187,183,111,63,98,247,180,187,128,176,163,217,49,75,152,31,246,105,188,91,27,147,75,193,108,31,8,196,172,180,237,20,205,85,18,110,169,206,114,4,96,166,211,110,25,37,130,232,221,90,83,96,233,152,6,156,78,208,150,0,169,240,223,245,26,0,12,154,151,60,106,152,226,34,78,23,82,186,241,129,156,65,232,35,159,207,32,104,69,112,6,1,54,246,28,137,28,96,167,64,208,32,189,2,46,235,190,223,26,219,244,110,115,104,111,203,61,125,92,107,205,254,113,62,241,177,39,154,30,125,137,136,194,250,24,189,203,117,130,95,198,113,223,207,51,121,35,88,191,219,176,208,218,217,34,146,105,95,192,107,249,54,178,71,84,160,219,7,168,221,219,40,119,107,143,88,20,190,157,0,151,72,0,37,59,127,62,200,101,214,155,85,245,129,172,126,55,234,16,174,31,227,102,255,6,151,174,141,24,132,104,110,191,65,170,87,231,198,29,146,104,250,203,73,245,10,100,253,132,1,113,189,220,182,65,184,160,89,56,31,145,119,173,75,230,166,59,78,39,30,149,234,162,185,62,25,237,113,71,86,178,39,184,103,110,36,218,168,32,223,139,150,110,172,100,120,48,222,7,22,186,19,191,34,137,198,199,34,168,246,177,66,172,246,180,130,59,114,199,178,50,19,146,23,60,103,101,86,100,38,62,207,138,66,105,145,51,19,245,170,204,252,46,203,114,197,37,203,10,41,52,55,81,165,150,133,228,82,112,205,51,35,45,38,115,201,179,188,40,88,150,183,55,210,147,170,61,75,54,162,12,61,162,41,222,95,28,116,176,217,238,222,154,79,254,89,161,158,0,62,29,192,181,128,132,118,127,190,191,215,18,163,149,37,32,70,171,145,0,49,218,249,243,43,197,104,199,14,225,49,218,184,217,149,98,52,6,143,209,56,190,250,46,96,114,132,196,116,253,6,222,152,238,226,189,11,240,58,193,168,227,232,216,238,136,50,235,206,186,255,56,223,29,171,238,25,222,198,59,17,65,54,191,119,203,168,106,107,12,60,43,8,108,107,15,89,183,37,23,206,114,114,219,234,144,3,35,151,44,195,75,182,232,248,23,196,146,21,29,114,145,70,178,145,249,72,15,3,43,189,46,22,41,75,242,124,228,72,222,83,228,35,227,142,211,137,39,93,62,210,35,67,202,206,122,76,213,17,147,211,161,179,110,70,76,197,113,215,72,140,142,99,76,150,24,89,209,210,41,141,196,25,164,0,53,224,72,83,215,185,39,166,211,152,186,214,224,183,21,199,136,113,26,64,97,7,41,64,150,177,28,163,215,124,38,161,210,105,37,100,209,7,24,219,112,44,180,223,185,163,161,203,14,154,230,17,176,193,176,93,237,241,21,107,175,215,120,137,165,223,111,175,191,113,142,202,25,36,71,61,66,1,146,212,222,247,152,44,213,245,82,151,35,201,97,152,116,236,68,34,60,175,181,180,251,15,79,108,79,18,129,100,182,131,22,145,171,109,39,172,232,108,245,4,19,25,250,247,65,64,30,193,114,144,141,19,221,254,50,166,239,41,130,127,75,207,233,4,148,39,139,186,185,45,84,225,9,162,127,196,176,146,133,221,118,184,116,195,5,184,31,10,56,0,60,114,166,208,132,199,22,44,172,48,3,120,102,177,60,147,4,200,99,172,116,250,83,64,98,77,110,139,144,57,197,203,234,3,232,118,209,134,139,4,97,236,73,184,65,33,82,232,72,193,247,148,194,198,168,206,173,193,79,32,127,216,238,6,251,170,166,207,50,8,38,166,35,218,62,220,116,44,59,254,114,28,197,206,230,155,213,108,28,43,116,24,223,212,31,125,185,89,253,185,22,199,30,17,99,13,136,8,138,83,221,45,6,228,47,214,135,247,235,125,21,225,254,127,115,66,176,196,168,199,226,236,191,73,4,44,131,71,199,19,251,218,190,133,71,189,3,20,76,188,59,0,72,161,4,126,230,251,189,130,140,77,62,54,54,98,92,124,232,5,20,40,30,66,172,124,143,146,188,93,64,23,147,17,200,53,72,41,68,71,74,153,132,20,136,173,70,164,81,150,230,233,244,3,148,64,141,41,3,91,254,64,142,27,220,180,124,59,168,132,139,226,74,89,164,187,207,116,114,42,146,229,143,61,50,116,217,209,225,154,177,242,26,116,48,213,9,68,228,215,223,87,55,24,223,152,20,118,18,40,157,174,228,128,228,21,54,250,2,135,28,50,158,12,109,0,119,213,62,139,24,150,186,53,118,44,2,188,109,20,95,44,138,47,134,230,43,192,117,227,249,66,103,243,78,148,116,83,169,132,36,219,176,185,164,144,208,33,147,9,118,86,104,32,87,131,135,74,224,71,32,216,65,9,16,29,143,205,220,95,126,136,176,24,31,178,132,10,39,209,211,234,67,132,177,248,192,18,178,20,182,47,232,253,110,254,248,104,104,49,164,153,114,228,108,191,190,55,171,145,239,118,213,236,176,5,20,92,164,243,82,210,16,124,71,5,38,188,41,32,131,14,2,157,46,177,192,33,168,233,115,21,25,32,141,131,235,64,23,85,148,103,89,214,217,85,135,160,171,237,85,39,253,105,76,137,47,21,105,252,176,130,42,57,65,136,179,89,119,131,248,124,121,120,55,127,152,77,113,143,80,38,71,7,16,171,38,44,7,159,165,184,60,121,241,151,206,170,253,205,252,159,221,252,234,166,247,147,238,40,69,148,153,27,48,179,187,159,1,74,23,120,120,82,73,253,229,82,84,84,30,160,79,123,120,252,136,65,78,32,15,235,197,254,183,244,58,217,10,59,94,214,245,134,107,193,72,85,175,129,196,138,151,117,66,136,75,36,3,169,61,125,182,154,213,177,196,120,155,84,23,76,185,35,22,219,198,168,160,190,3,60,33,66,254,216,98,55,112,198,171,163,34,10,178,129,72,93,216,131,19,145,92,120,44,81,157,109,48,153,84,155,231,75,121,205,13,35,65,226,70,21,222,80,200,201,199,146,7,87,205,160,163,195,233,140,221,174,190,173,240,20,41,58,151,17,2,130,121,204,120,156,123,70,187,5,175,172,178,222,58,131,143,13,26,105,2,30,26,2,65,226,101,36,59,25,233,184,29,32,16,122,169,35,253,1,44,177,44,142,162,200,136,162,120,120,157,19,12,155,214,114,225,194,212,16,179,69,168,102,51,243,249,118,85,111,127,175,103,238,75,83,75,88,62,126,12,62,228,125,250,188,109,21,16,172,117,59,156,166,235,80,165,96,97,117,168,35,94,88,221,169,247,41,190,142,115,2,1,213,149,44,77,98,251,15,172,27,13,62,78,86,39,178,92,123,250,31,80,249,57,201,54,166,210,115,66,32,172,236,76,2,130,222,240,180,220,161,113,156,145,9,43,57,99,226,77,105,5,112,191,102,56,28,169,36,40,42,53,35,90,209,30,207,138,148,128,95,68,37,6,165,83,240,74,76,43,129,227,101,192,58,74,117,26,8,172,248,88,199,164,160,172,180,180,212,1,42,43,173,218,135,57,231,232,202,201,24,37,225,140,195,87,74,78,100,134,120,182,0,110,209,181,13,20,187,12,205,46,69,81,192,142,148,156,233,240,34,64,206,108,240,37,253,44,12,77,249,47,226,176,16,233,226,82,122,8,231,151,9,125,159,72,156,44,240,9,251,16,2,203,113,103,113,37,35,205,155,6,212,197,134,103,232,244,219,203,41,50,249,62,145,21,157,108,143,97,210,90,4,64,228,1,50,7,28,175,34,87,77,165,127,172,47,169,110,179,120,127,66,205,149,14,73,168,7,168,33,105,181,165,1,54,185,29,66,1,82,236,137,134,52,180,4,165,219,214,38,159,54,103,60,89,138,62,28,15,124,162,62,196,33,75,215,131,96,65,155,202,228,112,4,142,179,94,139,203,4,171,243,132,127,139,74,216,221,228,155,60,123,181,54,116,96,220,72,0,42,86,36,221,229,109,253,39,197,45,57,39,135,230,156,126,154,103,15,213,134,84,67,6,192,88,129,116,7,60,149,158,40,103,160,178,141,73,202,177,187,113,2,64,211,138,130,78,12,200,32,107,18,47,1,239,136,42,143,23,121,186,202,67,15,206,49,224,86,243,25,157,72,92,14,95,93,95,226,25,193,76,104,128,176,26,208,29,153,87,132,91,130,172,52,50,42,102,25,129,27,40,18,51,203,169,152,229,104,102,187,107,53,35,31,122,244,211,40,168,152,21,104,102,187,107,52,52,79,204,172,164,98,86,162,153,213,29,179,42,29,179,193,37,230,97,46,10,75,93,35,203,205,110,172,132,193,0,182,232,60,36,246,170,155,242,38,186,78,46,168,84,91,241,6,78,76,117,150,125,242,109,169,164,91,241,134,66,142,175,181,79,227,37,31,183,240,138,123,96,162,117,1,223,11,254,62,167,30,235,104,243,23,86,219,119,20,125,194,199,20,87,231,135,73,99,88,233,183,145,28,35,37,108,213,223,14,132,151,66,23,236,228,121,178,160,61,114,13,96,2,140,152,111,212,90,192,144,188,200,21,1,55,88,90,187,133,203,85,67,76,138,136,85,159,43,174,15,28,133,13,188,107,171,12,216,114,55,194,245,175,17,56,154,224,42,243,99,176,224,117,2,79,83,42,122,2,214,10,156,141,62,109,209,35,171,255,143,101,140,93,1,24,35,17,173,1,4,3,131,118,41,91,22,59,69,57,189,205,74,70,172,4,76,51,97,42,179,160,183,162,49,192,164,210,137,45,250,122,169,166,184,109,10,219,95,90,73,157,130,121,212,93,84,161,12,161,66,17,47,98,2,177,96,78,170,34,38,110,112,229,28,101,21,96,11,97,54,49,31,139,92,5,201,212,111,160,176,99,197,58,166,201,54,99,218,168,12,172,152,141,163,51,104,56,23,85,53,155,70,75,104,37,112,117,179,49,185,81,155,54,61,112,201,217,103,209,236,199,22,150,252,136,201,133,0,56,209,217,131,23,237,194,156,204,120,186,105,28,82,249,153,8,225,33,98,71,30,220,132,136,164,95,252,113,81,29,39,44,92,1,200,13,133,22,133,238,68,65,119,110,206,73,38,85,204,143,63,142,233,101,29,81,4,26,211,23,85,6,154,134,75,107,101,112,161,87,128,137,225,241,74,116,205,74,80,157,222,214,38,102,107,217,37,218,255,101,187,81,180,20,1,101,160,115,187,128,2,208,229,199,200,82,75,15,38,188,232,227,106,20,79,67,72,161,103,252,249,167,13,161,79,85,16,234,141,5,186,20,212,195,160,42,2,249,33,65,245,114,109,169,151,151,98,122,139,84,76,249,199,65,126,76,225,199,15,73,42,145,232,146,143,155,94,220,241,85,47,96,90,246,49,41,138,157,98,92,200,224,198,74,192,55,102,139,35,98,138,133,111,113,196,204,95,96,161,102,32,224,99,93,69,69,234,104,3,130,29,159,110,3,98,73,182,154,63,164,47,180,44,211,139,134,194,163,170,184,82,140,3,39,225,20,71,22,97,122,132,94,113,227,146,179,219,228,2,74,182,105,169,175,248,237,147,82,34,19,79,179,103,169,47,223,232,178,210,4,86,242,225,2,236,85,130,13,64,148,233,9,42,37,217,146,132,48,33,35,55,15,65,4,48,40,31,141,40,197,10,5,89,50,178,128,160,25,47,58,198,21,93,177,104,76,96,124,86,128,223,38,228,101,23,83,32,234,81,22,87,26,114,0,165,181,20,184,48,47,192,76,136,24,101,185,98,57,104,85,61,110,247,235,195,184,20,244,192,102,111,204,50,241,67,213,85,130,114,22,112,23,124,131,231,175,2,13,62,196,85,95,90,136,224,234,143,181,65,92,223,1,85,159,139,79,63,85,124,158,168,226,211,142,3,182,218,211,182,39,170,244,120,224,32,118,79,89,138,225,199,217,154,168,202,99,35,189,46,199,188,173,203,217,36,130,56,163,145,202,129,162,184,225,32,247,110,183,125,139,174,113,133,96,166,21,68,188,16,80,94,223,129,147,128,87,68,101,7,51,173,130,43,59,168,57,11,171,236,156,133,91,23,100,100,17,161,150,13,0,118,92,88,199,32,217,145,210,51,109,129,213,156,54,210,9,11,136,162,170,56,54,140,132,211,23,87,193,105,137,188,98,245,198,218,101,114,193,164,170,220,12,20,92,119,42,206,167,242,199,132,165,155,86,184,177,101,27,23,78,242,113,10,47,217,64,37,207,177,198,37,164,94,51,10,239,253,146,197,213,105,96,92,247,11,53,67,18,49,82,192,21,104,46,1,240,220,242,142,91,186,195,92,23,212,197,69,241,232,170,76,0,159,136,178,76,75,86,84,73,198,6,146,214,10,224,98,179,16,19,32,176,234,113,197,90,76,181,57,236,62,206,30,183,235,205,193,127,60,75,137,204,95,141,233,33,250,43,50,163,143,113,149,145,62,76,112,101,198,217,40,158,134,128,10,141,229,243,79,85,154,39,170,210,244,199,2,91,169,233,99,16,85,107,2,32,33,166,81,90,238,183,60,206,104,103,246,135,175,214,56,72,71,185,132,9,44,82,246,39,114,118,56,203,129,9,98,223,252,134,91,234,168,68,209,133,147,64,150,113,201,98,159,208,43,38,140,206,110,147,11,40,85,210,216,39,134,235,142,154,39,202,25,251,242,141,205,27,167,176,146,15,23,143,208,231,144,36,207,26,33,132,137,2,151,236,129,244,164,159,235,141,41,197,10,5,151,243,217,64,208,140,231,29,227,116,105,159,133,192,248,144,0,157,254,249,217,69,100,127,125,202,162,50,64,23,80,218,249,28,158,5,2,173,41,143,81,150,43,38,130,247,198,102,4,62,140,37,75,238,79,3,59,60,127,18,120,241,41,46,253,58,131,4,39,128,142,38,177,253,7,36,127,163,143,63,221,186,65,150,204,157,101,139,77,229,206,8,68,137,156,23,16,116,10,173,176,188,1,88,242,100,15,99,217,137,143,56,92,225,5,36,149,70,236,170,179,149,90,148,99,115,34,37,224,23,115,249,3,70,175,96,139,195,125,9,28,223,16,151,81,202,211,64,96,197,215,61,67,94,74,170,5,226,62,117,129,21,128,179,223,13,117,208,81,217,191,29,37,225,140,195,229,254,103,50,163,238,89,112,192,36,103,151,161,217,141,205,136,221,72,201,153,6,220,167,208,131,231,93,124,238,60,236,44,240,211,48,36,207,182,4,99,33,226,69,222,155,208,55,64,188,19,237,212,195,96,78,66,113,242,192,165,216,99,8,44,215,1,3,14,79,176,71,228,197,6,106,248,43,17,96,172,114,188,110,71,101,217,118,152,180,54,2,23,139,4,204,18,142,215,151,97,134,61,202,125,219,140,183,16,128,140,247,34,107,15,207,67,109,13,7,153,33,48,117,99,167,212,13,99,1,45,153,23,15,206,188,46,248,128,39,228,83,0,145,233,249,5,52,36,89,183,55,29,12,80,80,150,92,43,244,209,184,76,188,201,19,145,176,247,134,76,96,197,18,152,58,179,80,188,89,243,135,230,151,113,38,203,143,13,178,99,185,37,37,40,44,123,121,1,230,203,10,105,121,36,38,38,135,242,74,97,86,151,5,15,41,229,220,244,144,92,218,113,114,57,166,137,2,31,11,184,0,177,108,119,254,172,40,200,243,206,167,40,24,95,244,73,150,193,120,112,177,226,239,98,149,194,123,19,67,172,248,147,101,31,238,126,210,73,69,146,164,34,235,205,114,87,205,77,217,33,112,173,129,101,89,192,98,195,16,213,31,113,217,190,199,197,21,23,72,193,161,206,84,59,18,74,2,2,27,123,139,79,75,17,100,75,17,23,2,198,174,71,92,192,16,45,74,132,161,130,30,80,182,100,132,167,249,155,104,105,98,130,133,136,245,137,48,84,90,193,196,174,82,184,105,70,133,218,211,112,41,88,71,44,88,224,212,13,22,109,143,4,81,199,126,170,136,215,169,6,7,43,74,118,230,151,108,241,98,68,99,224,10,198,133,75,247,132,141,23,189,196,172,101,76,64,165,156,157,184,21,141,11,98,163,150,53,166,176,210,115,206,226,56,143,205,15,60,112,233,249,231,145,252,7,36,5,174,200,44,88,40,184,132,96,96,97,202,179,64,74,239,14,64,43,193,17,18,194,45,82,56,112,176,34,224,103,157,96,140,108,169,194,78,36,73,12,135,94,180,8,224,26,177,37,240,130,186,168,245,138,9,172,196,51,30,23,144,248,167,79,188,238,92,177,216,179,171,150,239,118,251,245,143,85,29,255,134,230,238,101,30,144,186,91,144,253,249,187,179,17,46,117,182,193,5,103,242,222,198,116,52,5,228,244,19,205,62,37,246,100,137,189,77,202,216,236,222,134,69,148,226,3,160,65,70,84,141,141,232,113,174,39,186,250,199,199,134,201,202,247,213,195,29,58,225,135,226,147,202,42,54,243,15,32,30,119,5,116,48,112,90,113,32,18,14,15,229,168,248,35,0,51,129,28,48,85,17,196,228,12,190,64,8,53,243,97,21,23,187,160,143,229,146,156,72,135,27,48,236,120,177,142,113,178,210,139,157,206,192,250,139,45,54,131,135,115,81,149,24,31,94,66,19,129,171,198,216,8,142,42,201,120,1,147,139,128,194,74,198,214,102,66,48,147,11,34,124,31,106,110,185,187,181,44,88,202,89,29,82,253,153,140,225,97,178,71,214,129,0,114,233,87,129,220,132,199,202,12,87,15,154,2,195,202,163,179,254,133,32,75,235,39,232,164,11,252,241,197,33,31,247,136,210,144,141,192,168,250,144,15,48,173,213,1,132,103,32,147,195,41,84,233,138,101,34,227,236,86,179,183,38,71,154,223,7,212,135,116,22,112,185,115,31,210,95,24,26,127,141,171,190,12,112,130,75,65,238,86,4,84,4,20,127,108,223,127,170,250,144,85,125,6,226,197,150,123,6,32,68,117,158,16,76,208,241,121,139,1,212,153,74,182,143,195,73,191,169,49,28,182,232,186,78,32,44,169,100,98,203,57,46,154,81,78,113,10,44,1,215,136,106,5,74,211,96,5,133,11,33,28,55,239,234,88,93,106,80,176,66,100,29,171,100,119,19,95,16,24,88,59,24,56,108,128,115,143,170,22,56,129,18,206,68,92,153,96,64,105,84,125,192,141,148,156,105,22,195,116,108,69,96,18,44,57,235,60,138,245,128,84,221,30,113,5,74,3,121,75,147,178,60,10,163,153,255,229,109,11,173,104,193,224,242,113,43,10,154,247,162,227,157,238,169,109,27,133,4,49,25,254,170,38,47,195,136,228,123,64,90,84,214,237,68,74,59,179,113,241,133,119,178,196,42,204,85,19,237,240,219,154,116,22,146,101,7,223,214,180,167,184,173,105,15,191,173,105,79,121,91,211,30,114,91,211,254,211,109,77,9,115,234,216,219,154,246,212,183,53,237,73,111,107,178,24,183,227,140,76,180,87,98,79,125,91,211,158,244,182,38,159,52,226,211,231,3,229,30,8,15,92,90,214,81,161,59,213,101,85,123,146,203,170,194,120,198,92,86,133,152,86,193,187,28,80,115,22,90,148,184,184,198,138,71,233,102,3,129,29,155,238,32,182,230,116,229,8,240,77,88,251,208,155,176,246,36,55,97,237,227,111,194,130,77,105,108,9,130,228,38,172,61,193,77,88,24,118,241,22,44,190,242,64,114,19,22,134,105,142,103,58,168,230,16,126,98,124,31,125,95,85,223,76,136,78,0,69,64,181,1,121,66,124,31,127,89,213,62,238,178,170,62,203,178,101,57,207,8,115,70,146,203,170,246,4,151,85,121,89,69,149,23,72,110,168,218,199,223,80,5,158,187,184,0,196,59,47,162,148,228,138,85,133,131,65,236,110,247,15,120,14,168,222,0,233,171,44,12,48,253,213,5,203,231,184,12,127,8,20,92,101,152,104,70,65,71,64,181,193,218,224,211,211,64,145,245,9,100,121,98,56,24,216,18,197,16,133,168,76,17,4,10,170,195,10,203,165,249,185,76,242,62,144,147,120,148,171,152,68,35,21,65,228,27,65,151,132,6,102,70,67,187,12,49,226,81,25,146,27,41,129,76,227,178,164,33,169,87,124,45,104,162,227,228,66,74,246,94,80,143,24,33,58,106,202,137,235,121,19,190,23,52,148,112,108,86,56,141,150,124,200,194,247,166,3,7,97,112,143,108,56,178,108,75,63,170,32,187,125,249,66,196,1,25,173,35,228,9,29,68,228,58,58,76,192,131,155,152,109,4,227,229,131,75,114,237,48,88,9,4,40,2,139,116,119,81,201,238,4,84,66,150,121,156,238,7,4,165,129,12,163,215,214,193,70,42,134,225,176,203,148,149,86,192,180,17,122,161,178,183,241,53,46,85,118,24,53,204,197,202,83,252,224,50,91,250,11,150,167,224,161,89,239,191,225,69,203,83,252,97,47,91,158,194,164,184,112,25,136,15,178,75,124,188,250,164,116,30,115,233,178,29,178,32,185,116,25,38,9,236,197,203,168,94,146,75,61,94,62,199,213,73,21,231,1,93,160,88,246,121,231,12,51,170,37,207,41,122,175,86,181,37,190,140,25,130,141,29,138,46,46,209,138,234,66,230,73,178,83,39,36,52,151,51,195,36,36,105,179,147,99,172,105,220,79,77,220,33,224,32,159,96,129,17,221,0,56,48,144,179,180,137,8,81,134,104,176,232,105,162,45,25,69,161,177,146,181,213,167,141,137,100,27,19,45,66,142,42,255,15,161,40,215,0,130,144,65,166,39,31,14,197,105,138,143,34,169,206,79,70,47,4,184,57,216,221,119,127,65,198,83,97,216,88,241,240,78,60,114,114,123,152,64,196,155,65,148,79,165,54,4,130,57,194,99,133,211,109,230,23,108,122,155,35,199,184,247,105,250,155,159,163,183,189,34,186,72,43,38,114,17,181,142,186,190,219,172,90,26,215,158,64,70,227,62,146,235,18,35,21,20,62,111,158,132,76,32,5,204,225,91,31,114,204,38,90,12,56,79,9,46,48,224,86,247,71,81,21,191,84,143,99,58,155,211,76,193,6,11,171,100,221,225,100,193,73,83,99,43,153,5,33,203,5,129,27,23,233,89,46,9,89,46,209,44,139,142,101,157,156,101,153,209,177,108,176,176,44,203,142,229,60,61,203,140,144,101,134,87,108,221,242,172,178,164,60,67,118,178,12,171,11,33,213,173,97,111,209,123,90,220,112,9,195,147,136,141,45,67,122,163,206,1,248,240,146,11,128,32,62,35,41,106,78,67,38,23,3,96,35,72,88,186,121,1,223,19,53,62,231,12,46,149,58,138,81,160,17,64,150,73,251,210,233,12,188,204,189,231,19,156,116,71,105,102,212,102,14,59,22,90,26,93,236,42,203,148,177,107,252,182,142,9,60,90,230,17,135,25,44,4,70,157,106,240,224,165,181,59,184,212,208,59,173,104,20,233,218,43,102,199,206,247,166,38,81,223,220,80,151,112,215,251,131,33,225,163,127,185,163,16,37,100,185,195,210,7,100,229,195,217,60,118,201,193,6,140,88,15,241,194,164,160,19,180,74,50,1,240,105,193,36,193,130,137,77,222,241,107,39,54,84,242,101,20,64,39,16,83,173,217,216,84,31,173,72,162,91,32,194,25,138,184,25,2,213,9,169,212,104,235,191,1,92,108,15,111,170,29,229,226,2,190,207,180,130,76,37,196,200,152,41,0,61,129,92,16,165,117,204,132,15,46,173,163,172,9,118,1,210,46,242,227,19,26,156,92,241,27,88,236,24,182,149,235,66,50,250,98,151,157,98,112,221,203,22,113,198,132,171,68,213,48,31,114,66,115,19,91,24,179,145,78,84,35,243,66,39,23,11,173,59,163,171,156,133,160,39,23,78,120,17,77,91,118,211,21,178,184,142,149,128,149,209,38,179,21,236,200,224,138,107,16,169,217,107,107,110,102,232,100,27,91,113,155,130,197,74,171,243,68,42,75,80,50,153,160,56,69,2,132,174,200,121,37,18,85,144,179,145,74,84,155,243,65,167,181,108,128,48,19,100,214,56,173,202,61,73,193,238,253,250,240,198,164,69,187,121,64,157,142,101,66,66,10,117,103,108,72,125,238,178,85,108,185,171,135,135,168,198,185,90,19,82,5,170,189,141,219,125,42,185,37,40,185,245,196,28,95,105,235,129,145,23,216,252,216,16,219,90,176,241,86,45,150,73,150,120,171,178,131,137,186,204,181,139,242,59,211,192,88,201,240,78,50,253,141,47,148,69,130,73,186,35,183,40,251,177,177,114,57,63,0,47,100,170,162,162,155,250,168,39,139,193,29,36,150,17,177,124,34,195,55,55,104,10,49,32,202,131,126,232,152,250,32,10,157,99,208,237,54,151,44,207,25,140,227,177,54,88,82,205,148,6,13,171,15,236,44,86,69,95,68,24,81,170,51,74,190,117,70,225,74,244,53,248,102,164,124,51,52,223,226,204,119,121,13,190,57,41,223,28,205,183,60,79,240,236,26,124,11,82,190,5,154,111,125,230,91,36,230,27,188,130,208,75,129,17,105,51,209,122,129,3,48,101,152,17,187,78,208,35,153,104,121,192,133,152,94,10,36,1,41,221,106,192,4,104,122,89,132,175,2,132,38,69,147,123,105,61,93,112,27,11,138,39,53,34,176,5,6,91,73,6,56,198,184,229,4,144,108,236,235,9,35,218,163,5,23,187,122,96,65,195,202,228,28,84,42,153,54,154,38,90,44,112,33,210,10,32,106,145,160,71,34,209,218,128,3,49,177,157,3,228,150,48,11,196,73,52,234,218,107,1,171,234,161,186,159,31,170,35,29,1,23,148,212,247,64,5,45,4,12,128,3,151,1,44,109,34,202,237,67,52,216,18,192,68,91,50,138,66,203,255,214,86,159,138,255,180,197,255,161,144,163,74,255,67,40,202,194,127,16,50,232,228,67,105,57,161,157,171,116,85,127,55,7,241,23,148,132,97,99,197,211,157,24,203,25,249,5,37,65,148,227,171,255,225,240,88,225,116,167,102,198,239,118,16,92,80,50,77,63,201,30,98,88,23,105,197,68,46,34,162,11,74,128,125,36,215,37,70,42,40,124,48,59,9,153,64,10,152,11,74,124,200,81,23,148,32,192,121,74,112,129,1,183,186,63,138,148,241,82,61,142,23,17,112,154,41,216,96,97,149,172,187,160,68,211,214,226,173,100,10,66,150,5,129,27,207,210,179,44,9,89,150,104,150,187,11,74,114,145,158,101,69,200,178,66,179,220,29,180,205,101,122,150,53,33,203,26,175,216,221,5,37,69,158,148,103,200,50,203,176,186,0,174,71,196,47,177,184,225,18,134,39,17,235,43,67,122,227,87,87,38,240,146,11,128,32,62,35,89,88,153,134,76,46,6,192,5,37,97,233,38,205,5,37,23,82,9,93,248,112,20,163,64,35,128,188,160,164,180,221,164,80,200,176,69,15,27,221,81,154,25,181,224,97,199,66,75,163,139,93,11,157,50,118,141,95,236,152,192,163,101,30,187,212,49,36,48,126,161,195,141,151,214,238,224,82,67,239,180,162,81,164,107,175,113,220,87,167,101,150,106,215,47,18,77,47,116,228,50,244,38,246,49,122,224,106,135,171,97,196,2,131,5,18,182,238,225,3,160,165,45,116,5,196,221,244,211,50,8,237,50,136,69,210,81,107,33,22,60,202,5,145,112,120,136,185,85,150,183,190,114,233,185,206,55,118,101,196,195,138,41,177,86,31,30,77,101,213,100,94,81,149,110,68,63,164,178,35,41,119,79,51,129,119,215,126,220,4,178,64,212,115,81,26,138,88,152,178,202,227,88,168,40,9,181,175,1,196,138,150,117,2,160,173,111,89,105,133,84,63,44,113,7,46,92,137,175,131,120,48,19,206,240,136,98,136,133,232,248,138,136,15,52,185,40,24,145,40,72,106,35,1,184,201,5,194,169,4,18,90,195,152,10,39,225,226,194,85,51,6,6,140,119,162,10,188,18,194,201,1,133,16,35,234,26,19,128,104,225,180,203,23,57,245,13,16,110,98,105,35,82,116,153,195,47,6,108,153,195,66,101,124,173,195,3,154,214,142,224,98,39,239,204,35,84,174,39,169,122,88,54,199,120,234,30,245,234,81,120,221,227,2,31,82,249,176,54,141,173,47,92,130,34,170,31,147,16,212,244,129,42,32,142,198,159,106,32,9,106,32,151,178,142,175,130,92,34,146,215,65,2,59,0,217,97,203,205,216,121,145,95,161,18,50,197,12,109,45,4,218,19,169,252,232,170,33,19,108,68,186,116,15,114,2,121,96,42,34,24,77,197,86,68,198,18,57,158,130,103,164,90,216,64,98,197,219,85,69,138,146,190,42,50,166,22,92,23,25,239,169,197,133,52,68,181,145,41,212,132,51,62,182,58,114,73,54,81,125,100,18,54,185,56,24,153,56,232,106,36,62,228,228,66,225,116,66,1,213,73,156,65,39,70,104,200,90,73,110,203,216,74,9,168,149,216,185,160,17,102,108,189,196,5,137,22,81,87,42,40,117,130,164,214,65,46,117,244,138,175,154,120,69,17,85,53,185,164,147,168,110,50,5,155,214,182,224,98,44,239,60,36,85,178,167,168,157,236,171,127,188,171,169,132,108,26,209,18,80,60,25,117,0,168,158,56,218,70,150,39,198,168,240,250,137,7,131,156,66,72,5,197,217,250,83,9,133,190,132,50,22,118,116,13,101,12,73,93,68,9,238,1,100,147,149,197,38,107,153,190,138,50,205,13,105,25,5,222,21,169,4,201,234,40,147,124,196,249,120,47,116,2,137,96,42,41,24,109,69,86,82,108,34,57,214,61,50,90,77,108,48,177,2,238,106,41,90,147,215,82,108,228,66,139,41,227,80,5,29,228,208,148,83,166,97,19,206,252,200,122,202,152,110,154,130,138,7,55,185,64,24,157,64,200,74,42,126,232,228,98,225,132,98,129,20,85,38,226,80,148,220,144,101,21,101,75,231,114,22,94,86,113,241,65,36,208,200,194,138,27,19,45,165,174,156,224,63,74,75,40,3,242,152,22,95,91,241,10,35,166,182,50,38,148,166,184,50,141,155,214,202,224,226,46,239,116,164,85,180,107,151,87,118,149,233,209,200,161,166,210,255,72,112,153,5,22,85,122,176,129,165,148,81,139,136,242,68,31,11,86,54,113,182,36,162,38,180,68,98,105,243,169,48,66,91,24,233,139,56,170,28,210,7,162,44,130,4,224,130,222,108,210,150,119,149,202,44,237,123,189,46,30,76,21,98,85,61,30,222,208,74,166,67,37,149,11,217,133,71,19,100,83,62,194,11,239,38,173,184,8,69,133,15,62,38,0,19,112,143,121,93,23,49,61,195,95,215,197,204,125,68,33,105,40,229,99,169,71,82,40,113,131,132,29,169,238,157,190,146,246,206,234,33,145,144,82,81,63,236,2,134,105,241,101,33,23,88,66,51,16,81,12,234,83,27,95,2,114,162,37,103,62,218,101,144,148,123,166,0,147,139,0,240,182,109,110,131,47,147,205,222,224,154,145,53,48,7,136,28,249,104,45,64,28,163,242,208,152,228,40,57,69,148,130,108,72,88,49,180,54,189,204,136,211,114,11,145,68,65,60,254,205,89,31,223,216,82,79,159,186,248,2,143,11,45,173,93,1,132,88,32,163,194,163,213,231,138,181,156,15,219,58,172,127,183,57,52,245,129,233,58,142,168,31,124,242,213,113,250,144,254,26,206,248,107,92,197,100,128,19,92,187,113,183,34,160,34,160,102,99,251,62,184,94,227,24,255,211,55,139,119,235,7,163,43,251,151,191,57,33,252,230,244,247,95,66,10,60,97,29,252,110,190,127,99,65,255,15,40,7,13,70,15,91,10,26,128,16,149,129,66,48,33,198,149,23,99,3,40,250,143,191,217,110,240,141,40,1,57,233,55,165,136,245,102,85,125,152,205,55,171,217,7,119,200,245,77,253,209,151,155,213,159,107,250,246,40,81,93,116,69,42,46,75,169,195,65,122,176,15,113,241,129,242,202,83,96,9,4,129,168,122,160,52,18,86,152,184,16,66,93,74,224,58,118,42,54,40,88,33,182,65,156,240,63,49,138,84,156,192,98,196,32,110,0,196,24,47,83,56,180,48,225,99,43,22,192,217,220,85,44,80,220,0,85,159,233,78,35,212,148,70,224,105,1,171,16,125,68,17,54,188,232,162,12,106,124,89,168,76,251,188,36,24,92,241,57,154,16,240,200,198,214,145,38,193,146,143,88,120,13,9,58,6,60,202,228,134,84,144,236,105,66,160,160,113,149,35,152,16,250,181,35,11,177,104,201,224,106,70,86,20,60,243,188,99,158,110,199,144,141,68,130,88,31,93,41,10,224,24,81,43,26,208,22,85,39,114,34,165,181,27,184,128,52,196,104,200,40,149,73,91,33,114,52,51,34,223,46,79,255,29,149,138,154,2,145,125,155,143,31,207,90,39,10,109,22,92,170,9,0,156,170,28,65,155,83,210,101,175,37,133,55,28,20,149,128,117,16,134,35,25,80,16,113,160,53,17,251,203,47,191,253,118,246,221,31,94,77,128,252,138,101,58,103,89,206,75,149,49,149,11,101,254,84,40,158,21,146,103,172,148,74,100,130,151,89,46,114,153,101,146,43,165,138,162,80,133,105,82,114,33,253,4,12,3,227,224,121,54,25,94,135,207,187,150,138,54,129,249,112,122,253,203,54,255,152,46,33,51,208,130,12,153,137,206,230,3,109,251,224,43,209,213,26,240,209,191,187,172,211,71,30,174,143,54,10,17,83,220,11,115,181,154,45,110,90,218,232,7,89,148,9,128,225,88,215,191,153,125,244,143,56,21,23,116,70,166,143,154,186,72,129,36,5,18,235,48,203,154,21,211,174,210,155,250,60,93,189,194,74,137,243,5,206,83,178,166,144,228,184,227,82,128,200,63,132,196,224,32,188,116,3,39,3,114,79,8,169,199,106,247,71,106,1,52,168,209,98,200,227,175,161,5,145,61,101,203,208,178,56,130,38,23,133,36,22,197,135,36,178,248,112,29,97,8,82,97,80,139,225,99,66,251,32,240,246,97,58,122,13,139,27,124,17,48,52,76,244,216,167,254,66,242,244,236,237,47,15,7,6,45,2,24,166,170,240,200,230,66,76,175,150,223,61,70,201,185,15,48,16,242,219,16,121,60,134,198,60,213,114,246,184,93,111,14,166,191,63,214,255,191,24,172,127,16,224,28,183,4,16,224,168,243,184,228,17,227,114,130,13,205,255,44,244,4,166,124,238,218,61,78,33,250,0,3,133,216,85,251,119,15,135,160,249,68,157,198,9,244,56,252,176,190,55,162,127,183,139,51,70,35,148,225,76,169,246,251,249,125,21,114,232,233,241,221,98,246,247,10,146,244,0,50,216,213,186,62,111,177,92,214,71,30,191,54,127,254,242,248,199,64,142,29,141,7,140,6,81,126,251,98,83,189,159,53,30,198,175,43,143,187,234,199,176,175,113,250,48,154,88,97,226,176,204,199,103,82,167,120,99,230,231,229,44,199,148,152,134,243,60,208,216,28,59,175,255,195,93,101,37,1,41,42,157,225,32,181,164,203,86,207,107,104,78,132,33,42,71,174,214,3,246,234,223,211,111,192,195,21,89,122,4,131,42,68,227,118,8,63,19,77,114,124,57,168,7,70,59,44,48,25,118,125,131,82,3,203,242,86,116,193,7,184,129,193,66,131,154,44,245,8,12,33,224,58,79,79,180,211,170,8,27,166,6,43,114,144,84,170,170,70,143,210,15,52,12,127,72,165,144,17,133,172,30,121,31,105,184,252,152,138,203,136,116,252,237,252,240,230,229,124,191,175,118,135,25,87,217,204,84,16,198,27,246,255,190,217,190,223,204,12,173,203,55,245,254,154,118,223,190,204,33,14,220,210,19,196,147,59,155,15,28,66,80,116,136,243,7,54,2,126,247,205,111,127,55,251,205,119,127,250,195,215,110,175,160,132,169,163,48,86,22,130,137,82,107,33,75,179,144,175,56,47,184,100,140,51,145,23,34,147,176,110,17,17,131,23,102,232,87,97,59,236,233,4,10,10,14,38,0,98,23,201,109,208,63,252,238,155,255,126,237,30,103,33,51,51,166,66,235,146,103,165,40,164,25,105,45,204,210,176,206,114,41,88,174,11,206,152,84,26,216,103,116,228,97,67,253,211,31,255,248,234,123,159,222,178,34,43,185,50,58,43,133,16,153,54,171,219,70,117,205,122,183,214,50,203,107,166,10,165,51,110,86,191,165,80,44,51,43,224,134,219,130,9,198,180,226,50,55,11,230,70,22,146,107,149,105,14,84,239,211,126,102,22,97,116,167,80,33,54,216,114,208,77,198,156,250,4,147,203,147,8,129,99,133,208,238,224,242,63,184,70,41,4,145,68,8,2,43,132,246,118,43,197,174,41,4,153,68,8,18,43,132,246,61,120,37,174,41,4,149,68,8,10,43,4,213,10,65,93,83,8,58,137,16,52,86,8,186,21,130,190,142,16,222,172,239,223,16,75,224,8,137,100,191,141,205,165,243,38,125,25,122,223,2,128,226,135,237,123,98,25,212,136,41,69,64,202,62,226,204,64,4,58,185,88,108,201,233,45,120,190,185,158,176,146,253,197,233,207,41,196,61,153,85,33,133,124,194,76,37,90,162,140,248,161,114,214,174,5,54,247,125,168,176,105,239,131,229,42,194,23,243,144,34,246,34,77,17,251,130,184,200,180,244,161,122,78,25,233,67,133,79,70,31,170,20,121,232,67,69,156,14,26,192,57,209,172,62,66,129,238,75,181,157,153,160,47,226,93,208,184,160,99,119,145,140,93,50,219,149,200,77,62,196,93,213,4,17,133,10,247,144,106,28,150,139,60,109,68,186,217,184,188,3,47,177,222,97,179,193,122,135,182,37,212,59,196,26,74,211,111,164,225,191,68,120,90,195,111,168,65,27,254,115,91,74,195,111,80,105,13,191,1,164,50,252,71,40,200,244,151,227,233,207,203,180,150,208,208,152,198,18,90,128,83,137,2,144,43,88,96,69,54,153,43,48,130,92,97,179,153,138,150,11,188,61,140,8,152,123,141,159,101,204,124,162,47,218,122,62,179,200,249,68,80,132,13,77,20,63,159,128,169,45,41,101,20,221,162,129,110,168,179,204,246,34,109,32,125,34,115,65,202,244,34,25,211,130,146,233,84,126,36,54,168,134,8,4,16,84,235,113,80,45,131,238,44,14,134,101,237,66,130,76,92,62,222,108,15,179,127,86,187,173,51,100,151,104,23,213,32,163,189,212,160,253,83,108,103,232,40,136,117,69,86,28,82,27,222,246,128,119,47,23,8,73,168,35,118,50,45,236,108,190,217,26,83,49,95,84,15,199,133,225,163,222,158,67,171,227,47,94,224,49,5,21,38,101,189,248,2,20,98,20,133,37,190,150,9,188,196,224,222,11,135,121,129,21,4,250,136,32,179,50,110,56,176,39,171,253,33,224,138,134,219,23,15,213,38,100,67,254,126,183,244,194,225,182,226,15,25,193,152,37,55,64,244,140,31,64,127,187,221,62,254,247,238,72,11,130,176,115,107,212,56,1,7,128,99,153,132,89,91,91,83,90,161,19,216,215,1,222,105,9,60,139,49,89,86,60,208,53,66,227,29,38,44,197,190,130,33,161,103,235,159,181,214,159,241,112,235,239,2,99,209,96,245,171,48,235,205,59,19,16,111,31,63,26,113,145,141,205,8,56,118,144,44,129,43,209,232,76,153,1,48,223,171,253,1,203,106,235,61,75,95,70,17,205,241,93,107,73,67,78,70,184,77,41,88,56,119,77,67,148,120,218,93,113,76,78,92,229,7,227,33,228,106,176,244,4,196,140,228,68,8,1,30,157,26,43,145,234,82,197,125,47,31,140,228,58,163,39,145,70,111,83,125,56,204,40,230,0,202,66,244,122,39,180,137,103,61,100,112,37,140,27,147,169,240,8,44,157,26,44,145,18,202,8,251,185,171,238,215,251,227,253,133,245,3,158,119,143,199,171,12,30,157,87,233,177,92,65,50,17,7,58,36,39,153,132,136,13,11,93,224,136,140,33,8,42,21,189,160,0,219,3,50,200,36,204,111,141,202,133,172,119,60,46,67,190,196,101,19,46,138,81,113,252,241,79,155,234,112,158,166,199,51,245,251,151,63,188,250,195,215,179,223,191,250,225,135,47,127,251,106,246,250,187,217,183,108,246,195,171,111,95,125,245,250,187,239,167,78,62,95,226,53,247,128,78,227,77,29,131,118,19,88,109,86,191,63,253,229,245,246,91,246,195,199,253,87,166,35,28,109,118,40,20,89,123,131,53,107,254,54,59,108,103,167,232,221,110,61,180,199,122,0,58,241,24,17,48,210,240,50,202,249,199,135,237,124,229,205,142,143,161,211,233,219,89,200,195,31,245,49,16,211,167,231,69,76,75,105,118,186,248,1,97,54,204,182,161,17,7,98,68,190,113,194,200,152,245,25,70,4,22,194,134,67,122,161,181,105,150,14,154,131,76,57,44,188,70,245,0,58,175,90,142,15,75,177,188,32,169,96,64,136,247,205,252,120,241,180,61,96,165,115,190,96,76,7,189,89,146,66,60,193,183,130,19,244,146,78,78,50,153,22,65,175,21,143,239,37,157,148,52,224,5,28,235,44,46,184,99,251,144,30,94,10,72,60,6,126,63,27,63,2,189,62,210,13,128,138,82,211,189,137,193,12,193,47,191,252,250,107,239,161,93,252,141,213,178,40,131,168,248,253,151,255,123,246,131,137,128,235,152,248,155,215,175,126,63,171,253,157,155,32,126,113,226,217,5,107,187,130,32,228,206,121,203,245,5,144,24,184,237,126,179,221,189,53,159,255,179,234,107,92,208,37,8,58,3,70,196,206,46,129,241,176,7,103,184,225,205,252,134,108,27,65,56,33,184,72,53,16,239,42,155,220,194,105,131,6,170,94,164,203,139,142,158,128,39,146,80,214,13,127,10,51,35,227,88,63,60,196,174,247,159,219,104,139,153,57,75,18,195,250,8,47,210,202,165,136,150,75,161,175,45,151,222,246,151,110,181,50,159,220,171,130,3,63,175,94,102,25,61,122,183,117,167,228,244,224,221,30,158,146,72,46,83,174,35,86,19,143,216,72,53,108,163,46,157,145,172,236,132,19,189,222,215,145,70,42,145,52,232,72,161,180,11,129,69,118,229,169,105,200,222,191,109,106,153,137,196,114,194,199,26,173,86,91,248,149,5,19,181,97,24,223,77,170,73,5,56,134,210,151,126,171,151,186,140,223,60,220,87,247,118,243,112,174,210,224,150,89,34,220,226,202,106,248,33,149,226,125,136,158,145,114,242,117,221,152,124,54,252,84,83,56,191,31,83,9,242,35,185,32,107,109,130,189,150,29,176,238,244,85,253,106,214,87,223,253,225,245,247,95,126,245,122,176,188,230,200,255,179,66,9,158,11,153,43,206,51,153,115,89,104,86,154,186,176,44,120,22,216,165,249,239,87,219,77,45,138,3,32,191,178,54,191,72,170,254,241,174,178,108,177,2,130,126,223,192,12,205,168,25,212,71,35,138,42,30,189,193,65,220,58,15,34,63,78,178,103,33,244,4,220,190,240,237,93,58,170,237,98,247,28,120,200,50,92,157,131,44,155,174,67,23,227,234,137,210,150,104,102,251,234,161,90,30,182,187,160,109,206,129,223,102,161,175,52,192,6,62,118,96,58,253,25,168,254,33,104,96,216,81,147,15,193,227,18,124,27,189,147,246,175,141,73,249,237,151,175,95,205,142,150,38,192,192,48,166,115,85,202,76,27,163,34,120,166,11,46,88,105,60,128,102,50,208,192,12,47,192,15,170,59,58,175,192,7,148,30,219,238,127,251,234,245,145,217,87,223,207,234,18,239,171,31,126,8,96,187,148,101,86,179,153,23,76,148,34,51,246,84,26,255,39,139,76,100,166,14,173,10,150,113,45,5,128,128,214,164,135,147,160,185,241,178,165,18,58,43,50,37,75,38,115,198,153,226,101,158,49,67,80,125,237,35,43,185,177,242,89,1,160,227,135,87,255,207,159,94,253,225,43,144,44,152,42,13,41,166,27,97,248,46,141,115,49,66,80,194,16,85,152,176,161,148,154,213,191,170,9,81,82,20,121,56,45,175,77,165,251,155,223,254,225,203,215,127,250,254,85,8,25,210,136,191,40,25,47,180,226,194,4,36,185,145,136,209,67,206,243,220,252,165,204,67,197,80,29,234,9,92,237,190,60,219,53,160,1,24,65,80,249,189,75,96,122,223,55,238,97,228,255,88,180,145,113,177,17,47,105,171,31,68,56,16,70,197,24,218,137,76,12,196,133,139,175,118,136,253,48,17,12,54,158,45,110,122,92,128,80,78,144,33,116,154,41,114,217,71,162,73,98,103,133,66,226,207,96,162,56,100,72,195,157,117,178,0,35,86,18,54,127,168,5,109,18,188,56,119,50,66,33,156,48,151,216,73,102,204,184,147,52,83,198,197,12,137,212,159,126,210,56,197,72,196,159,109,218,236,219,175,174,58,111,94,127,232,158,242,194,49,215,7,32,156,45,61,216,36,19,101,128,63,53,71,4,133,104,163,166,135,85,20,79,53,51,108,114,139,231,202,58,31,250,122,233,77,223,187,175,103,1,167,186,227,243,119,207,38,124,123,234,36,69,157,182,154,20,46,215,133,41,233,74,81,154,162,174,73,111,11,147,217,73,145,155,252,41,52,121,106,183,38,125,255,234,203,175,67,114,54,147,157,150,153,46,133,48,9,107,157,57,215,101,228,172,224,90,103,176,254,254,231,251,111,94,135,36,137,220,36,165,133,233,72,101,188,48,69,107,149,213,28,106,173,77,218,44,66,89,116,158,34,0,234,154,243,12,193,120,31,125,208,6,112,1,220,75,15,171,173,65,246,221,247,172,148,68,170,241,169,80,255,125,117,218,73,12,149,108,175,53,149,233,239,97,210,219,253,1,248,200,232,243,104,163,111,33,62,74,170,86,115,15,168,3,35,60,3,39,224,28,237,22,236,227,147,236,166,32,31,29,255,179,91,31,34,216,56,53,79,63,118,183,47,2,223,22,141,85,239,227,38,238,101,111,141,202,122,120,42,3,111,21,181,226,67,247,137,78,128,224,86,107,4,116,181,134,35,86,107,50,204,106,77,188,221,31,10,9,185,129,53,0,236,250,167,172,28,84,129,247,173,78,194,252,76,22,153,134,180,211,108,115,181,99,159,54,91,150,145,187,6,166,177,33,27,7,108,199,59,178,68,155,162,236,84,123,205,76,148,76,58,116,164,80,186,195,28,89,150,230,108,150,135,110,130,115,89,65,61,36,19,143,76,162,51,129,206,35,78,64,151,157,36,147,145,78,33,163,96,103,25,37,164,113,47,201,164,164,82,72,41,193,182,156,40,121,238,206,56,145,70,220,249,248,82,126,220,72,167,250,151,175,128,88,36,149,127,243,227,88,241,199,138,189,37,131,94,121,123,82,7,75,60,133,164,9,78,176,6,116,144,204,8,228,128,179,171,190,105,97,153,21,121,196,209,213,78,44,43,99,10,239,231,135,106,182,236,110,243,176,100,127,189,155,240,128,217,223,0,31,155,253,89,64,62,101,127,211,66,138,204,254,38,192,158,48,251,27,82,133,206,254,172,48,63,147,236,111,72,59,109,246,55,196,110,46,210,200,136,66,49,7,56,232,224,122,102,49,146,206,123,3,137,18,192,33,221,212,9,160,3,29,43,149,206,39,49,158,56,3,180,19,78,153,1,78,245,144,78,62,50,137,214,164,73,1,61,157,164,19,146,78,33,164,84,57,160,175,151,116,98,82,41,196,244,244,73,160,131,158,120,75,94,62,211,44,112,200,240,147,101,129,118,50,18,168,239,19,166,129,86,30,41,211,64,119,7,233,236,0,36,15,244,206,140,84,137,96,125,185,229,120,67,180,53,27,244,62,55,3,232,4,155,18,186,144,8,46,200,155,234,35,50,173,242,33,62,97,110,101,33,13,157,96,185,177,158,116,255,189,133,44,218,4,202,210,65,147,232,48,162,96,102,170,7,144,1,99,22,51,195,117,218,84,202,66,124,132,51,181,156,19,138,23,38,202,171,50,139,51,24,63,214,51,56,203,140,224,47,153,240,41,221,171,167,151,4,98,181,230,181,183,8,229,207,39,207,242,115,50,31,107,201,5,173,94,214,251,238,40,168,155,40,63,107,197,34,247,180,151,189,80,248,218,73,204,167,246,182,151,196,197,249,91,7,218,19,31,226,177,146,150,192,235,94,118,209,120,69,65,233,119,157,125,128,204,154,176,24,31,153,93,193,243,94,146,31,233,123,71,135,16,41,68,138,242,191,150,183,242,216,248,5,81,140,255,29,242,152,112,16,200,125,240,84,63,9,132,139,241,194,214,137,192,174,227,133,173,199,178,236,110,152,197,184,225,81,63,49,126,216,1,70,237,136,199,221,16,120,98,15,232,19,187,226,49,117,81,190,216,9,247,212,71,3,237,196,209,187,227,113,31,141,175,228,132,254,120,162,19,144,133,227,22,59,36,68,122,135,60,166,63,206,35,91,142,57,147,72,21,229,147,185,205,109,48,2,159,124,201,101,202,129,160,246,202,211,29,37,144,47,198,45,91,167,131,188,142,91,62,124,152,13,14,136,90,61,178,84,49,30,185,223,69,140,51,30,227,80,251,225,65,15,4,46,216,141,247,196,222,119,64,88,148,227,181,33,253,124,142,31,143,56,160,119,204,3,248,198,93,74,66,159,108,199,7,89,54,105,75,11,242,244,238,120,64,122,156,39,30,222,158,16,43,70,148,255,149,22,255,32,21,129,255,237,241,150,72,232,212,94,215,217,71,2,129,98,28,174,85,225,139,73,135,43,40,28,110,115,159,235,108,215,156,19,183,58,91,37,176,206,182,15,143,117,180,99,12,204,193,219,120,47,53,160,35,210,21,187,177,158,208,13,15,136,66,187,96,27,202,83,156,244,30,208,65,235,68,7,208,141,131,83,68,14,212,142,13,178,82,202,98,75,148,74,235,60,7,100,211,238,112,180,66,99,5,210,153,109,37,210,60,187,96,165,154,254,102,139,24,25,226,118,235,89,181,202,121,102,75,182,57,33,142,67,74,225,71,132,113,195,107,80,98,100,142,138,223,194,244,182,39,114,168,184,19,136,153,50,112,115,226,167,155,253,18,18,180,249,166,132,101,70,144,6,109,239,219,91,76,172,81,155,102,177,81,219,17,63,54,108,235,129,224,226,182,192,75,80,226,47,63,28,82,76,20,225,89,192,158,65,136,119,162,42,58,198,27,192,80,150,190,134,29,164,137,222,78,216,77,136,165,137,131,149,11,112,144,193,210,22,179,162,197,117,226,183,19,221,105,2,184,33,54,86,36,157,13,215,44,237,241,157,33,217,9,221,219,184,131,116,178,81,16,255,102,85,68,237,240,111,42,145,127,123,57,105,253,163,68,126,66,78,39,108,127,42,97,32,222,206,215,155,217,126,185,61,254,106,54,59,254,117,102,136,122,220,173,143,92,101,31,138,172,247,15,99,25,236,159,193,158,96,3,191,49,252,239,78,231,91,131,185,30,51,45,226,223,215,2,160,138,36,168,245,92,112,60,143,113,82,181,197,187,245,195,97,189,217,191,252,221,124,255,230,55,167,191,252,18,71,131,179,234,170,134,139,103,145,216,246,25,9,103,242,115,31,25,150,165,199,146,192,228,0,96,101,26,88,128,170,241,241,187,133,206,131,200,220,173,107,38,106,90,62,126,108,255,247,237,118,251,248,223,59,99,208,126,102,4,136,46,1,138,127,113,206,6,107,57,150,64,133,119,166,146,193,101,228,235,219,178,117,206,191,127,221,207,146,101,37,130,151,215,133,149,81,176,34,155,204,147,89,247,212,219,52,178,37,185,23,4,190,9,2,43,210,192,42,20,172,106,97,243,248,105,104,137,117,156,155,62,101,26,88,145,6,86,161,96,91,217,74,78,42,91,214,62,170,41,117,60,110,62,150,194,120,221,28,46,92,8,172,36,134,29,212,55,19,1,159,45,14,12,188,77,139,100,73,58,116,173,55,87,25,41,108,235,252,20,35,133,109,245,87,9,82,216,118,186,41,69,10,171,91,88,157,6,54,168,254,251,57,224,209,93,216,67,225,183,79,253,84,50,232,161,234,219,231,248,218,238,109,202,151,107,159,252,205,105,214,90,129,156,253,60,222,178,6,61,9,15,23,67,161,255,29,159,222,38,194,253,213,77,6,197,198,95,36,123,155,232,234,213,219,68,151,3,223,166,186,147,249,246,201,175,159,76,121,63,232,109,162,251,189,111,159,219,149,179,41,47,251,188,77,117,147,215,109,170,187,175,110,83,93,208,118,155,236,102,188,219,103,112,255,79,202,43,154,110,83,221,180,120,251,236,46,254,74,122,225,210,237,51,184,195,34,245,165,35,183,169,174,146,73,122,77,199,237,51,56,64,117,133,163,111,183,169,14,55,38,61,38,118,251,12,14,157,167,191,43,224,54,213,77,16,73,79,214,223,62,131,131,16,105,207,172,220,166,58,129,148,244,164,199,109,170,157,206,183,207,96,19,101,194,77,174,183,169,182,204,223,62,183,93,211,73,247,172,222,166,218,166,117,155,106,219,205,237,179,218,60,69,225,116,227,118,101,121,192,115,155,60,8,86,128,97,192,34,21,112,248,150,159,223,172,15,239,215,251,10,178,235,199,70,73,206,200,54,254,96,224,69,90,120,73,7,111,65,87,200,177,242,107,185,173,210,149,107,130,42,6,8,88,166,2,6,5,92,32,100,141,68,238,12,85,78,80,189,182,2,23,220,161,75,122,168,169,222,189,66,182,218,75,161,8,118,139,129,128,147,237,77,132,145,33,9,249,59,226,178,172,204,132,228,5,55,107,110,89,145,153,213,183,204,44,193,105,145,179,34,207,84,102,126,151,101,185,226,146,153,53,59,161,121,81,72,45,205,234,157,20,92,215,75,120,202,196,224,102,45,47,47,138,186,86,26,182,166,214,39,44,111,9,43,25,124,159,28,157,224,253,100,48,156,224,133,238,144,213,4,131,105,144,33,52,219,42,87,37,197,158,76,16,48,196,156,193,144,211,205,95,16,25,18,39,57,217,46,10,242,204,85,239,21,215,96,48,128,14,158,140,67,164,58,43,214,33,23,62,154,233,161,177,68,23,45,50,19,212,68,251,161,177,68,151,29,178,119,12,129,208,186,219,253,58,185,159,57,249,4,208,221,136,51,77,43,60,205,59,228,156,24,89,116,200,20,90,106,169,164,115,86,198,199,234,48,224,218,144,126,86,35,55,65,7,121,7,5,68,83,65,200,121,50,69,5,145,161,113,67,115,54,212,252,250,174,8,70,7,79,198,33,114,190,156,253,5,47,41,12,100,31,186,13,97,185,32,177,189,182,99,18,34,39,152,229,32,96,153,10,88,36,147,69,145,12,57,157,221,0,145,161,113,99,162,187,224,64,186,60,184,66,138,46,0,90,94,67,118,1,116,136,100,194,227,8,135,216,235,33,63,31,134,162,8,108,250,200,157,209,163,88,174,235,35,155,53,226,22,90,121,5,158,0,155,95,67,169,66,8,129,200,207,118,162,108,188,245,190,87,248,5,200,15,140,61,121,196,47,82,134,24,98,120,66,57,130,170,255,129,240,24,111,6,35,92,0,14,249,120,161,109,7,4,130,235,192,96,186,65,103,136,48,180,115,12,237,157,53,84,57,237,108,238,242,71,85,164,2,30,109,192,187,152,61,144,131,162,129,61,196,11,188,203,126,53,163,149,75,151,38,80,28,173,233,3,171,14,88,80,132,242,62,228,147,160,59,228,191,161,14,202,244,123,209,93,47,196,14,139,169,78,83,114,18,135,15,196,78,231,240,129,132,36,147,95,118,123,211,94,121,242,114,190,250,113,94,95,81,178,220,190,219,28,170,93,115,173,20,184,203,110,254,229,57,177,54,59,176,143,208,89,168,222,90,182,59,113,146,229,55,16,176,72,5,12,217,230,14,67,214,201,38,3,136,12,133,147,92,87,46,241,31,11,11,65,214,182,123,26,4,77,84,13,198,78,25,85,99,136,1,68,213,24,120,65,13,143,137,170,97,132,131,162,106,31,116,84,84,13,166,27,22,85,35,104,231,100,180,219,192,113,193,141,101,139,31,39,89,118,239,3,231,221,77,44,130,34,182,129,65,167,11,109,96,116,164,18,94,63,176,57,94,83,89,95,126,185,133,4,53,253,222,138,174,55,69,236,61,236,208,176,144,198,178,181,79,176,169,107,109,58,201,124,179,89,85,31,190,220,172,254,92,127,25,114,92,2,214,87,9,17,10,8,185,72,166,190,32,50,114,128,246,130,128,117,194,125,178,112,125,73,194,162,76,5,44,112,192,93,205,93,176,146,98,193,2,6,45,175,161,208,1,116,164,19,30,102,193,162,215,67,222,86,25,4,151,209,62,45,110,210,4,144,194,112,98,44,68,135,92,62,49,147,1,164,32,153,100,234,124,247,90,78,17,249,0,177,249,53,166,90,8,33,16,249,21,182,155,235,74,154,132,19,140,157,50,225,196,16,195,19,202,17,114,131,43,98,198,133,209,131,201,80,97,156,30,147,163,136,184,208,215,91,204,169,74,20,56,46,241,179,92,46,37,36,163,157,191,172,219,84,40,156,23,193,73,228,72,135,96,167,219,174,5,36,132,167,147,31,251,252,58,115,214,79,75,63,17,253,176,221,181,213,245,61,32,19,29,244,199,187,254,72,22,139,252,216,176,92,212,114,154,73,56,207,115,66,182,22,129,128,35,147,92,80,95,160,13,96,32,228,28,39,30,217,1,147,20,43,172,200,150,157,9,207,27,210,158,210,226,96,45,158,7,230,207,74,219,125,193,20,94,166,127,48,175,75,82,242,146,34,200,134,65,243,100,68,67,116,87,100,182,59,137,9,174,225,130,1,199,89,35,88,95,69,50,241,228,56,241,240,110,72,157,43,111,28,73,115,0,52,96,242,8,219,203,21,37,35,73,177,224,216,160,101,23,20,60,79,11,47,168,225,17,57,16,144,112,200,42,157,23,58,102,149,14,78,247,9,61,194,200,32,216,145,100,236,216,192,81,249,155,176,220,86,38,74,65,107,28,68,119,15,189,243,94,76,142,84,210,0,232,84,68,15,22,204,234,119,176,112,201,202,160,79,221,245,73,113,70,197,15,13,74,85,132,229,244,148,244,95,76,25,64,39,8,56,217,182,26,24,25,42,21,127,144,74,70,31,57,239,144,41,118,254,193,144,57,78,24,126,96,134,37,185,83,119,46,8,214,166,128,208,242,26,42,26,64,7,114,14,6,32,35,214,166,6,61,116,35,79,177,32,52,64,46,58,100,69,139,204,100,231,17,132,32,158,97,33,216,252,26,74,21,66,8,68,126,150,131,115,82,40,154,20,1,140,157,112,21,6,69,12,79,40,71,88,66,17,6,143,73,40,96,132,131,18,10,31,116,84,66,129,1,199,69,224,150,107,79,37,197,10,232,0,184,219,8,46,229,213,15,165,67,9,225,233,120,100,72,213,245,99,15,207,5,172,102,251,246,234,214,217,97,139,201,10,6,157,119,239,109,249,143,158,210,96,195,242,2,203,201,48,169,100,252,46,38,24,176,72,5,12,10,20,165,37,186,85,36,165,89,203,166,127,169,51,26,87,10,198,134,85,219,48,240,60,45,188,160,134,199,56,71,24,225,32,231,232,131,142,114,142,96,186,105,213,37,102,79,60,10,28,231,216,45,23,23,75,138,147,144,3,224,206,47,233,130,216,200,120,161,251,46,207,180,152,29,63,1,184,56,101,123,81,50,207,168,217,176,66,195,28,156,182,61,206,72,240,2,40,12,24,84,24,210,22,63,84,144,84,95,65,200,16,181,182,61,129,89,76,109,134,238,180,239,30,161,125,160,222,4,142,141,110,218,219,14,231,1,68,126,45,72,109,95,167,15,119,12,150,23,65,101,65,112,218,94,88,54,180,201,146,211,4,63,96,108,152,55,195,192,243,180,240,130,26,30,19,252,192,8,7,5,63,62,232,168,224,7,3,142,11,32,10,219,179,189,146,118,54,117,143,118,202,178,164,240,14,48,104,22,107,197,251,239,66,102,221,27,196,156,160,30,14,67,230,201,144,65,113,143,101,183,156,202,74,138,120,2,132,156,174,148,84,142,131,15,197,36,133,226,130,144,33,147,173,180,196,162,138,51,226,225,62,107,18,87,196,226,8,128,6,200,67,90,246,80,41,65,83,199,128,99,39,92,18,64,17,195,19,202,17,228,248,3,225,17,142,223,139,60,114,160,24,231,41,109,219,222,148,160,152,27,64,232,100,215,46,131,232,232,39,235,213,230,176,251,56,123,220,174,55,135,112,87,59,232,173,179,144,130,226,202,26,63,52,40,93,151,150,221,83,74,78,221,88,147,102,120,64,100,0,66,147,62,48,107,143,145,42,69,144,130,247,145,207,26,165,202,107,175,72,3,233,128,112,104,217,138,163,180,10,41,50,28,170,253,225,204,81,248,188,1,245,40,112,172,176,14,56,143,169,10,92,13,178,136,44,52,244,81,219,44,67,229,4,123,154,165,101,221,87,229,210,31,157,164,128,78,25,156,96,136,225,105,121,21,212,240,152,224,196,135,76,19,156,244,122,17,162,235,166,188,246,202,60,144,14,142,155,71,1,200,140,194,208,246,186,148,157,169,41,8,106,1,64,100,158,12,25,20,84,89,214,184,85,65,240,96,17,12,88,34,73,238,172,122,105,173,115,3,247,30,74,203,173,164,170,204,9,6,80,90,234,93,154,100,247,182,180,172,84,234,140,102,239,28,28,27,84,243,70,193,243,180,240,130,26,30,227,93,96,132,67,106,222,94,232,152,154,55,10,28,231,25,45,139,230,58,35,216,13,55,0,110,115,76,205,56,241,68,245,66,15,23,205,55,171,217,219,106,191,159,223,3,106,222,131,238,138,174,59,106,147,99,135,134,37,226,150,229,109,205,9,78,147,194,128,85,42,96,153,10,24,100,83,64,200,57,18,153,117,147,145,83,28,142,150,150,213,119,45,104,142,142,194,177,97,190,13,3,207,211,194,11,106,248,187,228,67,10,242,109,62,232,40,223,6,166,155,86,93,98,54,179,161,104,231,73,105,23,24,218,59,227,34,40,138,152,150,77,40,154,226,48,139,29,88,18,62,249,16,216,67,188,192,69,7,174,105,229,34,59,224,156,22,88,117,192,20,251,28,189,200,36,79,62,12,134,179,147,140,204,137,25,240,66,103,151,197,149,227,113,229,229,118,83,163,67,150,128,250,157,118,98,147,37,53,63,86,104,88,228,153,91,22,16,180,162,40,16,91,182,255,104,69,240,132,36,12,88,165,2,150,169,128,65,177,4,8,57,71,34,159,99,90,173,41,98,90,203,22,25,61,222,58,141,139,105,193,216,176,32,5,3,207,211,194,11,106,248,187,228,67,10,138,105,125,208,81,49,45,152,110,90,117,137,138,105,49,180,243,164,180,11,12,237,103,227,66,177,108,93,90,2,67,146,245,78,43,48,163,140,105,195,122,136,23,120,23,211,230,130,86,46,93,120,149,75,90,224,46,206,201,41,174,191,240,34,211,196,180,165,45,240,44,36,49,3,94,232,81,76,187,170,30,170,251,249,161,58,6,183,128,152,182,180,5,158,133,166,230,199,10,13,139,105,75,91,76,91,16,228,89,202,178,35,79,151,58,62,66,132,1,139,84,192,144,0,17,134,172,83,145,172,82,45,249,247,201,232,44,102,73,145,83,247,145,219,217,155,103,140,86,61,207,183,196,231,140,17,4,237,80,108,126,141,113,9,33,4,34,63,203,70,196,156,209,44,36,195,177,19,110,106,66,17,195,19,202,17,148,198,4,194,35,210,24,32,225,144,52,198,11,29,147,198,192,233,6,165,49,24,218,57,25,237,100,231,204,149,229,10,199,156,229,180,118,227,124,109,123,206,41,174,151,131,98,243,116,100,39,219,159,15,35,164,31,208,174,170,199,237,126,13,168,204,14,187,226,93,87,20,165,230,0,108,80,28,171,44,27,162,115,65,176,33,26,6,12,217,152,214,71,214,29,114,65,112,150,4,134,12,153,188,150,141,172,185,164,89,97,135,99,195,236,50,6,158,167,133,23,212,240,24,55,14,35,28,228,198,125,208,81,110,28,3,142,115,133,150,187,212,114,41,104,103,83,183,205,51,151,36,105,19,4,122,84,245,168,207,76,215,5,143,106,55,155,175,86,187,106,15,216,48,61,232,185,205,5,115,149,81,51,101,133,134,185,12,203,150,227,92,17,92,192,2,3,6,185,12,105,49,236,154,81,184,12,16,50,68,201,45,187,60,115,45,105,92,6,24,27,230,50,48,240,60,45,188,160,134,199,184,12,24,225,32,151,225,131,142,114,25,24,112,156,203,176,108,56,206,181,166,157,77,103,187,158,83,156,251,7,65,91,93,198,190,250,199,187,106,179,68,121,13,219,21,97,121,46,168,249,178,66,195,188,134,101,103,108,94,48,2,175,1,2,6,121,13,109,177,237,5,197,253,22,48,100,136,158,231,54,97,228,52,94,3,140,13,243,26,24,120,158,22,94,80,195,99,188,6,140,112,144,215,240,65,71,121,13,12,56,206,107,88,54,175,230,69,73,59,155,206,166,189,164,88,94,5,65,219,19,141,102,199,32,194,105,228,54,203,94,106,106,182,172,208,48,167,97,217,122,86,100,4,151,25,195,128,69,42,96,13,17,45,8,89,225,72,238,84,177,96,36,153,103,97,57,140,85,48,138,155,47,129,208,144,89,111,217,148,84,112,18,154,65,200,72,146,187,141,148,5,215,196,52,7,64,3,136,214,150,53,248,66,72,130,245,12,24,50,79,69,50,68,22,204,6,76,243,64,58,28,27,20,183,161,224,121,90,120,65,13,143,136,219,128,132,67,226,54,47,116,76,220,6,167,155,86,93,98,214,121,81,224,168,152,83,91,214,121,11,138,167,214,181,101,221,172,144,20,171,91,48,228,68,36,219,79,191,236,15,219,221,252,190,170,99,218,253,122,127,48,197,144,143,225,225,172,182,92,106,84,144,20,206,189,200,160,96,86,91,86,94,10,127,121,59,128,76,16,176,72,5,12,9,102,97,200,10,71,242,57,152,37,121,74,92,91,150,39,138,156,226,85,96,24,50,100,102,74,91,240,150,43,98,154,3,160,33,68,91,202,205,69,65,18,23,130,144,121,42,146,145,178,232,132,92,80,4,223,150,170,105,81,210,92,252,10,199,134,69,16,24,120,158,22,94,80,195,99,2,78,24,225,160,128,211,7,29,21,112,130,233,166,85,151,168,128,19,3,142,11,56,181,197,18,148,4,181,3,157,219,88,160,184,126,30,134,156,136,228,81,192,185,171,102,245,149,187,115,179,224,6,136,49,45,37,230,50,163,88,62,244,34,195,98,76,75,145,176,204,8,238,153,131,1,67,30,105,131,33,75,28,201,237,34,91,73,82,123,132,33,67,20,219,82,32,44,57,197,62,21,24,50,146,228,78,127,185,32,6,22,29,50,197,253,6,185,165,140,87,18,93,120,4,199,6,121,51,20,60,79,11,47,168,225,17,193,15,144,112,72,240,227,133,142,9,126,80,224,168,0,162,223,83,55,81,41,110,226,201,153,141,5,138,0,2,134,156,136,228,203,183,100,129,143,226,228,150,66,97,41,41,34,7,47,50,40,114,200,45,69,188,82,18,184,97,24,176,72,5,12,169,78,193,144,1,213,169,220,82,246,42,73,30,164,205,45,37,164,82,83,44,0,194,144,33,147,176,95,65,234,194,40,146,39,39,115,75,61,166,204,105,94,168,131,99,195,28,60,6,158,167,133,23,212,240,24,7,15,35,28,228,224,125,208,81,14,30,76,55,173,186,196,84,55,80,224,184,224,196,82,231,44,41,110,248,200,45,5,154,178,160,200,168,96,200,137,72,238,7,39,187,106,249,110,183,95,255,88,205,48,97,138,165,188,84,22,20,251,136,189,200,176,48,197,82,250,41,75,130,109,196,48,96,200,54,226,62,114,222,33,83,172,193,192,144,25,78,24,221,51,121,44,35,41,120,229,150,122,143,129,38,114,206,112,112,152,185,69,225,243,196,248,130,28,31,227,160,129,164,131,60,180,23,59,202,69,163,208,113,126,206,242,138,172,233,138,194,209,21,150,119,200,12,116,73,60,101,253,216,125,159,180,222,44,119,213,124,95,129,221,145,237,89,86,150,49,106,3,228,192,134,185,164,210,166,62,140,34,93,132,33,203,100,200,32,59,0,131,206,211,65,3,238,131,42,50,27,178,179,58,6,113,210,64,104,192,148,47,152,21,153,230,140,40,2,28,228,73,113,248,60,49,190,32,199,71,204,32,40,233,16,79,234,199,142,241,164,8,202,137,149,38,38,221,45,152,205,57,11,69,59,83,249,25,89,39,67,206,9,239,12,13,237,34,94,232,226,140,94,210,138,230,156,195,200,140,22,89,157,145,41,130,19,63,52,201,197,161,253,110,244,185,27,10,167,196,109,83,84,81,44,187,3,161,83,17,109,223,194,252,126,125,120,51,155,239,118,115,192,206,229,130,219,12,142,162,56,95,232,135,6,197,184,133,176,9,72,19,60,242,4,68,150,201,144,69,50,100,72,136,11,132,214,56,162,207,230,80,83,156,250,116,64,71,61,85,124,69,204,216,247,143,29,176,165,29,150,99,96,207,174,32,39,168,48,247,145,217,217,252,231,20,143,137,65,177,121,58,178,65,42,44,109,243,174,160,48,67,48,100,145,12,89,167,19,135,194,17,125,158,44,36,87,124,59,160,227,76,198,245,48,163,205,144,180,217,139,146,34,222,149,214,137,231,188,168,90,32,7,45,4,155,167,35,155,37,36,59,9,118,47,11,160,20,202,40,195,64,42,33,0,190,78,98,46,153,129,245,213,174,127,49,83,151,38,208,120,203,202,183,65,86,4,238,0,134,44,146,33,131,220,1,12,90,225,136,150,103,100,18,151,110,133,102,89,148,233,190,30,38,139,117,7,202,226,14,24,19,180,147,227,60,199,25,167,120,2,0,138,205,211,145,13,210,53,109,155,32,156,224,118,22,32,178,76,134,44,146,33,231,233,4,173,113,68,159,167,33,47,136,181,163,7,93,70,89,141,171,97,138,44,214,18,217,97,89,108,126,172,109,6,142,100,97,77,91,45,133,36,49,112,64,108,158,142,108,144,10,231,182,121,39,41,230,29,12,89,37,67,150,201,144,69,58,65,23,233,160,115,156,60,122,138,87,16,43,94,15,58,206,206,93,13,83,69,219,78,59,108,180,237,180,195,218,85,129,69,234,129,146,132,212,158,243,60,69,177,124,106,71,182,223,219,201,1,218,96,123,217,150,177,156,196,131,0,177,33,30,4,8,61,156,200,127,251,233,167,255,31,40,99,59,131,51,192,5,0],"entry_points_by_type":{"CONSTRUCTOR":[{"offset":293,"selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}],"EXTERNAL":[{"offset":1034,"selector":"0x5fbd85570830519219bb4ad6951316f96fce363f86909d1f8adb1fdc836471"},{"offset":339,"selector":"0x7772be8b80a8a33dc6c1f9a6ab820c02e537c73e859de67f288c70f92571bb"},{"offset":931,"selector":"0x8a2a3272a92492ded6c04f7c85df9c53134cef398564465f12af3c9c986d41"},{"offset":787,"selector":"0xbd7daa40535813d892224da817610f4c7e6fe8983abe588a4227586262d9d3"},{"offset":741,"selector":"0xe8f69bd941db5b0bff2e416c63d46f067fcdfad558c528f9fd102ba368cb5f"},{"offset":605,"selector":"0x12ead94ae9d3f9d2bdb6b847cf255f1f398193a1f88884a0ae8e18f24a037b6"},{"offset":839,"selector":"0x19a35a6e95cb7a3318dbb244f20975a1cd8587cc6b5259f15f61d7beb7ee43b"},{"offset":435,"selector":"0x1ae1a515cf2d214b29bdf63a79ee2d490efd4dd1acc99d383a8e549c3cecb5d"},{"offset":972,"selector":"0x1b1343fe0f4a16bed5e5133b5ca9f03ab15976bb2df2b6d263ac3170b8b6a13"},{"offset":530,"selector":"0x1cad42b55a5b2c7366b371db59448730766dfef74c0156c9c6f332c8c5e34d9"},{"offset":574,"selector":"0x1eaab699414d786ce9dbfd4e86815f66680647efd13f9334ac97148e4e30e82"},{"offset":890,"selector":"0x218f305395474a84a39307fa5297be118fe17bf65e27ac5e2de6617baa44c64"},{"offset":492,"selector":"0x26813d396fdb198e9ead934e4f7a592a8b88a059e45ab0eb6ee53494e8d45b0"},{"offset":631,"selector":"0x27c3334165536f239cfd400ed956eabff55fc60de4fb56728b6a4f6b87db01c"},{"offset":668,"selector":"0x29cef374bfc7ad2628f04d9a18ac3c3a259c1eb3ce3d3c77bbab281c42649fc"},{"offset":391,"selector":"0x30f842021fbf02caf80d09a113997c1e00a32870eee0c6136bed27acb348bea"},{"offset":256,"selector":"0x317eb442b72a9fae758d4fb26830ed0d9f31c8e7da4dbff4e8c59ea6a158e7f"},{"offset":764,"selector":"0x33ce93a3eececa5c9fc70da05f4aff3b00e1820b79587924d514bc76788991a"},{"offset":1002,"selector":"0x34c4c150632e67baf44fc50e9a685184d72a822510a26a66f72058b5e7b2892"},{"offset":460,"selector":"0x3d7905601c217734671143d457f0db37f7f8883112abd34b92c4abfeafde0c3"}],"L1_HANDLER":[{"offset":715,"selector":"0xc73f681176fc7b3f9693986fd7b14581e8d540519e27400e88b8713932be01"}]},"abi":[{"Struct":{"type":"struct","name":"IndexAndValues","size":3,"members":[{"name":"index","type":"felt","offset":0},{"name":"values","type":"(felt, felt)","offset":1}]}},{"Function":{"type":"function","name":"advance_counter","inputs":[{"name":"index","type":"felt"},{"name":"diffs_len","type":"felt"},{"name":"diffs","type":"felt*"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"constructor","name":"constructor","inputs":[{"name":"address","type":"felt"},{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"xor_counters","inputs":[{"name":"index_and_x","type":"IndexAndValues"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"call_xor_counters","inputs":[{"name":"address","type":"felt"},{"name":"index_and_x","type":"IndexAndValues"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"add_signature_to_counters","inputs":[{"name":"index","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"set_value","inputs":[{"name":"address","type":"felt"},{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"get_value","inputs":[{"name":"address","type":"felt"}],"outputs":[{"name":"res","type":"felt"}],"stateMutability":null}},{"Function":{"type":"function","name":"entry_point","inputs":[],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_builtins","inputs":[],"outputs":[{"name":"result","type":"felt"}],"stateMutability":null}},{"Function":{"type":"function","name":"send_message","inputs":[{"name":"to_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_call_contract","inputs":[{"name":"contract_address","type":"felt"},{"name":"function_selector","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_delegate_call","inputs":[{"name":"contract_address","type":"felt"},{"name":"function_selector","type":"felt"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"l1_handler","name":"deposit","inputs":[{"name":"from_address","type":"felt"},{"name":"amount","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_get_caller_address","inputs":[{"name":"expected_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_get_sequencer_address","inputs":[{"name":"expected_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_get_contract_address","inputs":[{"name":"expected_address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_call_storage_consistency","inputs":[{"name":"other_contract_address","type":"felt"},{"name":"address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_re_entrance","inputs":[{"name":"other_contract_address","type":"felt"},{"name":"depth","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"add_value","inputs":[{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"recursive_add_value","inputs":[{"name":"self_address","type":"felt"},{"name":"value","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"increase_value","inputs":[{"name":"address","type":"felt"}],"outputs":[],"stateMutability":null}},{"Function":{"type":"function","name":"test_call_with_array","inputs":[{"name":"self_address","type":"felt"},{"name":"arr_len","type":"felt"},{"name":"arr","type":"felt*"}],"outputs":[],"stateMutability":null}}]}}}],"commitments":{"transaction_count":null,"transaction_commitment":null,"event_count":null,"event_commitment":null,"state_diff_length":null,"state_diff_commitment":null,"receipt_commitment":null,"global_state_root":"0x21870ba80540e7831fb21c591ee93481f5ae1bb71ff85a86ddd465be4eddee6","block_hash":"0x47c3637b57c2b079b93c61539950c17e868a28f46cdef28f88521067f21e943"}} \ No newline at end of file diff --git a/crates/client/sync/test-data/block_724130.json b/crates/client/sync/test-data/block_724130.json index 4d113512f..656482a04 100644 --- a/crates/client/sync/test-data/block_724130.json +++ b/crates/client/sync/test-data/block_724130.json @@ -1 +1 @@ -{"signature":["0x6ca01cec1369dc1860c2fc5879d8a60fc780e08b9fff2f0fa527577b1fa2233","0x109bb37b673044414cbfac3b6a8aa20c108e79efcbceb5adeec4d3799e7b9a5"],"unverified_block_number":724130,"header":{"parent_block_hash":"0x2202b54db0b611de85f4b7cac4a18920936d109628913ae62a0f23f9c294c88","sequencer_address":"0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","block_timestamp":1726483910,"protocol_version":[0,13,2,1],"l1_gas_price":{"eth_l1_gas_price":13543370708,"strk_l1_gas_price":81846555763849,"eth_l1_data_gas_price":1,"strk_l1_data_gas_price":6043},"l1_da_mode":"BLOB"},"state_diff":{"storage_diffs":[{"address":"0x1","storage_entries":[{"key":"0xb0c98","value":"0x372c9dac7fb3713f8e2a39f6ac1cd8dcacf6aa2ea6d0cf43c47bd6ab03c8c29"}]},{"address":"0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","storage_entries":[{"key":"0x591acc006991ecc44299588fcfe36aaf338929a2ce09835de224d78d1791dc7","value":"0xb90c75009ca88e7dcebfed3edf5c78d46e"},{"key":"0x786e6f2cbcf63b6c37de67d37e3fbbd3689e837c77677e5ca9f95f64b1817c5","value":"0x1012f7ad000000000000000000000032537ed5619b64e055aa0fb14dca5"},{"key":"0x7e90b0128622cf5b5b4703e185c007a43570b801dbb80615738c28e4a167763","value":"0x91a5b6bba6a9f74"},{"key":"0x7ed8d6370ad07d19fa64def9549d0e17867755a448d1e61e961ef6e5a23ca86","value":"0x7870f24d1e28e898703d9a8247069250a8"},{"key":"0x7ed8d6370ad07d19fa64def9549d0e17867755a448d1e61e961ef6e5a23ca87","value":"0x63525a6bd71ec43370b21b22ab0"}]},{"address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","storage_entries":[{"key":"0x1f7de53410a85ed2a804b984149a69358a73cb9847dcf030245471790934bfd","value":"0x30c208feccf5e"},{"key":"0x2b317f1d76a1b287a48df2f31215729d2fd2d6bde40de53f0189a6c0f396a96","value":"0x7b1f5b3eabd"},{"key":"0x53897302c5e8ef1d231d0f7673f50d9b5e386b8f5e766ef0ae6adf59528ab9e","value":"0x71ab0c16c9c"}]},{"address":"0x26c5994c2462770bbf940552c5824fb0e0920e2a8a5ce1180042da1b3e489db","storage_entries":[{"key":"0x9bbef8a57b386d59cf37a51ebc41ea292e19460fa1da471105f77fc8d788f5","value":"0x8072b23ee447b18581e"},{"key":"0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","value":"0x2f5e3a0b0f85ffee335cc"}]},{"address":"0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","storage_entries":[{"key":"0x483c7f7ea1869f0faa489653466f9a025b64547f2d8f172001b70035e33fd14","value":"0x20f7194ef6135ed07"}]},{"address":"0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","storage_entries":[{"key":"0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","value":"0x61dad54f8dec7f75c84"},{"key":"0x529c924665a599ae770853f674236ed47387957e78474d04f2e1b8afb6ef255","value":"0x155c47d5543f67ded9"}]},{"address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","storage_entries":[{"key":"0x532db0958bf8ed143131b352126a20f0479d18a225a9beb9a1102d8bb1f4ff","value":"0x21090001"},{"key":"0xa0cc655cbdccdc35dc4908b0c5ca5a63ab12664a59b580b941670559ac7899","value":"0x14ffffe380019b69dfd8001c3c34014d693400083"},{"key":"0x1b7d074c90845ff149fac25f6f73b7b152290aeb8d84d1ce27dbd8dd109c101","value":"0x390b8816e0000eafebac401000a0000000004475324b00001168813c001"},{"key":"0x1b7d074c90845ff149fac25f6f73b7b152290aeb8d84d1ce27dbd8dd109c102","value":"0x60001900000000000000000041f4c400055914"},{"key":"0x1e15a2c2637958276931ee4f9ad6750bbc42d7a264d2ae1c29161aafa9e4ec7","value":"0x100000000000000000000000000000000"},{"key":"0x20977ea42475db028eedc8815ccd575e4113f033e49ec623e471723b187eeb7","value":"0x800000000000000000000000000989680"},{"key":"0x2aea6895b96d1ae98a87d5583279272c31bf6827a6c67d6422db93f27b83017","value":"0x20759000000000000276800050000b0ca200002066e90670066e294eb"},{"key":"0x2d4da188e578d0d6db3f25d20ebd09b467d0f51fd19d5d577dd896bec35699a","value":"0x100000000000040ac00052010066e80d9d0100000000000060370005"},{"key":"0x4590e13f801ef5a6ef018af6a0486e22fc83290e196d8088c328446d35e4b85","value":"0x14ace478000002540be4001001300001000f02a2edba40008abc060d001"},{"key":"0x47983e59d4f0b910d53a4077c079a144d80551cdb8e7044d0eaef3da20ab66e","value":"0xea51359d000035297b5801000a000000001acfb2e26400078f67d6300f"},{"key":"0x47983e59d4f0b910d53a4077c079a144d80551cdb8e7044d0eaef3da20ab672","value":"0x53d54001f00074007b000600003000123e700000640003c41d6000fb005"},{"key":"0x47983e59d4f0b910d53a4077c079a144d80551cdb8e7044d0eaef3da20ab678","value":"0x50c30005f002340058002f800410000231400008b500001e48b00000005"},{"key":"0x4b9dc52bb8603200fafec3ceeb9e25e437d298e9b7b768d1554016781d092c7","value":"0x100020000000000e1531b0000002188984001"},{"key":"0x4b9dc52bb8603200fafec3ceeb9e25e437d298e9b7b768d1554016781d092c8","value":"0x1800f3003b4007d00114002c0000000100000bb8000493e00003d090"},{"key":"0x4f0c798dc69dfab602b09cb9c153714601860c082b3727c3cad207c5a83c110","value":"0x66e809eb066dea3f5"},{"key":"0x4f8e0d2a19a4ec8c5d70862ea4635aa5b05011cdcf7b5931bbebe31d8fa4efb","value":"0x0"},{"key":"0x511db5b6c02ce5c9b361d4377cc06425f4abe5194c2e0aeaa1a05e578d60914","value":"0x66b932b200001876868b01000a00000000104fb704480004bde23a0802"},{"key":"0x511db5b6c02ce5c9b361d4377cc06425f4abe5194c2e0aeaa1a05e578d60916","value":"0x14b351000140004c001e001c000070000270f000389f600003f5d00bd7330"},{"key":"0x568f9dceb2bf4358c53d4fa1cd9d7033704b02fa585793910f56dcaf35caf9d","value":"0x100020000000000e1531b0000002188984001"},{"key":"0x568f9dceb2bf4358c53d4fa1cd9d7033704b02fa585793910f56dcaf35caf9e","value":"0x1800f3003b4007d00114002c0000000100000bb8000493e00003d090"},{"key":"0x5e1550fe0eb602ae3a02c00739b5fa1024200fb1459803f8c71bb5162c1daa3","value":"0x20099000000000000442100050000b0ca200003066e82642066e61ed6"},{"key":"0x5e2b78886f320dd94a77f1bd257260878badddfc4b2e269ab58cb5176fea813","value":"0x19ba28cf80003a98000000000400010020000000000004ed1000500074001c"},{"key":"0x6889d597bdb660ddf214bf428a07aafab4af5cda1715f38648b1cc2ed68c4c0","value":"0x200000000000041ef00052010066e6ff32010000000000005fd70005"},{"key":"0x79e794455c21923e256c5c013c9780f3a9fefba0a7a02183a4987ddd12bef60","value":"0x20000000000005d36000500000019bbc8e9001312d00000810001"},{"key":"0x7b63f75c41951d980445cf8878868d5b9cd621d30debce6210eb0ec254326e2","value":"0x100000000000000000000000000000000"}]},{"address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","storage_entries":[{"key":"0x6fb914f316fbd4e1ccf26070033cb54067180520e114325ec93948415fd3","value":"0x2c52f760178f79933ab4c2"},{"key":"0x397a5e1aec0495b0b394e0d12a11058d5efeca61bcd74df3ee1f123f3dfa9","value":"0x6e9d582164c7bc20"},{"key":"0x13f71d2bbe2c37549de7b31cd889315ca3dd0c4847227039b4735195416274f","value":"0x623ba096b45efd764"},{"key":"0x38d6079dbb7ade1dbdf5d488d4b6b12f605d942b9be1897078128e5630e3a9f","value":"0x61dad54f8dec7f75c84"},{"key":"0x529c924665a599ae770853f674236ed47387957e78474d04f2e1b8afb6ef255","value":"0x1a20e724dfe73fdf"},{"key":"0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a","value":"0x26a3f5d5ddc30d68e00"},{"key":"0x56993ed1d50bc3f13473306434ae81f3ffeda97fc374511449c65555bd707d2","value":"0x13f2cbb17bae007073d2"},{"key":"0x5abb997ecdab6544c50e7f490e437a5480ca38ed5e42448f69a76bc62842fdb","value":"0x23025700c7124c8a4a74"}]},{"address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","storage_entries":[{"key":"0x1488e68cb80b78333acd24d286115a5b4681d32764d6710d4bc9cd09771d049","value":"0xc6a9129bc88d950"},{"key":"0x2354fceac0db81b3a249ffed8cae0a194bd8295a5d223dfff6874d3fb9dbcb5","value":"0x4fd1df3d034912"},{"key":"0x367b012f3d07fcd419fa5d383fb3884ea5d6bd315bfd9e1e63c1147e5506368","value":"0xb67a483540f3b9"},{"key":"0x43e1ef374bc5f9e49c6c9764a9aac6e36bc8e3df0ca3bffb3cde5a0990ca369","value":"0x25dcdfc488ba28353c4"},{"key":"0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a","value":"0x216d3b66d1b51520"},{"key":"0x72fddfd5dfb8ca6d05ba86bae8516f238765f8e512a628cf96bb7b3129a1b06","value":"0x7741827d4321f5"},{"key":"0x7effecfcd0745eeb5d91e3d7497643fdfc0f5fe4077149f258e655b9c719d44","value":"0x2292b51bc1d67dc"}]},{"address":"0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","storage_entries":[{"key":"0x483c7f7ea1869f0faa489653466f9a025b64547f2d8f172001b70035e33fd14","value":"0x2040e007f6656655b"}]},{"address":"0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","storage_entries":[{"key":"0x1488e68cb80b78333acd24d286115a5b4681d32764d6710d4bc9cd09771d049","value":"0x117e39e03"},{"key":"0x43e1ef374bc5f9e49c6c9764a9aac6e36bc8e3df0ca3bffb3cde5a0990ca369","value":"0x179affff38b7"}]},{"address":"0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","storage_entries":[{"key":"0x5baec44d0231569dc064f3db2a91ac9f8800127ccd52033c5c29e3e5e13e1ff","value":"0x1"}]},{"address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","storage_entries":[{"key":"0xb5da8588258cf59a9a61b801cb29947fe195cd2a4cf7029895d1841ed37793","value":"0x77ded4e9f3350f"},{"key":"0x44dff0be23dce03163b957c4e69a9767a4898e7c7ea6c4cf52d8f57d63ed5d9","value":"0x66e80dc6"},{"key":"0x4a31f49fdb9cb10e4c5f4318207bab1aa70548024c73b5a20a4828c1a4e9005","value":"0x1438f316729356"},{"key":"0x55bd64a08284f65eaa89fd5a81f307ed9c778e89b797992d4af620df1d9cca7","value":"0xde5b7c234e442e5"},{"key":"0x7f707060dc04e7a4bf0e4a5b3cc74cac753d9ff1a2997082a22fb3cf8eb237f","value":"0xe10d2cd635c94d5"}]},{"address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","storage_entries":[{"key":"0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","value":"0x3fd7124a94e5cb413936a5"},{"key":"0x529c924665a599ae770853f674236ed47387957e78474d04f2e1b8afb6ef255","value":"0x211243977a3"}]}],"deprecated_declared_classes":[],"declared_classes":[],"deployed_contracts":[],"replaced_classes":[],"nonces":[{"contract_address":"0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","nonce":"0xf"},{"contract_address":"0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12","nonce":"0x525"},{"contract_address":"0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","nonce":"0x63"},{"contract_address":"0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","nonce":"0x3d66"},{"contract_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","nonce":"0x2f99"},{"contract_address":"0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","nonce":"0x1eef"},{"contract_address":"0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","nonce":"0x9fe"},{"contract_address":"0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","nonce":"0x5d5b"}]},"transactions":[{"Invoke":{"V1":{"sender_address":"0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","calldata":["0x3","0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","0xa72371689866be053cc37a071de4216af73c9ffff96319b2576f7bf1e15290","0x4","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0xf4240","0x109a40007","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x6","0x50757263686173654465706f736974","0x4","0x7","0x109a4","0x1","0x2109","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0xd","0x457874726163745265736f757263655374617274","0xb","0x7","0x109a4","0x4c4b40","0x5","0x2768","0x1","0x5","0x5d36","0x2","0x1","0x2109"],"max_fee":"0xe0ac5b3dadc","signature":["0x1","0x0","0x18eab81019936b1fa1fdafb88c75d49db37e8625f5c48712cb6b652137591e4","0x4a928427fc356cb000c37538c59736174c7521293e4f2a24c10716ea23cf166","0x624f4741bde233f6cd904c20bf8a35d52824baee2a3b234112688a51eb539ed"],"nonce":"0x1eee"}}},{"Invoke":{"V1":{"sender_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x7","0x50726f6365737350726f647563747346696e697368","0x5","0x5","0x42cf","0x1","0x1","0x18b5"],"max_fee":"0x1ae6d5322ca","signature":["0x73657373696f6e2d746f6b656e","0x66ef5e96","0x40ec3c2930339a4d7005fde62833f70f7f0ef82360dcccf93637b0f2709b393","0x1dbe92cf386604bf3f87df1227b08e2fe64d80faec993e7c486b242571b352","0x71881c86e17158eb0d9b0b395a703040b073a67b3bc47c312c7154778ace8e6","0x0","0x9","0x2","0x0","0x6ea68c7c3e3c152ba05dc1945cfed2d0cd37a7f01fd52fbe57fb070eda05157","0x636f1671e6c4172f9c689c05bae2b8ffb8a70ef7ec6f4a748c55fcab7020a67","0x1f3a02206ac9ab7abacff1e0cad6ca947da38eae330080bcc4fafb03a78fe4f","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x655612ed312682c39ca8d7c6932f7b57d9a554dbfb91e3a86fab3e45729629c","0x70bd52099caaaeab7dadcb48f561c03dae199ac156bed1912e31848b3ac1337","0x0","0x6134a98a48cfcd6424d6117f3032bcf6303419b842277b27532c8cbb81d8028","0x47b818213e05846b19dc9c10e633832ff4000ef1a3079044856d8fceb66f3b8","0x4f44dc7f7d471bf660db3bcc4097703b0fd5c7e9b6a1ac43ced983d8adcea12","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x1800b3357c32fde966b5fe19004b73f1219df0f5486f8c5d1f0d75975abf95d","0x16981d883f54f5ff629cbd40c10882490aeeee640451f95cc6e311fe825f5c1","0x1","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21"],"nonce":"0x2f97"}}},{"Invoke":{"V1":{"sender_address":"0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x11","0x50726f6365737350726f64756374735374617274","0xf","0x5","0x4421","0x1","0x1c","0x1d","0xea6000000000","0x0","0x5","0x4ed1","0x2","0x5","0x4ed1","0x2","0x1","0x19bc"],"max_fee":"0xebe828009ae","signature":["0x2","0x0","0x45d9eced6706379a34c43354705f747d2698ccd2f15fc92e7436b3f1c62b2e2","0x2f92cfe61f2671055e3f17a194c11cbb51d1db0c0721d85cd0ba84d9cf67dea","0x18425ffd91a53d0fd9245f34ca38858d3d71f3236fd7332004e514aee2daef4","0x0","0x5771e48f36f6b56938be5be42fd1a6946d5d2759cf789e8e144320a3d2719cf","0x2794b68b80bcb108e041379a541329cd844bf2079c2fa98274980f73cde1f4","0x531ce22de939a06644aeb5ad449619e4089252d1490845116d63a44fd12cfbc"],"nonce":"0x9fd"}}},{"Invoke":{"V3":{"sender_address":"0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","calldata":["0x2","0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","0x3bada4d9e663a0f9475b03ed2dc915c8acc4d83e4b7a94efccff304f70b967c","0x4","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x1126e4bf867072165130f767d49b03b9370774fbfb5224842ac5b288851843a","0x1e","0x2","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x4","0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","0x41b033f4a31df8067c24d1e9b550a2ce75fd4a29e1147af9752174f0e6cb20","0x4","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0","0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","0x3e8cfd4725c1e28fa4a6e3e468b4fcf75367166b850ac5f04e33ec843e82c1","0x4","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0","0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c","0x3","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x155c47d5543f67ded9","0x0","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x2f0b3c5710379609eb5495f1ecd348cb28167711b73609fe565a72734550354","0x3","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x155c47d5543f67ded9","0x0"],"signature":["0x2","0x0","0x677b9a777388cce7c2987ad79590d169c064e6acfdf3e325932c447b9cb42b2","0x194ed205d28ea788d1639c12b4cf54812359a5b756efc8fc723cdd85d4d6050","0x54240f9c248572fb7e403b5e74cb35ed6ab99ce693a2dcd4563a42f311ae060","0x0","0x1b185abf4388cf9094aeb92330ea65a7d2d6fdc6e1248cfa79a81b3e7c820bc","0x58603d07b47602bb963e124c3ddf969b2b130100823c71a1743b18af2e52b29","0x7bf15647a94c689cf3bba71e1762b7824576806ad48944cadeefe860af7a45a"],"nonce":"0xe","resource_bounds":{"L1_GAS":{"max_amount":"0x93e","max_price_per_unit":"0x6fa894514704"},"L2_GAS":{"max_amount":"0x0","max_price_per_unit":"0x0"}},"tip":0,"paymaster_data":[],"account_deployment_data":[],"nonce_data_availability_mode":0,"fee_data_availability_mode":0}}},{"Invoke":{"V3":{"sender_address":"0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x6","0x5265636569766544656c6976657279","0x4","0x9","0x2b338","0x1","0x1b6c"],"signature":["0x1","0x33e211a6522dbbd92b277ef195efe9a45bc260532569e71850b345769d365bb","0x154df10a10c15ce13dcd7050df480449884e7f56027fba3d588ee6a0f6308c5"],"nonce":"0x524","resource_bounds":{"L1_GAS":{"max_amount":"0xb7","max_price_per_unit":"0x51e2065ee1c9"},"L2_GAS":{"max_amount":"0x0","max_price_per_unit":"0x0"}},"tip":0,"paymaster_data":[],"account_deployment_data":[],"nonce_data_availability_mode":0,"fee_data_availability_mode":0}}},{"Invoke":{"V1":{"sender_address":"0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","calldata":["0x1","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x240060cdb34fcc260f41eac7474ee1d7c80b7e3607daff9ac67c7ea2ebb1c44","0x49","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","0x34cc13b274446654ca3233ed2c1620d4c5d1d32fd20b47146a3371064bdc57d","0x43","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x1d6b526aa4f1a7fa8f33fd3240ef477ea5d2594a600ef76abc66c5d998abef3","0x1","0x191faacf0a7","0x3","0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","0x3","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x2ea6442f","0x0","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x5","0x5265736f6c766552616e646f6d4576656e74","0x3","0x0","0x1","0xdba","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x7","0x50726f6365737350726f647563747346696e697368","0x5","0x5","0x2119","0x1","0x1","0xdba","0x25","0x73657373696f6e2d746f6b656e","0x66ee86b7","0x40ec3c2930339a4d7005fde62833f70f7f0ef82360dcccf93637b0f2709b393","0x1dbe92cf386604bf3f87df1227b08e2fe64d80faec993e7c486b242571b352","0x150b06e79312eb9602421cfc533a191fc1d846f90288b9050437aaa6d4bbc8","0x0","0x9","0x2","0x0","0x2fe3536225ebf348f466dec6945a593fb584f3407e73fbc64885fda13cb7e3a","0x5a1854af850ae74f6e56c846b7759ebc23ef11d4a18c966ae90d117b192050e","0x2a9e9ac3592397a739494056612ff0324eb8563bd270cb0188f8018ac04e5c","0x0","0x707c35970861629815711fa8993b3d08f813303f6728d35459fbe9c36a23863","0xea9076d3da941c8d793d7e0701ebb0c02ea404005bc8e663062cfa5100e1b3","0x3d9ccf1f71e2b657efd83b4150650479c80d9b29597180c7d9a5ee73993839e","0x0","0x52543ea588f5b6ba6de8654b5fc2fe643ad8b4f7f757f61fca8bec08b4d03f9","0x31f7cb096aa213c90c7e771a64044ed440f7481658ef8d8ce003857e5290735","0x3713fd372d82052ccfcc65fb236513b21d37c81891108eed60692a4f9b41607","0x0","0x707c35970861629815711fa8993b3d08f813303f6728d35459fbe9c36a23863","0x4c6715b2063920d0f663d80f4bba9716f2285fae0e8294c14131c6b80e4824","0x33083916b4872b3f41085eea061b985c812f8b68c1eb2d798792393da0813ae","0x3","0x3","0xa159132f32aa79c625a0c9e286eac017a7f823da4377b56f69fadf34bbf74a","0x25304f16290ad4509d2a642feb9b2c45a76debd0933652e145f9b1683cb52a5","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21","0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","0x10040b49","0x0"],"max_fee":"0x9d457be9dd8","signature":["0x79dacbd22070b3edb91cf4024887756b48dd873a8956b54cc4ddc3f4f7ace75","0x4ea1fe6fc3f0e719085095ed0daa19055b23721dee08a420edd64dacb7dfb3c"],"nonce":"0x3d65"}}},{"Invoke":{"V1":{"sender_address":"0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","calldata":["0x4","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","0x3","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x8bcd8ac10339f80","0x0","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x15543c3708653cda9d418b4ccd3be11368e40636c10c44b18cfe756b6d88b29","0xb","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","0x68db8bac710cb4000000000000000","0xc8","0x0","0x0","0x0","0x0","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x8bcd8ac10339f80","0x0","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x2e1d93dafae32660a4a76a0fd6f31550f3ddfd6a51c29ef2e055b80afbbd011","0x3","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","0x566fbdcb","0x0","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x292f3f4df7749c2ae1fdc3379303c2e6caa9bbc3033ee67709fde5b77f65836","0x1","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8"],"max_fee":"0x2a50c1bcc08c","signature":["0x4bf17d784b3f9a5fde3c3cca48fe91a4f01e1a9865433fbf606799e62a5f8f6","0x2c32f7d5032e4c7a5cafebdc7d18f29d6b54ffda4bb11a576ad2dbdec0c5f4b"],"nonce":"0x5d5a"}}},{"Invoke":{"V3":{"sender_address":"0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","calldata":["0x2","0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","0xb758361d5e84380ef1e632f89d8e76a8677dbc3f4b93a4f9d75d2a6048f312","0x14","0x20f7194ef6135ed07","0x12","0x7aaed47e1309e1c70685d1146d7eb09d42830155684c28cdf99e45e1edb6a35","0x5c57f49768c910d1f640afe9e1556b230af8d663a2b67b4bfb9638e5c0da3e7","0x47772a98f84b714e7c1e862a732ddd626e5a3966f29b890d8edb2026f392614","0x362dba94ca49abab56e34c99bba9c21f353c0beed9518c745217ab3d10c03dc","0x52062b80f45556b9298aef87fef0c698e2bd1b9413509ef567cfe2092f2e46b","0x1f701622f3616227715d2d7a94efd424f879886549831613e602bdea52fa696","0x1499227d6c2035fda5686809d9a23add468b3993bb2d3b8aad0e0b727ef28a9","0x6e14a488e75ffdef4837352f5f4f6ced8f3a6e281cee1001a928d7d88414b51","0x75f7bb403f1f1b17b7bdbdf4d084250fb63005e30aac51331af23040dad04b9","0x28b4fe5e08d77771620e7fee94ea9efb49318f7b8d4d9841f938bdf36916949","0x4e973cfe881f368c5cc622eb97bf6bdf1804f1a5456f1039fab4186ae680bc0","0x3fbf86382ff61b1043fbd8938feddc7efc425db1ec56273c1f3bf5643bd5c2b","0x219664c808384296c24fc8dd1a165ce6fbe2d349e03472f8b4d458b6f0606fa","0x255ee502908864e4d0b4bd6997bc98600a5a2cba53667efde85018751f69dd2","0x7cdb76c695687d00ab6a361f2d6e15816714578bbd7a590664e8f26bfdbea7e","0x17cac1b480c548de7f1fb657bb15f267ee457486b1045ac15a3d878f57b0fd9","0x377292313747409f293a0efb68b2f6e2d45f395832244bfa513bd561902d14","0x525b05b8b3acf34ce21fb912bc2aa1946530e901703101a8f8af51b886067b2","0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","0xb758361d5e84380ef1e632f89d8e76a8677dbc3f4b93a4f9d75d2a6048f312","0x14","0x2040e007f6656655b","0x12","0x3bdf272e7aef4a99cad7170e27f0b55e97060ec84e817f3f21564c3aed3fe1e","0x4fa858c4bfb60e267c9669aebb7531675b9d4b9c37ef8bc2b8e11877127da3c","0x353dbb72f2ebab6a3087f98ed730e1f042ee1aa01174bfca729edf831d54f18","0x165e51a62cf3a0665887661a521d86e1b596a594db163c881db46c705e35e8b","0x701da8dcb7d172d5cf0332bba6cc392a1aa7d7bb544ca9fbb05e9df69f1a86f","0x269cfb97dcae06d128ecb488a4d4c9e8fb7f09e0a45a1cfde358525819f8a2e","0x6d4856f8e74923dcc3a5ba306045ab9f257c4f0bad40acdf1dcd0a0819b686d","0x49ea8317956394603d60f7b9e938ad2355a6c740e3a42f5ddb9c2acdaf92f4b","0xd52842a8cbd3669abd258a2c2f596dad87b34ed58e89f4729304f773e49a0a","0x62944effbe0903d7dc7a04109329f2859d8149dbe467cf0b171aedccb880f87","0xc7b1a0fcc3fdc6d69cfecdf6040c51c43e295ab045a8f997617d504e3c5afd","0x62c32a38cc84d49873bacdb33e2abfc78fb06829fdbe509bc7ee84450e8316f","0x783708841c84b730080bb106f95c7f65db87aa989e3f30391213eff645386f2","0x754bd01c45aca855926e06a255a01d2f57423f0d18e42b3a60e5e7d0596fc89","0x24e29155cad672f43cf51a1a388c783dbb1c92539c03da169c769453fa8786b","0x70d62ac7701c115904a34d9ffa19cafa2e2c6b839545b859b0431ccb6c6d4d9","0xe5a57177a954150b035a7a0fde5a9200954b47c926a39e990d013581877fe7","0x3fc4635341dc9dc5520481764d3e93ee9f34768f8f8a220efe12e2fcb245d5d"],"signature":["0x6df4ccc50ed6de522be73b1a1faab617ab5dc2bde916ce13845021b60e9047d","0x431b3967b67b30827407ed230fdc82cf9a6371c8147a28cdf58791b94c22381"],"nonce":"0x62","resource_bounds":{"L1_GAS":{"max_amount":"0xb9","max_price_per_unit":"0x6fa89451e8fa"},"L2_GAS":{"max_amount":"0x0","max_price_per_unit":"0x0"}},"tip":0,"paymaster_data":[],"account_deployment_data":[],"nonce_data_availability_mode":0,"fee_data_availability_mode":0}}},{"Invoke":{"V1":{"sender_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x6","0x5265636569766544656c6976657279","0x4","0x9","0x2aedd","0x1","0x18b5"],"max_fee":"0x211c1a16560","signature":["0x73657373696f6e2d746f6b656e","0x66ef5e96","0x40ec3c2930339a4d7005fde62833f70f7f0ef82360dcccf93637b0f2709b393","0x1dbe92cf386604bf3f87df1227b08e2fe64d80faec993e7c486b242571b352","0x71881c86e17158eb0d9b0b395a703040b073a67b3bc47c312c7154778ace8e6","0x0","0x9","0x2","0x0","0x6ea68c7c3e3c152ba05dc1945cfed2d0cd37a7f01fd52fbe57fb070eda05157","0x636f1671e6c4172f9c689c05bae2b8ffb8a70ef7ec6f4a748c55fcab7020a67","0x1f3a02206ac9ab7abacff1e0cad6ca947da38eae330080bcc4fafb03a78fe4f","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x655612ed312682c39ca8d7c6932f7b57d9a554dbfb91e3a86fab3e45729629c","0x70bd52099caaaeab7dadcb48f561c03dae199ac156bed1912e31848b3ac1337","0x0","0x6134a98a48cfcd6424d6117f3032bcf6303419b842277b27532c8cbb81d8028","0x27f748c11bec2af17e3ab6e6b952350feb677a4ba3639c7e5721f889d26348b","0x3c1ebc146bef30f29b9425cf50a625063c8cc041ef221e48eb363b55bd0b132","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x4b2e37b83da74641933818e3e0626dbc2fc2a51ff9059f6d4b849f4dbc54fea","0x5b748e96d70ca25a7e63a2b80de8f5b648e143f536591ffd7b58f77c8918981","0x1","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21"],"nonce":"0x2f98"}}}],"receipts":[{"Invoke":{"transaction_hash":"0x5faaa73c8f48d4b46fe68e72990495190c6128cc9919d1ca2119b68dc0d0071","actual_fee":{"amount":"0x4badf27c100","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410"],"data":["0xf4240","0x0"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x4ff9c92b4b06fc7d4923606d69abafc9051b0e41b0d7954692bd38be4b99e7"],"data":["0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0xf4240","0x109a40007","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x2a992f38709bbb47a4d6775ba0863c3fb72e0f309972ace179ebaefb2fc60b3"],"data":["0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0xf4240","0x109a40007","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x436f6e74726f6c"],"data":["0x1","0x109a40007","0x1","0x2109"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x5072697661746553616c65"],"data":["0x1","0x109a40007","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x139f3e273ffde9597a38ee22f0fedc5c0b921eab036cf16cce18d63529045fb"],"data":["0x7","0x109a4","0xf4240","0x1","0x12d8","0x1","0x2109","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x5d360005","0x2","0x13","0x1","0x8abc060d0","0x3c0a8bb6e9","0x2540be400","0x52b391e00","0x4","0x2","0xfb5c4a","0x7","0x131e85e","0x42","0xafb5f","0xa9","0x19b","0x1","0x8","0x989680"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x4465706f736974"],"data":["0x1","0x109a40007","0x3","0x8","0x535a4d","0x70f0d","0x66da77f6","0x14ffffe38","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x457874726163746f72"],"data":["0x2","0x27680005","0x1","0x1","0x1","0x8","0x4c4b40","0x5","0x5d36","0x2","0x66ef23a4"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x43726577","0x1"],"data":["0x1","0x21090001","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x2","0x8043","0x80c8","0x66e294eb","0x66e90670","0x2","0x5","0x2768","0xb0ca2","0x759","0x2"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x2032457432fdc3444a9d87d36c03b163de510f154164b8a6e17d305b2513e5a"],"data":["0x7","0x109a4","0x8","0x4c4b40","0x5","0x2768","0x1","0x5","0x5d36","0x2","0x66ef23a4","0x1","0x2109","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410"]},{"from_address":"0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x5faaa73c8f48d4b46fe68e72990495190c6128cc9919d1ca2119b68dc0d0071"],"data":["0x3","0x1","0x1","0x1","0x0","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x4badf27c100","0x0"]}],"execution_resources":{"steps":144518,"memory_holes":null,"range_check_builtin_applications":6081,"pedersen_builtin_applications":78,"poseidon_builtin_applications":209,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":768},"total_gas_consumed":{"l1_gas":384,"l1_data_gas":768}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0xe6aa07de9be23d93f7eb09435d9536c4f0aedda66b2540c710bb73f7eed47c","actual_fee":{"amount":"0x14b1904df74","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x4dc80005","0x2","0xa","0x1","0x1168813c0","0x111d4c92c","0xeafebac40","0xe42e205b8","0x2","0x19","0x55914","0x18","0x41f4c4","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x50726f636573736f72","0x1"],"data":["0x2","0x42cf0005","0x1","0x1","0x0","0x0","0x0","0x0","0x0","0x140000000","0x0","0x0","0x0","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x17d3031632aeed96ab9d68226d6439ef5fdc0bb7f8086a7cc6a54207da53e4"],"data":["0x5","0x42cf","0x1","0x1","0x18b5","0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e"]},{"from_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0xe6aa07de9be23d93f7eb09435d9536c4f0aedda66b2540c710bb73f7eed47c"],"data":["0x1","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x14b1904df74","0x0"]}],"execution_resources":{"steps":37061,"memory_holes":null,"range_check_builtin_applications":1652,"pedersen_builtin_applications":27,"poseidon_builtin_applications":76,"ec_op_builtin_applications":12,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":384},"total_gas_consumed":{"l1_gas":105,"l1_data_gas":384}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x26924aaee01daced06075d606b1f80f18d2eabb137f15c2dd75be384d7e38fd","actual_fee":{"amount":"0x4f9f01c7c50","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x4ed10005","0x2","0xa","0x1","0x4bde23a08","0x413edc112","0x147c005b0","0x191ddd168","0xa","0x1f","0x108ec2","0x6","0x1","0xd","0x6","0x3a","0xf4232","0x1a","0x2bf44","0x7","0xbd7330","0x70","0x3f5d","0x1e","0x389f6","0x13","0x270f","0x14","0x52cd44","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x4ed10005","0x2","0xa","0x1","0x4bde23a08","0x413edc112","0x1876868b0","0x19ae4cac8","0xa","0x1f","0x108ec2","0x6","0x1","0xd","0x6","0x3a","0xf4232","0x1a","0x2bf44","0x7","0xbd7330","0x70","0x3f5d","0x1e","0x389f6","0x13","0x270f","0x14","0x52cd44","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x50726f636573736f72","0x1"],"data":["0x2","0x44210005","0x1","0x1","0x1","0x1c","0x1d","0xea6000000000","0x0","0x140000000","0x0","0x5","0x4ed1","0x2","0x66e8a33e"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x43726577","0x1"],"data":["0x1","0x19bc0001","0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","0x5","0x83ee","0x83ef","0x83f0","0x83f1","0x83f2","0x66e61ed6","0x66e82642","0x3","0x5","0x4421","0xb0ca2","0x99","0x2"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x3065adaec3635cf39a14af3ca256db24878ed04ac9a67e4da02df245920e5e3"],"data":["0x5","0x4421","0x1","0x1c","0x1","0x14","0x124f80","0x5","0x4ed1","0x2","0x3","0x1d","0xdbba0","0x1e","0xa410","0x1f","0x1ec30","0x5","0x4ed1","0x2","0x66e8a33e","0x1","0x19bc","0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8"]},{"from_address":"0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x26924aaee01daced06075d606b1f80f18d2eabb137f15c2dd75be384d7e38fd"],"data":["0x1","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x4f9f01c7c50","0x0"]}],"execution_resources":{"steps":153153,"memory_holes":null,"range_check_builtin_applications":6357,"pedersen_builtin_applications":52,"poseidon_builtin_applications":187,"ec_op_builtin_applications":6,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":448},"total_gas_consumed":{"l1_gas":404,"l1_data_gas":448}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5b8086d35dd0d6ada93c160d4cbeb075432801eb72cd055a31ac654f5c4b4a7","actual_fee":{"amount":"0xe93415c81e1572","unit":"Fri"},"messages_sent":[],"events":[{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411"],"data":["0x155c47d5543f67ded9","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411"],"data":["0x0","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411"],"data":["0x155496d307eb06eeae","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x624ef3ac9a411845bcc671de3155f9c27c29a2539be56d17acff46d0747877","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x66e80dc6"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x2d869564c7a090f9b3cd65b3da756ce0477042ddacf02cf39dd19ca4c223e5f","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0xde5b7c234e442e5","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x3fe378208b9b410fecd7e94ee45037c8715f0f12c7a8455bde0f35277b83d65","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0xe10d2cd635c94d5","0x0"]},{"from_address":"0x26c5994c2462770bbf940552c5824fb0e0920e2a8a5ce1180042da1b3e489db","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x0","0x25a55e8860426582eefb8a54615ce79177f220a41362a202175cce6eaa30f49"],"data":["0x8a5d06f9c57e640f","0x0"]},{"from_address":"0x26c5994c2462770bbf940552c5824fb0e0920e2a8a5ce1180042da1b3e489db","keys":["0x34e55c1cd55f1338241b50d352f0e91c7e4ffad0e4271d64eb347589ebdfd16"],"data":["0x25a55e8860426582eefb8a54615ce79177f220a41362a202175cce6eaa30f49","0x8a8eeb485732e485","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x0"],"data":["0x155496d307eb06eeae","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x243e1de00e8a6bc1dfa3e950e6ade24c52e4a25de4dee7fb5affe918ad1e744"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x3f1547f5c752a56ed475433772ec93cab0ef5ff7786632287d7381d30d305ae","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x1438f316729356","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x49d3e14a9a5551aa9aa4e7ce97f74cc7357d95f68db2d55fc291f2e07af82d","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x77ded4e9f3350f","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x33db1d611576200c90997bde1f948502469d333e65e87045c250e6efd2e42c7","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x1438f316729356","0x0","0x77ded4e9f3350f","0x0","0xde5b7c234e442e5","0x0","0xe10d2cd635c94d5","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x0","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x0","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb"],"data":["0x155c47d5543f67ded9","0x0"]},{"from_address":"0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","keys":["0x34e55c1cd55f1338241b50d352f0e91c7e4ffad0e4271d64eb347589ebdfd16"],"data":["0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x5b8086d35dd0d6ada93c160d4cbeb075432801eb72cd055a31ac654f5c4b4a7"],"data":["0x2","0x1","0x1","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0xe93415c81e1572","0x0"]}],"execution_resources":{"steps":311463,"memory_holes":null,"range_check_builtin_applications":9359,"pedersen_builtin_applications":429,"poseidon_builtin_applications":20,"ec_op_builtin_applications":6,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":12,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":1216},"total_gas_consumed":{"l1_gas":802,"l1_data_gas":1216}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x2cece4382a49a8e195595ecce3724e8b98355298f24b30e61d0aae3c1951843","actual_fee":{"amount":"0x240e6fe58e1adc","unit":"Fri"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x60370005","0x1","0x2","0x1","0x21889840","0x3854c6c0","0x0","0x0","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x44656c6976657279"],"data":["0x1","0x2b3380009","0x2","0x5","0x40ac","0x1","0x5","0x6037","0x1","0x66e80d9d","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x2dc24e3b0e2d3292a9686c8468d7b0a1456f1825b9cf7fc6e1d228d81de7e81"],"data":["0x5","0x40ac","0x1","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x5","0x6037","0x1","0x9","0x2b338","0x1","0x1b6c","0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x240e6fe58e1adc","0x0"]}],"execution_resources":{"steps":45301,"memory_holes":null,"range_check_builtin_applications":2110,"pedersen_builtin_applications":25,"poseidon_builtin_applications":61,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":384},"total_gas_consumed":{"l1_gas":124,"l1_data_gas":384}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x607a57157815daf6ff7f75d657503c6b2177b484435353bed99ca152a2a2661","actual_fee":{"amount":"0x4ea2bdf4eec","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f"],"data":["0x2ea6442f","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x43726577","0x1"],"data":["0x1","0xdba0001","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","0x5","0x71c","0x6a9f","0x6aa0","0x6aa1","0x728","0x66dea3f5","0x66e809eb","0x0","0x0","0x0","0x0","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x250f0005","0x2","0xa","0x1","0x78f67d630","0x6b3ecb899","0x35297b580","0x3a944d674","0x48","0x1e","0x5005","0x9","0xc99ea","0xe","0x11d085","0x2b","0x3d86","0x2d","0x62ae2","0x2e","0x68c21","0x51","0x9c37","0x30","0x412e4","0x31","0x16df1","0x6","0x37775","0x70","0xb2f","0x4e","0x1be5a","0x3a","0x406518","0x13","0x2ecb4","0xd","0x27e6d8","0x3","0xfb005","0x18","0x3c41d6","0x7b","0x640","0x1d","0x123e7","0x1f","0x14f55","0x1a","0xca85e","0x4c","0x17b5a","0x10","0xf4240","0x4a","0xb1","0x20","0x71868","0x11","0x186a0","0x50","0x58b12","0x59","0x31b3e","0xb","0x673e8","0x17","0x762e","0xbf","0x1d46","0x12","0x24585","0x14","0x186a0","0x22","0x51467a","0xc","0x179949","0x15","0x186a0","0x25","0x30d40","0x2","0x91d","0x83","0x4d58","0x84","0x14ee","0xa","0x1632ed","0xd9","0x1f43","0x7","0x4fb3f","0x6f","0xf5d","0x5","0x2170d","0x41","0x5","0xbe","0x1e48b","0x58","0x8b50","0x8d","0x2314","0x5f","0x1430c","0x37","0x21475","0x1","0x2faf08","0x87","0x2","0x66","0x40ef","0xc2","0xd","0x4f","0x2ba8","0x4d","0x86a2","0x3f","0x9559","0x57","0xff51","0x56","0x1d90","0x6a","0x280e","0x3e","0x133","0x3d","0x1","0x63","0x12c0","0x43","0x10cb","0x33","0x1d7f","0x64","0x1321","0xb2","0xc25","0x23","0x8a86","0xb6","0x61a8","0x54","0x3ab4","0x61","0x3e8","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x50726f636573736f72","0x1"],"data":["0x2","0x21190005","0x1","0x1","0x0","0x0","0x0","0x0","0x0","0x100000000","0x0","0x0","0x0","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x17d3031632aeed96ab9d68226d6439ef5fdc0bb7f8086a7cc6a54207da53e4"],"data":["0x5","0x2119","0x1","0x1","0xdba","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937"]},{"from_address":"0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x672f0ab646088984d1fd10e077d1532e683808fc310b9051cd2e451f3266c63"],"data":["0x3","0x1","0x1","0x1","0x0","0x1","0x0"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x455f986e8eef5fbfbdf7c8246a38eae29d0bbd9af7e657bb268fb8a801d9ab3"],"data":["0x10040b49","0x0"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937"],"data":["0x1ea238e6","0x0"]},{"from_address":"0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x607a57157815daf6ff7f75d657503c6b2177b484435353bed99ca152a2a2661"],"data":["0x1","0x1","0x1"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x4ea2bdf4eec","0x0"]}],"execution_resources":{"steps":142452,"memory_holes":null,"range_check_builtin_applications":6868,"pedersen_builtin_applications":122,"poseidon_builtin_applications":126,"ec_op_builtin_applications":15,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":896},"total_gas_consumed":{"l1_gas":399,"l1_data_gas":896}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x4d3d49bbb6416157a2676a6c9ee513ef3598b2ed20ec58e363d7bc3ed114700","actual_fee":{"amount":"0x22afb9ce4c0","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x8bcd8ac10339f80","0x0"]},{"from_address":"0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","keys":["0x157717768aca88da4ac4279765f09f4d0151823d573537fbbeb950cdbd9a870"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","0x68db8bac710cb4000000000000000","0xc8","0x0","0x8bcd8ac10339f80","0x0","0x0","0x1000003f7f1380b75","0x0","0x0","0x8bcd8ac10339f80","0x0","0x5670ebf6","0x1","0x32537ed5619b64e055aa0fb14dca5","0x0","0x12f7ad0","0x1","0x91a5b6bba6a9f74"]},{"from_address":"0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5670ebf6","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x8bcd8ac10339f80","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x0","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x8bcd8ac10339f80","0x0"]},{"from_address":"0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","0x5670ebf6","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x22afb9ce4c0","0x0"]}],"execution_resources":{"steps":65669,"memory_holes":null,"range_check_builtin_applications":3997,"pedersen_builtin_applications":111,"poseidon_builtin_applications":13,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":58,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":768},"total_gas_consumed":{"l1_gas":176,"l1_data_gas":768}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5720e1d812d11bfff0bba5bfbe57d42aef3faadcd7308ba76c9cf7c92c1ea80","actual_fee":{"amount":"0x153a0c32996111","unit":"Fri"},"messages_sent":[],"events":[{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x20f7194ef6135ed07","0x0"]},{"from_address":"0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","keys":["0x35cc0235f835cc84da50813dc84eb10a75e24a21d74d6d86278c0f037cb7429"],"data":["0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x20f7194ef6135ed07"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x2040e007f6656655b","0x0"]},{"from_address":"0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","keys":["0x35cc0235f835cc84da50813dc84eb10a75e24a21d74d6d86278c0f037cb7429"],"data":["0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x2040e007f6656655b"]},{"from_address":"0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x5720e1d812d11bfff0bba5bfbe57d42aef3faadcd7308ba76c9cf7c92c1ea80"],"data":["0x2","0x0","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x153a0c32996111","0x0"]}],"execution_resources":{"steps":25284,"memory_holes":null,"range_check_builtin_applications":978,"pedersen_builtin_applications":113,"poseidon_builtin_applications":11,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":512},"total_gas_consumed":{"l1_gas":73,"l1_data_gas":512}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x1a63a9c9f06c3314407347ce18c55be4bd45c5ef7d9a683abe5e11666f7e696","actual_fee":{"amount":"0x18d51390bd8","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x5fd70005","0x1","0x2","0x1","0x21889840","0x3854c6c0","0x0","0x0","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x44656c6976657279"],"data":["0x1","0x2aedd0009","0x2","0x5","0x41ef","0x2","0x5","0x5fd7","0x1","0x66e6ff32","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x2dc24e3b0e2d3292a9686c8468d7b0a1456f1825b9cf7fc6e1d228d81de7e81"],"data":["0x5","0x41ef","0x2","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x5","0x5fd7","0x1","0x9","0x2aedd","0x1","0x18b5","0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e"]},{"from_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x1a63a9c9f06c3314407347ce18c55be4bd45c5ef7d9a683abe5e11666f7e696"],"data":["0x1","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x18d51390bd8","0x0"]}],"execution_resources":{"steps":44637,"memory_holes":null,"range_check_builtin_applications":2101,"pedersen_builtin_applications":26,"poseidon_builtin_applications":76,"ec_op_builtin_applications":12,"ecdsa_builtin_applications":null,"bitwise_builtin_applications":null,"keccak_builtin_applications":null,"segment_arena_builtin":null,"data_availability":{"l1_gas":0,"l1_data_gas":384},"total_gas_consumed":{"l1_gas":126,"l1_data_gas":384}},"execution_result":"Succeeded"}}],"declared_classes":[],"commitments":{"transaction_count":null,"transaction_commitment":null,"event_count":null,"event_commitment":null,"state_diff_length":null,"state_diff_commitment":null,"receipt_commitment":null,"global_state_root":"0x13805939c3d081d65a886f22b4a785e9a7731b4f8be3e81d478a3c6915ecc58","block_hash":"0x63221327badb10e5473ebb62a995db68413012684fee01964deb68f5912445b"}} \ No newline at end of file +{"signature":["0x6ca01cec1369dc1860c2fc5879d8a60fc780e08b9fff2f0fa527577b1fa2233","0x109bb37b673044414cbfac3b6a8aa20c108e79efcbceb5adeec4d3799e7b9a5"],"unverified_block_number":724130,"header":{"parent_block_hash":"0x2202b54db0b611de85f4b7cac4a18920936d109628913ae62a0f23f9c294c88","sequencer_address":"0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","block_timestamp":1726483910,"protocol_version":[0,13,2,1],"l1_gas_price":{"eth_l1_gas_price":13543370708,"strk_l1_gas_price":81846555763849,"eth_l1_data_gas_price":1,"strk_l1_data_gas_price":6043},"l1_da_mode":"BLOB"},"state_diff":{"storage_diffs":[{"address":"0x1","storage_entries":[{"key":"0xb0c98","value":"0x372c9dac7fb3713f8e2a39f6ac1cd8dcacf6aa2ea6d0cf43c47bd6ab03c8c29"}]},{"address":"0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","storage_entries":[{"key":"0x591acc006991ecc44299588fcfe36aaf338929a2ce09835de224d78d1791dc7","value":"0xb90c75009ca88e7dcebfed3edf5c78d46e"},{"key":"0x786e6f2cbcf63b6c37de67d37e3fbbd3689e837c77677e5ca9f95f64b1817c5","value":"0x1012f7ad000000000000000000000032537ed5619b64e055aa0fb14dca5"},{"key":"0x7e90b0128622cf5b5b4703e185c007a43570b801dbb80615738c28e4a167763","value":"0x91a5b6bba6a9f74"},{"key":"0x7ed8d6370ad07d19fa64def9549d0e17867755a448d1e61e961ef6e5a23ca86","value":"0x7870f24d1e28e898703d9a8247069250a8"},{"key":"0x7ed8d6370ad07d19fa64def9549d0e17867755a448d1e61e961ef6e5a23ca87","value":"0x63525a6bd71ec43370b21b22ab0"}]},{"address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","storage_entries":[{"key":"0x1f7de53410a85ed2a804b984149a69358a73cb9847dcf030245471790934bfd","value":"0x30c208feccf5e"},{"key":"0x2b317f1d76a1b287a48df2f31215729d2fd2d6bde40de53f0189a6c0f396a96","value":"0x7b1f5b3eabd"},{"key":"0x53897302c5e8ef1d231d0f7673f50d9b5e386b8f5e766ef0ae6adf59528ab9e","value":"0x71ab0c16c9c"}]},{"address":"0x26c5994c2462770bbf940552c5824fb0e0920e2a8a5ce1180042da1b3e489db","storage_entries":[{"key":"0x9bbef8a57b386d59cf37a51ebc41ea292e19460fa1da471105f77fc8d788f5","value":"0x8072b23ee447b18581e"},{"key":"0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","value":"0x2f5e3a0b0f85ffee335cc"}]},{"address":"0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","storage_entries":[{"key":"0x483c7f7ea1869f0faa489653466f9a025b64547f2d8f172001b70035e33fd14","value":"0x20f7194ef6135ed07"}]},{"address":"0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","storage_entries":[{"key":"0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","value":"0x61dad54f8dec7f75c84"},{"key":"0x529c924665a599ae770853f674236ed47387957e78474d04f2e1b8afb6ef255","value":"0x155c47d5543f67ded9"}]},{"address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","storage_entries":[{"key":"0x532db0958bf8ed143131b352126a20f0479d18a225a9beb9a1102d8bb1f4ff","value":"0x21090001"},{"key":"0xa0cc655cbdccdc35dc4908b0c5ca5a63ab12664a59b580b941670559ac7899","value":"0x14ffffe380019b69dfd8001c3c34014d693400083"},{"key":"0x1b7d074c90845ff149fac25f6f73b7b152290aeb8d84d1ce27dbd8dd109c101","value":"0x390b8816e0000eafebac401000a0000000004475324b00001168813c001"},{"key":"0x1b7d074c90845ff149fac25f6f73b7b152290aeb8d84d1ce27dbd8dd109c102","value":"0x60001900000000000000000041f4c400055914"},{"key":"0x1e15a2c2637958276931ee4f9ad6750bbc42d7a264d2ae1c29161aafa9e4ec7","value":"0x100000000000000000000000000000000"},{"key":"0x20977ea42475db028eedc8815ccd575e4113f033e49ec623e471723b187eeb7","value":"0x800000000000000000000000000989680"},{"key":"0x2aea6895b96d1ae98a87d5583279272c31bf6827a6c67d6422db93f27b83017","value":"0x20759000000000000276800050000b0ca200002066e90670066e294eb"},{"key":"0x2d4da188e578d0d6db3f25d20ebd09b467d0f51fd19d5d577dd896bec35699a","value":"0x100000000000040ac00052010066e80d9d0100000000000060370005"},{"key":"0x4590e13f801ef5a6ef018af6a0486e22fc83290e196d8088c328446d35e4b85","value":"0x14ace478000002540be4001001300001000f02a2edba40008abc060d001"},{"key":"0x47983e59d4f0b910d53a4077c079a144d80551cdb8e7044d0eaef3da20ab66e","value":"0xea51359d000035297b5801000a000000001acfb2e26400078f67d6300f"},{"key":"0x47983e59d4f0b910d53a4077c079a144d80551cdb8e7044d0eaef3da20ab672","value":"0x53d54001f00074007b000600003000123e700000640003c41d6000fb005"},{"key":"0x47983e59d4f0b910d53a4077c079a144d80551cdb8e7044d0eaef3da20ab678","value":"0x50c30005f002340058002f800410000231400008b500001e48b00000005"},{"key":"0x4b9dc52bb8603200fafec3ceeb9e25e437d298e9b7b768d1554016781d092c7","value":"0x100020000000000e1531b0000002188984001"},{"key":"0x4b9dc52bb8603200fafec3ceeb9e25e437d298e9b7b768d1554016781d092c8","value":"0x1800f3003b4007d00114002c0000000100000bb8000493e00003d090"},{"key":"0x4f0c798dc69dfab602b09cb9c153714601860c082b3727c3cad207c5a83c110","value":"0x66e809eb066dea3f5"},{"key":"0x4f8e0d2a19a4ec8c5d70862ea4635aa5b05011cdcf7b5931bbebe31d8fa4efb","value":"0x0"},{"key":"0x511db5b6c02ce5c9b361d4377cc06425f4abe5194c2e0aeaa1a05e578d60914","value":"0x66b932b200001876868b01000a00000000104fb704480004bde23a0802"},{"key":"0x511db5b6c02ce5c9b361d4377cc06425f4abe5194c2e0aeaa1a05e578d60916","value":"0x14b351000140004c001e001c000070000270f000389f600003f5d00bd7330"},{"key":"0x568f9dceb2bf4358c53d4fa1cd9d7033704b02fa585793910f56dcaf35caf9d","value":"0x100020000000000e1531b0000002188984001"},{"key":"0x568f9dceb2bf4358c53d4fa1cd9d7033704b02fa585793910f56dcaf35caf9e","value":"0x1800f3003b4007d00114002c0000000100000bb8000493e00003d090"},{"key":"0x5e1550fe0eb602ae3a02c00739b5fa1024200fb1459803f8c71bb5162c1daa3","value":"0x20099000000000000442100050000b0ca200003066e82642066e61ed6"},{"key":"0x5e2b78886f320dd94a77f1bd257260878badddfc4b2e269ab58cb5176fea813","value":"0x19ba28cf80003a98000000000400010020000000000004ed1000500074001c"},{"key":"0x6889d597bdb660ddf214bf428a07aafab4af5cda1715f38648b1cc2ed68c4c0","value":"0x200000000000041ef00052010066e6ff32010000000000005fd70005"},{"key":"0x79e794455c21923e256c5c013c9780f3a9fefba0a7a02183a4987ddd12bef60","value":"0x20000000000005d36000500000019bbc8e9001312d00000810001"},{"key":"0x7b63f75c41951d980445cf8878868d5b9cd621d30debce6210eb0ec254326e2","value":"0x100000000000000000000000000000000"}]},{"address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","storage_entries":[{"key":"0x6fb914f316fbd4e1ccf26070033cb54067180520e114325ec93948415fd3","value":"0x2c52f760178f79933ab4c2"},{"key":"0x397a5e1aec0495b0b394e0d12a11058d5efeca61bcd74df3ee1f123f3dfa9","value":"0x6e9d582164c7bc20"},{"key":"0x13f71d2bbe2c37549de7b31cd889315ca3dd0c4847227039b4735195416274f","value":"0x623ba096b45efd764"},{"key":"0x38d6079dbb7ade1dbdf5d488d4b6b12f605d942b9be1897078128e5630e3a9f","value":"0x61dad54f8dec7f75c84"},{"key":"0x529c924665a599ae770853f674236ed47387957e78474d04f2e1b8afb6ef255","value":"0x1a20e724dfe73fdf"},{"key":"0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a","value":"0x26a3f5d5ddc30d68e00"},{"key":"0x56993ed1d50bc3f13473306434ae81f3ffeda97fc374511449c65555bd707d2","value":"0x13f2cbb17bae007073d2"},{"key":"0x5abb997ecdab6544c50e7f490e437a5480ca38ed5e42448f69a76bc62842fdb","value":"0x23025700c7124c8a4a74"}]},{"address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","storage_entries":[{"key":"0x1488e68cb80b78333acd24d286115a5b4681d32764d6710d4bc9cd09771d049","value":"0xc6a9129bc88d950"},{"key":"0x2354fceac0db81b3a249ffed8cae0a194bd8295a5d223dfff6874d3fb9dbcb5","value":"0x4fd1df3d034912"},{"key":"0x367b012f3d07fcd419fa5d383fb3884ea5d6bd315bfd9e1e63c1147e5506368","value":"0xb67a483540f3b9"},{"key":"0x43e1ef374bc5f9e49c6c9764a9aac6e36bc8e3df0ca3bffb3cde5a0990ca369","value":"0x25dcdfc488ba28353c4"},{"key":"0x5496768776e3db30053404f18067d81a6e06f5a2b0de326e21298fd9d569a9a","value":"0x216d3b66d1b51520"},{"key":"0x72fddfd5dfb8ca6d05ba86bae8516f238765f8e512a628cf96bb7b3129a1b06","value":"0x7741827d4321f5"},{"key":"0x7effecfcd0745eeb5d91e3d7497643fdfc0f5fe4077149f258e655b9c719d44","value":"0x2292b51bc1d67dc"}]},{"address":"0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","storage_entries":[{"key":"0x483c7f7ea1869f0faa489653466f9a025b64547f2d8f172001b70035e33fd14","value":"0x2040e007f6656655b"}]},{"address":"0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","storage_entries":[{"key":"0x1488e68cb80b78333acd24d286115a5b4681d32764d6710d4bc9cd09771d049","value":"0x117e39e03"},{"key":"0x43e1ef374bc5f9e49c6c9764a9aac6e36bc8e3df0ca3bffb3cde5a0990ca369","value":"0x179affff38b7"}]},{"address":"0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","storage_entries":[{"key":"0x5baec44d0231569dc064f3db2a91ac9f8800127ccd52033c5c29e3e5e13e1ff","value":"0x1"}]},{"address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","storage_entries":[{"key":"0xb5da8588258cf59a9a61b801cb29947fe195cd2a4cf7029895d1841ed37793","value":"0x77ded4e9f3350f"},{"key":"0x44dff0be23dce03163b957c4e69a9767a4898e7c7ea6c4cf52d8f57d63ed5d9","value":"0x66e80dc6"},{"key":"0x4a31f49fdb9cb10e4c5f4318207bab1aa70548024c73b5a20a4828c1a4e9005","value":"0x1438f316729356"},{"key":"0x55bd64a08284f65eaa89fd5a81f307ed9c778e89b797992d4af620df1d9cca7","value":"0xde5b7c234e442e5"},{"key":"0x7f707060dc04e7a4bf0e4a5b3cc74cac753d9ff1a2997082a22fb3cf8eb237f","value":"0xe10d2cd635c94d5"}]},{"address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","storage_entries":[{"key":"0x110e2f729c9c2b988559994a3daccd838cf52faf88e18101373e67dd061455a","value":"0x3fd7124a94e5cb413936a5"},{"key":"0x529c924665a599ae770853f674236ed47387957e78474d04f2e1b8afb6ef255","value":"0x211243977a3"}]}],"deprecated_declared_classes":[],"declared_classes":[],"deployed_contracts":[],"replaced_classes":[],"nonces":[{"contract_address":"0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","nonce":"0xf"},{"contract_address":"0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12","nonce":"0x525"},{"contract_address":"0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","nonce":"0x63"},{"contract_address":"0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","nonce":"0x3d66"},{"contract_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","nonce":"0x2f99"},{"contract_address":"0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","nonce":"0x1eef"},{"contract_address":"0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","nonce":"0x9fe"},{"contract_address":"0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","nonce":"0x5d5b"}]},"transactions":[{"Invoke":{"V1":{"sender_address":"0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","calldata":["0x3","0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","0xa72371689866be053cc37a071de4216af73c9ffff96319b2576f7bf1e15290","0x4","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0xf4240","0x109a40007","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x6","0x50757263686173654465706f736974","0x4","0x7","0x109a4","0x1","0x2109","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0xd","0x457874726163745265736f757263655374617274","0xb","0x7","0x109a4","0x4c4b40","0x5","0x2768","0x1","0x5","0x5d36","0x2","0x1","0x2109"],"max_fee":"0xe0ac5b3dadc","signature":["0x1","0x0","0x18eab81019936b1fa1fdafb88c75d49db37e8625f5c48712cb6b652137591e4","0x4a928427fc356cb000c37538c59736174c7521293e4f2a24c10716ea23cf166","0x624f4741bde233f6cd904c20bf8a35d52824baee2a3b234112688a51eb539ed"],"nonce":"0x1eee"}}},{"Invoke":{"V1":{"sender_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x7","0x50726f6365737350726f647563747346696e697368","0x5","0x5","0x42cf","0x1","0x1","0x18b5"],"max_fee":"0x1ae6d5322ca","signature":["0x73657373696f6e2d746f6b656e","0x66ef5e96","0x40ec3c2930339a4d7005fde62833f70f7f0ef82360dcccf93637b0f2709b393","0x1dbe92cf386604bf3f87df1227b08e2fe64d80faec993e7c486b242571b352","0x71881c86e17158eb0d9b0b395a703040b073a67b3bc47c312c7154778ace8e6","0x0","0x9","0x2","0x0","0x6ea68c7c3e3c152ba05dc1945cfed2d0cd37a7f01fd52fbe57fb070eda05157","0x636f1671e6c4172f9c689c05bae2b8ffb8a70ef7ec6f4a748c55fcab7020a67","0x1f3a02206ac9ab7abacff1e0cad6ca947da38eae330080bcc4fafb03a78fe4f","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x655612ed312682c39ca8d7c6932f7b57d9a554dbfb91e3a86fab3e45729629c","0x70bd52099caaaeab7dadcb48f561c03dae199ac156bed1912e31848b3ac1337","0x0","0x6134a98a48cfcd6424d6117f3032bcf6303419b842277b27532c8cbb81d8028","0x47b818213e05846b19dc9c10e633832ff4000ef1a3079044856d8fceb66f3b8","0x4f44dc7f7d471bf660db3bcc4097703b0fd5c7e9b6a1ac43ced983d8adcea12","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x1800b3357c32fde966b5fe19004b73f1219df0f5486f8c5d1f0d75975abf95d","0x16981d883f54f5ff629cbd40c10882490aeeee640451f95cc6e311fe825f5c1","0x1","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21"],"nonce":"0x2f97"}}},{"Invoke":{"V1":{"sender_address":"0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x11","0x50726f6365737350726f64756374735374617274","0xf","0x5","0x4421","0x1","0x1c","0x1d","0xea6000000000","0x0","0x5","0x4ed1","0x2","0x5","0x4ed1","0x2","0x1","0x19bc"],"max_fee":"0xebe828009ae","signature":["0x2","0x0","0x45d9eced6706379a34c43354705f747d2698ccd2f15fc92e7436b3f1c62b2e2","0x2f92cfe61f2671055e3f17a194c11cbb51d1db0c0721d85cd0ba84d9cf67dea","0x18425ffd91a53d0fd9245f34ca38858d3d71f3236fd7332004e514aee2daef4","0x0","0x5771e48f36f6b56938be5be42fd1a6946d5d2759cf789e8e144320a3d2719cf","0x2794b68b80bcb108e041379a541329cd844bf2079c2fa98274980f73cde1f4","0x531ce22de939a06644aeb5ad449619e4089252d1490845116d63a44fd12cfbc"],"nonce":"0x9fd"}}},{"Invoke":{"V3":{"sender_address":"0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","calldata":["0x2","0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","0x3bada4d9e663a0f9475b03ed2dc915c8acc4d83e4b7a94efccff304f70b967c","0x4","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x1126e4bf867072165130f767d49b03b9370774fbfb5224842ac5b288851843a","0x1e","0x2","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x4","0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","0x41b033f4a31df8067c24d1e9b550a2ce75fd4a29e1147af9752174f0e6cb20","0x4","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0","0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","0x3e8cfd4725c1e28fa4a6e3e468b4fcf75367166b850ac5f04e33ec843e82c1","0x4","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0","0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c","0x3","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x155c47d5543f67ded9","0x0","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x2f0b3c5710379609eb5495f1ecd348cb28167711b73609fe565a72734550354","0x3","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x155c47d5543f67ded9","0x0"],"signature":["0x2","0x0","0x677b9a777388cce7c2987ad79590d169c064e6acfdf3e325932c447b9cb42b2","0x194ed205d28ea788d1639c12b4cf54812359a5b756efc8fc723cdd85d4d6050","0x54240f9c248572fb7e403b5e74cb35ed6ab99ce693a2dcd4563a42f311ae060","0x0","0x1b185abf4388cf9094aeb92330ea65a7d2d6fdc6e1248cfa79a81b3e7c820bc","0x58603d07b47602bb963e124c3ddf969b2b130100823c71a1743b18af2e52b29","0x7bf15647a94c689cf3bba71e1762b7824576806ad48944cadeefe860af7a45a"],"nonce":"0xe","resource_bounds":{"L1_GAS":{"max_amount":"0x93e","max_price_per_unit":"0x6fa894514704"},"L2_GAS":{"max_amount":"0x0","max_price_per_unit":"0x0"}},"tip":0,"paymaster_data":[],"account_deployment_data":[],"nonce_data_availability_mode":0,"fee_data_availability_mode":0}}},{"Invoke":{"V3":{"sender_address":"0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x6","0x5265636569766544656c6976657279","0x4","0x9","0x2b338","0x1","0x1b6c"],"signature":["0x1","0x33e211a6522dbbd92b277ef195efe9a45bc260532569e71850b345769d365bb","0x154df10a10c15ce13dcd7050df480449884e7f56027fba3d588ee6a0f6308c5"],"nonce":"0x524","resource_bounds":{"L1_GAS":{"max_amount":"0xb7","max_price_per_unit":"0x51e2065ee1c9"},"L2_GAS":{"max_amount":"0x0","max_price_per_unit":"0x0"}},"tip":0,"paymaster_data":[],"account_deployment_data":[],"nonce_data_availability_mode":0,"fee_data_availability_mode":0}}},{"Invoke":{"V1":{"sender_address":"0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","calldata":["0x1","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x240060cdb34fcc260f41eac7474ee1d7c80b7e3607daff9ac67c7ea2ebb1c44","0x49","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","0x34cc13b274446654ca3233ed2c1620d4c5d1d32fd20b47146a3371064bdc57d","0x43","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x1d6b526aa4f1a7fa8f33fd3240ef477ea5d2594a600ef76abc66c5d998abef3","0x1","0x191faacf0a7","0x3","0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","0x3","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x2ea6442f","0x0","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x5","0x5265736f6c766552616e646f6d4576656e74","0x3","0x0","0x1","0xdba","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x7","0x50726f6365737350726f647563747346696e697368","0x5","0x5","0x2119","0x1","0x1","0xdba","0x25","0x73657373696f6e2d746f6b656e","0x66ee86b7","0x40ec3c2930339a4d7005fde62833f70f7f0ef82360dcccf93637b0f2709b393","0x1dbe92cf386604bf3f87df1227b08e2fe64d80faec993e7c486b242571b352","0x150b06e79312eb9602421cfc533a191fc1d846f90288b9050437aaa6d4bbc8","0x0","0x9","0x2","0x0","0x2fe3536225ebf348f466dec6945a593fb584f3407e73fbc64885fda13cb7e3a","0x5a1854af850ae74f6e56c846b7759ebc23ef11d4a18c966ae90d117b192050e","0x2a9e9ac3592397a739494056612ff0324eb8563bd270cb0188f8018ac04e5c","0x0","0x707c35970861629815711fa8993b3d08f813303f6728d35459fbe9c36a23863","0xea9076d3da941c8d793d7e0701ebb0c02ea404005bc8e663062cfa5100e1b3","0x3d9ccf1f71e2b657efd83b4150650479c80d9b29597180c7d9a5ee73993839e","0x0","0x52543ea588f5b6ba6de8654b5fc2fe643ad8b4f7f757f61fca8bec08b4d03f9","0x31f7cb096aa213c90c7e771a64044ed440f7481658ef8d8ce003857e5290735","0x3713fd372d82052ccfcc65fb236513b21d37c81891108eed60692a4f9b41607","0x0","0x707c35970861629815711fa8993b3d08f813303f6728d35459fbe9c36a23863","0x4c6715b2063920d0f663d80f4bba9716f2285fae0e8294c14131c6b80e4824","0x33083916b4872b3f41085eea061b985c812f8b68c1eb2d798792393da0813ae","0x3","0x3","0xa159132f32aa79c625a0c9e286eac017a7f823da4377b56f69fadf34bbf74a","0x25304f16290ad4509d2a642feb9b2c45a76debd0933652e145f9b1683cb52a5","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21","0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","0x10040b49","0x0"],"max_fee":"0x9d457be9dd8","signature":["0x79dacbd22070b3edb91cf4024887756b48dd873a8956b54cc4ddc3f4f7ace75","0x4ea1fe6fc3f0e719085095ed0daa19055b23721dee08a420edd64dacb7dfb3c"],"nonce":"0x3d65"}}},{"Invoke":{"V1":{"sender_address":"0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","calldata":["0x4","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e","0x3","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x8bcd8ac10339f80","0x0","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x15543c3708653cda9d418b4ccd3be11368e40636c10c44b18cfe756b6d88b29","0xb","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","0x68db8bac710cb4000000000000000","0xc8","0x0","0x0","0x0","0x0","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x8bcd8ac10339f80","0x0","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x2e1d93dafae32660a4a76a0fd6f31550f3ddfd6a51c29ef2e055b80afbbd011","0x3","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","0x566fbdcb","0x0","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x292f3f4df7749c2ae1fdc3379303c2e6caa9bbc3033ee67709fde5b77f65836","0x1","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8"],"max_fee":"0x2a50c1bcc08c","signature":["0x4bf17d784b3f9a5fde3c3cca48fe91a4f01e1a9865433fbf606799e62a5f8f6","0x2c32f7d5032e4c7a5cafebdc7d18f29d6b54ffda4bb11a576ad2dbdec0c5f4b"],"nonce":"0x5d5a"}}},{"Invoke":{"V3":{"sender_address":"0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","calldata":["0x2","0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","0xb758361d5e84380ef1e632f89d8e76a8677dbc3f4b93a4f9d75d2a6048f312","0x14","0x20f7194ef6135ed07","0x12","0x7aaed47e1309e1c70685d1146d7eb09d42830155684c28cdf99e45e1edb6a35","0x5c57f49768c910d1f640afe9e1556b230af8d663a2b67b4bfb9638e5c0da3e7","0x47772a98f84b714e7c1e862a732ddd626e5a3966f29b890d8edb2026f392614","0x362dba94ca49abab56e34c99bba9c21f353c0beed9518c745217ab3d10c03dc","0x52062b80f45556b9298aef87fef0c698e2bd1b9413509ef567cfe2092f2e46b","0x1f701622f3616227715d2d7a94efd424f879886549831613e602bdea52fa696","0x1499227d6c2035fda5686809d9a23add468b3993bb2d3b8aad0e0b727ef28a9","0x6e14a488e75ffdef4837352f5f4f6ced8f3a6e281cee1001a928d7d88414b51","0x75f7bb403f1f1b17b7bdbdf4d084250fb63005e30aac51331af23040dad04b9","0x28b4fe5e08d77771620e7fee94ea9efb49318f7b8d4d9841f938bdf36916949","0x4e973cfe881f368c5cc622eb97bf6bdf1804f1a5456f1039fab4186ae680bc0","0x3fbf86382ff61b1043fbd8938feddc7efc425db1ec56273c1f3bf5643bd5c2b","0x219664c808384296c24fc8dd1a165ce6fbe2d349e03472f8b4d458b6f0606fa","0x255ee502908864e4d0b4bd6997bc98600a5a2cba53667efde85018751f69dd2","0x7cdb76c695687d00ab6a361f2d6e15816714578bbd7a590664e8f26bfdbea7e","0x17cac1b480c548de7f1fb657bb15f267ee457486b1045ac15a3d878f57b0fd9","0x377292313747409f293a0efb68b2f6e2d45f395832244bfa513bd561902d14","0x525b05b8b3acf34ce21fb912bc2aa1946530e901703101a8f8af51b886067b2","0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","0xb758361d5e84380ef1e632f89d8e76a8677dbc3f4b93a4f9d75d2a6048f312","0x14","0x2040e007f6656655b","0x12","0x3bdf272e7aef4a99cad7170e27f0b55e97060ec84e817f3f21564c3aed3fe1e","0x4fa858c4bfb60e267c9669aebb7531675b9d4b9c37ef8bc2b8e11877127da3c","0x353dbb72f2ebab6a3087f98ed730e1f042ee1aa01174bfca729edf831d54f18","0x165e51a62cf3a0665887661a521d86e1b596a594db163c881db46c705e35e8b","0x701da8dcb7d172d5cf0332bba6cc392a1aa7d7bb544ca9fbb05e9df69f1a86f","0x269cfb97dcae06d128ecb488a4d4c9e8fb7f09e0a45a1cfde358525819f8a2e","0x6d4856f8e74923dcc3a5ba306045ab9f257c4f0bad40acdf1dcd0a0819b686d","0x49ea8317956394603d60f7b9e938ad2355a6c740e3a42f5ddb9c2acdaf92f4b","0xd52842a8cbd3669abd258a2c2f596dad87b34ed58e89f4729304f773e49a0a","0x62944effbe0903d7dc7a04109329f2859d8149dbe467cf0b171aedccb880f87","0xc7b1a0fcc3fdc6d69cfecdf6040c51c43e295ab045a8f997617d504e3c5afd","0x62c32a38cc84d49873bacdb33e2abfc78fb06829fdbe509bc7ee84450e8316f","0x783708841c84b730080bb106f95c7f65db87aa989e3f30391213eff645386f2","0x754bd01c45aca855926e06a255a01d2f57423f0d18e42b3a60e5e7d0596fc89","0x24e29155cad672f43cf51a1a388c783dbb1c92539c03da169c769453fa8786b","0x70d62ac7701c115904a34d9ffa19cafa2e2c6b839545b859b0431ccb6c6d4d9","0xe5a57177a954150b035a7a0fde5a9200954b47c926a39e990d013581877fe7","0x3fc4635341dc9dc5520481764d3e93ee9f34768f8f8a220efe12e2fcb245d5d"],"signature":["0x6df4ccc50ed6de522be73b1a1faab617ab5dc2bde916ce13845021b60e9047d","0x431b3967b67b30827407ed230fdc82cf9a6371c8147a28cdf58791b94c22381"],"nonce":"0x62","resource_bounds":{"L1_GAS":{"max_amount":"0xb9","max_price_per_unit":"0x6fa89451e8fa"},"L2_GAS":{"max_amount":"0x0","max_price_per_unit":"0x0"}},"tip":0,"paymaster_data":[],"account_deployment_data":[],"nonce_data_availability_mode":0,"fee_data_availability_mode":0}}},{"Invoke":{"V1":{"sender_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","calldata":["0x1","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","0xcaffbd1bd76bd7f24a3fa1d69d1b2588a86d1f9d2359b13f6a84b7e1cbd126","0x6","0x5265636569766544656c6976657279","0x4","0x9","0x2aedd","0x1","0x18b5"],"max_fee":"0x211c1a16560","signature":["0x73657373696f6e2d746f6b656e","0x66ef5e96","0x40ec3c2930339a4d7005fde62833f70f7f0ef82360dcccf93637b0f2709b393","0x1dbe92cf386604bf3f87df1227b08e2fe64d80faec993e7c486b242571b352","0x71881c86e17158eb0d9b0b395a703040b073a67b3bc47c312c7154778ace8e6","0x0","0x9","0x2","0x0","0x6ea68c7c3e3c152ba05dc1945cfed2d0cd37a7f01fd52fbe57fb070eda05157","0x636f1671e6c4172f9c689c05bae2b8ffb8a70ef7ec6f4a748c55fcab7020a67","0x1f3a02206ac9ab7abacff1e0cad6ca947da38eae330080bcc4fafb03a78fe4f","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x655612ed312682c39ca8d7c6932f7b57d9a554dbfb91e3a86fab3e45729629c","0x70bd52099caaaeab7dadcb48f561c03dae199ac156bed1912e31848b3ac1337","0x0","0x6134a98a48cfcd6424d6117f3032bcf6303419b842277b27532c8cbb81d8028","0x27f748c11bec2af17e3ab6e6b952350feb677a4ba3639c7e5721f889d26348b","0x3c1ebc146bef30f29b9425cf50a625063c8cc041ef221e48eb363b55bd0b132","0x0","0x4fd23341278b34b81c9f0cf292fa9905ed4884c80ed7efc3d68461bb4ec9bab","0x4b2e37b83da74641933818e3e0626dbc2fc2a51ff9059f6d4b849f4dbc54fea","0x5b748e96d70ca25a7e63a2b80de8f5b648e143f536591ffd7b58f77c8918981","0x1","0x3","0x3e5982050a85f026eb6b70f54a78896caa97c781fd71da0b23a7674ba9a22a4","0x67ae72c915d68669a8a50989c59bd57974049617b1eccfbf3b8b4dd3e002f7a","0x2702181abd7965d14c4b233e1846548ea30480aadd664e5516468d5851d4e21"],"nonce":"0x2f98"}}}],"receipts":[{"Invoke":{"transaction_hash":"0x5faaa73c8f48d4b46fe68e72990495190c6128cc9919d1ca2119b68dc0d0071","actual_fee":{"amount":"0x4badf27c100","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410"],"data":["0xf4240","0x0"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x4ff9c92b4b06fc7d4923606d69abafc9051b0e41b0d7954692bd38be4b99e7"],"data":["0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0xf4240","0x109a40007","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x2a992f38709bbb47a4d6775ba0863c3fb72e0f309972ace179ebaefb2fc60b3"],"data":["0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0xf4240","0x109a40007","0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x436f6e74726f6c"],"data":["0x1","0x109a40007","0x1","0x2109"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x5072697661746553616c65"],"data":["0x1","0x109a40007","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x139f3e273ffde9597a38ee22f0fedc5c0b921eab036cf16cce18d63529045fb"],"data":["0x7","0x109a4","0xf4240","0x1","0x12d8","0x1","0x2109","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x5d360005","0x2","0x13","0x1","0x8abc060d0","0x3c0a8bb6e9","0x2540be400","0x52b391e00","0x4","0x2","0xfb5c4a","0x7","0x131e85e","0x42","0xafb5f","0xa9","0x19b","0x1","0x8","0x989680"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x4465706f736974"],"data":["0x1","0x109a40007","0x3","0x8","0x535a4d","0x70f0d","0x66da77f6","0x14ffffe38","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x457874726163746f72"],"data":["0x2","0x27680005","0x1","0x1","0x1","0x8","0x4c4b40","0x5","0x5d36","0x2","0x66ef23a4"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x43726577","0x1"],"data":["0x1","0x21090001","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x2","0x8043","0x80c8","0x66e294eb","0x66e90670","0x2","0x5","0x2768","0xb0ca2","0x759","0x2"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x2032457432fdc3444a9d87d36c03b163de510f154164b8a6e17d305b2513e5a"],"data":["0x7","0x109a4","0x8","0x4c4b40","0x5","0x2768","0x1","0x5","0x5d36","0x2","0x66ef23a4","0x1","0x2109","0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410"]},{"from_address":"0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x5faaa73c8f48d4b46fe68e72990495190c6128cc9919d1ca2119b68dc0d0071"],"data":["0x3","0x1","0x1","0x1","0x0","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x4790afdc300d7ac15843a5733b80aa4152f48f5632a84e4978e88114a838410","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x4badf27c100","0x0"]}],"execution_resources":{"steps":144518,"memory_holes":0,"range_check_builtin_applications":6081,"pedersen_builtin_applications":78,"poseidon_builtin_applications":209,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":768},"total_gas_consumed":{"l1_gas":384,"l1_data_gas":768}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0xe6aa07de9be23d93f7eb09435d9536c4f0aedda66b2540c710bb73f7eed47c","actual_fee":{"amount":"0x14b1904df74","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x4dc80005","0x2","0xa","0x1","0x1168813c0","0x111d4c92c","0xeafebac40","0xe42e205b8","0x2","0x19","0x55914","0x18","0x41f4c4","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x50726f636573736f72","0x1"],"data":["0x2","0x42cf0005","0x1","0x1","0x0","0x0","0x0","0x0","0x0","0x140000000","0x0","0x0","0x0","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x17d3031632aeed96ab9d68226d6439ef5fdc0bb7f8086a7cc6a54207da53e4"],"data":["0x5","0x42cf","0x1","0x1","0x18b5","0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e"]},{"from_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0xe6aa07de9be23d93f7eb09435d9536c4f0aedda66b2540c710bb73f7eed47c"],"data":["0x1","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x14b1904df74","0x0"]}],"execution_resources":{"steps":37061,"memory_holes":0,"range_check_builtin_applications":1652,"pedersen_builtin_applications":27,"poseidon_builtin_applications":76,"ec_op_builtin_applications":12,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":384},"total_gas_consumed":{"l1_gas":105,"l1_data_gas":384}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x26924aaee01daced06075d606b1f80f18d2eabb137f15c2dd75be384d7e38fd","actual_fee":{"amount":"0x4f9f01c7c50","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x4ed10005","0x2","0xa","0x1","0x4bde23a08","0x413edc112","0x147c005b0","0x191ddd168","0xa","0x1f","0x108ec2","0x6","0x1","0xd","0x6","0x3a","0xf4232","0x1a","0x2bf44","0x7","0xbd7330","0x70","0x3f5d","0x1e","0x389f6","0x13","0x270f","0x14","0x52cd44","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x4ed10005","0x2","0xa","0x1","0x4bde23a08","0x413edc112","0x1876868b0","0x19ae4cac8","0xa","0x1f","0x108ec2","0x6","0x1","0xd","0x6","0x3a","0xf4232","0x1a","0x2bf44","0x7","0xbd7330","0x70","0x3f5d","0x1e","0x389f6","0x13","0x270f","0x14","0x52cd44","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x50726f636573736f72","0x1"],"data":["0x2","0x44210005","0x1","0x1","0x1","0x1c","0x1d","0xea6000000000","0x0","0x140000000","0x0","0x5","0x4ed1","0x2","0x66e8a33e"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x43726577","0x1"],"data":["0x1","0x19bc0001","0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","0x5","0x83ee","0x83ef","0x83f0","0x83f1","0x83f2","0x66e61ed6","0x66e82642","0x3","0x5","0x4421","0xb0ca2","0x99","0x2"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x3065adaec3635cf39a14af3ca256db24878ed04ac9a67e4da02df245920e5e3"],"data":["0x5","0x4421","0x1","0x1c","0x1","0x14","0x124f80","0x5","0x4ed1","0x2","0x3","0x1d","0xdbba0","0x1e","0xa410","0x1f","0x1ec30","0x5","0x4ed1","0x2","0x66e8a33e","0x1","0x19bc","0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8"]},{"from_address":"0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x26924aaee01daced06075d606b1f80f18d2eabb137f15c2dd75be384d7e38fd"],"data":["0x1","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x51115972b585a12f6e4a0e66bb543e2bf7420a1d13bcefe5f0158b0ca4866d8","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x4f9f01c7c50","0x0"]}],"execution_resources":{"steps":153153,"memory_holes":0,"range_check_builtin_applications":6357,"pedersen_builtin_applications":52,"poseidon_builtin_applications":187,"ec_op_builtin_applications":6,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":448},"total_gas_consumed":{"l1_gas":404,"l1_data_gas":448}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5b8086d35dd0d6ada93c160d4cbeb075432801eb72cd055a31ac654f5c4b4a7","actual_fee":{"amount":"0xe93415c81e1572","unit":"Fri"},"messages_sent":[],"events":[{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411"],"data":["0x155c47d5543f67ded9","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411"],"data":["0x0","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411"],"data":["0x155496d307eb06eeae","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x624ef3ac9a411845bcc671de3155f9c27c29a2539be56d17acff46d0747877","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x66e80dc6"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x2d869564c7a090f9b3cd65b3da756ce0477042ddacf02cf39dd19ca4c223e5f","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0xde5b7c234e442e5","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x3fe378208b9b410fecd7e94ee45037c8715f0f12c7a8455bde0f35277b83d65","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0xe10d2cd635c94d5","0x0"]},{"from_address":"0x26c5994c2462770bbf940552c5824fb0e0920e2a8a5ce1180042da1b3e489db","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x0","0x25a55e8860426582eefb8a54615ce79177f220a41362a202175cce6eaa30f49"],"data":["0x8a5d06f9c57e640f","0x0"]},{"from_address":"0x26c5994c2462770bbf940552c5824fb0e0920e2a8a5ce1180042da1b3e489db","keys":["0x34e55c1cd55f1338241b50d352f0e91c7e4ffad0e4271d64eb347589ebdfd16"],"data":["0x25a55e8860426582eefb8a54615ce79177f220a41362a202175cce6eaa30f49","0x8a8eeb485732e485","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x0"],"data":["0x155496d307eb06eeae","0x0"]},{"from_address":"0x7c2e1e733f28daa23e78be3a4f6c724c0ab06af65f6a95b5e0545215f1abc1b","keys":["0x243e1de00e8a6bc1dfa3e950e6ade24c52e4a25de4dee7fb5affe918ad1e744"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x3f1547f5c752a56ed475433772ec93cab0ef5ff7786632287d7381d30d305ae","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x1438f316729356","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x49d3e14a9a5551aa9aa4e7ce97f74cc7357d95f68db2d55fc291f2e07af82d","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x77ded4e9f3350f","0x0"]},{"from_address":"0x59a943ca214c10234b9a3b61c558ac20c005127d183b86a99a8f3c60a08b4ff","keys":["0x33db1d611576200c90997bde1f948502469d333e65e87045c250e6efd2e42c7","0x1258eae3eae5002125bebf062d611a772e8aea3a1879b64a19f363ebd00947"],"data":["0x1438f316729356","0x0","0x77ded4e9f3350f","0x0","0xde5b7c234e442e5","0x0","0xe10d2cd635c94d5","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x0","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x3b2f41fffb81ed93c1dc307221dfaf372b823394dc937b4d0ee2671fae47411","0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x0","0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb"],"data":["0x155c47d5543f67ded9","0x0"]},{"from_address":"0x40f5a6b7a6d3c472c12ca31ae6250b462c6d35bbdae17bd52f6c6ca065e30cf","keys":["0x34e55c1cd55f1338241b50d352f0e91c7e4ffad0e4271d64eb347589ebdfd16"],"data":["0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x155c47d5543f67ded9","0x0"]},{"from_address":"0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x5b8086d35dd0d6ada93c160d4cbeb075432801eb72cd055a31ac654f5c4b4a7"],"data":["0x2","0x1","0x1","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x1edb78400674b9803e12c9058f2beb68c42d2fd115a5d9ab2852314d5214cb","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0xe93415c81e1572","0x0"]}],"execution_resources":{"steps":311463,"memory_holes":0,"range_check_builtin_applications":9359,"pedersen_builtin_applications":429,"poseidon_builtin_applications":20,"ec_op_builtin_applications":6,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":12,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":1216},"total_gas_consumed":{"l1_gas":802,"l1_data_gas":1216}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x2cece4382a49a8e195595ecce3724e8b98355298f24b30e61d0aae3c1951843","actual_fee":{"amount":"0x240e6fe58e1adc","unit":"Fri"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x60370005","0x1","0x2","0x1","0x21889840","0x3854c6c0","0x0","0x0","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x44656c6976657279"],"data":["0x1","0x2b3380009","0x2","0x5","0x40ac","0x1","0x5","0x6037","0x1","0x66e80d9d","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x2dc24e3b0e2d3292a9686c8468d7b0a1456f1825b9cf7fc6e1d228d81de7e81"],"data":["0x5","0x40ac","0x1","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x5","0x6037","0x1","0x9","0x2b338","0x1","0x1b6c","0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x64f007708f1cd84c9cb57b296c67897ade2572c8613ccc7fea8afa55ea5b12","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x240e6fe58e1adc","0x0"]}],"execution_resources":{"steps":45301,"memory_holes":0,"range_check_builtin_applications":2110,"pedersen_builtin_applications":25,"poseidon_builtin_applications":61,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":384},"total_gas_consumed":{"l1_gas":124,"l1_data_gas":384}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x607a57157815daf6ff7f75d657503c6b2177b484435353bed99ca152a2a2661","actual_fee":{"amount":"0x4ea2bdf4eec","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f"],"data":["0x2ea6442f","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x43726577","0x1"],"data":["0x1","0xdba0001","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","0x5","0x71c","0x6a9f","0x6aa0","0x6aa1","0x728","0x66dea3f5","0x66e809eb","0x0","0x0","0x0","0x0","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x250f0005","0x2","0xa","0x1","0x78f67d630","0x6b3ecb899","0x35297b580","0x3a944d674","0x48","0x1e","0x5005","0x9","0xc99ea","0xe","0x11d085","0x2b","0x3d86","0x2d","0x62ae2","0x2e","0x68c21","0x51","0x9c37","0x30","0x412e4","0x31","0x16df1","0x6","0x37775","0x70","0xb2f","0x4e","0x1be5a","0x3a","0x406518","0x13","0x2ecb4","0xd","0x27e6d8","0x3","0xfb005","0x18","0x3c41d6","0x7b","0x640","0x1d","0x123e7","0x1f","0x14f55","0x1a","0xca85e","0x4c","0x17b5a","0x10","0xf4240","0x4a","0xb1","0x20","0x71868","0x11","0x186a0","0x50","0x58b12","0x59","0x31b3e","0xb","0x673e8","0x17","0x762e","0xbf","0x1d46","0x12","0x24585","0x14","0x186a0","0x22","0x51467a","0xc","0x179949","0x15","0x186a0","0x25","0x30d40","0x2","0x91d","0x83","0x4d58","0x84","0x14ee","0xa","0x1632ed","0xd9","0x1f43","0x7","0x4fb3f","0x6f","0xf5d","0x5","0x2170d","0x41","0x5","0xbe","0x1e48b","0x58","0x8b50","0x8d","0x2314","0x5f","0x1430c","0x37","0x21475","0x1","0x2faf08","0x87","0x2","0x66","0x40ef","0xc2","0xd","0x4f","0x2ba8","0x4d","0x86a2","0x3f","0x9559","0x57","0xff51","0x56","0x1d90","0x6a","0x280e","0x3e","0x133","0x3d","0x1","0x63","0x12c0","0x43","0x10cb","0x33","0x1d7f","0x64","0x1321","0xb2","0xc25","0x23","0x8a86","0xb6","0x61a8","0x54","0x3ab4","0x61","0x3e8","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x50726f636573736f72","0x1"],"data":["0x2","0x21190005","0x1","0x1","0x0","0x0","0x0","0x0","0x0","0x100000000","0x0","0x0","0x0","0x0","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x17d3031632aeed96ab9d68226d6439ef5fdc0bb7f8086a7cc6a54207da53e4"],"data":["0x5","0x2119","0x1","0x1","0xdba","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937"]},{"from_address":"0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x672f0ab646088984d1fd10e077d1532e683808fc310b9051cd2e451f3266c63"],"data":["0x3","0x1","0x1","0x1","0x0","0x1","0x0"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x455f986e8eef5fbfbdf7c8246a38eae29d0bbd9af7e657bb268fb8a801d9ab3"],"data":["0x10040b49","0x0"]},{"from_address":"0x4878d1148318a31829523ee9c6a5ee563af6cd87f90a30809e5b0d27db8a9b","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9","0x127021a1b5a52d3174c2ab077c2b043c80369250d29428cee956d76ee51584f","0x57ee37291d82ca6ce49c99f7918d210a5c4332b3aae8416c18a016e988f6937"],"data":["0x1ea238e6","0x0"]},{"from_address":"0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x607a57157815daf6ff7f75d657503c6b2177b484435353bed99ca152a2a2661"],"data":["0x1","0x1","0x1"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x40c94eed22c9a80383136565cb19cb8c05e6397c47a83a3f4bbea6b1c129f7f","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x4ea2bdf4eec","0x0"]}],"execution_resources":{"steps":142452,"memory_holes":0,"range_check_builtin_applications":6868,"pedersen_builtin_applications":122,"poseidon_builtin_applications":126,"ec_op_builtin_applications":15,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":896},"total_gas_consumed":{"l1_gas":399,"l1_data_gas":896}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x4d3d49bbb6416157a2676a6c9ee513ef3598b2ed20ec58e363d7bc3ed114700","actual_fee":{"amount":"0x22afb9ce4c0","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x8bcd8ac10339f80","0x0"]},{"from_address":"0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","keys":["0x157717768aca88da4ac4279765f09f4d0151823d573537fbbeb950cdbd9a870"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","0x68db8bac710cb4000000000000000","0xc8","0x0","0x8bcd8ac10339f80","0x0","0x0","0x1000003f7f1380b75","0x0","0x0","0x8bcd8ac10339f80","0x0","0x5670ebf6","0x1","0x32537ed5619b64e055aa0fb14dca5","0x0","0x12f7ad0","0x1","0x91a5b6bba6a9f74"]},{"from_address":"0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5670ebf6","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x8bcd8ac10339f80","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x134692b230b9e1ffa39098904722134159652b09c5bc41d88d6698779d228ff"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x0","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x5dd3d2f4429af886cd1a3b08289dbcea99a294197e9eb43b0e0325b4b","0x8bcd8ac10339f80","0x0"]},{"from_address":"0x53c91253bc9682c04929ca02ed00b3e423f6710d2ee7e0d5ebb06f3ecf368a8","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x4505a9f06f2bd639b6601f37a4dc0908bb70e8e0e0c34b1220827d64f4fc066","0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","0x5670ebf6","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x60f99d48dec1575154e00390e8a73a2159ffa8fefa815ceb84465ffe017971f","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x22afb9ce4c0","0x0"]}],"execution_resources":{"steps":65669,"memory_holes":0,"range_check_builtin_applications":3997,"pedersen_builtin_applications":111,"poseidon_builtin_applications":13,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":58,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":768},"total_gas_consumed":{"l1_gas":176,"l1_data_gas":768}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x5720e1d812d11bfff0bba5bfbe57d42aef3faadcd7308ba76c9cf7c92c1ea80","actual_fee":{"amount":"0x153a0c32996111","unit":"Fri"},"messages_sent":[],"events":[{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x20f7194ef6135ed07","0x0"]},{"from_address":"0x314341cc731260254db9efd6a309cd31af03cde435869d6ad7ad9d5b3552866","keys":["0x35cc0235f835cc84da50813dc84eb10a75e24a21d74d6d86278c0f037cb7429"],"data":["0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x20f7194ef6135ed07"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x2040e007f6656655b","0x0"]},{"from_address":"0x51d1820021439813ed35e7ff9e05fae5559f5997ddb4f64381533bf772ad5a1","keys":["0x35cc0235f835cc84da50813dc84eb10a75e24a21d74d6d86278c0f037cb7429"],"data":["0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x2040e007f6656655b"]},{"from_address":"0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x5720e1d812d11bfff0bba5bfbe57d42aef3faadcd7308ba76c9cf7c92c1ea80"],"data":["0x2","0x0","0x0"]},{"from_address":"0x4718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0xcfa99acbcd2ed017c72019758f77639c58e42736b4d464066f12b75bbe179d","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x153a0c32996111","0x0"]}],"execution_resources":{"steps":25284,"memory_holes":0,"range_check_builtin_applications":978,"pedersen_builtin_applications":113,"poseidon_builtin_applications":11,"ec_op_builtin_applications":3,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":512},"total_gas_consumed":{"l1_gas":73,"l1_data_gas":512}},"execution_result":"Succeeded"}},{"Invoke":{"transaction_hash":"0x1a63a9c9f06c3314407347ce18c55be4bd45c5ef7d9a683abe5e11666f7e696","actual_fee":{"amount":"0x18d51390bd8","unit":"Wei"},"messages_sent":[],"events":[{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x496e76656e746f7279"],"data":["0x2","0x5fd70005","0x1","0x2","0x1","0x21889840","0x3854c6c0","0x0","0x0","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x0"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x297be67eb977068ccd2304c6440368d4a6114929aeb860c98b6a7e91f96e2ef","0x44656c6976657279"],"data":["0x1","0x2aedd0009","0x2","0x5","0x41ef","0x2","0x5","0x5fd7","0x1","0x66e6ff32","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6"]},{"from_address":"0x422d33a3638dcc4c62e72e1d6942cd31eb643ef596ccac2351e0e21f6cd4bf4","keys":["0x2dc24e3b0e2d3292a9686c8468d7b0a1456f1825b9cf7fc6e1d228d81de7e81"],"data":["0x5","0x41ef","0x2","0x5","0x2c","0x3d090","0x45","0x493e0","0x7d","0xbb8","0xed","0x1","0xf3","0x6","0x5","0x5fd7","0x1","0x9","0x2aedd","0x1","0x18b5","0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e"]},{"from_address":"0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","keys":["0x1dcde06aabdbca2f80aa51392b345d7549d7757aa855f7e37f5d335ac8243b1","0x1a63a9c9f06c3314407347ce18c55be4bd45c5ef7d9a683abe5e11666f7e696"],"data":["0x1","0x1","0x0"]},{"from_address":"0x49d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7","keys":["0x99cd8bde557814842a3121e8ddfd433a539b8c9f14bf31ebf108d12e6196e9"],"data":["0x41b0978486922bdfc7eeca616f4859e302875392b7bdf3c2a5cdafba685213e","0x1176a1bd84444c89232ec27754698e5d2e7e1a7f1539f12027f28b23ec9f3d8","0x18d51390bd8","0x0"]}],"execution_resources":{"steps":44637,"memory_holes":0,"range_check_builtin_applications":2101,"pedersen_builtin_applications":26,"poseidon_builtin_applications":76,"ec_op_builtin_applications":12,"ecdsa_builtin_applications":0,"bitwise_builtin_applications":0,"keccak_builtin_applications":0,"segment_arena_builtin":0,"data_availability":{"l1_gas":0,"l1_data_gas":384},"total_gas_consumed":{"l1_gas":126,"l1_data_gas":384}},"execution_result":"Succeeded"}}],"declared_classes":[],"commitments":{"transaction_count":null,"transaction_commitment":null,"event_count":null,"event_commitment":null,"state_diff_length":null,"state_diff_commitment":null,"receipt_commitment":null,"global_state_root":"0x13805939c3d081d65a886f22b4a785e9a7731b4f8be3e81d478a3c6915ecc58","block_hash":"0x63221327badb10e5473ebb62a995db68413012684fee01964deb68f5912445b"}} \ No newline at end of file diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 6c9f7c53a..3821b5181 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -38,14 +38,12 @@ mp-utils = { workspace = true } # Starknet blockifier.workspace = true -starknet-providers.workspace = true starknet_api.workspace = true # Other alloy.workspace = true anyhow.workspace = true async-trait.workspace = true -chrono = "0.4.38" clap = { workspace = true, features = ["derive", "env"] } fdlimit.workspace = true futures = { workspace = true, features = ["thread-pool"] } diff --git a/crates/primitives/block/Cargo.toml b/crates/primitives/block/Cargo.toml index c56032f7e..df04f3807 100644 --- a/crates/primitives/block/Cargo.toml +++ b/crates/primitives/block/Cargo.toml @@ -23,7 +23,6 @@ mp-transactions = { workspace = true } # Starknet blockifier = { workspace = true } -starknet-core = { workspace = true } starknet-types-core = { workspace = true } starknet-types-rpc = { workspace = true } diff --git a/crates/primitives/block/src/header.rs b/crates/primitives/block/src/header.rs index 5207d56ce..7de360e39 100644 --- a/crates/primitives/block/src/header.rs +++ b/crates/primitives/block/src/header.rs @@ -18,13 +18,13 @@ pub enum BlockStatus { Rejected, } -impl From for starknet_core::types::BlockStatus { +impl From for starknet_types_rpc::BlockStatus { fn from(status: BlockStatus) -> Self { match status { - BlockStatus::Pending => starknet_core::types::BlockStatus::Pending, - BlockStatus::AcceptedOnL2 => starknet_core::types::BlockStatus::AcceptedOnL2, - BlockStatus::AcceptedOnL1 => starknet_core::types::BlockStatus::AcceptedOnL1, - BlockStatus::Rejected => starknet_core::types::BlockStatus::Rejected, + BlockStatus::Pending => starknet_types_rpc::BlockStatus::Pending, + BlockStatus::AcceptedOnL2 => starknet_types_rpc::BlockStatus::AcceptedOnL2, + BlockStatus::AcceptedOnL1 => starknet_types_rpc::BlockStatus::AcceptedOnL1, + BlockStatus::Rejected => starknet_types_rpc::BlockStatus::Rejected, } } } @@ -102,14 +102,15 @@ impl From<&GasPrices> for blockifier::blockifier::block::GasPrices { } impl GasPrices { - pub fn l1_gas_price(&self) -> starknet_core::types::ResourcePrice { - starknet_core::types::ResourcePrice { + pub fn l1_gas_price(&self) -> starknet_types_rpc::ResourcePrice { + starknet_types_rpc::ResourcePrice { price_in_fri: self.strk_l1_gas_price.into(), price_in_wei: self.eth_l1_gas_price.into(), } } - pub fn l1_data_gas_price(&self) -> starknet_core::types::ResourcePrice { - starknet_core::types::ResourcePrice { + + pub fn l1_data_gas_price(&self) -> starknet_types_rpc::ResourcePrice { + starknet_types_rpc::ResourcePrice { price_in_fri: self.strk_l1_data_gas_price.into(), price_in_wei: self.eth_l1_data_gas_price.into(), } @@ -126,7 +127,7 @@ pub enum L1DataAvailabilityMode { Blob, } -impl From for starknet_core::types::L1DataAvailabilityMode { +impl From for starknet_types_rpc::L1DaMode { fn from(value: L1DataAvailabilityMode) -> Self { match value { L1DataAvailabilityMode::Calldata => Self::Calldata, @@ -134,14 +135,6 @@ impl From for starknet_core::types::L1DataAvailabilityMo } } } -impl From for L1DataAvailabilityMode { - fn from(value: starknet_core::types::L1DataAvailabilityMode) -> Self { - match value { - starknet_core::types::L1DataAvailabilityMode::Calldata => Self::Calldata, - starknet_core::types::L1DataAvailabilityMode::Blob => Self::Blob, - } - } -} #[derive(thiserror::Error, Debug)] pub enum BlockFormatError { diff --git a/crates/primitives/block/src/lib.rs b/crates/primitives/block/src/lib.rs index 4cca7ef65..60dc23ea1 100644 --- a/crates/primitives/block/src/lib.rs +++ b/crates/primitives/block/src/lib.rs @@ -125,7 +125,11 @@ impl From for starknet_types_rpc::BlockHeader { new_root, parent_hash, sequencer_address, - starknet_version: protocol_version.to_string(), + starknet_version: if protocol_version < StarknetVersion::V0_9_1 { + "".to_string() + } else { + protocol_version.to_string() + }, timestamp, } } diff --git a/crates/primitives/class/Cargo.toml b/crates/primitives/class/Cargo.toml index d7f2da062..858d365da 100644 --- a/crates/primitives/class/Cargo.toml +++ b/crates/primitives/class/Cargo.toml @@ -32,8 +32,10 @@ casm-utils-v1_1_1 = { package = "cairo-lang-utils", version = "=1.1.1" } casm-utils-v2 = { package = "cairo-lang-utils", version = "=2.8.4" } starknet-core = { workspace = true } starknet-types-core = { workspace = true } +starknet-types-rpc = { workspace = true } # Other +base64 = { workspace = true } flate2 = { workspace = true } lazy_static = { workspace = true } num-bigint = { workspace = true } diff --git a/crates/primitives/class/src/class_hash.rs b/crates/primitives/class/src/class_hash.rs index c46839a4d..2d1c52ee8 100644 --- a/crates/primitives/class/src/class_hash.rs +++ b/crates/primitives/class/src/class_hash.rs @@ -54,11 +54,11 @@ impl FlattenedSierraClass { } fn compute_hash_entries_point(entry_points: &[SierraEntryPoint]) -> Felt { - let entry_pointfalten: Vec<_> = entry_points + let entry_point_flatten: Vec<_> = entry_points .iter() .flat_map(|SierraEntryPoint { selector, function_idx }| [*selector, Felt::from(*function_idx)].into_iter()) .collect(); - Poseidon::hash_array(&entry_pointfalten) + Poseidon::hash_array(&entry_point_flatten) } impl CompressedLegacyContractClass { diff --git a/crates/primitives/class/src/into_starknet_core.rs b/crates/primitives/class/src/into_starknet_core.rs index 59f54e36a..5a3136ef7 100644 --- a/crates/primitives/class/src/into_starknet_core.rs +++ b/crates/primitives/class/src/into_starknet_core.rs @@ -422,7 +422,7 @@ mod tests { #[test] fn test_legacy_contract_class_conversion() { let legacy_contract_class = CompressedLegacyContractClass { - program: vec![1, 2, 3], + program: "program".as_bytes().to_vec(), entry_points_by_type: LegacyEntryPointsByType { constructor: vec![LegacyContractEntryPoint { offset: 0, selector: Felt::from(1) }], external: vec![LegacyContractEntryPoint { offset: 1, selector: Felt::from(2) }], diff --git a/crates/primitives/class/src/into_starknet_types.rs b/crates/primitives/class/src/into_starknet_types.rs new file mode 100644 index 000000000..86b897be2 --- /dev/null +++ b/crates/primitives/class/src/into_starknet_types.rs @@ -0,0 +1,495 @@ +use std::sync::Arc; + +use starknet_types_core::felt::Felt; + +use crate::{ + CompressedLegacyContractClass, ContractClass, EntryPointsByType, FlattenedSierraClass, FunctionStateMutability, + LegacyContractAbiEntry, LegacyContractEntryPoint, LegacyEntryPointsByType, LegacyEventAbiEntry, LegacyEventAbiType, + LegacyFunctionAbiEntry, LegacyFunctionAbiType, LegacyStructAbiEntry, LegacyStructAbiType, LegacyStructMember, + LegacyTypedParameter, SierraEntryPoint, +}; + +impl TryFrom> for ContractClass { + type Error = base64::DecodeError; + + fn try_from(contract_class: starknet_types_rpc::MaybeDeprecatedContractClass) -> Result { + match contract_class { + starknet_types_rpc::MaybeDeprecatedContractClass::ContractClass(flattened_sierra_class) => { + Ok(ContractClass::Sierra(Arc::new(flattened_sierra_class.into()))) + } + starknet_types_rpc::MaybeDeprecatedContractClass::Deprecated(compressed_legacy_contract_class) => { + Ok(ContractClass::Legacy(Arc::new(compressed_legacy_contract_class.try_into()?))) + } + } + } +} + +impl From for starknet_types_rpc::MaybeDeprecatedContractClass { + fn from(contract_class: ContractClass) -> Self { + match contract_class { + ContractClass::Sierra(flattened_sierra_class) => { + starknet_types_rpc::MaybeDeprecatedContractClass::ContractClass( + (*flattened_sierra_class).clone().into(), + ) + } + ContractClass::Legacy(compressed_legacy_contract_class) => { + starknet_types_rpc::MaybeDeprecatedContractClass::Deprecated( + (*compressed_legacy_contract_class).clone().into(), + ) + } + } + } +} + +impl From> for FlattenedSierraClass { + fn from(flattened_sierra_class: starknet_types_rpc::ContractClass) -> Self { + FlattenedSierraClass { + sierra_program: flattened_sierra_class.sierra_program, + contract_class_version: flattened_sierra_class.contract_class_version, + entry_points_by_type: flattened_sierra_class.entry_points_by_type.into(), + abi: flattened_sierra_class.abi.unwrap_or("".to_string()), + } + } +} + +impl From for starknet_types_rpc::ContractClass { + fn from(flattened_sierra_class: FlattenedSierraClass) -> Self { + starknet_types_rpc::ContractClass { + sierra_program: flattened_sierra_class.sierra_program, + contract_class_version: flattened_sierra_class.contract_class_version, + entry_points_by_type: flattened_sierra_class.entry_points_by_type.into(), + abi: Some(flattened_sierra_class.abi), + } + } +} + +impl From> for EntryPointsByType { + fn from(entry_points_by_type: starknet_types_rpc::EntryPointsByType) -> Self { + EntryPointsByType { + constructor: entry_points_by_type + .constructor + .into_iter() + .map(|sierra_entry_point| sierra_entry_point.into()) + .collect(), + external: entry_points_by_type + .external + .into_iter() + .map(|sierra_entry_point| sierra_entry_point.into()) + .collect(), + l1_handler: entry_points_by_type + .l1_handler + .into_iter() + .map(|sierra_entry_point| sierra_entry_point.into()) + .collect(), + } + } +} + +impl From for starknet_types_rpc::EntryPointsByType { + fn from(entry_points_by_type: EntryPointsByType) -> Self { + starknet_types_rpc::EntryPointsByType { + constructor: entry_points_by_type + .constructor + .into_iter() + .map(|sierra_entry_point| sierra_entry_point.into()) + .collect(), + external: entry_points_by_type + .external + .into_iter() + .map(|sierra_entry_point| sierra_entry_point.into()) + .collect(), + l1_handler: entry_points_by_type + .l1_handler + .into_iter() + .map(|sierra_entry_point| sierra_entry_point.into()) + .collect(), + } + } +} + +impl From> for SierraEntryPoint { + fn from(sierra_entry_point: starknet_types_rpc::SierraEntryPoint) -> Self { + SierraEntryPoint { selector: sierra_entry_point.selector, function_idx: sierra_entry_point.function_idx } + } +} + +impl From for starknet_types_rpc::SierraEntryPoint { + fn from(sierra_entry_point: SierraEntryPoint) -> Self { + starknet_types_rpc::SierraEntryPoint { + selector: sierra_entry_point.selector, + function_idx: sierra_entry_point.function_idx, + } + } +} + +impl TryFrom> for CompressedLegacyContractClass { + type Error = base64::DecodeError; + + fn try_from( + compressed_legacy_contract_class: starknet_types_rpc::DeprecatedContractClass, + ) -> Result { + use base64::Engine; + + let decoded_program = + base64::engine::general_purpose::STANDARD.decode(&compressed_legacy_contract_class.program)?; + + Ok(CompressedLegacyContractClass { + program: decoded_program, + entry_points_by_type: compressed_legacy_contract_class.entry_points_by_type.into(), + abi: compressed_legacy_contract_class + .abi + .map(|abi| abi.into_iter().map(|legacy_contract_abi_entry| legacy_contract_abi_entry.into()).collect()), + }) + } +} + +impl From for starknet_types_rpc::DeprecatedContractClass { + fn from(compressed_legacy_contract_class: CompressedLegacyContractClass) -> Self { + use base64::Engine; + + let encoded_program = + base64::engine::general_purpose::STANDARD.encode(&compressed_legacy_contract_class.program); + + starknet_types_rpc::DeprecatedContractClass { + program: encoded_program, + entry_points_by_type: compressed_legacy_contract_class.entry_points_by_type.into(), + abi: compressed_legacy_contract_class + .abi + .map(|abi| abi.into_iter().map(|legacy_contract_abi_entry| legacy_contract_abi_entry.into()).collect()), + } + } +} + +impl From> for LegacyEntryPointsByType { + fn from(legacy_entry_points_by_type: starknet_types_rpc::DeprecatedEntryPointsByType) -> Self { + LegacyEntryPointsByType { + constructor: legacy_entry_points_by_type + .constructor + .into_iter() + .map(|legacy_contract_entry_point| legacy_contract_entry_point.into()) + .collect(), + external: legacy_entry_points_by_type + .external + .into_iter() + .map(|legacy_contract_entry_point| legacy_contract_entry_point.into()) + .collect(), + l1_handler: legacy_entry_points_by_type + .l1_handler + .into_iter() + .map(|legacy_contract_entry_point| legacy_contract_entry_point.into()) + .collect(), + } + } +} + +impl From for starknet_types_rpc::DeprecatedEntryPointsByType { + fn from(legacy_entry_points_by_type: LegacyEntryPointsByType) -> Self { + starknet_types_rpc::DeprecatedEntryPointsByType { + constructor: legacy_entry_points_by_type + .constructor + .into_iter() + .map(|legacy_contract_entry_point| legacy_contract_entry_point.into()) + .collect(), + external: legacy_entry_points_by_type + .external + .into_iter() + .map(|legacy_contract_entry_point| legacy_contract_entry_point.into()) + .collect(), + l1_handler: legacy_entry_points_by_type + .l1_handler + .into_iter() + .map(|legacy_contract_entry_point| legacy_contract_entry_point.into()) + .collect(), + } + } +} + +impl From> for LegacyContractEntryPoint { + fn from(legacy_contract_entry_point: starknet_types_rpc::DeprecatedCairoEntryPoint) -> Self { + LegacyContractEntryPoint { + offset: legacy_contract_entry_point.offset, + selector: legacy_contract_entry_point.selector, + } + } +} + +impl From for starknet_types_rpc::DeprecatedCairoEntryPoint { + fn from(legacy_contract_entry_point: LegacyContractEntryPoint) -> Self { + starknet_types_rpc::DeprecatedCairoEntryPoint { + offset: legacy_contract_entry_point.offset, + selector: legacy_contract_entry_point.selector, + } + } +} + +impl From for LegacyContractAbiEntry { + fn from(legacy_contract_abi_entry: starknet_types_rpc::ContractAbiEntry) -> Self { + match legacy_contract_abi_entry { + starknet_types_rpc::ContractAbiEntry::Function(legacy_function_abi_entry) => { + LegacyContractAbiEntry::Function(legacy_function_abi_entry.into()) + } + starknet_types_rpc::ContractAbiEntry::Event(legacy_event_abi_entry) => { + LegacyContractAbiEntry::Event(legacy_event_abi_entry.into()) + } + starknet_types_rpc::ContractAbiEntry::Struct(legacy_struct_abi_entry) => { + LegacyContractAbiEntry::Struct(legacy_struct_abi_entry.into()) + } + } + } +} + +impl From for starknet_types_rpc::ContractAbiEntry { + fn from(legacy_contract_abi_entry: LegacyContractAbiEntry) -> Self { + match legacy_contract_abi_entry { + LegacyContractAbiEntry::Function(legacy_function_abi_entry) => { + starknet_types_rpc::ContractAbiEntry::Function(legacy_function_abi_entry.into()) + } + LegacyContractAbiEntry::Event(legacy_event_abi_entry) => { + starknet_types_rpc::ContractAbiEntry::Event(legacy_event_abi_entry.into()) + } + LegacyContractAbiEntry::Struct(legacy_struct_abi_entry) => { + starknet_types_rpc::ContractAbiEntry::Struct(legacy_struct_abi_entry.into()) + } + } + } +} + +impl From for LegacyFunctionAbiEntry { + fn from(legacy_function_abi_entry: starknet_types_rpc::FunctionAbiEntry) -> Self { + LegacyFunctionAbiEntry { + r#type: legacy_function_abi_entry.ty.into(), + name: legacy_function_abi_entry.name, + inputs: legacy_function_abi_entry.inputs.into_iter().map(|abi_entry| abi_entry.into()).collect(), + outputs: legacy_function_abi_entry.outputs.into_iter().map(|abi_entry| abi_entry.into()).collect(), + state_mutability: legacy_function_abi_entry + .state_mutability + .map(|state_mutability| state_mutability.into()), + } + } +} + +impl From for starknet_types_rpc::FunctionAbiEntry { + fn from(legacy_function_abi_entry: LegacyFunctionAbiEntry) -> Self { + starknet_types_rpc::FunctionAbiEntry { + ty: legacy_function_abi_entry.r#type.into(), + name: legacy_function_abi_entry.name, + inputs: legacy_function_abi_entry.inputs.into_iter().map(|abi_entry| abi_entry.into()).collect(), + outputs: legacy_function_abi_entry.outputs.into_iter().map(|abi_entry| abi_entry.into()).collect(), + state_mutability: legacy_function_abi_entry + .state_mutability + .map(|state_mutability| state_mutability.into()), + } + } +} + +impl From for LegacyEventAbiEntry { + fn from(legacy_event_abi_entry: starknet_types_rpc::EventAbiEntry) -> Self { + LegacyEventAbiEntry { + r#type: legacy_event_abi_entry.ty.into(), + name: legacy_event_abi_entry.name, + keys: legacy_event_abi_entry.keys.into_iter().map(|abi_entry| abi_entry.into()).collect(), + data: legacy_event_abi_entry.data.into_iter().map(|abi_entry| abi_entry.into()).collect(), + } + } +} + +impl From for starknet_types_rpc::EventAbiEntry { + fn from(legacy_event_abi_entry: LegacyEventAbiEntry) -> Self { + starknet_types_rpc::EventAbiEntry { + ty: legacy_event_abi_entry.r#type.into(), + name: legacy_event_abi_entry.name, + keys: legacy_event_abi_entry.keys.into_iter().map(|abi_entry| abi_entry.into()).collect(), + data: legacy_event_abi_entry.data.into_iter().map(|abi_entry| abi_entry.into()).collect(), + } + } +} + +impl From for LegacyStructAbiEntry { + fn from(legacy_struct_abi_entry: starknet_types_rpc::StructAbiEntry) -> Self { + LegacyStructAbiEntry { + r#type: legacy_struct_abi_entry.ty.into(), + name: legacy_struct_abi_entry.name, + size: legacy_struct_abi_entry.size, + members: legacy_struct_abi_entry.members.into_iter().map(|member| member.into()).collect(), + } + } +} + +impl From for starknet_types_rpc::StructAbiEntry { + fn from(legacy_struct_abi_entry: LegacyStructAbiEntry) -> Self { + starknet_types_rpc::StructAbiEntry { + ty: legacy_struct_abi_entry.r#type.into(), + name: legacy_struct_abi_entry.name, + size: legacy_struct_abi_entry.size, + members: legacy_struct_abi_entry.members.into_iter().map(|member| member.into()).collect(), + } + } +} + +impl From for LegacyStructMember { + fn from(legacy_struct_member: starknet_types_rpc::StructMember) -> Self { + LegacyStructMember { + name: legacy_struct_member.typed_parameter.name, + r#type: legacy_struct_member.typed_parameter.ty, + offset: legacy_struct_member.offset, + } + } +} + +impl From for starknet_types_rpc::StructMember { + fn from(legacy_struct_member: LegacyStructMember) -> Self { + starknet_types_rpc::StructMember { + typed_parameter: starknet_types_rpc::TypedParameter { + name: legacy_struct_member.name, + ty: legacy_struct_member.r#type, + }, + offset: legacy_struct_member.offset, + } + } +} + +impl From for LegacyTypedParameter { + fn from(legacy_typed_parameter: starknet_types_rpc::TypedParameter) -> Self { + LegacyTypedParameter { r#type: legacy_typed_parameter.ty, name: legacy_typed_parameter.name } + } +} + +impl From for starknet_types_rpc::TypedParameter { + fn from(legacy_typed_parameter: LegacyTypedParameter) -> Self { + starknet_types_rpc::TypedParameter { ty: legacy_typed_parameter.r#type, name: legacy_typed_parameter.name } + } +} + +impl From for LegacyFunctionAbiType { + fn from(legacy_function_abi_type: starknet_types_rpc::FunctionAbiType) -> Self { + match legacy_function_abi_type { + starknet_types_rpc::FunctionAbiType::Function => LegacyFunctionAbiType::Function, + starknet_types_rpc::FunctionAbiType::L1Handler => LegacyFunctionAbiType::L1Handler, + starknet_types_rpc::FunctionAbiType::Constructor => LegacyFunctionAbiType::Constructor, + } + } +} + +impl From for starknet_types_rpc::FunctionAbiType { + fn from(legacy_function_abi_type: LegacyFunctionAbiType) -> Self { + match legacy_function_abi_type { + LegacyFunctionAbiType::Function => starknet_types_rpc::FunctionAbiType::Function, + LegacyFunctionAbiType::L1Handler => starknet_types_rpc::FunctionAbiType::L1Handler, + LegacyFunctionAbiType::Constructor => starknet_types_rpc::FunctionAbiType::Constructor, + } + } +} + +impl From for LegacyEventAbiType { + fn from(_: starknet_types_rpc::EventAbiType) -> Self { + LegacyEventAbiType::Event + } +} + +impl From for starknet_types_rpc::EventAbiType { + fn from(legacy_event_abi_type: LegacyEventAbiType) -> Self { + match legacy_event_abi_type { + LegacyEventAbiType::Event => "event".to_string(), + } + } +} + +impl From for LegacyStructAbiType { + fn from(_: starknet_types_rpc::StructAbiType) -> Self { + LegacyStructAbiType::Struct + } +} + +impl From for starknet_types_rpc::StructAbiType { + fn from(legacy_struct_abi_type: LegacyStructAbiType) -> Self { + match legacy_struct_abi_type { + LegacyStructAbiType::Struct => "struct".to_string(), + } + } +} + +impl From for FunctionStateMutability { + fn from(_: starknet_types_rpc::FunctionStateMutability) -> Self { + FunctionStateMutability::View + } +} + +impl From for starknet_types_rpc::FunctionStateMutability { + fn from(function_state_mutability: FunctionStateMutability) -> Self { + match function_state_mutability { + FunctionStateMutability::View => "view".to_string(), + } + } +} + +#[cfg(test)] +mod tests { + use crate::{ + CompressedLegacyContractClass, ContractClass, EntryPointsByType, FlattenedSierraClass, FunctionStateMutability, + LegacyContractAbiEntry, LegacyContractEntryPoint, LegacyEntryPointsByType, LegacyEventAbiEntry, + LegacyEventAbiType, LegacyFunctionAbiEntry, LegacyFunctionAbiType, LegacyStructAbiEntry, LegacyStructAbiType, + LegacyStructMember, LegacyTypedParameter, SierraEntryPoint, + }; + use mp_convert::test::assert_consistent_conversion; + use starknet_types_core::felt::Felt; + use starknet_types_rpc::MaybeDeprecatedContractClass as StarknetContractClass; + + #[test] + fn test_legacy_contract_class_conversion() { + let legacy_contract_class = CompressedLegacyContractClass { + program: "program".as_bytes().to_vec(), + entry_points_by_type: LegacyEntryPointsByType { + constructor: vec![LegacyContractEntryPoint { offset: 0, selector: Felt::from(1) }], + external: vec![LegacyContractEntryPoint { offset: 1, selector: Felt::from(2) }], + l1_handler: vec![LegacyContractEntryPoint { offset: 2, selector: Felt::from(3) }], + }, + abi: Some(vec![ + LegacyContractAbiEntry::Function(LegacyFunctionAbiEntry { + r#type: LegacyFunctionAbiType::Function, + name: "function".to_string(), + inputs: vec![LegacyTypedParameter { r#type: "type".to_string(), name: "name".to_string() }], + outputs: vec![LegacyTypedParameter { r#type: "type".to_string(), name: "name".to_string() }], + state_mutability: Some(FunctionStateMutability::View), + }), + LegacyContractAbiEntry::Event(LegacyEventAbiEntry { + r#type: LegacyEventAbiType::Event, + name: "event".to_string(), + keys: vec![LegacyTypedParameter { r#type: "type".to_string(), name: "name".to_string() }], + data: vec![LegacyTypedParameter { r#type: "type".to_string(), name: "name".to_string() }], + }), + LegacyContractAbiEntry::Struct(LegacyStructAbiEntry { + r#type: LegacyStructAbiType::Struct, + name: "struct".to_string(), + size: 1, + members: vec![LegacyStructMember { + name: "name".to_string(), + r#type: "type".to_string(), + offset: 1, + }], + }), + ]), + }; + + let contract_class: ContractClass = legacy_contract_class.clone().into(); + + assert_consistent_conversion::<_, StarknetContractClass>(contract_class); + } + + #[test] + fn test_sierra_contract_class_conversion() { + let sierra_contract_class = FlattenedSierraClass { + sierra_program: vec![Felt::from(1), Felt::from(2), Felt::from(3)], + contract_class_version: "1.2.3".to_string(), + entry_points_by_type: EntryPointsByType { + constructor: vec![SierraEntryPoint { selector: Felt::from(1), function_idx: 1 }], + external: vec![SierraEntryPoint { selector: Felt::from(2), function_idx: 2 }], + l1_handler: vec![SierraEntryPoint { selector: Felt::from(3), function_idx: 3 }], + }, + abi: "abi definition".to_string(), + }; + + let contract_class: ContractClass = sierra_contract_class.into(); + + assert_consistent_conversion::<_, StarknetContractClass>(contract_class); + } +} diff --git a/crates/primitives/class/src/lib.rs b/crates/primitives/class/src/lib.rs index c557ac290..31f84adf3 100644 --- a/crates/primitives/class/src/lib.rs +++ b/crates/primitives/class/src/lib.rs @@ -7,6 +7,7 @@ pub mod class_update; pub mod compile; pub mod convert; mod into_starknet_core; +mod into_starknet_types; #[derive(Clone, Debug, PartialEq, Eq)] pub enum ConvertedClass { diff --git a/crates/primitives/convert/Cargo.toml b/crates/primitives/convert/Cargo.toml index 1fcaebbdb..9aac03e2a 100644 --- a/crates/primitives/convert/Cargo.toml +++ b/crates/primitives/convert/Cargo.toml @@ -29,3 +29,4 @@ thiserror.workspace = true [dev-dependencies] assert_matches.workspace = true +serde_json.workspace = true diff --git a/crates/primitives/convert/src/hex_serde.rs b/crates/primitives/convert/src/hex_serde.rs index 0d08d93b0..7b9257d7a 100644 --- a/crates/primitives/convert/src/hex_serde.rs +++ b/crates/primitives/convert/src/hex_serde.rs @@ -22,6 +22,14 @@ impl<'de> DeserializeAs<'de, u64> for U64AsHex { } } +pub fn hex_str_to_u64(s: &str) -> Result { + u64::from_str_radix(s.trim_start_matches("0x"), 16) +} + +pub fn u64_to_hex_string(n: u64) -> String { + format!("0x{:x}", n) +} + pub struct U128AsHex; impl SerializeAs for U128AsHex { @@ -42,3 +50,34 @@ impl<'de> DeserializeAs<'de, u128> for U128AsHex { u128::from_str_radix(s.trim_start_matches("0x"), 16).map_err(serde::de::Error::custom) } } + +pub fn hex_str_to_u128(s: &str) -> Result { + u128::from_str_radix(s.trim_start_matches("0x"), 16) +} + +pub fn u128_to_hex_string(n: u128) -> String { + format!("0x{:x}", n) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_u64_as_hex() { + let n = 0x1234567890abcdef; + let s = u64_to_hex_string(n); + assert_eq!(s, "0x1234567890abcdef"); + let m = hex_str_to_u64(&s).unwrap(); + assert_eq!(m, n); + } + + #[test] + fn test_u128_as_hex() { + let n = 0x1234567890abcdef1234567890abcdef; + let s = u128_to_hex_string(n); + assert_eq!(s, "0x1234567890abcdef1234567890abcdef"); + let m = hex_str_to_u128(&s).unwrap(); + assert_eq!(m, n); + } +} diff --git a/crates/primitives/gateway/Cargo.toml b/crates/primitives/gateway/Cargo.toml index 035ad97c6..2d1e072b7 100644 --- a/crates/primitives/gateway/Cargo.toml +++ b/crates/primitives/gateway/Cargo.toml @@ -29,13 +29,17 @@ mp-transactions.workspace = true # Starknet starknet-core.workspace = true starknet-types-core.workspace = true +starknet-types-rpc.workspace = true # Other anyhow.workspace = true +base64.workspace = true http.workspace = true hyper.workspace = true +primitive-types.workspace = true serde = { workspace = true, features = ["derive"] } serde_json.workspace = true serde_with.workspace = true +sha3.workspace = true thiserror.workspace = true url.workspace = true diff --git a/crates/primitives/gateway/src/receipt.rs b/crates/primitives/gateway/src/receipt.rs index 2be69acc1..e0f220c1e 100644 --- a/crates/primitives/gateway/src/receipt.rs +++ b/crates/primitives/gateway/src/receipt.rs @@ -1,7 +1,9 @@ use mp_block::H160; use mp_convert::felt_to_h160; use mp_receipt::{Event, L1Gas, MsgToL1}; +use primitive_types::H256; use serde::{Deserialize, Serialize}; +use sha3::{Digest, Keccak256}; use starknet_types_core::felt::Felt; use crate::transaction::{ @@ -87,7 +89,7 @@ impl ConfirmedReceipt { let message_hash = message_to_l2.hash(); mp_receipt::L1HandlerTransactionReceipt { - message_hash: message_hash.try_into().unwrap_or_default(), + message_hash: H256::from_slice(message_hash.as_bytes()), transaction_hash: self.transaction_hash, actual_fee: fee_payment(self.actual_fee, tx.version()), messages_sent: self.l2_to_l1_messages, @@ -170,19 +172,19 @@ impl From for ExecutionResources { Self { builtin_instance_counter: BuiltinCounters { output_builtin: 0, - pedersen_builtin: resources.pedersen_builtin_applications.unwrap_or(0), - range_check_builtin: resources.range_check_builtin_applications.unwrap_or(0), - ecdsa_builtin: resources.ecdsa_builtin_applications.unwrap_or(0), - bitwise_builtin: resources.bitwise_builtin_applications.unwrap_or(0), - ec_op_builtin: resources.ec_op_builtin_applications.unwrap_or(0), - keccak_builtin: resources.keccak_builtin_applications.unwrap_or(0), - poseidon_builtin: resources.poseidon_builtin_applications.unwrap_or(0), - segment_arena_builtin: resources.segment_arena_builtin.unwrap_or(0), + pedersen_builtin: resources.pedersen_builtin_applications, + range_check_builtin: resources.range_check_builtin_applications, + ecdsa_builtin: resources.ecdsa_builtin_applications, + bitwise_builtin: resources.bitwise_builtin_applications, + ec_op_builtin: resources.ec_op_builtin_applications, + keccak_builtin: resources.keccak_builtin_applications, + poseidon_builtin: resources.poseidon_builtin_applications, + segment_arena_builtin: resources.segment_arena_builtin, add_mod_builtin: 0, mul_mod_builtin: 0, }, n_steps: resources.steps, - n_memory_holes: resources.memory_holes.unwrap_or(0), + n_memory_holes: resources.memory_holes, data_availability: none_if_zero(resources.data_availability), total_gas_consumed: none_if_zero(resources.total_gas_consumed), } @@ -191,14 +193,6 @@ impl From for ExecutionResources { impl From for mp_receipt::ExecutionResources { fn from(resources: ExecutionResources) -> Self { - fn none_if_zero(n: u64) -> Option { - if n == 0 { - None - } else { - Some(n) - } - } - let BuiltinCounters { output_builtin: _, pedersen_builtin, @@ -215,15 +209,15 @@ impl From for mp_receipt::ExecutionResources { Self { steps: resources.n_steps, - memory_holes: none_if_zero(resources.n_memory_holes), - range_check_builtin_applications: none_if_zero(range_check_builtin), - pedersen_builtin_applications: none_if_zero(pedersen_builtin), - poseidon_builtin_applications: none_if_zero(poseidon_builtin), - ec_op_builtin_applications: none_if_zero(ec_op_builtin), - ecdsa_builtin_applications: none_if_zero(ecdsa_builtin), - bitwise_builtin_applications: none_if_zero(bitwise_builtin), - keccak_builtin_applications: none_if_zero(keccak_builtin), - segment_arena_builtin: none_if_zero(segment_arena_builtin), + memory_holes: resources.n_memory_holes, + range_check_builtin_applications: range_check_builtin, + pedersen_builtin_applications: pedersen_builtin, + poseidon_builtin_applications: poseidon_builtin, + ec_op_builtin_applications: ec_op_builtin, + ecdsa_builtin_applications: ecdsa_builtin, + bitwise_builtin_applications: bitwise_builtin, + keccak_builtin_applications: keccak_builtin, + segment_arena_builtin, data_availability: resources.data_availability.unwrap_or_default(), total_gas_consumed: resources.total_gas_consumed.unwrap_or_default(), } @@ -271,6 +265,21 @@ pub struct MsgToL2 { pub nonce: Option, } +impl MsgToL2 { + pub fn compute_hash(&self) -> H256 { + let mut hasher = Keccak256::new(); + hasher.update([0u8; 12]); // Padding + hasher.update(self.from_address.as_bytes()); + hasher.update(self.to_address.to_bytes_be()); + hasher.update(self.nonce.unwrap_or_default().to_bytes_be()); + hasher.update(self.selector.to_bytes_be()); + hasher.update([0u8; 24]); // Padding + hasher.update((self.payload.len() as u64).to_be_bytes()); + self.payload.iter().for_each(|felt| hasher.update(felt.to_bytes_be())); + H256::from_slice(&hasher.finalize()) + } +} + impl TryFrom<&L1HandlerTransaction> for MsgToL2 { type Error = (); @@ -300,3 +309,27 @@ fn fee_payment(fee: Felt, tx_version: u8) -> mp_receipt::FeePayment { unit: if tx_version < 3 { mp_receipt::PriceUnit::Wei } else { mp_receipt::PriceUnit::Fri }, } } + +#[cfg(test)] +mod test { + use super::*; + use std::str::FromStr; + + #[test] + fn test_compute_hash_msg_to_l2() { + let msg = MsgToL2 { + from_address: H160::from_str("0x0000000000000000000000000000000000000001").unwrap(), + to_address: Felt::from(2), + selector: Felt::from(3), + payload: vec![Felt::from(4), Felt::from(5), Felt::from(6)], + nonce: Some(Felt::from(7)), + }; + + let hash = msg.compute_hash(); + + let expected_hash = + H256::from_str("0xeec1e25e91757d5e9c8a11cf6e84ddf078dbfbee23382ee979234fc86a8608a5").unwrap(); + + assert_eq!(hash, expected_hash); + } +} diff --git a/crates/primitives/gateway/src/user_transaction.rs b/crates/primitives/gateway/src/user_transaction.rs index dfc7ae3f6..d92bfaac1 100644 --- a/crates/primitives/gateway/src/user_transaction.rs +++ b/crates/primitives/gateway/src/user_transaction.rs @@ -1,15 +1,12 @@ -use std::sync::Arc; - use mp_class::{CompressedLegacyContractClass, FlattenedSierraClass}; use mp_transactions::{DataAvailabilityMode, ResourceBoundsMapping}; use serde::{Deserialize, Serialize}; -use starknet_core::types::{ - BroadcastedDeclareTransaction, BroadcastedDeclareTransactionV1, BroadcastedDeclareTransactionV2, - BroadcastedDeclareTransactionV3, BroadcastedDeployAccountTransaction, BroadcastedDeployAccountTransactionV1, - BroadcastedDeployAccountTransactionV3, BroadcastedInvokeTransaction, BroadcastedInvokeTransactionV1, - BroadcastedInvokeTransactionV3, BroadcastedTransaction, -}; use starknet_types_core::felt::Felt; +use starknet_types_rpc::{ + BroadcastedDeclareTxn, BroadcastedDeclareTxnV1, BroadcastedDeclareTxnV2, BroadcastedDeclareTxnV3, + BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, BroadcastedTxn, DeployAccountTxnV1, DeployAccountTxnV3, + InvokeTxnV0, InvokeTxnV1, InvokeTxnV3, +}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "type", rename_all = "SCREAMING_SNAKE_CASE")] @@ -20,22 +17,24 @@ pub enum UserTransaction { DeployAccount(UserDeployAccountTransaction), } -impl From for BroadcastedTransaction { +impl From for BroadcastedTxn { fn from(transaction: UserTransaction) -> Self { match transaction { - UserTransaction::Declare(v1) => BroadcastedTransaction::Declare(v1.into()), - UserTransaction::InvokeFunction(v1) => BroadcastedTransaction::Invoke(v1.into()), - UserTransaction::DeployAccount(v1) => BroadcastedTransaction::DeployAccount(v1.into()), + UserTransaction::Declare(tx) => BroadcastedTxn::Declare(tx.into()), + UserTransaction::InvokeFunction(tx) => BroadcastedTxn::Invoke(tx.into()), + UserTransaction::DeployAccount(tx) => BroadcastedTxn::DeployAccount(tx.into()), } } } -impl From for UserTransaction { - fn from(transaction: BroadcastedTransaction) -> Self { +impl TryFrom> for UserTransaction { + type Error = base64::DecodeError; + + fn try_from(transaction: BroadcastedTxn) -> Result { match transaction { - BroadcastedTransaction::Declare(v1) => UserTransaction::Declare(v1.into()), - BroadcastedTransaction::Invoke(v1) => UserTransaction::InvokeFunction(v1.into()), - BroadcastedTransaction::DeployAccount(v1) => UserTransaction::DeployAccount(v1.into()), + BroadcastedTxn::Declare(tx) => Ok(UserTransaction::Declare(tx.try_into()?)), + BroadcastedTxn::Invoke(tx) => Ok(UserTransaction::InvokeFunction(tx.into())), + BroadcastedTxn::DeployAccount(tx) => Ok(UserTransaction::DeployAccount(tx.into())), } } } @@ -51,22 +50,42 @@ pub enum UserDeclareTransaction { V3(UserDeclareV3Transaction), } -impl From for BroadcastedDeclareTransaction { +impl From for BroadcastedDeclareTxn { fn from(transaction: UserDeclareTransaction) -> Self { match transaction { - UserDeclareTransaction::V1(v1) => BroadcastedDeclareTransaction::V1(v1.into()), - UserDeclareTransaction::V2(v2) => BroadcastedDeclareTransaction::V2(v2.into()), - UserDeclareTransaction::V3(v3) => BroadcastedDeclareTransaction::V3(v3.into()), + UserDeclareTransaction::V1(tx) if tx.is_query => BroadcastedDeclareTxn::QueryV1(tx.into()), + UserDeclareTransaction::V1(tx) => BroadcastedDeclareTxn::V1(tx.into()), + UserDeclareTransaction::V2(tx) if tx.is_query => BroadcastedDeclareTxn::QueryV2(tx.into()), + UserDeclareTransaction::V2(tx) => BroadcastedDeclareTxn::V2(tx.into()), + UserDeclareTransaction::V3(tx) if tx.is_query => BroadcastedDeclareTxn::QueryV3(tx.into()), + UserDeclareTransaction::V3(tx) => BroadcastedDeclareTxn::V3(tx.into()), } } } -impl From for UserDeclareTransaction { - fn from(transaction: BroadcastedDeclareTransaction) -> Self { +impl TryFrom> for UserDeclareTransaction { + type Error = base64::DecodeError; + + fn try_from(transaction: BroadcastedDeclareTxn) -> Result { match transaction { - BroadcastedDeclareTransaction::V1(v1) => UserDeclareTransaction::V1(v1.into()), - BroadcastedDeclareTransaction::V2(v2) => UserDeclareTransaction::V2(v2.into()), - BroadcastedDeclareTransaction::V3(v3) => UserDeclareTransaction::V3(v3.into()), + BroadcastedDeclareTxn::V1(tx) => { + Ok(UserDeclareTransaction::V1(UserDeclareV1Transaction::try_from_broadcasted(tx, false)?)) + } + BroadcastedDeclareTxn::QueryV1(tx) => { + Ok(UserDeclareTransaction::V1(UserDeclareV1Transaction::try_from_broadcasted(tx, true)?)) + } + BroadcastedDeclareTxn::V2(tx) => { + Ok(UserDeclareTransaction::V2(UserDeclareV2Transaction::from_broadcasted(tx, false))) + } + BroadcastedDeclareTxn::QueryV2(tx) => { + Ok(UserDeclareTransaction::V2(UserDeclareV2Transaction::from_broadcasted(tx, true))) + } + BroadcastedDeclareTxn::V3(tx) => { + Ok(UserDeclareTransaction::V3(UserDeclareV3Transaction::from_broadcasted(tx, false))) + } + BroadcastedDeclareTxn::QueryV3(tx) => { + Ok(UserDeclareTransaction::V3(UserDeclareV3Transaction::from_broadcasted(tx, true))) + } } } } @@ -81,29 +100,31 @@ pub struct UserDeclareV1Transaction { pub is_query: bool, } -impl From for BroadcastedDeclareTransactionV1 { +impl From for BroadcastedDeclareTxnV1 { fn from(transaction: UserDeclareV1Transaction) -> Self { Self { sender_address: transaction.sender_address, max_fee: transaction.max_fee, signature: transaction.signature, nonce: transaction.nonce, - contract_class: Arc::new(transaction.contract_class.into()), - is_query: transaction.is_query, + contract_class: transaction.contract_class.into(), } } } -impl From for UserDeclareV1Transaction { - fn from(transaction: BroadcastedDeclareTransactionV1) -> Self { - Self { +impl UserDeclareV1Transaction { + fn try_from_broadcasted( + transaction: BroadcastedDeclareTxnV1, + is_query: bool, + ) -> Result { + Ok(Self { sender_address: transaction.sender_address, max_fee: transaction.max_fee, signature: transaction.signature, nonce: transaction.nonce, - contract_class: transaction.contract_class.as_ref().to_owned().into(), - is_query: transaction.is_query, - } + contract_class: transaction.contract_class.try_into()?, + is_query, + }) } } @@ -118,7 +139,7 @@ pub struct UserDeclareV2Transaction { pub is_query: bool, } -impl From for BroadcastedDeclareTransactionV2 { +impl From for BroadcastedDeclareTxnV2 { fn from(transaction: UserDeclareV2Transaction) -> Self { Self { sender_address: transaction.sender_address, @@ -126,22 +147,21 @@ impl From for BroadcastedDeclareTransactionV2 { max_fee: transaction.max_fee, signature: transaction.signature, nonce: transaction.nonce, - contract_class: Arc::new(transaction.contract_class.into()), - is_query: transaction.is_query, + contract_class: transaction.contract_class.into(), } } } -impl From for UserDeclareV2Transaction { - fn from(transaction: BroadcastedDeclareTransactionV2) -> Self { +impl UserDeclareV2Transaction { + fn from_broadcasted(transaction: BroadcastedDeclareTxnV2, is_query: bool) -> Self { Self { sender_address: transaction.sender_address, compiled_class_hash: transaction.compiled_class_hash, signature: transaction.signature, nonce: transaction.nonce, - contract_class: transaction.contract_class.as_ref().to_owned().into(), + contract_class: transaction.contract_class.into(), max_fee: transaction.max_fee, - is_query: transaction.is_query, + is_query, } } } @@ -162,7 +182,7 @@ pub struct UserDeclareV3Transaction { pub is_query: bool, } -impl From for BroadcastedDeclareTransactionV3 { +impl From for BroadcastedDeclareTxnV3 { fn from(transaction: UserDeclareV3Transaction) -> Self { Self { sender_address: transaction.sender_address, @@ -173,16 +193,19 @@ impl From for BroadcastedDeclareTransactionV3 { fee_data_availability_mode: transaction.fee_data_availability_mode.into(), resource_bounds: transaction.resource_bounds.into(), tip: transaction.tip, - contract_class: Arc::new(transaction.contract_class.into()), + contract_class: transaction.contract_class.into(), paymaster_data: transaction.paymaster_data, account_deployment_data: transaction.account_deployment_data, - is_query: transaction.is_query, + version: match transaction.is_query { + true => starknet_types_rpc::Version::X100000000000000000000000000000003, + false => starknet_types_rpc::Version::X3, + }, } } } -impl From for UserDeclareV3Transaction { - fn from(transaction: BroadcastedDeclareTransactionV3) -> Self { +impl UserDeclareV3Transaction { + fn from_broadcasted(transaction: BroadcastedDeclareTxnV3, is_query: bool) -> Self { Self { sender_address: transaction.sender_address, compiled_class_hash: transaction.compiled_class_hash, @@ -192,10 +215,10 @@ impl From for UserDeclareV3Transaction { fee_data_availability_mode: transaction.fee_data_availability_mode.into(), resource_bounds: transaction.resource_bounds.into(), tip: transaction.tip, - contract_class: transaction.contract_class.as_ref().to_owned().into(), + contract_class: transaction.contract_class.into(), paymaster_data: transaction.paymaster_data, account_deployment_data: transaction.account_deployment_data, - is_query: transaction.is_query, + is_query, } } } @@ -203,26 +226,83 @@ impl From for UserDeclareV3Transaction { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(tag = "version")] pub enum UserInvokeFunctionTransaction { + #[serde(rename = "0x0")] + V0(UserInvokeFunctionV0Transaction), #[serde(rename = "0x1")] V1(UserInvokeFunctionV1Transaction), #[serde(rename = "0x3")] V3(UserInvokeFunctionV3Transaction), } -impl From for BroadcastedInvokeTransaction { +impl From for BroadcastedInvokeTxn { fn from(transaction: UserInvokeFunctionTransaction) -> Self { match transaction { - UserInvokeFunctionTransaction::V1(v1) => BroadcastedInvokeTransaction::V1(v1.into()), - UserInvokeFunctionTransaction::V3(v3) => BroadcastedInvokeTransaction::V3(v3.into()), + UserInvokeFunctionTransaction::V0(tx) if tx.is_query => BroadcastedInvokeTxn::QueryV0(tx.into()), + UserInvokeFunctionTransaction::V0(tx) => BroadcastedInvokeTxn::V0(tx.into()), + UserInvokeFunctionTransaction::V1(tx) if tx.is_query => BroadcastedInvokeTxn::QueryV1(tx.into()), + UserInvokeFunctionTransaction::V1(tx) => BroadcastedInvokeTxn::V1(tx.into()), + UserInvokeFunctionTransaction::V3(tx) if tx.is_query => BroadcastedInvokeTxn::QueryV3(tx.into()), + UserInvokeFunctionTransaction::V3(tx) => BroadcastedInvokeTxn::V3(tx.into()), } } } -impl From for UserInvokeFunctionTransaction { - fn from(transaction: BroadcastedInvokeTransaction) -> Self { +impl From> for UserInvokeFunctionTransaction { + fn from(transaction: BroadcastedInvokeTxn) -> Self { match transaction { - BroadcastedInvokeTransaction::V1(v1) => UserInvokeFunctionTransaction::V1(v1.into()), - BroadcastedInvokeTransaction::V3(v3) => UserInvokeFunctionTransaction::V3(v3.into()), + BroadcastedInvokeTxn::V0(tx) => { + UserInvokeFunctionTransaction::V0(UserInvokeFunctionV0Transaction::from_broadcasted(tx, false)) + } + BroadcastedInvokeTxn::QueryV0(tx) => { + UserInvokeFunctionTransaction::V0(UserInvokeFunctionV0Transaction::from_broadcasted(tx, true)) + } + BroadcastedInvokeTxn::V1(tx) => { + UserInvokeFunctionTransaction::V1(UserInvokeFunctionV1Transaction::from_broadcasted(tx, false)) + } + BroadcastedInvokeTxn::QueryV1(tx) => { + UserInvokeFunctionTransaction::V1(UserInvokeFunctionV1Transaction::from_broadcasted(tx, true)) + } + BroadcastedInvokeTxn::V3(tx) => { + UserInvokeFunctionTransaction::V3(UserInvokeFunctionV3Transaction::from_broadcasted(tx, false)) + } + BroadcastedInvokeTxn::QueryV3(tx) => { + UserInvokeFunctionTransaction::V3(UserInvokeFunctionV3Transaction::from_broadcasted(tx, true)) + } + } + } +} + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct UserInvokeFunctionV0Transaction { + pub sender_address: Felt, + pub entry_point_selector: Felt, + pub calldata: Vec, + pub signature: Vec, + pub max_fee: Felt, + pub is_query: bool, +} + +impl From for InvokeTxnV0 { + fn from(transaction: UserInvokeFunctionV0Transaction) -> Self { + Self { + contract_address: transaction.sender_address, + entry_point_selector: transaction.entry_point_selector, + calldata: transaction.calldata, + signature: transaction.signature, + max_fee: transaction.max_fee, + } + } +} + +impl UserInvokeFunctionV0Transaction { + fn from_broadcasted(transaction: InvokeTxnV0, is_query: bool) -> Self { + Self { + sender_address: transaction.contract_address, + entry_point_selector: transaction.entry_point_selector, + calldata: transaction.calldata, + signature: transaction.signature, + max_fee: transaction.max_fee, + is_query, } } } @@ -237,7 +317,7 @@ pub struct UserInvokeFunctionV1Transaction { pub is_query: bool, } -impl From for BroadcastedInvokeTransactionV1 { +impl From for InvokeTxnV1 { fn from(transaction: UserInvokeFunctionV1Transaction) -> Self { Self { sender_address: transaction.sender_address, @@ -245,20 +325,19 @@ impl From for BroadcastedInvokeTransactionV1 { signature: transaction.signature, max_fee: transaction.max_fee, nonce: transaction.nonce, - is_query: transaction.is_query, } } } -impl From for UserInvokeFunctionV1Transaction { - fn from(transaction: BroadcastedInvokeTransactionV1) -> Self { +impl UserInvokeFunctionV1Transaction { + fn from_broadcasted(transaction: InvokeTxnV1, is_query: bool) -> Self { Self { sender_address: transaction.sender_address, calldata: transaction.calldata, signature: transaction.signature, max_fee: transaction.max_fee, nonce: transaction.nonce, - is_query: transaction.is_query, + is_query, } } } @@ -278,7 +357,7 @@ pub struct UserInvokeFunctionV3Transaction { pub is_query: bool, } -impl From for BroadcastedInvokeTransactionV3 { +impl From for InvokeTxnV3 { fn from(transaction: UserInvokeFunctionV3Transaction) -> Self { Self { sender_address: transaction.sender_address, @@ -291,13 +370,12 @@ impl From for BroadcastedInvokeTransactionV3 { tip: transaction.tip, paymaster_data: transaction.paymaster_data, account_deployment_data: transaction.account_deployment_data, - is_query: transaction.is_query, } } } -impl From for UserInvokeFunctionV3Transaction { - fn from(transaction: BroadcastedInvokeTransactionV3) -> Self { +impl UserInvokeFunctionV3Transaction { + fn from_broadcasted(transaction: InvokeTxnV3, is_query: bool) -> Self { Self { sender_address: transaction.sender_address, calldata: transaction.calldata, @@ -309,7 +387,7 @@ impl From for UserInvokeFunctionV3Transaction { tip: transaction.tip, paymaster_data: transaction.paymaster_data, account_deployment_data: transaction.account_deployment_data, - is_query: transaction.is_query, + is_query, } } } @@ -323,20 +401,31 @@ pub enum UserDeployAccountTransaction { V3(UserDeployAccountV3Transaction), } -impl From for BroadcastedDeployAccountTransaction { +impl From for BroadcastedDeployAccountTxn { fn from(transaction: UserDeployAccountTransaction) -> Self { match transaction { - UserDeployAccountTransaction::V1(v1) => BroadcastedDeployAccountTransaction::V1(v1.into()), - UserDeployAccountTransaction::V3(v3) => BroadcastedDeployAccountTransaction::V3(v3.into()), + UserDeployAccountTransaction::V1(tx) if tx.is_query => BroadcastedDeployAccountTxn::QueryV1(tx.into()), + UserDeployAccountTransaction::V1(tx) => BroadcastedDeployAccountTxn::V1(tx.into()), + UserDeployAccountTransaction::V3(tx) => BroadcastedDeployAccountTxn::QueryV3(tx.into()), } } } -impl From for UserDeployAccountTransaction { - fn from(transaction: BroadcastedDeployAccountTransaction) -> Self { +impl From> for UserDeployAccountTransaction { + fn from(transaction: BroadcastedDeployAccountTxn) -> Self { match transaction { - BroadcastedDeployAccountTransaction::V1(v1) => UserDeployAccountTransaction::V1(v1.into()), - BroadcastedDeployAccountTransaction::V3(v3) => UserDeployAccountTransaction::V3(v3.into()), + BroadcastedDeployAccountTxn::V1(tx) => { + UserDeployAccountTransaction::V1(UserDeployAccountV1Transaction::from_broadcasted(tx, false)) + } + BroadcastedDeployAccountTxn::V3(tx) => { + UserDeployAccountTransaction::V3(UserDeployAccountV3Transaction::from_broadcasted(tx, false)) + } + BroadcastedDeployAccountTxn::QueryV1(tx) => { + UserDeployAccountTransaction::V1(UserDeployAccountV1Transaction::from_broadcasted(tx, true)) + } + BroadcastedDeployAccountTxn::QueryV3(tx) => { + UserDeployAccountTransaction::V3(UserDeployAccountV3Transaction::from_broadcasted(tx, true)) + } } } } @@ -352,7 +441,7 @@ pub struct UserDeployAccountV1Transaction { pub is_query: bool, } -impl From for BroadcastedDeployAccountTransactionV1 { +impl From for DeployAccountTxnV1 { fn from(transaction: UserDeployAccountV1Transaction) -> Self { Self { class_hash: transaction.class_hash, @@ -361,13 +450,12 @@ impl From for BroadcastedDeployAccountTransactio max_fee: transaction.max_fee, signature: transaction.signature, nonce: transaction.nonce, - is_query: transaction.is_query, } } } -impl From for UserDeployAccountV1Transaction { - fn from(transaction: BroadcastedDeployAccountTransactionV1) -> Self { +impl UserDeployAccountV1Transaction { + fn from_broadcasted(transaction: DeployAccountTxnV1, is_query: bool) -> Self { Self { class_hash: transaction.class_hash, contract_address_salt: transaction.contract_address_salt, @@ -375,7 +463,7 @@ impl From for UserDeployAccountV1Transact max_fee: transaction.max_fee, signature: transaction.signature, nonce: transaction.nonce, - is_query: transaction.is_query, + is_query, } } } @@ -395,7 +483,7 @@ pub struct UserDeployAccountV3Transaction { pub is_query: bool, } -impl From for BroadcastedDeployAccountTransactionV3 { +impl From for DeployAccountTxnV3 { fn from(transaction: UserDeployAccountV3Transaction) -> Self { Self { class_hash: transaction.class_hash, @@ -408,13 +496,12 @@ impl From for BroadcastedDeployAccountTransactio resource_bounds: transaction.resource_bounds.into(), tip: transaction.tip, paymaster_data: transaction.paymaster_data, - is_query: transaction.is_query, } } } -impl From for UserDeployAccountV3Transaction { - fn from(transaction: BroadcastedDeployAccountTransactionV3) -> Self { +impl UserDeployAccountV3Transaction { + fn from_broadcasted(transaction: DeployAccountTxnV3, is_query: bool) -> Self { Self { class_hash: transaction.class_hash, contract_address_salt: transaction.contract_address_salt, @@ -426,7 +513,7 @@ impl From for UserDeployAccountV3Transact resource_bounds: transaction.resource_bounds.into(), tip: transaction.tip, paymaster_data: transaction.paymaster_data, - is_query: transaction.is_query, + is_query, } } } diff --git a/crates/primitives/receipt/Cargo.toml b/crates/primitives/receipt/Cargo.toml index 25a11dc88..f807c1517 100644 --- a/crates/primitives/receipt/Cargo.toml +++ b/crates/primitives/receipt/Cargo.toml @@ -22,11 +22,13 @@ cairo-vm = { workspace = true } rstest.workspace = true starknet-core = { workspace = true } starknet-types-core = { workspace = true } +starknet-types-rpc = { workspace = true } starknet_api = { workspace = true } thiserror = { workspace = true } tracing.workspace = true # Other +primitive-types = { workspace = true } serde = { workspace = true, features = ["derive"] } [dev-dependencies] diff --git a/crates/primitives/receipt/src/from_blockifier.rs b/crates/primitives/receipt/src/from_blockifier.rs index 202c83e99..fe76a477e 100644 --- a/crates/primitives/receipt/src/from_blockifier.rs +++ b/crates/primitives/receipt/src/from_blockifier.rs @@ -6,6 +6,7 @@ use blockifier::transaction::{ transactions::L1HandlerTransaction, }; use cairo_vm::types::builtin_name::BuiltinName; +use primitive_types::H256; use starknet_core::types::MsgToL2; use starknet_types_core::felt::Felt; use thiserror::Error; @@ -42,7 +43,7 @@ pub enum L1HandlerMessageError { InvalidNonce, } -fn get_l1_handler_message_hash(tx: &L1HandlerTransaction) -> Result { +fn get_l1_handler_message_hash(tx: &L1HandlerTransaction) -> Result { let (from_address, payload) = tx.tx.calldata.0.split_first().ok_or(L1HandlerMessageError::EmptyCalldata)?; let from_address = (*from_address).try_into().map_err(|_| L1HandlerMessageError::FromAddressOutOfRange)?; @@ -56,7 +57,7 @@ fn get_l1_handler_message_hash(tx: &L1HandlerTransaction) -> Result impl Iterator { @@ -112,14 +113,15 @@ pub fn from_blockifier_execution_info(res: &TransactionExecutionInfo, tx: &Trans let get_applications = |resource| { res.non_optional_call_infos() .map(|call| call.resources.builtin_instance_counter.get(resource).map(|el| *el as u64)) - .sum() + .sum::>() + .unwrap_or_default() }; let memory_holes = res.non_optional_call_infos().map(|call| call.resources.n_memory_holes as u64).sum(); let execution_resources = ExecutionResources { steps: res.non_optional_call_infos().map(|call| call.resources.n_steps as u64).sum(), - memory_holes: if memory_holes == 0 { None } else { Some(memory_holes) }, + memory_holes, range_check_builtin_applications: get_applications(&BuiltinName::range_check), pedersen_builtin_applications: get_applications(&BuiltinName::pedersen), poseidon_builtin_applications: get_applications(&BuiltinName::poseidon), diff --git a/crates/primitives/receipt/src/into_starknet_core.rs b/crates/primitives/receipt/src/into_starknet_core.rs deleted file mode 100644 index 65064bd93..000000000 --- a/crates/primitives/receipt/src/into_starknet_core.rs +++ /dev/null @@ -1,375 +0,0 @@ -use crate::{ - DeclareTransactionReceipt, DeployAccountTransactionReceipt, DeployTransactionReceipt, Event, ExecutionResources, - ExecutionResult, FeePayment, InvokeTransactionReceipt, L1Gas, L1HandlerTransactionReceipt, MsgToL1, PriceUnit, - TransactionReceipt, -}; - -impl From for TransactionReceipt { - fn from(receipt: starknet_core::types::TransactionReceipt) -> Self { - match receipt { - starknet_core::types::TransactionReceipt::Invoke(receipt) => TransactionReceipt::Invoke(receipt.into()), - starknet_core::types::TransactionReceipt::L1Handler(receipt) => { - TransactionReceipt::L1Handler(receipt.into()) - } - starknet_core::types::TransactionReceipt::Declare(receipt) => TransactionReceipt::Declare(receipt.into()), - starknet_core::types::TransactionReceipt::Deploy(receipt) => TransactionReceipt::Deploy(receipt.into()), - starknet_core::types::TransactionReceipt::DeployAccount(receipt) => { - TransactionReceipt::DeployAccount(receipt.into()) - } - } - } -} - -impl TransactionReceipt { - pub fn to_starknet_core( - self, - finality_status: starknet_core::types::TransactionFinalityStatus, - ) -> starknet_core::types::TransactionReceipt { - match self { - TransactionReceipt::Invoke(receipt) => { - starknet_core::types::TransactionReceipt::Invoke(receipt.to_starknet_core(finality_status)) - } - TransactionReceipt::L1Handler(receipt) => { - starknet_core::types::TransactionReceipt::L1Handler(receipt.to_starknet_core(finality_status)) - } - TransactionReceipt::Declare(receipt) => { - starknet_core::types::TransactionReceipt::Declare(receipt.to_starknet_core(finality_status)) - } - TransactionReceipt::Deploy(receipt) => { - starknet_core::types::TransactionReceipt::Deploy(receipt.to_starknet_core(finality_status)) - } - TransactionReceipt::DeployAccount(receipt) => { - starknet_core::types::TransactionReceipt::DeployAccount(receipt.to_starknet_core(finality_status)) - } - } - } -} - -impl From for InvokeTransactionReceipt { - fn from(receipt: starknet_core::types::InvokeTransactionReceipt) -> Self { - Self { - transaction_hash: receipt.transaction_hash, - actual_fee: receipt.actual_fee.into(), - messages_sent: receipt.messages_sent.into_iter().map(MsgToL1::from).collect(), - events: receipt.events.into_iter().map(Event::from).collect(), - execution_resources: receipt.execution_resources.into(), - execution_result: receipt.execution_result.into(), - } - } -} - -impl InvokeTransactionReceipt { - pub fn to_starknet_core( - self, - finality_status: starknet_core::types::TransactionFinalityStatus, - ) -> starknet_core::types::InvokeTransactionReceipt { - starknet_core::types::InvokeTransactionReceipt { - transaction_hash: self.transaction_hash, - actual_fee: self.actual_fee.into(), - finality_status, - messages_sent: self.messages_sent.into_iter().map(starknet_core::types::MsgToL1::from).collect(), - events: self.events.into_iter().map(starknet_core::types::Event::from).collect(), - execution_resources: self.execution_resources.into(), - execution_result: self.execution_result.into(), - } - } -} - -impl From for L1HandlerTransactionReceipt { - fn from(receipt: starknet_core::types::L1HandlerTransactionReceipt) -> Self { - Self { - message_hash: receipt.message_hash.try_into().unwrap_or_default(), - transaction_hash: receipt.transaction_hash, - actual_fee: receipt.actual_fee.into(), - messages_sent: receipt.messages_sent.into_iter().map(MsgToL1::from).collect(), - events: receipt.events.into_iter().map(Event::from).collect(), - execution_resources: receipt.execution_resources.into(), - execution_result: receipt.execution_result.into(), - } - } -} - -impl L1HandlerTransactionReceipt { - pub fn to_starknet_core( - self, - finality_status: starknet_core::types::TransactionFinalityStatus, - ) -> starknet_core::types::L1HandlerTransactionReceipt { - starknet_core::types::L1HandlerTransactionReceipt { - message_hash: self.message_hash.into(), - transaction_hash: self.transaction_hash, - actual_fee: self.actual_fee.into(), - finality_status, - messages_sent: self.messages_sent.into_iter().map(starknet_core::types::MsgToL1::from).collect(), - events: self.events.into_iter().map(starknet_core::types::Event::from).collect(), - execution_resources: self.execution_resources.into(), - execution_result: self.execution_result.into(), - } - } -} - -impl From for DeclareTransactionReceipt { - fn from(receipt: starknet_core::types::DeclareTransactionReceipt) -> Self { - Self { - transaction_hash: receipt.transaction_hash, - actual_fee: receipt.actual_fee.into(), - messages_sent: receipt.messages_sent.into_iter().map(MsgToL1::from).collect(), - events: receipt.events.into_iter().map(Event::from).collect(), - execution_resources: receipt.execution_resources.into(), - execution_result: receipt.execution_result.into(), - } - } -} - -impl DeclareTransactionReceipt { - pub fn to_starknet_core( - self, - finality_status: starknet_core::types::TransactionFinalityStatus, - ) -> starknet_core::types::DeclareTransactionReceipt { - starknet_core::types::DeclareTransactionReceipt { - transaction_hash: self.transaction_hash, - actual_fee: self.actual_fee.into(), - finality_status, - messages_sent: self.messages_sent.into_iter().map(starknet_core::types::MsgToL1::from).collect(), - events: self.events.into_iter().map(starknet_core::types::Event::from).collect(), - execution_resources: self.execution_resources.into(), - execution_result: self.execution_result.into(), - } - } -} - -impl From for DeployTransactionReceipt { - fn from(receipt: starknet_core::types::DeployTransactionReceipt) -> Self { - Self { - transaction_hash: receipt.transaction_hash, - actual_fee: receipt.actual_fee.into(), - messages_sent: receipt.messages_sent.into_iter().map(MsgToL1::from).collect(), - events: receipt.events.into_iter().map(Event::from).collect(), - execution_resources: receipt.execution_resources.into(), - execution_result: receipt.execution_result.into(), - contract_address: receipt.contract_address, - } - } -} - -impl DeployTransactionReceipt { - pub fn to_starknet_core( - self, - finality_status: starknet_core::types::TransactionFinalityStatus, - ) -> starknet_core::types::DeployTransactionReceipt { - starknet_core::types::DeployTransactionReceipt { - transaction_hash: self.transaction_hash, - actual_fee: self.actual_fee.into(), - finality_status, - messages_sent: self.messages_sent.into_iter().map(starknet_core::types::MsgToL1::from).collect(), - events: self.events.into_iter().map(starknet_core::types::Event::from).collect(), - execution_resources: self.execution_resources.into(), - execution_result: self.execution_result.into(), - contract_address: self.contract_address, - } - } -} - -impl From for DeployAccountTransactionReceipt { - fn from(receipt: starknet_core::types::DeployAccountTransactionReceipt) -> Self { - Self { - transaction_hash: receipt.transaction_hash, - actual_fee: receipt.actual_fee.into(), - messages_sent: receipt.messages_sent.into_iter().map(MsgToL1::from).collect(), - events: receipt.events.into_iter().map(Event::from).collect(), - execution_resources: receipt.execution_resources.into(), - execution_result: receipt.execution_result.into(), - contract_address: receipt.contract_address, - } - } -} - -impl DeployAccountTransactionReceipt { - pub fn to_starknet_core( - self, - finality_status: starknet_core::types::TransactionFinalityStatus, - ) -> starknet_core::types::DeployAccountTransactionReceipt { - starknet_core::types::DeployAccountTransactionReceipt { - transaction_hash: self.transaction_hash, - actual_fee: self.actual_fee.into(), - finality_status, - messages_sent: self.messages_sent.into_iter().map(starknet_core::types::MsgToL1::from).collect(), - events: self.events.into_iter().map(starknet_core::types::Event::from).collect(), - execution_resources: self.execution_resources.into(), - execution_result: self.execution_result.into(), - contract_address: self.contract_address, - } - } -} - -impl From for FeePayment { - fn from(payment: starknet_core::types::FeePayment) -> Self { - Self { amount: payment.amount, unit: payment.unit.into() } - } -} - -impl From for starknet_core::types::FeePayment { - fn from(fee: FeePayment) -> Self { - Self { amount: fee.amount, unit: fee.unit.into() } - } -} - -impl From for PriceUnit { - fn from(unit: starknet_core::types::PriceUnit) -> Self { - match unit { - starknet_core::types::PriceUnit::Fri => PriceUnit::Fri, - starknet_core::types::PriceUnit::Wei => PriceUnit::Wei, - } - } -} - -impl From for starknet_core::types::PriceUnit { - fn from(unit: PriceUnit) -> Self { - match unit { - PriceUnit::Wei => starknet_core::types::PriceUnit::Wei, - PriceUnit::Fri => starknet_core::types::PriceUnit::Fri, - } - } -} - -impl From for MsgToL1 { - fn from(msg: starknet_core::types::MsgToL1) -> Self { - Self { from_address: msg.from_address, to_address: msg.to_address, payload: msg.payload } - } -} - -impl From for starknet_core::types::MsgToL1 { - fn from(msg: MsgToL1) -> Self { - Self { from_address: msg.from_address, to_address: msg.to_address, payload: msg.payload } - } -} - -impl From for Event { - fn from(event: starknet_core::types::Event) -> Self { - Self { from_address: event.from_address, keys: event.keys, data: event.data } - } -} - -impl From for starknet_core::types::Event { - fn from(event: Event) -> Self { - Self { from_address: event.from_address, keys: event.keys, data: event.data } - } -} - -impl From for ExecutionResources { - fn from(resources: starknet_core::types::ExecutionResources) -> Self { - let computation_resources = resources.computation_resources; - Self { - steps: computation_resources.steps, - memory_holes: computation_resources.memory_holes, - range_check_builtin_applications: computation_resources.range_check_builtin_applications, - pedersen_builtin_applications: computation_resources.pedersen_builtin_applications, - poseidon_builtin_applications: computation_resources.poseidon_builtin_applications, - ec_op_builtin_applications: computation_resources.ec_op_builtin_applications, - ecdsa_builtin_applications: computation_resources.ecdsa_builtin_applications, - bitwise_builtin_applications: computation_resources.bitwise_builtin_applications, - keccak_builtin_applications: computation_resources.keccak_builtin_applications, - segment_arena_builtin: computation_resources.segment_arena_builtin, - data_availability: resources.data_resources.data_availability.into(), - total_gas_consumed: Default::default(), - } - } -} - -impl From for starknet_core::types::ExecutionResources { - fn from(resources: ExecutionResources) -> Self { - Self { - computation_resources: starknet_core::types::ComputationResources { - steps: resources.steps, - memory_holes: resources.memory_holes, - range_check_builtin_applications: resources.range_check_builtin_applications, - pedersen_builtin_applications: resources.pedersen_builtin_applications, - poseidon_builtin_applications: resources.poseidon_builtin_applications, - ec_op_builtin_applications: resources.ec_op_builtin_applications, - ecdsa_builtin_applications: resources.ecdsa_builtin_applications, - bitwise_builtin_applications: resources.bitwise_builtin_applications, - keccak_builtin_applications: resources.keccak_builtin_applications, - segment_arena_builtin: resources.segment_arena_builtin, - }, - data_resources: starknet_core::types::DataResources { - data_availability: resources.data_availability.into(), - }, - } - } -} - -impl From for L1Gas { - fn from(resources: starknet_core::types::DataAvailabilityResources) -> Self { - Self { l1_gas: resources.l1_gas.into(), l1_data_gas: resources.l1_data_gas.into() } - } -} - -impl From for starknet_core::types::DataAvailabilityResources { - fn from(resources: L1Gas) -> Self { - Self { l1_gas: resources.l1_gas as u64, l1_data_gas: resources.l1_data_gas as u64 } - } -} - -impl From for ExecutionResult { - fn from(result: starknet_core::types::ExecutionResult) -> Self { - match result { - starknet_core::types::ExecutionResult::Succeeded => ExecutionResult::Succeeded, - starknet_core::types::ExecutionResult::Reverted { reason } => ExecutionResult::Reverted { reason }, - } - } -} - -impl From for starknet_core::types::ExecutionResult { - fn from(result: ExecutionResult) -> Self { - match result { - ExecutionResult::Succeeded => starknet_core::types::ExecutionResult::Succeeded, - ExecutionResult::Reverted { reason } => starknet_core::types::ExecutionResult::Reverted { reason }, - } - } -} - -#[cfg(test)] -mod test { - use super::*; - use crate::{ - tests::dummy_declare_receipt, tests::dummy_deploy_account_receipt, tests::dummy_deploy_receipt, - tests::dummy_invoke_receipt, tests::dummy_l1_handler_receipt, - }; - - #[test] - fn test_into_starknet_core_receipt() { - let receipt: TransactionReceipt = dummy_invoke_receipt().into(); - let core_receipt = - receipt.clone().to_starknet_core(starknet_core::types::TransactionFinalityStatus::AcceptedOnL1); - assert_eq!(core_receipt.finality_status(), &starknet_core::types::TransactionFinalityStatus::AcceptedOnL1); - let receipt_back: TransactionReceipt = core_receipt.into(); - assert_eq!(receipt, receipt_back); - - let receipt: TransactionReceipt = dummy_l1_handler_receipt().into(); - let core_receipt = - receipt.clone().to_starknet_core(starknet_core::types::TransactionFinalityStatus::AcceptedOnL2); - assert_eq!(core_receipt.finality_status(), &starknet_core::types::TransactionFinalityStatus::AcceptedOnL2); - let receipt_back: TransactionReceipt = core_receipt.into(); - assert_eq!(receipt, receipt_back); - - let receipt: TransactionReceipt = dummy_declare_receipt().into(); - let core_receipt = - receipt.clone().to_starknet_core(starknet_core::types::TransactionFinalityStatus::AcceptedOnL1); - assert_eq!(core_receipt.finality_status(), &starknet_core::types::TransactionFinalityStatus::AcceptedOnL1); - let receipt_back: TransactionReceipt = core_receipt.into(); - assert_eq!(receipt, receipt_back); - - let receipt: TransactionReceipt = dummy_deploy_receipt().into(); - let core_receipt = - receipt.clone().to_starknet_core(starknet_core::types::TransactionFinalityStatus::AcceptedOnL2); - assert_eq!(core_receipt.finality_status(), &starknet_core::types::TransactionFinalityStatus::AcceptedOnL2); - let receipt_back: TransactionReceipt = core_receipt.into(); - assert_eq!(receipt, receipt_back); - - let receipt: TransactionReceipt = dummy_deploy_account_receipt().into(); - let core_receipt = - receipt.clone().to_starknet_core(starknet_core::types::TransactionFinalityStatus::AcceptedOnL1); - assert_eq!(core_receipt.finality_status(), &starknet_core::types::TransactionFinalityStatus::AcceptedOnL1); - let receipt_back: TransactionReceipt = core_receipt.into(); - assert_eq!(receipt, receipt_back); - } -} diff --git a/crates/primitives/receipt/src/lib.rs b/crates/primitives/receipt/src/lib.rs index 3fb9be13f..ea384360f 100644 --- a/crates/primitives/receipt/src/lib.rs +++ b/crates/primitives/receipt/src/lib.rs @@ -1,7 +1,8 @@ mod from_blockifier; -mod into_starknet_core; +mod to_starknet_types; pub use from_blockifier::from_blockifier_execution_info; +use primitive_types::H256; use serde::{Deserialize, Serialize}; use starknet_core::utils::starknet_keccak; use starknet_types_core::{ @@ -179,7 +180,7 @@ pub struct InvokeTransactionReceipt { #[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)] pub struct L1HandlerTransactionReceipt { // normally this would be a Hash256, but the serde implementation doesn't work with bincode. - pub message_hash: Felt, + pub message_hash: H256, pub transaction_hash: Felt, pub actual_fee: FeePayment, pub messages_sent: Vec, @@ -274,15 +275,15 @@ impl Event { #[derive(Debug, Clone, PartialEq, Eq, Default, Serialize, Deserialize)] pub struct ExecutionResources { pub steps: u64, - pub memory_holes: Option, - pub range_check_builtin_applications: Option, - pub pedersen_builtin_applications: Option, - pub poseidon_builtin_applications: Option, - pub ec_op_builtin_applications: Option, - pub ecdsa_builtin_applications: Option, - pub bitwise_builtin_applications: Option, - pub keccak_builtin_applications: Option, - pub segment_arena_builtin: Option, + pub memory_holes: u64, + pub range_check_builtin_applications: u64, + pub pedersen_builtin_applications: u64, + pub poseidon_builtin_applications: u64, + pub ec_op_builtin_applications: u64, + pub ecdsa_builtin_applications: u64, + pub bitwise_builtin_applications: u64, + pub keccak_builtin_applications: u64, + pub segment_arena_builtin: u64, pub data_availability: L1Gas, pub total_gas_consumed: L1Gas, } @@ -314,6 +315,8 @@ impl ExecutionResult { #[cfg(test)] mod tests { + use std::str::FromStr; + use super::*; #[test] @@ -329,15 +332,15 @@ mod tests { events: vec![Event { from_address: Felt::from(6), keys: vec![Felt::from(7)], data: vec![Felt::from(8)] }], execution_resources: ExecutionResources { steps: 9, - memory_holes: Some(10), - range_check_builtin_applications: Some(11), - pedersen_builtin_applications: Some(12), - poseidon_builtin_applications: Some(13), - ec_op_builtin_applications: Some(14), - ecdsa_builtin_applications: Some(15), - bitwise_builtin_applications: Some(16), - keccak_builtin_applications: Some(17), - segment_arena_builtin: Some(18), + memory_holes: 10, + range_check_builtin_applications: 11, + pedersen_builtin_applications: 12, + poseidon_builtin_applications: 13, + ec_op_builtin_applications: 14, + ecdsa_builtin_applications: 15, + bitwise_builtin_applications: 16, + keccak_builtin_applications: 17, + segment_arena_builtin: 18, data_availability: L1Gas { l1_gas: 19, l1_data_gas: 20 }, total_gas_consumed: L1Gas { l1_gas: 21, l1_data_gas: 22 }, }, @@ -464,15 +467,15 @@ mod tests { fn dummy_execution_ressources() -> ExecutionResources { ExecutionResources { steps: 1, - memory_holes: Some(2), - range_check_builtin_applications: Some(3), - pedersen_builtin_applications: Some(4), - poseidon_builtin_applications: Some(5), - ec_op_builtin_applications: Some(6), - ecdsa_builtin_applications: Some(7), - bitwise_builtin_applications: Some(8), - keccak_builtin_applications: Some(9), - segment_arena_builtin: Some(10), + memory_holes: 2, + range_check_builtin_applications: 3, + pedersen_builtin_applications: 4, + poseidon_builtin_applications: 5, + ec_op_builtin_applications: 6, + ecdsa_builtin_applications: 7, + bitwise_builtin_applications: 8, + keccak_builtin_applications: 9, + segment_arena_builtin: 10, data_availability: L1Gas { l1_gas: 11, l1_data_gas: 12 }, // TODO: Change with non-default values when starknet-rs supports it. total_gas_consumed: Default::default(), @@ -492,7 +495,7 @@ mod tests { pub(crate) fn dummy_l1_handler_receipt() -> L1HandlerTransactionReceipt { L1HandlerTransactionReceipt { - message_hash: Felt::from(1), + message_hash: H256::from_str("0x0000000000000000000000000000000000000000000000000000000000000001").unwrap(), transaction_hash: Felt::from(2), actual_fee: FeePayment { amount: Felt::from(3), unit: PriceUnit::Wei }, messages_sent: dummy_messages(), diff --git a/crates/primitives/receipt/src/to_starknet_types.rs b/crates/primitives/receipt/src/to_starknet_types.rs new file mode 100644 index 000000000..caf980a76 --- /dev/null +++ b/crates/primitives/receipt/src/to_starknet_types.rs @@ -0,0 +1,203 @@ +use starknet_types_core::felt::Felt; + +use crate::{ + DeclareTransactionReceipt, DeployAccountTransactionReceipt, DeployTransactionReceipt, Event, ExecutionResources, + ExecutionResult, FeePayment, InvokeTransactionReceipt, L1Gas, L1HandlerTransactionReceipt, MsgToL1, PriceUnit, + TransactionReceipt, +}; + +impl TransactionReceipt { + pub fn to_starknet_types( + self, + finality_status: starknet_types_rpc::TxnFinalityStatus, + ) -> starknet_types_rpc::TxnReceipt { + match self { + TransactionReceipt::Invoke(receipt) => { + starknet_types_rpc::TxnReceipt::Invoke(receipt.to_starknet_types(finality_status)) + } + TransactionReceipt::L1Handler(receipt) => { + starknet_types_rpc::TxnReceipt::L1Handler(receipt.to_starknet_types(finality_status)) + } + TransactionReceipt::Declare(receipt) => { + starknet_types_rpc::TxnReceipt::Declare(receipt.to_starknet_types(finality_status)) + } + TransactionReceipt::Deploy(receipt) => { + starknet_types_rpc::TxnReceipt::Deploy(receipt.to_starknet_types(finality_status)) + } + TransactionReceipt::DeployAccount(receipt) => { + starknet_types_rpc::TxnReceipt::DeployAccount(receipt.to_starknet_types(finality_status)) + } + } + } +} + +impl InvokeTransactionReceipt { + pub fn to_starknet_types( + self, + finality_status: starknet_types_rpc::TxnFinalityStatus, + ) -> starknet_types_rpc::InvokeTxnReceipt { + starknet_types_rpc::InvokeTxnReceipt:: { + common_receipt_properties: starknet_types_rpc::CommonReceiptProperties { + actual_fee: self.actual_fee.into(), + events: self.events.into_iter().map(starknet_types_rpc::Event::from).collect(), + execution_resources: self.execution_resources.into(), + finality_status, + messages_sent: self.messages_sent.into_iter().map(starknet_types_rpc::MsgToL1::from).collect(), + transaction_hash: self.transaction_hash, + execution_status: self.execution_result.into(), + }, + } + } +} + +// FIXME: The `message_hash` field is currently defined as a u64 in the RPC schema, +// which is insufficient for representing the full 256-bit hash value. +// See: https://github.com/starknet-io/types-rs/issues/103 +impl L1HandlerTransactionReceipt { + pub fn to_starknet_types( + self, + finality_status: starknet_types_rpc::TxnFinalityStatus, + ) -> starknet_types_rpc::L1HandlerTxnReceipt { + starknet_types_rpc::L1HandlerTxnReceipt:: { + message_hash: self.message_hash.to_string(), + common_receipt_properties: starknet_types_rpc::CommonReceiptProperties { + actual_fee: self.actual_fee.into(), + events: self.events.into_iter().map(starknet_types_rpc::Event::from).collect(), + execution_resources: self.execution_resources.into(), + finality_status, + messages_sent: self.messages_sent.into_iter().map(starknet_types_rpc::MsgToL1::from).collect(), + transaction_hash: self.transaction_hash, + execution_status: self.execution_result.into(), + }, + } + } +} + +impl DeclareTransactionReceipt { + pub fn to_starknet_types( + self, + finality_status: starknet_types_rpc::TxnFinalityStatus, + ) -> starknet_types_rpc::DeclareTxnReceipt { + starknet_types_rpc::DeclareTxnReceipt:: { + common_receipt_properties: starknet_types_rpc::CommonReceiptProperties { + actual_fee: self.actual_fee.into(), + events: self.events.into_iter().map(starknet_types_rpc::Event::from).collect(), + execution_resources: self.execution_resources.into(), + finality_status, + messages_sent: self.messages_sent.into_iter().map(starknet_types_rpc::MsgToL1::from).collect(), + transaction_hash: self.transaction_hash, + execution_status: self.execution_result.into(), + }, + } + } +} + +impl DeployTransactionReceipt { + pub fn to_starknet_types( + self, + finality_status: starknet_types_rpc::TxnFinalityStatus, + ) -> starknet_types_rpc::DeployTxnReceipt { + starknet_types_rpc::DeployTxnReceipt:: { + contract_address: self.contract_address, + common_receipt_properties: starknet_types_rpc::CommonReceiptProperties { + actual_fee: self.actual_fee.into(), + events: self.events.into_iter().map(starknet_types_rpc::Event::from).collect(), + execution_resources: self.execution_resources.into(), + finality_status, + messages_sent: self.messages_sent.into_iter().map(starknet_types_rpc::MsgToL1::from).collect(), + transaction_hash: self.transaction_hash, + execution_status: self.execution_result.into(), + }, + } + } +} + +impl DeployAccountTransactionReceipt { + pub fn to_starknet_types( + self, + finality_status: starknet_types_rpc::TxnFinalityStatus, + ) -> starknet_types_rpc::DeployAccountTxnReceipt { + starknet_types_rpc::DeployAccountTxnReceipt:: { + contract_address: self.contract_address, + common_receipt_properties: starknet_types_rpc::CommonReceiptProperties { + actual_fee: self.actual_fee.into(), + events: self.events.into_iter().map(starknet_types_rpc::Event::from).collect(), + execution_resources: self.execution_resources.into(), + finality_status, + messages_sent: self.messages_sent.into_iter().map(starknet_types_rpc::MsgToL1::from).collect(), + transaction_hash: self.transaction_hash, + execution_status: self.execution_result.into(), + }, + } + } +} + +impl From for starknet_types_rpc::FeePayment { + fn from(fee: FeePayment) -> Self { + Self { amount: fee.amount, unit: fee.unit.into() } + } +} + +impl From for starknet_types_rpc::PriceUnit { + fn from(unit: PriceUnit) -> Self { + match unit { + PriceUnit::Wei => starknet_types_rpc::PriceUnit::Wei, + PriceUnit::Fri => starknet_types_rpc::PriceUnit::Fri, + } + } +} + +impl From for starknet_types_rpc::MsgToL1 { + fn from(msg: MsgToL1) -> Self { + Self { from_address: msg.from_address, to_address: msg.to_address, payload: msg.payload } + } +} + +impl From for starknet_types_rpc::Event { + fn from(event: Event) -> Self { + Self { + from_address: event.from_address, + event_content: starknet_types_rpc::EventContent { keys: event.keys, data: event.data }, + } + } +} + +impl From for starknet_types_rpc::ExecutionResources { + fn from(resources: ExecutionResources) -> Self { + Self { + bitwise_builtin_applications: nullify_zero(resources.bitwise_builtin_applications), + ec_op_builtin_applications: nullify_zero(resources.ec_op_builtin_applications), + ecdsa_builtin_applications: nullify_zero(resources.ecdsa_builtin_applications), + keccak_builtin_applications: nullify_zero(resources.keccak_builtin_applications), + memory_holes: nullify_zero(resources.memory_holes), + pedersen_builtin_applications: nullify_zero(resources.pedersen_builtin_applications), + poseidon_builtin_applications: nullify_zero(resources.poseidon_builtin_applications), + range_check_builtin_applications: nullify_zero(resources.range_check_builtin_applications), + segment_arena_builtin: nullify_zero(resources.segment_arena_builtin), + steps: resources.steps, + data_availability: resources.data_availability.into(), + } + } +} + +fn nullify_zero(u: u64) -> Option { + match u { + 0 => None, + _ => Some(u), + } +} + +impl From for starknet_types_rpc::DataAvailability { + fn from(resources: L1Gas) -> Self { + Self { l1_gas: resources.l1_gas, l1_data_gas: resources.l1_data_gas } + } +} + +impl From for starknet_types_rpc::ExecutionStatus { + fn from(result: ExecutionResult) -> Self { + match result { + ExecutionResult::Succeeded => starknet_types_rpc::ExecutionStatus::Successful, + ExecutionResult::Reverted { reason } => starknet_types_rpc::ExecutionStatus::Reverted(reason), + } + } +} diff --git a/crates/primitives/state_update/Cargo.toml b/crates/primitives/state_update/Cargo.toml index c40ee5eb8..c4ec97a91 100644 --- a/crates/primitives/state_update/Cargo.toml +++ b/crates/primitives/state_update/Cargo.toml @@ -17,8 +17,8 @@ targets = ["x86_64-unknown-linux-gnu"] [dependencies] # Starknet -starknet-core = { workspace = true } starknet-types-core = { workspace = true } +starknet-types-rpc = { workspace = true } # Other serde = { workspace = true, features = ["derive"] } diff --git a/crates/primitives/state_update/src/into_starknet_core.rs b/crates/primitives/state_update/src/into_starknet_types.rs similarity index 70% rename from crates/primitives/state_update/src/into_starknet_core.rs rename to crates/primitives/state_update/src/into_starknet_types.rs index 0fa25ab63..478bc783b 100644 --- a/crates/primitives/state_update/src/into_starknet_core.rs +++ b/crates/primitives/state_update/src/into_starknet_types.rs @@ -1,10 +1,12 @@ +use starknet_types_core::felt::Felt; + use crate::{ ContractStorageDiffItem, DeclaredClassItem, DeployedContractItem, NonceUpdate, PendingStateUpdate, ReplacedClassItem, StateDiff, StateUpdate, StorageEntry, }; -impl From for StateUpdate { - fn from(state_update: starknet_core::types::StateUpdate) -> Self { +impl From> for StateUpdate { + fn from(state_update: starknet_types_rpc::StateUpdate) -> Self { Self { block_hash: state_update.block_hash, old_root: state_update.old_root, @@ -14,7 +16,7 @@ impl From for StateUpdate { } } -impl From for starknet_core::types::StateUpdate { +impl From for starknet_types_rpc::StateUpdate { fn from(state_update: StateUpdate) -> Self { Self { block_hash: state_update.block_hash, @@ -25,20 +27,20 @@ impl From for starknet_core::types::StateUpdate { } } -impl From for PendingStateUpdate { - fn from(pending_state_update: starknet_core::types::PendingStateUpdate) -> Self { +impl From> for PendingStateUpdate { + fn from(pending_state_update: starknet_types_rpc::PendingStateUpdate) -> Self { Self { old_root: pending_state_update.old_root, state_diff: pending_state_update.state_diff.into() } } } -impl From for starknet_core::types::PendingStateUpdate { +impl From for starknet_types_rpc::PendingStateUpdate { fn from(pending_state_update: PendingStateUpdate) -> Self { Self { old_root: pending_state_update.old_root, state_diff: pending_state_update.state_diff.into() } } } -impl From for StateDiff { - fn from(state_diff: starknet_core::types::StateDiff) -> Self { +impl From> for StateDiff { + fn from(state_diff: starknet_types_rpc::StateDiff) -> Self { Self { storage_diffs: state_diff.storage_diffs.into_iter().map(|diff| diff.into()).collect(), deprecated_declared_classes: state_diff.deprecated_declared_classes, @@ -62,7 +64,7 @@ impl From for StateDiff { } } -impl From for starknet_core::types::StateDiff { +impl From for starknet_types_rpc::StateDiff { fn from(state_diff: StateDiff) -> Self { Self { storage_diffs: state_diff.storage_diffs.into_iter().map(|diff| diff.into()).collect(), @@ -87,8 +89,8 @@ impl From for starknet_core::types::StateDiff { } } -impl From for ContractStorageDiffItem { - fn from(contract_storage_diff_item: starknet_core::types::ContractStorageDiffItem) -> Self { +impl From> for ContractStorageDiffItem { + fn from(contract_storage_diff_item: starknet_types_rpc::ContractStorageDiffItem) -> Self { Self { address: contract_storage_diff_item.address, storage_entries: contract_storage_diff_item.storage_entries.into_iter().map(|entry| entry.into()).collect(), @@ -96,7 +98,7 @@ impl From for ContractStorageDiff } } -impl From for starknet_core::types::ContractStorageDiffItem { +impl From for starknet_types_rpc::ContractStorageDiffItem { fn from(contract_storage_diff_item: ContractStorageDiffItem) -> Self { Self { address: contract_storage_diff_item.address, @@ -105,20 +107,20 @@ impl From for starknet_core::types::ContractStorageDiff } } -impl From for StorageEntry { - fn from(storage_entry: starknet_core::types::StorageEntry) -> Self { +impl From> for StorageEntry { + fn from(storage_entry: starknet_types_rpc::KeyValuePair) -> Self { Self { key: storage_entry.key, value: storage_entry.value } } } -impl From for starknet_core::types::StorageEntry { +impl From for starknet_types_rpc::KeyValuePair { fn from(storage_entry: StorageEntry) -> Self { Self { key: storage_entry.key, value: storage_entry.value } } } -impl From for DeclaredClassItem { - fn from(declared_class_item: starknet_core::types::DeclaredClassItem) -> Self { +impl From> for DeclaredClassItem { + fn from(declared_class_item: starknet_types_rpc::NewClasses) -> Self { Self { class_hash: declared_class_item.class_hash, compiled_class_hash: declared_class_item.compiled_class_hash, @@ -126,7 +128,7 @@ impl From for DeclaredClassItem { } } -impl From for starknet_core::types::DeclaredClassItem { +impl From for starknet_types_rpc::NewClasses { fn from(declared_class_item: DeclaredClassItem) -> Self { Self { class_hash: declared_class_item.class_hash, @@ -135,37 +137,37 @@ impl From for starknet_core::types::DeclaredClassItem { } } -impl From for DeployedContractItem { - fn from(deployed_contract_item: starknet_core::types::DeployedContractItem) -> Self { +impl From> for DeployedContractItem { + fn from(deployed_contract_item: starknet_types_rpc::DeployedContractItem) -> Self { Self { address: deployed_contract_item.address, class_hash: deployed_contract_item.class_hash } } } -impl From for starknet_core::types::DeployedContractItem { +impl From for starknet_types_rpc::DeployedContractItem { fn from(deployed_contract_item: DeployedContractItem) -> Self { Self { address: deployed_contract_item.address, class_hash: deployed_contract_item.class_hash } } } -impl From for ReplacedClassItem { - fn from(replaced_class_item: starknet_core::types::ReplacedClassItem) -> Self { +impl From> for ReplacedClassItem { + fn from(replaced_class_item: starknet_types_rpc::ReplacedClass) -> Self { Self { contract_address: replaced_class_item.contract_address, class_hash: replaced_class_item.class_hash } } } -impl From for starknet_core::types::ReplacedClassItem { +impl From for starknet_types_rpc::ReplacedClass { fn from(replaced_class_item: ReplacedClassItem) -> Self { Self { contract_address: replaced_class_item.contract_address, class_hash: replaced_class_item.class_hash } } } -impl From for NonceUpdate { - fn from(nonce_update: starknet_core::types::NonceUpdate) -> Self { +impl From> for NonceUpdate { + fn from(nonce_update: starknet_types_rpc::NonceUpdate) -> Self { Self { contract_address: nonce_update.contract_address, nonce: nonce_update.nonce } } } -impl From for starknet_core::types::NonceUpdate { +impl From for starknet_types_rpc::NonceUpdate { fn from(nonce_update: NonceUpdate) -> Self { Self { contract_address: nonce_update.contract_address, nonce: nonce_update.nonce } } @@ -189,7 +191,7 @@ mod test { state_diff: dummy_state_diff(), }; - assert_consistent_conversion::<_, starknet_core::types::StateUpdate>(state_update); + assert_consistent_conversion::<_, starknet_types_rpc::StateUpdate>(state_update); } #[test] @@ -197,6 +199,6 @@ mod test { let pending_state_update = PendingStateUpdate { old_root: Felt::from_hex_unchecked("0x5678"), state_diff: dummy_state_diff() }; - assert_consistent_conversion::<_, starknet_core::types::PendingStateUpdate>(pending_state_update); + assert_consistent_conversion::<_, starknet_types_rpc::PendingStateUpdate>(pending_state_update); } } diff --git a/crates/primitives/state_update/src/lib.rs b/crates/primitives/state_update/src/lib.rs index 0b5ca0b2c..a6d3fd9a1 100644 --- a/crates/primitives/state_update/src/lib.rs +++ b/crates/primitives/state_update/src/lib.rs @@ -1,4 +1,4 @@ -mod into_starknet_core; +mod into_starknet_types; use starknet_types_core::{ felt::Felt, diff --git a/crates/primitives/transactions/Cargo.toml b/crates/primitives/transactions/Cargo.toml index 26485336d..04c4b7c60 100644 --- a/crates/primitives/transactions/Cargo.toml +++ b/crates/primitives/transactions/Cargo.toml @@ -28,11 +28,12 @@ cairo-lang-utils = { workspace = true } cairo-vm = { workspace = true } starknet-core = { workspace = true } starknet-types-core = { workspace = true } +starknet-types-rpc = { workspace = true } starknet_api = { workspace = true } # Other anyhow = { workspace = true } - +base64 = { workspace = true } num-bigint = { workspace = true } serde = { workspace = true, features = ["derive"] } serde_with = { workspace = true } diff --git a/crates/primitives/transactions/src/broadcasted_to_blockifier.rs b/crates/primitives/transactions/src/broadcasted_to_blockifier.rs index 8049fa4d1..4c0ba4dd7 100644 --- a/crates/primitives/transactions/src/broadcasted_to_blockifier.rs +++ b/crates/primitives/transactions/src/broadcasted_to_blockifier.rs @@ -1,12 +1,13 @@ use std::sync::Arc; use crate::{ - into_starknet_api::TransactionApiError, BroadcastedDeclareTransactionV0, Transaction, TransactionWithHash, + from_broadcasted_transaction::is_query, into_starknet_api::TransactionApiError, BroadcastedDeclareTransactionV0, + Transaction, TransactionWithHash, }; use blockifier::{execution::errors::ContractClassError, transaction::errors::TransactionExecutionError}; use mp_chain_config::StarknetVersion; use mp_class::{ - compile::ClassCompilationError, CompressedLegacyContractClass, ConvertedClass, FlattenedSierraClass, + class_hash, compile::ClassCompilationError, CompressedLegacyContractClass, ConvertedClass, FlattenedSierraClass, LegacyClassInfo, LegacyConvertedClass, SierraClassInfo, SierraConvertedClass, }; use starknet_api::transaction::TransactionHash; @@ -20,6 +21,8 @@ pub enum BroadcastedToBlockifierError { ProgramError(#[from] cairo_vm::types::errors::program_errors::ProgramError), #[error("Failed to compute legacy class hash: {0}")] ComputeLegacyClassHashFailed(anyhow::Error), + #[error("Failed to compute sierra class hash: {0}")] + ComputeSierraClassHashFailed(#[from] class_hash::ComputeClassHashError), #[error("Failed to convert transaction to starkneti-api: {0}")] ConvertToTxApiError(#[from] TransactionApiError), #[error("Failed to convert transaction to blockifier: {0}")] @@ -30,6 +33,8 @@ pub enum BroadcastedToBlockifierError { LegacyContractClassesNotSupported, #[error("Compiled class hash mismatch: expected {expected}, actual {compilation}")] CompiledClassHashMismatch { expected: Felt, compilation: Felt }, + #[error("Failed to convert base64 program to cairo program: {0}")] + Base64ToCairoError(#[from] base64::DecodeError), } pub fn broadcasted_declare_v0_to_blockifier( @@ -76,7 +81,7 @@ pub fn broadcasted_declare_v0_to_blockifier( } pub fn broadcasted_to_blockifier( - transaction: starknet_core::types::BroadcastedTransaction, + transaction: starknet_types_rpc::BroadcastedTxn, chain_id: Felt, starknet_version: StarknetVersion, ) -> Result< @@ -84,12 +89,19 @@ pub fn broadcasted_to_blockifier( BroadcastedToBlockifierError, > { let (class_info, class_hash, extra_class_info) = match &transaction { - starknet_core::types::BroadcastedTransaction::Declare(tx) => match tx { - starknet_core::types::BroadcastedDeclareTransaction::V1(tx) => { - let compressed_legacy_class: CompressedLegacyContractClass = (*tx.contract_class).clone().into(); + starknet_types_rpc::BroadcastedTxn::Declare(tx) => match tx { + starknet_types_rpc::BroadcastedDeclareTxn::V1(starknet_types_rpc::BroadcastedDeclareTxnV1 { + contract_class, + .. + }) + | starknet_types_rpc::BroadcastedDeclareTxn::QueryV1(starknet_types_rpc::BroadcastedDeclareTxnV1 { + contract_class, + .. + }) => { + let compressed_legacy_class: CompressedLegacyContractClass = contract_class.clone().try_into()?; let class_hash = compressed_legacy_class.compute_class_hash().unwrap(); tracing::debug!("Computed legacy class hash: {:?}", class_hash); - let compressed_legacy_class: CompressedLegacyContractClass = (*tx.contract_class).clone().into(); + let compressed_legacy_class: CompressedLegacyContractClass = contract_class.clone().try_into()?; let class_blockifier = compressed_legacy_class .to_blockifier_class() .map_err(BroadcastedToBlockifierError::CompilationFailed)?; @@ -101,51 +113,47 @@ pub fn broadcasted_to_blockifier( Some(ConvertedClass::Legacy(LegacyConvertedClass { class_hash, info: class_info })), ) } - starknet_core::types::BroadcastedDeclareTransaction::V2(tx) => { - let class_hash = tx.contract_class.class_hash(); - let flatten_sierra_class: FlattenedSierraClass = (*tx.contract_class).clone().into(); - let (compiled_class_hash, compiled) = flatten_sierra_class.compile_to_casm()?; - if tx.compiled_class_hash != compiled_class_hash { + starknet_types_rpc::BroadcastedDeclareTxn::V2(starknet_types_rpc::BroadcastedDeclareTxnV2 { + compiled_class_hash, + contract_class, + .. + }) + | starknet_types_rpc::BroadcastedDeclareTxn::QueryV2(starknet_types_rpc::BroadcastedDeclareTxnV2 { + compiled_class_hash, + contract_class, + .. + }) + | starknet_types_rpc::BroadcastedDeclareTxn::V3(starknet_types_rpc::BroadcastedDeclareTxnV3 { + compiled_class_hash, + contract_class, + .. + }) + | starknet_types_rpc::BroadcastedDeclareTxn::QueryV3(starknet_types_rpc::BroadcastedDeclareTxnV3 { + compiled_class_hash, + contract_class, + .. + }) => { + let flatten_sierra_class: FlattenedSierraClass = contract_class.clone().into(); + let class_hash = flatten_sierra_class + .compute_class_hash() + .map_err(BroadcastedToBlockifierError::ComputeSierraClassHashFailed)?; + let (compiled_class_hash_computed, compiled) = flatten_sierra_class.compile_to_casm()?; + if compiled_class_hash != &compiled_class_hash_computed { return Err(BroadcastedToBlockifierError::CompiledClassHashMismatch { - expected: tx.compiled_class_hash, - compilation: compiled_class_hash, + expected: *compiled_class_hash, + compilation: compiled_class_hash_computed, }); } - let class_info = - SierraClassInfo { contract_class: Arc::new(flatten_sierra_class), compiled_class_hash }; + let class_info = SierraClassInfo { + contract_class: Arc::new(flatten_sierra_class), + compiled_class_hash: compiled_class_hash_computed, + }; ( Some(blockifier::execution::contract_class::ClassInfo::new( &compiled.to_blockifier_class()?, - tx.contract_class.sierra_program.len(), - tx.contract_class.abi.len(), - )?), - Some(class_hash), - Some(ConvertedClass::Sierra(SierraConvertedClass { - class_hash, - info: class_info, - compiled: Arc::new(compiled), - })), - ) - } - starknet_core::types::BroadcastedDeclareTransaction::V3(tx) => { - let class_hash = tx.contract_class.class_hash(); - let flatten_sierra_class: FlattenedSierraClass = (*tx.contract_class).clone().into(); - let (compiled_class_hash, compiled) = flatten_sierra_class.compile_to_casm()?; - if tx.compiled_class_hash != compiled_class_hash { - return Err(BroadcastedToBlockifierError::CompiledClassHashMismatch { - expected: tx.compiled_class_hash, - compilation: compiled_class_hash, - }); - } - let class_info = - SierraClassInfo { contract_class: Arc::new(flatten_sierra_class), compiled_class_hash }; - - ( - Some(blockifier::execution::contract_class::ClassInfo::new( - &compiled.to_blockifier_class()?, - tx.contract_class.sierra_program.len(), - tx.contract_class.abi.len(), + contract_class.sierra_program.len(), + contract_class.abi.as_ref().map(|abi| abi.len()).unwrap_or(0), )?), Some(class_hash), Some(ConvertedClass::Sierra(SierraConvertedClass { @@ -180,21 +188,3 @@ pub fn broadcasted_to_blockifier( extra_class_info, )) } - -fn is_query(transaction: &starknet_core::types::BroadcastedTransaction) -> bool { - match transaction { - starknet_core::types::BroadcastedTransaction::Invoke(tx) => match tx { - starknet_core::types::BroadcastedInvokeTransaction::V1(tx) => tx.is_query, - starknet_core::types::BroadcastedInvokeTransaction::V3(tx) => tx.is_query, - }, - starknet_core::types::BroadcastedTransaction::Declare(tx) => match tx { - starknet_core::types::BroadcastedDeclareTransaction::V1(tx) => tx.is_query, - starknet_core::types::BroadcastedDeclareTransaction::V2(tx) => tx.is_query, - starknet_core::types::BroadcastedDeclareTransaction::V3(tx) => tx.is_query, - }, - starknet_core::types::BroadcastedTransaction::DeployAccount(tx) => match tx { - starknet_core::types::BroadcastedDeployAccountTransaction::V1(tx) => tx.is_query, - starknet_core::types::BroadcastedDeployAccountTransaction::V3(tx) => tx.is_query, - }, - } -} diff --git a/crates/primitives/transactions/src/from_broadcasted_transaction.rs b/crates/primitives/transactions/src/from_broadcasted_transaction.rs index a6f5e54cc..c76e92406 100644 --- a/crates/primitives/transactions/src/from_broadcasted_transaction.rs +++ b/crates/primitives/transactions/src/from_broadcasted_transaction.rs @@ -3,29 +3,28 @@ use starknet_types_core::felt::Felt; use crate::{ BroadcastedDeclareTransactionV0, DeclareTransaction, DeclareTransactionV0, DeclareTransactionV1, - DeclareTransactionV2, DeclareTransactionV3, DeployAccountTransaction, DeployAccountTransactionV1, - DeployAccountTransactionV3, InvokeTransaction, InvokeTransactionV1, InvokeTransactionV3, Transaction, + DeclareTransactionV2, DeclareTransactionV3, DeployAccountTransaction, InvokeTransaction, Transaction, TransactionWithHash, }; // class_hash is required for DeclareTransaction impl TransactionWithHash { pub fn from_broadcasted( - tx: starknet_core::types::BroadcastedTransaction, + tx: starknet_types_rpc::BroadcastedTxn, chain_id: Felt, starknet_version: StarknetVersion, class_hash: Option, ) -> Self { let is_query = is_query(&tx); let transaction: Transaction = match tx { - starknet_core::types::BroadcastedTransaction::Invoke(tx) => Transaction::Invoke(tx.into()), - starknet_core::types::BroadcastedTransaction::Declare(tx) => { + starknet_types_rpc::BroadcastedTxn::Invoke(tx) => Transaction::Invoke(tx.into()), + starknet_types_rpc::BroadcastedTxn::Declare(tx) => { Transaction::Declare(DeclareTransaction::from_broadcasted( tx, class_hash.expect("Class hash must be provided for DeclareTransaction"), )) } - starknet_core::types::BroadcastedTransaction::DeployAccount(tx) => Transaction::DeployAccount(tx.into()), + starknet_types_rpc::BroadcastedTxn::DeployAccount(tx) => Transaction::DeployAccount(tx.into()), }; let hash = transaction.compute_hash(chain_id, starknet_version, is_query); Self { hash, transaction } @@ -47,54 +46,32 @@ impl TransactionWithHash { } } -impl From for InvokeTransaction { - fn from(tx: starknet_core::types::BroadcastedInvokeTransaction) -> Self { +impl From> for InvokeTransaction { + fn from(tx: starknet_types_rpc::BroadcastedInvokeTxn) -> Self { match tx { - starknet_core::types::BroadcastedInvokeTransaction::V1(tx) => InvokeTransaction::V1(tx.into()), - starknet_core::types::BroadcastedInvokeTransaction::V3(tx) => InvokeTransaction::V3(tx.into()), - } - } -} - -impl From for InvokeTransactionV1 { - fn from(tx: starknet_core::types::BroadcastedInvokeTransactionV1) -> Self { - Self { - sender_address: tx.sender_address, - calldata: tx.calldata, - max_fee: tx.max_fee, - signature: tx.signature, - nonce: tx.nonce, - } - } -} - -impl From for InvokeTransactionV3 { - fn from(tx: starknet_core::types::BroadcastedInvokeTransactionV3) -> Self { - Self { - sender_address: tx.sender_address, - calldata: tx.calldata, - signature: tx.signature, - nonce: tx.nonce, - resource_bounds: tx.resource_bounds.into(), - tip: tx.tip, - paymaster_data: tx.paymaster_data, - account_deployment_data: tx.account_deployment_data, - nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), - fee_data_availability_mode: tx.fee_data_availability_mode.into(), + starknet_types_rpc::BroadcastedInvokeTxn::V0(tx) => InvokeTransaction::V0(tx.into()), + starknet_types_rpc::BroadcastedInvokeTxn::V1(tx) => InvokeTransaction::V1(tx.into()), + starknet_types_rpc::BroadcastedInvokeTxn::V3(tx) => InvokeTransaction::V3(tx.into()), + starknet_types_rpc::BroadcastedInvokeTxn::QueryV0(tx) => InvokeTransaction::V0(tx.into()), + starknet_types_rpc::BroadcastedInvokeTxn::QueryV1(tx) => InvokeTransaction::V1(tx.into()), + starknet_types_rpc::BroadcastedInvokeTxn::QueryV3(tx) => InvokeTransaction::V3(tx.into()), } } } impl DeclareTransaction { - fn from_broadcasted(tx: starknet_core::types::BroadcastedDeclareTransaction, class_hash: Felt) -> Self { + fn from_broadcasted(tx: starknet_types_rpc::BroadcastedDeclareTxn, class_hash: Felt) -> Self { match tx { - starknet_core::types::BroadcastedDeclareTransaction::V1(tx) => { + starknet_types_rpc::BroadcastedDeclareTxn::V1(tx) + | starknet_types_rpc::BroadcastedDeclareTxn::QueryV1(tx) => { DeclareTransaction::V1(DeclareTransactionV1::from_broadcasted(tx, class_hash)) } - starknet_core::types::BroadcastedDeclareTransaction::V2(tx) => { + starknet_types_rpc::BroadcastedDeclareTxn::V2(tx) + | starknet_types_rpc::BroadcastedDeclareTxn::QueryV2(tx) => { DeclareTransaction::V2(DeclareTransactionV2::from_broadcasted(tx, class_hash)) } - starknet_core::types::BroadcastedDeclareTransaction::V3(tx) => { + starknet_types_rpc::BroadcastedDeclareTxn::V3(tx) + | starknet_types_rpc::BroadcastedDeclareTxn::QueryV3(tx) => { DeclareTransaction::V3(DeclareTransactionV3::from_broadcasted(tx, class_hash)) } } @@ -112,7 +89,7 @@ impl DeclareTransactionV0 { } impl DeclareTransactionV1 { - fn from_broadcasted(tx: starknet_core::types::BroadcastedDeclareTransactionV1, class_hash: Felt) -> Self { + fn from_broadcasted(tx: starknet_types_rpc::BroadcastedDeclareTxnV1, class_hash: Felt) -> Self { Self { sender_address: tx.sender_address, max_fee: tx.max_fee, @@ -124,7 +101,7 @@ impl DeclareTransactionV1 { } impl DeclareTransactionV2 { - fn from_broadcasted(tx: starknet_core::types::BroadcastedDeclareTransactionV2, class_hash: Felt) -> Self { + fn from_broadcasted(tx: starknet_types_rpc::BroadcastedDeclareTxnV2, class_hash: Felt) -> Self { Self { sender_address: tx.sender_address, compiled_class_hash: tx.compiled_class_hash, @@ -137,7 +114,7 @@ impl DeclareTransactionV2 { } impl DeclareTransactionV3 { - fn from_broadcasted(tx: starknet_core::types::BroadcastedDeclareTransactionV3, class_hash: Felt) -> Self { + fn from_broadcasted(tx: starknet_types_rpc::BroadcastedDeclareTxnV3, class_hash: Felt) -> Self { Self { sender_address: tx.sender_address, compiled_class_hash: tx.compiled_class_hash, @@ -154,63 +131,33 @@ impl DeclareTransactionV3 { } } -impl From for DeployAccountTransaction { - fn from(tx: starknet_core::types::BroadcastedDeployAccountTransaction) -> Self { +impl From> for DeployAccountTransaction { + fn from(tx: starknet_types_rpc::BroadcastedDeployAccountTxn) -> Self { match tx { - starknet_core::types::BroadcastedDeployAccountTransaction::V1(tx) => { - DeployAccountTransaction::V1(tx.into()) - } - starknet_core::types::BroadcastedDeployAccountTransaction::V3(tx) => { - DeployAccountTransaction::V3(tx.into()) - } + starknet_types_rpc::BroadcastedDeployAccountTxn::V1(tx) + | starknet_types_rpc::BroadcastedDeployAccountTxn::QueryV1(tx) => DeployAccountTransaction::V1(tx.into()), + starknet_types_rpc::BroadcastedDeployAccountTxn::V3(tx) + | starknet_types_rpc::BroadcastedDeployAccountTxn::QueryV3(tx) => DeployAccountTransaction::V3(tx.into()), } } } -impl From for DeployAccountTransactionV1 { - fn from(tx: starknet_core::types::BroadcastedDeployAccountTransactionV1) -> Self { - Self { - max_fee: tx.max_fee, - signature: tx.signature, - nonce: tx.nonce, - contract_address_salt: tx.contract_address_salt, - constructor_calldata: tx.constructor_calldata, - class_hash: tx.class_hash, - } - } -} +pub(crate) fn is_query(tx: &starknet_types_rpc::BroadcastedTxn) -> bool { + use starknet_types_rpc::{ + BroadcastedDeclareTxn, BroadcastedDeployAccountTxn, BroadcastedInvokeTxn, BroadcastedTxn, + }; -impl From for DeployAccountTransactionV3 { - fn from(tx: starknet_core::types::BroadcastedDeployAccountTransactionV3) -> Self { - Self { - signature: tx.signature, - nonce: tx.nonce, - contract_address_salt: tx.contract_address_salt, - constructor_calldata: tx.constructor_calldata, - class_hash: tx.class_hash, - resource_bounds: tx.resource_bounds.into(), - tip: tx.tip, - paymaster_data: tx.paymaster_data, - nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), - fee_data_availability_mode: tx.fee_data_availability_mode.into(), - } - } -} - -fn is_query(tx: &starknet_core::types::BroadcastedTransaction) -> bool { match tx { - starknet_core::types::BroadcastedTransaction::Invoke(tx) => match tx { - starknet_core::types::BroadcastedInvokeTransaction::V1(tx) => tx.is_query, - starknet_core::types::BroadcastedInvokeTransaction::V3(tx) => tx.is_query, - }, - starknet_core::types::BroadcastedTransaction::Declare(tx) => match tx { - starknet_core::types::BroadcastedDeclareTransaction::V1(tx) => tx.is_query, - starknet_core::types::BroadcastedDeclareTransaction::V2(tx) => tx.is_query, - starknet_core::types::BroadcastedDeclareTransaction::V3(tx) => tx.is_query, - }, - starknet_core::types::BroadcastedTransaction::DeployAccount(tx) => match tx { - starknet_core::types::BroadcastedDeployAccountTransaction::V1(tx) => tx.is_query, - starknet_core::types::BroadcastedDeployAccountTransaction::V3(tx) => tx.is_query, - }, + BroadcastedTxn::Invoke(tx) => matches!( + tx, + BroadcastedInvokeTxn::QueryV0(_) | BroadcastedInvokeTxn::QueryV1(_) | BroadcastedInvokeTxn::QueryV3(_) + ), + BroadcastedTxn::Declare(tx) => matches!( + tx, + BroadcastedDeclareTxn::QueryV1(_) | BroadcastedDeclareTxn::QueryV2(_) | BroadcastedDeclareTxn::QueryV3(_) + ), + BroadcastedTxn::DeployAccount(tx) => { + matches!(tx, BroadcastedDeployAccountTxn::QueryV1(_) | BroadcastedDeployAccountTxn::QueryV3(_)) + } } } diff --git a/crates/primitives/transactions/src/from_starknet_core.rs b/crates/primitives/transactions/src/from_starknet_types.rs similarity index 51% rename from crates/primitives/transactions/src/from_starknet_core.rs rename to crates/primitives/transactions/src/from_starknet_types.rs index eb3c9ceac..28789e94f 100644 --- a/crates/primitives/transactions/src/from_starknet_core.rs +++ b/crates/primitives/transactions/src/from_starknet_types.rs @@ -1,3 +1,5 @@ +use starknet_types_core::felt::Felt; + use crate::{ DeclareTransaction, DeclareTransactionV0, DeclareTransactionV1, DeclareTransactionV2, DeclareTransactionV3, DeployAccountTransaction, DeployAccountTransactionV1, DeployAccountTransactionV3, DeployTransaction, @@ -5,30 +7,30 @@ use crate::{ Transaction, }; -impl From for Transaction { - fn from(tx: starknet_core::types::Transaction) -> Self { +impl From> for Transaction { + fn from(tx: starknet_types_rpc::Txn) -> Self { match tx { - starknet_core::types::Transaction::Invoke(tx) => Self::Invoke(tx.into()), - starknet_core::types::Transaction::L1Handler(tx) => Self::L1Handler(tx.into()), - starknet_core::types::Transaction::Declare(tx) => Self::Declare(tx.into()), - starknet_core::types::Transaction::Deploy(tx) => Self::Deploy(tx.into()), - starknet_core::types::Transaction::DeployAccount(tx) => Self::DeployAccount(tx.into()), + starknet_types_rpc::Txn::Invoke(tx) => Self::Invoke(tx.into()), + starknet_types_rpc::Txn::L1Handler(tx) => Self::L1Handler(tx.into()), + starknet_types_rpc::Txn::Declare(tx) => Self::Declare(tx.into()), + starknet_types_rpc::Txn::Deploy(tx) => Self::Deploy(tx.into()), + starknet_types_rpc::Txn::DeployAccount(tx) => Self::DeployAccount(tx.into()), } } } -impl From for InvokeTransaction { - fn from(tx: starknet_core::types::InvokeTransaction) -> Self { +impl From> for InvokeTransaction { + fn from(tx: starknet_types_rpc::InvokeTxn) -> Self { match tx { - starknet_core::types::InvokeTransaction::V0(tx) => Self::V0(tx.into()), - starknet_core::types::InvokeTransaction::V1(tx) => Self::V1(tx.into()), - starknet_core::types::InvokeTransaction::V3(tx) => Self::V3(tx.into()), + starknet_types_rpc::InvokeTxn::V0(tx) => Self::V0(tx.into()), + starknet_types_rpc::InvokeTxn::V1(tx) => Self::V1(tx.into()), + starknet_types_rpc::InvokeTxn::V3(tx) => Self::V3(tx.into()), } } } -impl From for InvokeTransactionV0 { - fn from(tx: starknet_core::types::InvokeTransactionV0) -> Self { +impl From> for InvokeTransactionV0 { + fn from(tx: starknet_types_rpc::InvokeTxnV0) -> Self { Self { max_fee: tx.max_fee, signature: tx.signature, @@ -39,8 +41,8 @@ impl From for InvokeTransactionV0 { } } -impl From for InvokeTransactionV1 { - fn from(tx: starknet_core::types::InvokeTransactionV1) -> Self { +impl From> for InvokeTransactionV1 { + fn from(tx: starknet_types_rpc::InvokeTxnV1) -> Self { Self { sender_address: tx.sender_address, calldata: tx.calldata, @@ -51,8 +53,8 @@ impl From for InvokeTransactionV1 { } } -impl From for InvokeTransactionV3 { - fn from(tx: starknet_core::types::InvokeTransactionV3) -> Self { +impl From> for InvokeTransactionV3 { + fn from(tx: starknet_types_rpc::InvokeTxnV3) -> Self { Self { sender_address: tx.sender_address, calldata: tx.calldata, @@ -68,31 +70,31 @@ impl From for InvokeTransactionV3 { } } -impl From for L1HandlerTransaction { - fn from(tx: starknet_core::types::L1HandlerTransaction) -> Self { +impl From> for L1HandlerTransaction { + fn from(tx: starknet_types_rpc::L1HandlerTxn) -> Self { Self { - version: tx.version, + version: Felt::from_hex(&tx.version).unwrap_or(Felt::ZERO), nonce: tx.nonce, - contract_address: tx.contract_address, - entry_point_selector: tx.entry_point_selector, - calldata: tx.calldata, + contract_address: tx.function_call.contract_address, + entry_point_selector: tx.function_call.entry_point_selector, + calldata: tx.function_call.calldata, } } } -impl From for DeclareTransaction { - fn from(tx: starknet_core::types::DeclareTransaction) -> Self { +impl From> for DeclareTransaction { + fn from(tx: starknet_types_rpc::DeclareTxn) -> Self { match tx { - starknet_core::types::DeclareTransaction::V0(tx) => Self::V0(tx.into()), - starknet_core::types::DeclareTransaction::V1(tx) => Self::V1(tx.into()), - starknet_core::types::DeclareTransaction::V2(tx) => Self::V2(tx.into()), - starknet_core::types::DeclareTransaction::V3(tx) => Self::V3(tx.into()), + starknet_types_rpc::DeclareTxn::V0(tx) => Self::V0(tx.into()), + starknet_types_rpc::DeclareTxn::V1(tx) => Self::V1(tx.into()), + starknet_types_rpc::DeclareTxn::V2(tx) => Self::V2(tx.into()), + starknet_types_rpc::DeclareTxn::V3(tx) => Self::V3(tx.into()), } } } -impl From for DeclareTransactionV0 { - fn from(tx: starknet_core::types::DeclareTransactionV0) -> Self { +impl From> for DeclareTransactionV0 { + fn from(tx: starknet_types_rpc::DeclareTxnV0) -> Self { Self { sender_address: tx.sender_address, max_fee: tx.max_fee, @@ -102,8 +104,8 @@ impl From for DeclareTransactionV0 { } } -impl From for DeclareTransactionV1 { - fn from(tx: starknet_core::types::DeclareTransactionV1) -> Self { +impl From> for DeclareTransactionV1 { + fn from(tx: starknet_types_rpc::DeclareTxnV1) -> Self { Self { sender_address: tx.sender_address, max_fee: tx.max_fee, @@ -114,8 +116,8 @@ impl From for DeclareTransactionV1 { } } -impl From for DeclareTransactionV2 { - fn from(tx: starknet_core::types::DeclareTransactionV2) -> Self { +impl From> for DeclareTransactionV2 { + fn from(tx: starknet_types_rpc::DeclareTxnV2) -> Self { Self { sender_address: tx.sender_address, compiled_class_hash: tx.compiled_class_hash, @@ -127,8 +129,8 @@ impl From for DeclareTransactionV2 { } } -impl From for DeclareTransactionV3 { - fn from(tx: starknet_core::types::DeclareTransactionV3) -> Self { +impl From> for DeclareTransactionV3 { + fn from(tx: starknet_types_rpc::DeclareTxnV3) -> Self { Self { sender_address: tx.sender_address, compiled_class_hash: tx.compiled_class_hash, @@ -145,8 +147,8 @@ impl From for DeclareTransactionV3 { } } -impl From for DeployTransaction { - fn from(tx: starknet_core::types::DeployTransaction) -> Self { +impl From> for DeployTransaction { + fn from(tx: starknet_types_rpc::DeployTxn) -> Self { Self { version: tx.version, contract_address_salt: tx.contract_address_salt, @@ -156,17 +158,17 @@ impl From for DeployTransaction { } } -impl From for DeployAccountTransaction { - fn from(tx: starknet_core::types::DeployAccountTransaction) -> Self { +impl From> for DeployAccountTransaction { + fn from(tx: starknet_types_rpc::DeployAccountTxn) -> Self { match tx { - starknet_core::types::DeployAccountTransaction::V1(tx) => Self::V1(tx.into()), - starknet_core::types::DeployAccountTransaction::V3(tx) => Self::V3(tx.into()), + starknet_types_rpc::DeployAccountTxn::V1(tx) => Self::V1(tx.into()), + starknet_types_rpc::DeployAccountTxn::V3(tx) => Self::V3(tx.into()), } } } -impl From for DeployAccountTransactionV1 { - fn from(tx: starknet_core::types::DeployAccountTransactionV1) -> Self { +impl From> for DeployAccountTransactionV1 { + fn from(tx: starknet_types_rpc::DeployAccountTxnV1) -> Self { Self { max_fee: tx.max_fee, signature: tx.signature, @@ -177,8 +179,8 @@ impl From for DeployAccountTra } } } -impl From for DeployAccountTransactionV3 { - fn from(tx: starknet_core::types::DeployAccountTransactionV3) -> Self { +impl From> for DeployAccountTransactionV3 { + fn from(tx: starknet_types_rpc::DeployAccountTxnV3) -> Self { Self { signature: tx.signature, nonce: tx.nonce, diff --git a/crates/primitives/transactions/src/lib.rs b/crates/primitives/transactions/src/lib.rs index e4b196137..bca511b5f 100644 --- a/crates/primitives/transactions/src/lib.rs +++ b/crates/primitives/transactions/src/lib.rs @@ -5,14 +5,14 @@ use std::sync::Arc; mod broadcasted_to_blockifier; mod from_blockifier; mod from_broadcasted_transaction; -mod from_starknet_core; +mod from_starknet_types; mod into_starknet_api; -mod to_starknet_core; +mod to_starknet_types; pub mod compute_hash; pub mod utils; -use mp_convert::{hex_serde::U128AsHex, hex_serde::U64AsHex, ToFelt}; +use mp_convert::hex_serde::{U128AsHex, U64AsHex}; // pub use from_starknet_provider::TransactionTypeError; pub use broadcasted_to_blockifier::{ broadcasted_declare_v0_to_blockifier, broadcasted_to_blockifier, BroadcastedToBlockifierError, @@ -363,14 +363,15 @@ impl L1HandlerTransaction { } } -impl From for L1HandlerTransaction { - fn from(msg: starknet_core::types::MsgFromL1) -> Self { +impl From> for L1HandlerTransaction { + fn from(msg: starknet_types_rpc::MsgFromL1) -> Self { Self { version: Felt::ZERO, nonce: 0, contract_address: msg.to_address, entry_point_selector: msg.entry_point_selector, - calldata: std::iter::once(msg.from_address.to_felt()).chain(msg.payload).collect(), + // TODO: fix type from_address on starknet_types_rpc::MsgFromL1 + calldata: std::iter::once(Felt::from_hex(&msg.from_address).unwrap()).chain(msg.payload).collect(), } } } @@ -674,37 +675,31 @@ pub struct ResourceBounds { pub max_price_per_unit: u128, } -impl From for starknet_core::types::ResourceBoundsMapping { +impl From for starknet_types_rpc::ResourceBoundsMapping { fn from(resource: ResourceBoundsMapping) -> Self { - Self { - l1_gas: starknet_core::types::ResourceBounds { - max_amount: resource.l1_gas.max_amount, - max_price_per_unit: resource.l1_gas.max_price_per_unit, - }, - l2_gas: starknet_core::types::ResourceBounds { - max_amount: resource.l2_gas.max_amount, - max_price_per_unit: resource.l2_gas.max_price_per_unit, - }, - } + Self { l1_gas: resource.l1_gas.into(), l2_gas: resource.l2_gas.into() } } } -impl From for ResourceBoundsMapping { - fn from(resource: starknet_core::types::ResourceBoundsMapping) -> Self { - Self { - l1_gas: ResourceBounds { - max_amount: resource.l1_gas.max_amount, - max_price_per_unit: resource.l1_gas.max_price_per_unit, - }, - l2_gas: ResourceBounds { - max_amount: resource.l2_gas.max_amount, - max_price_per_unit: resource.l2_gas.max_price_per_unit, - }, - } +impl From for ResourceBoundsMapping { + fn from(resource: starknet_types_rpc::ResourceBoundsMapping) -> Self { + Self { l1_gas: resource.l1_gas.into(), l2_gas: resource.l2_gas.into() } + } +} + +impl From for starknet_types_rpc::ResourceBounds { + fn from(resource: ResourceBounds) -> Self { + Self { max_amount: resource.max_amount, max_price_per_unit: resource.max_price_per_unit } + } +} + +impl From for ResourceBounds { + fn from(resource: starknet_types_rpc::ResourceBounds) -> Self { + Self { max_amount: resource.max_amount, max_price_per_unit: resource.max_price_per_unit } } } -impl From for starknet_core::types::DataAvailabilityMode { +impl From for starknet_types_rpc::DaMode { fn from(da_mode: DataAvailabilityMode) -> Self { match da_mode { DataAvailabilityMode::L1 => Self::L1, @@ -713,11 +708,11 @@ impl From for starknet_core::types::DataAvailabilityMode { } } -impl From for DataAvailabilityMode { - fn from(da_mode: starknet_core::types::DataAvailabilityMode) -> Self { +impl From for DataAvailabilityMode { + fn from(da_mode: starknet_types_rpc::DaMode) -> Self { match da_mode { - starknet_core::types::DataAvailabilityMode::L1 => Self::L1, - starknet_core::types::DataAvailabilityMode::L2 => Self::L2, + starknet_types_rpc::DaMode::L1 => Self::L1, + starknet_types_rpc::DaMode::L2 => Self::L2, } } } @@ -955,9 +950,8 @@ mod tests { #[test] fn test_msg_to_l1_handler() { - let msg = starknet_core::types::MsgFromL1 { - from_address: starknet_core::types::EthAddress::from_hex("0x0000000000000000000000000000000000000001") - .unwrap(), + let msg = starknet_types_rpc::MsgFromL1 { + from_address: "0x0000000000000000000000000000000000000001".to_string(), to_address: Felt::from(2), entry_point_selector: Felt::from(3), payload: vec![Felt::from(4), Felt::from(5)], @@ -981,7 +975,7 @@ mod tests { l2_gas: ResourceBounds { max_amount: 3, max_price_per_unit: 4 }, }; - let starknet_resource_mapping: starknet_core::types::ResourceBoundsMapping = resource_mapping.clone().into(); + let starknet_resource_mapping: starknet_types_rpc::ResourceBoundsMapping = resource_mapping.clone().into(); let resource_mapping_back: ResourceBoundsMapping = starknet_resource_mapping.into(); assert_eq!(resource_mapping, resource_mapping_back); @@ -990,7 +984,7 @@ mod tests { #[test] fn test_data_availability_mode_conversion() { let da_mode = DataAvailabilityMode::L1; - let starknet_da_mode: starknet_core::types::DataAvailabilityMode = da_mode.into(); + let starknet_da_mode: starknet_types_rpc::DaMode = da_mode.into(); let da_mode_back: DataAvailabilityMode = starknet_da_mode.into(); assert_eq!(da_mode, da_mode_back); @@ -999,7 +993,7 @@ mod tests { #[test] fn test_broadcasted_declare_transaction_v0_serialization() { let contract_class = CompressedLegacyContractClass { - program: Vec::new(), + program: "".as_bytes().to_vec(), entry_points_by_type: LegacyEntryPointsByType { constructor: Vec::new(), external: Vec::new(), diff --git a/crates/primitives/transactions/src/to_starknet_core.rs b/crates/primitives/transactions/src/to_starknet_core.rs deleted file mode 100644 index 150feb9e3..000000000 --- a/crates/primitives/transactions/src/to_starknet_core.rs +++ /dev/null @@ -1,216 +0,0 @@ -use starknet_types_core::felt::Felt; - -use crate::{ - DeclareTransaction, DeclareTransactionV0, DeclareTransactionV1, DeclareTransactionV2, DeclareTransactionV3, - DeployAccountTransaction, DeployAccountTransactionV1, DeployAccountTransactionV3, DeployTransaction, - InvokeTransaction, InvokeTransactionV0, InvokeTransactionV1, InvokeTransactionV3, L1HandlerTransaction, - Transaction, TransactionWithHash, -}; - -impl From for starknet_core::types::Transaction { - fn from(tx: TransactionWithHash) -> Self { - let hash = tx.hash; - tx.transaction.to_core(hash) - } -} - -impl Transaction { - pub fn to_core(self, hash: Felt) -> starknet_core::types::Transaction { - match self { - Transaction::Invoke(tx) => starknet_core::types::Transaction::Invoke(tx.to_core(hash)), - Transaction::L1Handler(tx) => starknet_core::types::Transaction::L1Handler(tx.to_core(hash)), - Transaction::Declare(tx) => starknet_core::types::Transaction::Declare(tx.to_core(hash)), - Transaction::Deploy(tx) => starknet_core::types::Transaction::Deploy(tx.to_core(hash)), - Transaction::DeployAccount(tx) => starknet_core::types::Transaction::DeployAccount(tx.to_core(hash)), - } - } -} - -impl InvokeTransaction { - pub fn to_core(self, hash: Felt) -> starknet_core::types::InvokeTransaction { - match self { - InvokeTransaction::V0(tx) => starknet_core::types::InvokeTransaction::V0(tx.to_core(hash)), - InvokeTransaction::V1(tx) => starknet_core::types::InvokeTransaction::V1(tx.to_core(hash)), - InvokeTransaction::V3(tx) => starknet_core::types::InvokeTransaction::V3(tx.to_core(hash)), - } - } -} - -impl InvokeTransactionV0 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::InvokeTransactionV0 { - starknet_core::types::InvokeTransactionV0 { - transaction_hash: hash, - max_fee: self.max_fee, - signature: self.signature, - contract_address: self.contract_address, - entry_point_selector: self.entry_point_selector, - calldata: self.calldata, - } - } -} - -impl InvokeTransactionV1 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::InvokeTransactionV1 { - starknet_core::types::InvokeTransactionV1 { - transaction_hash: hash, - sender_address: self.sender_address, - calldata: self.calldata, - max_fee: self.max_fee, - signature: self.signature, - nonce: self.nonce, - } - } -} - -impl InvokeTransactionV3 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::InvokeTransactionV3 { - starknet_core::types::InvokeTransactionV3 { - transaction_hash: hash, - sender_address: self.sender_address, - calldata: self.calldata, - signature: self.signature, - nonce: self.nonce, - resource_bounds: self.resource_bounds.into(), - tip: self.tip, - paymaster_data: self.paymaster_data, - account_deployment_data: self.account_deployment_data, - nonce_data_availability_mode: self.nonce_data_availability_mode.into(), - fee_data_availability_mode: self.fee_data_availability_mode.into(), - } - } -} - -impl L1HandlerTransaction { - pub fn to_core(self, hash: Felt) -> starknet_core::types::L1HandlerTransaction { - starknet_core::types::L1HandlerTransaction { - transaction_hash: hash, - version: self.version, - nonce: self.nonce, - contract_address: self.contract_address, - entry_point_selector: self.entry_point_selector, - calldata: self.calldata, - } - } -} - -impl DeclareTransaction { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeclareTransaction { - match self { - DeclareTransaction::V0(tx) => starknet_core::types::DeclareTransaction::V0(tx.to_core(hash)), - DeclareTransaction::V1(tx) => starknet_core::types::DeclareTransaction::V1(tx.to_core(hash)), - DeclareTransaction::V2(tx) => starknet_core::types::DeclareTransaction::V2(tx.to_core(hash)), - DeclareTransaction::V3(tx) => starknet_core::types::DeclareTransaction::V3(tx.to_core(hash)), - } - } -} - -impl DeclareTransactionV0 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeclareTransactionV0 { - starknet_core::types::DeclareTransactionV0 { - transaction_hash: hash, - sender_address: self.sender_address, - max_fee: self.max_fee, - signature: self.signature, - class_hash: self.class_hash, - } - } -} - -impl DeclareTransactionV1 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeclareTransactionV1 { - starknet_core::types::DeclareTransactionV1 { - transaction_hash: hash, - sender_address: self.sender_address, - max_fee: self.max_fee, - signature: self.signature, - nonce: self.nonce, - class_hash: self.class_hash, - } - } -} - -impl DeclareTransactionV2 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeclareTransactionV2 { - starknet_core::types::DeclareTransactionV2 { - transaction_hash: hash, - sender_address: self.sender_address, - compiled_class_hash: self.compiled_class_hash, - max_fee: self.max_fee, - signature: self.signature, - nonce: self.nonce, - class_hash: self.class_hash, - } - } -} - -impl DeclareTransactionV3 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeclareTransactionV3 { - starknet_core::types::DeclareTransactionV3 { - transaction_hash: hash, - sender_address: self.sender_address, - compiled_class_hash: self.compiled_class_hash, - signature: self.signature, - nonce: self.nonce, - class_hash: self.class_hash, - resource_bounds: self.resource_bounds.into(), - tip: self.tip, - paymaster_data: self.paymaster_data, - account_deployment_data: self.account_deployment_data, - nonce_data_availability_mode: self.nonce_data_availability_mode.into(), - fee_data_availability_mode: self.fee_data_availability_mode.into(), - } - } -} - -impl DeployTransaction { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeployTransaction { - starknet_core::types::DeployTransaction { - transaction_hash: hash, - version: self.version, - contract_address_salt: self.contract_address_salt, - constructor_calldata: self.constructor_calldata, - class_hash: self.class_hash, - } - } -} - -impl DeployAccountTransaction { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeployAccountTransaction { - match self { - DeployAccountTransaction::V1(tx) => starknet_core::types::DeployAccountTransaction::V1(tx.to_core(hash)), - DeployAccountTransaction::V3(tx) => starknet_core::types::DeployAccountTransaction::V3(tx.to_core(hash)), - } - } -} - -impl DeployAccountTransactionV1 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeployAccountTransactionV1 { - starknet_core::types::DeployAccountTransactionV1 { - transaction_hash: hash, - max_fee: self.max_fee, - signature: self.signature, - nonce: self.nonce, - contract_address_salt: self.contract_address_salt, - constructor_calldata: self.constructor_calldata, - class_hash: self.class_hash, - } - } -} - -impl DeployAccountTransactionV3 { - pub fn to_core(self, hash: Felt) -> starknet_core::types::DeployAccountTransactionV3 { - starknet_core::types::DeployAccountTransactionV3 { - transaction_hash: hash, - signature: self.signature, - nonce: self.nonce, - contract_address_salt: self.contract_address_salt, - constructor_calldata: self.constructor_calldata, - class_hash: self.class_hash, - resource_bounds: self.resource_bounds.into(), - tip: self.tip, - paymaster_data: self.paymaster_data, - nonce_data_availability_mode: self.nonce_data_availability_mode.into(), - fee_data_availability_mode: self.fee_data_availability_mode.into(), - } - } -} diff --git a/crates/primitives/transactions/src/to_starknet_types.rs b/crates/primitives/transactions/src/to_starknet_types.rs new file mode 100644 index 000000000..d59dc092e --- /dev/null +++ b/crates/primitives/transactions/src/to_starknet_types.rs @@ -0,0 +1,200 @@ +use starknet_types_core::felt::Felt; + +use crate::{ + DeclareTransaction, DeclareTransactionV0, DeclareTransactionV1, DeclareTransactionV2, DeclareTransactionV3, + DeployAccountTransaction, DeployAccountTransactionV1, DeployAccountTransactionV3, DeployTransaction, + InvokeTransaction, InvokeTransactionV0, InvokeTransactionV1, InvokeTransactionV3, L1HandlerTransaction, + Transaction, +}; + +impl From for starknet_types_rpc::Txn { + fn from(tx: Transaction) -> Self { + match tx { + Transaction::Invoke(tx) => starknet_types_rpc::Txn::Invoke(tx.into()), + Transaction::L1Handler(tx) => starknet_types_rpc::Txn::L1Handler(tx.into()), + Transaction::Declare(tx) => starknet_types_rpc::Txn::Declare(tx.into()), + Transaction::Deploy(tx) => starknet_types_rpc::Txn::Deploy(tx.into()), + Transaction::DeployAccount(tx) => starknet_types_rpc::Txn::DeployAccount(tx.into()), + } + } +} + +impl From for starknet_types_rpc::InvokeTxn { + fn from(tx: InvokeTransaction) -> Self { + match tx { + InvokeTransaction::V0(tx) => starknet_types_rpc::InvokeTxn::V0(tx.into()), + InvokeTransaction::V1(tx) => starknet_types_rpc::InvokeTxn::V1(tx.into()), + InvokeTransaction::V3(tx) => starknet_types_rpc::InvokeTxn::V3(tx.into()), + } + } +} + +impl From for starknet_types_rpc::InvokeTxnV0 { + fn from(tx: InvokeTransactionV0) -> Self { + Self { + calldata: tx.calldata, + contract_address: tx.contract_address, + entry_point_selector: tx.entry_point_selector, + max_fee: tx.max_fee, + signature: tx.signature, + } + } +} + +impl From for starknet_types_rpc::InvokeTxnV1 { + fn from(tx: InvokeTransactionV1) -> Self { + Self { + calldata: tx.calldata, + max_fee: tx.max_fee, + nonce: tx.nonce, + sender_address: tx.sender_address, + signature: tx.signature, + } + } +} + +impl From for starknet_types_rpc::InvokeTxnV3 { + fn from(tx: InvokeTransactionV3) -> Self { + Self { + account_deployment_data: tx.account_deployment_data, + calldata: tx.calldata, + fee_data_availability_mode: tx.fee_data_availability_mode.into(), + nonce: tx.nonce, + nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), + paymaster_data: tx.paymaster_data, + resource_bounds: tx.resource_bounds.into(), + sender_address: tx.sender_address, + signature: tx.signature, + tip: tx.tip, + } + } +} + +impl From for starknet_types_rpc::L1HandlerTxn { + fn from(tx: L1HandlerTransaction) -> Self { + Self { + nonce: tx.nonce, + version: tx.version.to_hex_string(), + function_call: starknet_types_rpc::FunctionCall { + calldata: tx.calldata, + contract_address: tx.contract_address, + entry_point_selector: tx.entry_point_selector, + }, + } + } +} + +impl From for starknet_types_rpc::DeclareTxn { + fn from(tx: DeclareTransaction) -> Self { + match tx { + DeclareTransaction::V0(tx) => starknet_types_rpc::DeclareTxn::V0(tx.into()), + DeclareTransaction::V1(tx) => starknet_types_rpc::DeclareTxn::V1(tx.into()), + DeclareTransaction::V2(tx) => starknet_types_rpc::DeclareTxn::V2(tx.into()), + DeclareTransaction::V3(tx) => starknet_types_rpc::DeclareTxn::V3(tx.into()), + } + } +} + +impl From for starknet_types_rpc::DeclareTxnV0 { + fn from(tx: DeclareTransactionV0) -> Self { + Self { + class_hash: tx.class_hash, + max_fee: tx.max_fee, + sender_address: tx.sender_address, + signature: tx.signature, + } + } +} + +impl From for starknet_types_rpc::DeclareTxnV1 { + fn from(tx: DeclareTransactionV1) -> Self { + Self { + class_hash: tx.class_hash, + max_fee: tx.max_fee, + nonce: tx.nonce, + sender_address: tx.sender_address, + signature: tx.signature, + } + } +} + +impl From for starknet_types_rpc::DeclareTxnV2 { + fn from(tx: DeclareTransactionV2) -> Self { + Self { + class_hash: tx.class_hash, + compiled_class_hash: tx.compiled_class_hash, + max_fee: tx.max_fee, + nonce: tx.nonce, + sender_address: tx.sender_address, + signature: tx.signature, + } + } +} + +impl From for starknet_types_rpc::DeclareTxnV3 { + fn from(tx: DeclareTransactionV3) -> Self { + Self { + account_deployment_data: tx.account_deployment_data, + class_hash: tx.class_hash, + compiled_class_hash: tx.compiled_class_hash, + fee_data_availability_mode: tx.fee_data_availability_mode.into(), + nonce: tx.nonce, + nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), + paymaster_data: tx.paymaster_data, + resource_bounds: tx.resource_bounds.into(), + sender_address: tx.sender_address, + signature: tx.signature, + tip: tx.tip, + } + } +} + +impl From for starknet_types_rpc::DeployTxn { + fn from(tx: DeployTransaction) -> Self { + Self { + class_hash: tx.class_hash, + constructor_calldata: tx.constructor_calldata, + contract_address_salt: tx.contract_address_salt, + version: tx.version, + } + } +} + +impl From for starknet_types_rpc::DeployAccountTxn { + fn from(tx: DeployAccountTransaction) -> Self { + match tx { + DeployAccountTransaction::V1(tx) => starknet_types_rpc::DeployAccountTxn::V1(tx.into()), + DeployAccountTransaction::V3(tx) => starknet_types_rpc::DeployAccountTxn::V3(tx.into()), + } + } +} + +impl From for starknet_types_rpc::DeployAccountTxnV1 { + fn from(tx: DeployAccountTransactionV1) -> Self { + Self { + class_hash: tx.class_hash, + constructor_calldata: tx.constructor_calldata, + contract_address_salt: tx.contract_address_salt, + max_fee: tx.max_fee, + nonce: tx.nonce, + signature: tx.signature, + } + } +} + +impl From for starknet_types_rpc::DeployAccountTxnV3 { + fn from(tx: DeployAccountTransactionV3) -> Self { + Self { + class_hash: tx.class_hash, + constructor_calldata: tx.constructor_calldata, + contract_address_salt: tx.contract_address_salt, + fee_data_availability_mode: tx.fee_data_availability_mode.into(), + nonce: tx.nonce, + nonce_data_availability_mode: tx.nonce_data_availability_mode.into(), + paymaster_data: tx.paymaster_data, + resource_bounds: tx.resource_bounds.into(), + signature: tx.signature, + tip: tx.tip, + } + } +} diff --git a/crates/tests/src/lib.rs b/crates/tests/src/lib.rs index 7388edf63..32a6b1838 100644 --- a/crates/tests/src/lib.rs +++ b/crates/tests/src/lib.rs @@ -107,15 +107,29 @@ impl MadaraCmd { impl Drop for MadaraCmd { fn drop(&mut self) { let Some(mut child) = self.process.take() else { return }; - let kill = || { - let mut kill = Command::new("kill").args(["-s", "TERM", &child.id().to_string()]).spawn()?; - kill.wait()?; - anyhow::Ok(()) - }; - if let Err(_err) = kill() { - child.kill().unwrap() + + // Send SIGTERM signal to gracefully terminate the process + let termination_result = Command::new("kill").arg("-TERM").arg(child.id().to_string()).status(); + + // Force kill if graceful termination failed + if termination_result.is_err() { + let _ = child.kill(); } - child.wait().unwrap(); + + let grace_period = Duration::from_secs(2); + let termination_start = std::time::Instant::now(); + + // Wait for process exit or force kill after grace period + while let Ok(None) = child.try_wait() { + if termination_start.elapsed() >= grace_period { + let _ = child.kill(); + break; + } + std::thread::sleep(Duration::from_millis(100)); + } + + // Ensure process cleanup + let _ = child.wait(); } } diff --git a/crates/tests/src/rpc/read.rs b/crates/tests/src/rpc/read.rs index 3ca268c1f..7d1b83c23 100644 --- a/crates/tests/src/rpc/read.rs +++ b/crates/tests/src/rpc/read.rs @@ -238,6 +238,10 @@ mod test_rpc_read_calls { /// "id": 1 /// }' /// ``` + // FIXME: Ignoring this test because the starknet-rs library does not comply with the specifications for receipts. + // Specifically, it includes the TransactionHash in the receipt, which is against the expected standard. + // Issue: https://github.com/xJonathanLEI/starknet-rs/issues/678 + #[ignore] #[rstest] #[tokio::test] async fn test_get_block_txn_with_receipts_works() {