From 3c55d862864521c18673b5a7b011749b32f1aff4 Mon Sep 17 00:00:00 2001 From: glihm Date: Fri, 22 Dec 2023 16:22:35 -0600 Subject: [PATCH 01/16] fix(dojo-lang): use PluginDiagnostic instead of panic for model keys verification (#1327) --- crates/dojo-lang/src/introspect.rs | 12 +- .../compiler_cairo_v240/Scarb.lock | 2 +- .../dojo-lang/src/manifest_test_data/manifest | 2 +- crates/dojo-lang/src/model.rs | 9 +- .../dojo-lang/src/plugin_test_data/introspect | 2 +- crates/dojo-lang/src/plugin_test_data/model | 172 +++++++++++++++++- crates/dojo-world/src/contracts/model_test.rs | 2 +- examples/spawn-and-move/Scarb.lock | 2 +- 8 files changed, 183 insertions(+), 20 deletions(-) diff --git a/crates/dojo-lang/src/introspect.rs b/crates/dojo-lang/src/introspect.rs index 1370bf7470..67e7a23816 100644 --- a/crates/dojo-lang/src/introspect.rs +++ b/crates/dojo-lang/src/introspect.rs @@ -275,17 +275,7 @@ fn handle_introspect_internal( } }); - if size_precompute > 0 { - size.push(format!("{}", size_precompute)); - } - - if size.is_empty() { - panic!( - "The model `{}` has only keys, ensure you have at least one field without the #[key] \ - attribute.", - name - ); - } + size.push(format!("{}", size_precompute)); RewriteNode::interpolate_patched( " diff --git a/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock b/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock index e9d8135cc3..b0e7da2d12 100644 --- a/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock +++ b/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock @@ -10,7 +10,7 @@ dependencies = [ [[package]] name = "dojo" -version = "0.4.1" +version = "0.4.2" dependencies = [ "dojo_plugin", ] diff --git a/crates/dojo-lang/src/manifest_test_data/manifest b/crates/dojo-lang/src/manifest_test_data/manifest index 787374d71f..1f9e0fb0e9 100644 --- a/crates/dojo-lang/src/manifest_test_data/manifest +++ b/crates/dojo-lang/src/manifest_test_data/manifest @@ -1374,7 +1374,7 @@ test_manifest_file { "name": "dojo_examples::models::position", "address": null, - "class_hash": "0x2b233bba9a232a5e891c85eca9f67beedca7a12f9768729ff017bcb62d25c9d", + "class_hash": "0x4cd20d231b04405a77b184c115dc60637e186504fad7f0929bd76cbd09c10b", "abi": [ { "type": "function", diff --git a/crates/dojo-lang/src/model.rs b/crates/dojo-lang/src/model.rs index d201b18587..3a42488add 100644 --- a/crates/dojo-lang/src/model.rs +++ b/crates/dojo-lang/src/model.rs @@ -38,7 +38,14 @@ pub fn handle_model_struct( if keys.is_empty() { diagnostics.push(PluginDiagnostic { - message: "Model must define atleast one #[key] attribute".into(), + message: "Model must define at least one #[key] attribute".into(), + stable_ptr: struct_ast.name(db).stable_ptr().untyped(), + }); + } + + if keys.len() == members.len() { + diagnostics.push(PluginDiagnostic { + message: "Model must define at least one member that is not a key".into(), stable_ptr: struct_ast.name(db).stable_ptr().untyped(), }); } diff --git a/crates/dojo-lang/src/plugin_test_data/introspect b/crates/dojo-lang/src/plugin_test_data/introspect index 15fd1b5f07..a76ee7edd1 100644 --- a/crates/dojo-lang/src/plugin_test_data/introspect +++ b/crates/dojo-lang/src/plugin_test_data/introspect @@ -423,7 +423,7 @@ impl GenericStructSerde, +core::traits::Destruct> o impl GenericStructIntrospect> of dojo::database::introspect::Introspect> { #[inline(always)] fn size() -> usize { - dojo::database::introspect::Introspect::::size() + dojo::database::introspect::Introspect::::size() + 0 } #[inline(always)] diff --git a/crates/dojo-lang/src/plugin_test_data/model b/crates/dojo-lang/src/plugin_test_data/model index f524306fb1..bcaac79822 100644 --- a/crates/dojo-lang/src/plugin_test_data/model +++ b/crates/dojo-lang/src/plugin_test_data/model @@ -43,6 +43,12 @@ struct Roles { role_ids: Array } +#[derive(Model, Serde)] +struct OnlyKeyModel { + #[key] + id: felt252 +} + use starknet::ContractAddress; #[derive(Model, Copy, Drop, Serde)] @@ -520,11 +526,16 @@ mod player { } //! > expected_diagnostics -error: Model must define atleast one #[key] attribute +error: Model must define at least one #[key] attribute --> test_src/lib.cairo:36:8 struct Roles { ^***^ +error: Model must define at least one member that is not a key + --> test_src/lib.cairo:41:8 +struct OnlyKeyModel { + ^**********^ + error: Unsupported attribute. --> test_src/lib.cairo[Position]:73:13 #[starknet::contract] @@ -535,6 +546,11 @@ error: Unsupported attribute. #[starknet::contract] ^*******************^ +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:68:13 + #[starknet::contract] + ^*******************^ + error: Unsupported attribute. --> test_src/lib.cairo[Player]:77:13 #[starknet::contract] @@ -600,6 +616,36 @@ error: Unsupported attribute. #[external(v0)] ^*************^ +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:72:17 + #[storage] + ^********^ + +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:75:17 + #[external(v0)] + ^*************^ + +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:80:17 + #[external(v0)] + ^*************^ + +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:85:17 + #[external(v0)] + ^*************^ + +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:93:17 + #[external(v0)] + ^*************^ + +error: Unsupported attribute. + --> test_src/lib.cairo[OnlyKeyModel]:100:17 + #[external(v0)] + ^*************^ + error: Unsupported attribute. --> test_src/lib.cairo[Player]:81:17 #[storage] @@ -670,6 +716,12 @@ struct Roles { role_ids: Array } +#[derive(Model, Serde)] +struct OnlyKeyModel { + #[key] + id: felt252 +} + use starknet::ContractAddress; #[derive(Model, Copy, Drop, Serde)] @@ -786,7 +838,7 @@ impl PositionSerde of core::serde::Serde:: { impl PositionIntrospect<> of dojo::database::introspect::Introspect> { #[inline(always)] fn size() -> usize { - dojo::database::introspect::Introspect::::size() + dojo::database::introspect::Introspect::::size() + 0 } #[inline(always)] @@ -905,7 +957,7 @@ impl RolesSerde of core::serde::Serde:: { impl RolesIntrospect<> of dojo::database::introspect::Introspect> { #[inline(always)] fn size() -> usize { - dojo::database::introspect::Introspect::>::size() + dojo::database::introspect::Introspect::>::size() + 0 } #[inline(always)] @@ -971,6 +1023,120 @@ impl RolesIntrospect<> of dojo::database::introspect::Introspect> { dojo::database::introspect::Introspect::::ty() } } +impl OnlyKeyModelSerde of core::serde::Serde:: { + fn serialize(self: @OnlyKeyModel, ref output: core::array::Array) { + core::serde::Serde::serialize(self.id, ref output) + } + fn deserialize(ref serialized: core::array::Span) -> core::option::Option { + core::option::Option::Some(OnlyKeyModel { + id: core::serde::Serde::deserialize(ref serialized)?, + }) + } +} + + impl OnlyKeyModelModel of dojo::model::Model { + #[inline(always)] + fn name(self: @OnlyKeyModel) -> felt252 { + 'OnlyKeyModel' + } + + #[inline(always)] + fn keys(self: @OnlyKeyModel) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + core::array::ArrayTrait::append(ref serialized, *self.id); + core::array::ArrayTrait::span(@serialized) + } + + #[inline(always)] + fn values(self: @OnlyKeyModel) -> Span { + let mut serialized = core::array::ArrayTrait::new(); + + core::array::ArrayTrait::span(@serialized) + } + + #[inline(always)] + fn layout(self: @OnlyKeyModel) -> Span { + let mut layout = core::array::ArrayTrait::new(); + dojo::database::introspect::Introspect::::layout(ref layout); + core::array::ArrayTrait::span(@layout) + } + + #[inline(always)] + fn packed_size(self: @OnlyKeyModel) -> usize { + let mut layout = self.layout(); + dojo::packing::calculate_packed_size(ref layout) + } + } + + +impl OnlyKeyModelIntrospect<> of dojo::database::introspect::Introspect> { + #[inline(always)] + fn size() -> usize { + 0 + } + + #[inline(always)] + fn layout(ref layout: Array) { + + } + + #[inline(always)] + fn ty() -> dojo::database::introspect::Ty { + dojo::database::introspect::Ty::Struct(dojo::database::introspect::Struct { + name: 'OnlyKeyModel', + attrs: array![].span(), + children: array![dojo::database::introspect::serialize_member(@dojo::database::introspect::Member { + name: 'id', + ty: dojo::database::introspect::Ty::Primitive('felt252'), + attrs: array!['key'].span() + })].span() + }) + } +} + + + #[starknet::interface] + trait IOnlyKeyModel { + fn name(self: @T) -> felt252; + } + + #[starknet::contract] + mod only_key_model { + use super::OnlyKeyModel; + + #[storage] + struct Storage {} + + #[external(v0)] + fn name(self: @ContractState) -> felt252 { + 'OnlyKeyModel' + } + + #[external(v0)] + fn unpacked_size(self: @ContractState) -> usize { + dojo::database::introspect::Introspect::::size() + } + + #[external(v0)] + fn packed_size(self: @ContractState) -> usize { + let mut layout = core::array::ArrayTrait::new(); + dojo::database::introspect::Introspect::::layout(ref layout); + let mut layout_span = layout.span(); + dojo::packing::calculate_packed_size(ref layout_span) + } + + #[external(v0)] + fn layout(self: @ContractState) -> Span { + let mut layout = core::array::ArrayTrait::new(); + dojo::database::introspect::Introspect::::layout(ref layout); + core::array::ArrayTrait::span(@layout) + } + + #[external(v0)] + fn schema(self: @ContractState) -> dojo::database::introspect::Ty { + dojo::database::introspect::Introspect::::ty() + } + } impl PlayerCopy of core::traits::Copy::; impl PlayerDrop of core::traits::Drop::; impl PlayerSerde of core::serde::Serde:: { diff --git a/crates/dojo-world/src/contracts/model_test.rs b/crates/dojo-world/src/contracts/model_test.rs index efab444182..ce03fd3f3a 100644 --- a/crates/dojo-world/src/contracts/model_test.rs +++ b/crates/dojo-world/src/contracts/model_test.rs @@ -63,7 +63,7 @@ async fn test_model() { assert_eq!( position.class_hash(), FieldElement::from_hex_be( - "0x02b233bba9a232a5e891c85eca9f67beedca7a12f9768729ff017bcb62d25c9d" + "0x004cd20d231b04405a77b184c115dc60637e186504fad7f0929bd76cbd09c10b" ) .unwrap() ); diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index 48750706e3..c28e96ff39 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -10,7 +10,7 @@ dependencies = [ [[package]] name = "dojo_examples" -version = "0.4.1" +version = "0.4.2" dependencies = [ "dojo", ] From ce4f395cf15e09b153e013d661e40c4a1e682bd5 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Wed, 27 Dec 2023 13:55:18 +0800 Subject: [PATCH 02/16] refactor(katana-db): compress `SierraClass` as `JSON` for now (#1329) --- crates/katana/storage/db/src/codecs/mod.rs | 15 ++++++++++++++- crates/katana/storage/db/src/codecs/postcard.rs | 3 +-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/crates/katana/storage/db/src/codecs/mod.rs b/crates/katana/storage/db/src/codecs/mod.rs index 273dc15cf7..346659e76b 100644 --- a/crates/katana/storage/db/src/codecs/mod.rs +++ b/crates/katana/storage/db/src/codecs/mod.rs @@ -2,7 +2,7 @@ pub mod postcard; use katana_primitives::block::FinalityStatus; -use katana_primitives::contract::ContractAddress; +use katana_primitives::contract::{ContractAddress, SierraClass}; use katana_primitives::FieldElement; use crate::error::CodecError; @@ -72,6 +72,19 @@ macro_rules! impl_encode_and_decode_for_felts { impl_encode_and_decode_for_uints!(u64); impl_encode_and_decode_for_felts!(FieldElement, ContractAddress); +impl Compress for SierraClass { + type Compressed = Vec; + fn compress(self) -> Self::Compressed { + serde_json::to_vec(&self).unwrap() + } +} + +impl Decompress for SierraClass { + fn decompress>(bytes: B) -> Result { + serde_json::from_slice(bytes.as_ref()).map_err(|e| CodecError::Decode(e.to_string())) + } +} + impl Compress for FinalityStatus { type Compressed = [u8; 1]; fn compress(self) -> Self::Compressed { diff --git a/crates/katana/storage/db/src/codecs/postcard.rs b/crates/katana/storage/db/src/codecs/postcard.rs index 66a7ccddc7..fa692c5e8d 100644 --- a/crates/katana/storage/db/src/codecs/postcard.rs +++ b/crates/katana/storage/db/src/codecs/postcard.rs @@ -1,5 +1,5 @@ use katana_primitives::block::{BlockNumber, Header}; -use katana_primitives::contract::{ContractAddress, GenericContractInfo, SierraClass}; +use katana_primitives::contract::{ContractAddress, GenericContractInfo}; use katana_primitives::receipt::Receipt; use katana_primitives::transaction::Tx; use katana_primitives::FieldElement; @@ -34,7 +34,6 @@ impl_compress_and_decompress_for_table_values!( Tx, Header, Receipt, - SierraClass, FieldElement, ContractAddress, Vec, From 1a6d1cedffc557e094c9e4e405fcbe699a538a6a Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Wed, 27 Dec 2023 15:05:57 +0800 Subject: [PATCH 03/16] test(katana-provider): add tests for contract classes + fix provider state impl (#1333) --- Cargo.lock | 2 + crates/katana/core/src/constants.rs | 16 +-- crates/katana/primitives/src/utils/class.rs | 26 +++++ crates/katana/primitives/src/utils/mod.rs | 1 + crates/katana/storage/db/benches/codec.rs | 24 +--- crates/katana/storage/provider/Cargo.toml | 2 + .../provider/src/providers/db/state.rs | 24 ++-- .../provider/src/providers/fork/backend.rs | 10 +- .../provider/src/providers/fork/state.rs | 14 ++- .../provider/src/providers/in_memory/state.rs | 16 ++- crates/katana/storage/provider/tests/block.rs | 22 ++-- crates/katana/storage/provider/tests/class.rs | 83 ++++++++----- .../katana/storage/provider/tests/fixtures.rs | 109 +++++++++++------- 13 files changed, 218 insertions(+), 131 deletions(-) create mode 100644 crates/katana/primitives/src/utils/class.rs diff --git a/Cargo.lock b/Cargo.lock index 10d5c7b210..7d61987c3d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5564,6 +5564,7 @@ dependencies = [ "anyhow", "auto_impl", "futures", + "katana-core", "katana-db", "katana-primitives", "katana-runner", @@ -5572,6 +5573,7 @@ dependencies = [ "rand", "rstest", "rstest_reuse", + "serde_json", "starknet", "tempfile", "thiserror", diff --git a/crates/katana/core/src/constants.rs b/crates/katana/core/src/constants.rs index 16522dc652..b25be447dd 100644 --- a/crates/katana/core/src/constants.rs +++ b/crates/katana/core/src/constants.rs @@ -1,6 +1,5 @@ -use katana_primitives::contract::{ - CompiledContractClass, CompiledContractClassV0, ContractAddress, StorageKey, -}; +use katana_primitives::contract::{CompiledContractClass, ContractAddress, StorageKey}; +use katana_primitives::utils::class::parse_compiled_class; use katana_primitives::FieldElement; use lazy_static::lazy_static; use starknet::macros::felt; @@ -10,11 +9,6 @@ pub const DEFAULT_GAS_PRICE: u128 = 100 * u128::pow(10, 9); // Given in units of pub const DEFAULT_INVOKE_MAX_STEPS: u32 = 1_000_000; pub const DEFAULT_VALIDATE_MAX_STEPS: u32 = 1_000_000; -fn parse_legacy_contract_class(content: impl AsRef) -> CompiledContractClass { - let class: CompiledContractClassV0 = serde_json::from_str(content.as_ref()).unwrap(); - CompiledContractClass::V0(class) -} - lazy_static! { // Predefined contract addresses @@ -35,9 +29,9 @@ lazy_static! { // Predefined contract classes - pub static ref ERC20_CONTRACT: CompiledContractClass = parse_legacy_contract_class(include_str!("../contracts/compiled/erc20.json")); - pub static ref UDC_CONTRACT: CompiledContractClass = parse_legacy_contract_class(include_str!("../contracts/compiled/universal_deployer.json")); - pub static ref OZ_V0_ACCOUNT_CONTRACT: CompiledContractClass = parse_legacy_contract_class(include_str!("../contracts/compiled/account.json")); + pub static ref ERC20_CONTRACT: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/erc20.json")).unwrap(); + pub static ref UDC_CONTRACT: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/universal_deployer.json")).unwrap(); + pub static ref OZ_V0_ACCOUNT_CONTRACT: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/account.json")).unwrap(); pub static ref DEFAULT_PREFUNDED_ACCOUNT_BALANCE: FieldElement = felt!("0x3635c9adc5dea00000"); // 10^21 diff --git a/crates/katana/primitives/src/utils/class.rs b/crates/katana/primitives/src/utils/class.rs new file mode 100644 index 0000000000..3f02812c5f --- /dev/null +++ b/crates/katana/primitives/src/utils/class.rs @@ -0,0 +1,26 @@ +use anyhow::Result; +use cairo_lang_starknet::casm_contract_class::CasmContractClass; +use cairo_lang_starknet::contract_class::ContractClass; + +use crate::contract::{CompiledContractClass, CompiledContractClassV0, CompiledContractClassV1}; + +/// Parse a [`str`] into a [`CompiledContractClass`]. +pub fn parse_compiled_class(class: &str) -> Result { + if let Ok(class) = parse_compiled_class_v1(class) { + Ok(CompiledContractClass::V1(class)) + } else { + Ok(CompiledContractClass::V0(parse_compiled_class_v0(class)?)) + } +} + +/// Parse a [`str`] into a [`CompiledContractClassV1`]. +pub fn parse_compiled_class_v1(class: &str) -> Result { + let class: ContractClass = serde_json::from_str(class)?; + let class = CasmContractClass::from_contract_class(class, true)?; + Ok(CompiledContractClassV1::try_from(class)?) +} + +/// Parse a [`str`] into a [`CompiledContractClassV0`]. +pub fn parse_compiled_class_v0(class: &str) -> Result { + Ok(serde_json::from_str(class)?) +} diff --git a/crates/katana/primitives/src/utils/mod.rs b/crates/katana/primitives/src/utils/mod.rs index 37f08066e0..26db540223 100644 --- a/crates/katana/primitives/src/utils/mod.rs +++ b/crates/katana/primitives/src/utils/mod.rs @@ -1 +1,2 @@ +pub mod class; pub mod transaction; diff --git a/crates/katana/storage/db/benches/codec.rs b/crates/katana/storage/db/benches/codec.rs index 183667a021..fb7f5ab36c 100644 --- a/crates/katana/storage/db/benches/codec.rs +++ b/crates/katana/storage/db/benches/codec.rs @@ -1,27 +1,19 @@ -use blockifier::execution::contract_class::ContractClassV1; -use cairo_lang_starknet::casm_contract_class::CasmContractClass; use criterion::{black_box, criterion_group, criterion_main, Criterion}; use katana_db::codecs::{Compress, Decompress}; use katana_db::models::class::StoredContractClass; use katana_primitives::contract::CompiledContractClass; +use katana_primitives::utils::class::parse_compiled_class; fn compress_contract(contract: CompiledContractClass) -> Vec { - let class = StoredContractClass::from(contract); - class.compress() + StoredContractClass::from(contract).compress() } fn decompress_contract(compressed: &[u8]) -> CompiledContractClass { - let class = StoredContractClass::decompress(compressed).unwrap(); - CompiledContractClass::from(class) + CompiledContractClass::from(StoredContractClass::decompress(compressed).unwrap()) } fn compress_contract_with_main_codec(c: &mut Criterion) { - let class = { - let class = - serde_json::from_slice(include_bytes!("./artifacts/dojo_world_240.json")).unwrap(); - let class = CasmContractClass::from_contract_class(class, true).unwrap(); - CompiledContractClass::V1(ContractClassV1::try_from(class).unwrap()) - }; + let class = parse_compiled_class(include_str!("./artifacts/dojo_world_240.json")).unwrap(); c.bench_function("compress world contract", |b| { b.iter_with_large_drop(|| compress_contract(black_box(class.clone()))) @@ -29,13 +21,7 @@ fn compress_contract_with_main_codec(c: &mut Criterion) { } fn decompress_contract_with_main_codec(c: &mut Criterion) { - let class = { - let class = - serde_json::from_slice(include_bytes!("./artifacts/dojo_world_240.json")).unwrap(); - let class = CasmContractClass::from_contract_class(class, true).unwrap(); - CompiledContractClass::V1(ContractClassV1::try_from(class).unwrap()) - }; - + let class = parse_compiled_class(include_str!("./artifacts/dojo_world_240.json")).unwrap(); let compressed = compress_contract(class); c.bench_function("decompress world contract", |b| { diff --git a/crates/katana/storage/provider/Cargo.toml b/crates/katana/storage/provider/Cargo.toml index 5b4e4145da..9d727bb37e 100644 --- a/crates/katana/storage/provider/Cargo.toml +++ b/crates/katana/storage/provider/Cargo.toml @@ -27,11 +27,13 @@ fork = [ "in-memory" ] in-memory = [ ] [dev-dependencies] +katana-core = { path = "../../core" } katana-runner = { path = "../../runner" } lazy_static.workspace = true rand = "0.8.5" rstest = "0.18.2" rstest_reuse = "0.6.0" +serde_json.workspace = true starknet.workspace = true tempfile = "3.8.1" url.workspace = true diff --git a/crates/katana/storage/provider/src/providers/db/state.rs b/crates/katana/storage/provider/src/providers/db/state.rs index 0230ade4e5..88ecb50144 100644 --- a/crates/katana/storage/provider/src/providers/db/state.rs +++ b/crates/katana/storage/provider/src/providers/db/state.rs @@ -212,24 +212,28 @@ impl ContractClassProvider for HistoricalStateProvider { hash: ClassHash, ) -> Result> { // check that the requested class hash was declared before the pinned block number - if !self.tx.get::(hash)?.is_some_and(|num| num <= self.block_number) - { - return Ok(None); - }; - - Ok(self.tx.get::(hash)?) + if self.tx.get::(hash)?.is_some_and(|num| num <= self.block_number) { + Ok(self.tx.get::(hash)?) + } else { + Ok(None) + } } fn class(&self, hash: ClassHash) -> Result> { - self.compiled_class_hash_of_class_hash(hash).and_then(|_| { + if self.compiled_class_hash_of_class_hash(hash)?.is_some() { let contract = self.tx.get::(hash)?; Ok(contract.map(CompiledContractClass::from)) - }) + } else { + Ok(None) + } } fn sierra_class(&self, hash: ClassHash) -> Result> { - self.compiled_class_hash_of_class_hash(hash) - .and_then(|_| self.tx.get::(hash).map_err(|e| e.into())) + if self.compiled_class_hash_of_class_hash(hash)?.is_some() { + self.tx.get::(hash).map_err(|e| e.into()) + } else { + Ok(None) + } } } diff --git a/crates/katana/storage/provider/src/providers/fork/backend.rs b/crates/katana/storage/provider/src/providers/fork/backend.rs index cfba328649..5dc059d6c8 100644 --- a/crates/katana/storage/provider/src/providers/fork/backend.rs +++ b/crates/katana/storage/provider/src/providers/fork/backend.rs @@ -393,7 +393,15 @@ impl ContractClassProvider for SharedStateProvider { return Ok(class.cloned()); } - let class = self.0.do_get_class_at(hash)?; + let Some(class) = handle_contract_or_class_not_found_err(self.0.do_get_class_at(hash)) + .map_err(|e| { + error!(target: "forked_backend", "error while fetching sierra class {hash:#x}: {e}"); + e + })? + else { + return Ok(None); + }; + match class { starknet::core::types::ContractClass::Legacy(_) => Ok(None), starknet::core::types::ContractClass::Sierra(sierra_class) => { diff --git a/crates/katana/storage/provider/src/providers/fork/state.rs b/crates/katana/storage/provider/src/providers/fork/state.rs index 816fd8add8..bee548a930 100644 --- a/crates/katana/storage/provider/src/providers/fork/state.rs +++ b/crates/katana/storage/provider/src/providers/fork/state.rs @@ -173,10 +173,11 @@ impl StateProvider for ForkedSnapshot { impl ContractClassProvider for ForkedSnapshot { fn sierra_class(&self, hash: ClassHash) -> Result> { - if let class @ Some(_) = self.classes.sierra_classes.read().get(&hash).cloned() { - return Ok(class); + if self.inner.compiled_class_hashes.get(&hash).is_some() { + Ok(self.classes.sierra_classes.read().get(&hash).cloned()) + } else { + ContractClassProvider::sierra_class(&self.inner.db, hash) } - ContractClassProvider::sierra_class(&self.inner.db, hash) } fn compiled_class_hash_of_class_hash( @@ -190,9 +191,10 @@ impl ContractClassProvider for ForkedSnapshot { } fn class(&self, hash: ClassHash) -> Result> { - if let class @ Some(_) = self.classes.compiled_classes.read().get(&hash).cloned() { - return Ok(class); + if self.inner.compiled_class_hashes.get(&hash).is_some() { + Ok(self.classes.compiled_classes.read().get(&hash).cloned()) + } else { + ContractClassProvider::class(&self.inner.db, hash) } - ContractClassProvider::class(&self.inner.db, hash) } } diff --git a/crates/katana/storage/provider/src/providers/in_memory/state.rs b/crates/katana/storage/provider/src/providers/in_memory/state.rs index 1355cea528..dcce6de21a 100644 --- a/crates/katana/storage/provider/src/providers/in_memory/state.rs +++ b/crates/katana/storage/provider/src/providers/in_memory/state.rs @@ -13,6 +13,8 @@ use crate::traits::state::StateProvider; use crate::Result; pub struct StateSnapshot { + // because the classes are shared between snapshots, when trying to fetch check the compiled + // hash first and then the sierra class to ensure the class should be present in the snapshot. pub(crate) classes: Arc, pub(crate) inner: CacheSnapshotWithoutClasses, } @@ -145,13 +147,19 @@ impl StateProvider for InMemorySnapshot { impl ContractClassProvider for InMemorySnapshot { fn sierra_class(&self, hash: ClassHash) -> Result> { - let class = self.classes.sierra_classes.read().get(&hash).cloned(); - Ok(class) + if self.compiled_class_hash_of_class_hash(hash)?.is_some() { + Ok(self.classes.sierra_classes.read().get(&hash).cloned()) + } else { + Ok(None) + } } fn class(&self, hash: ClassHash) -> Result> { - let class = self.classes.compiled_classes.read().get(&hash).cloned(); - Ok(class) + if self.compiled_class_hash_of_class_hash(hash)?.is_some() { + Ok(self.classes.compiled_classes.read().get(&hash).cloned()) + } else { + Ok(None) + } } fn compiled_class_hash_of_class_hash( diff --git a/crates/katana/storage/provider/tests/block.rs b/crates/katana/storage/provider/tests/block.rs index e62efa89e6..1886b7caac 100644 --- a/crates/katana/storage/provider/tests/block.rs +++ b/crates/katana/storage/provider/tests/block.rs @@ -2,7 +2,7 @@ use anyhow::Result; use katana_primitives::block::{ Block, BlockHashOrNumber, BlockNumber, BlockWithTxHashes, FinalityStatus, }; -use katana_primitives::state::StateUpdates; +use katana_primitives::state::StateUpdatesWithDeclaredClasses; use katana_provider::providers::db::DbProvider; use katana_provider::providers::fork::ForkedProvider; use katana_provider::providers::in_memory::InMemoryProvider; @@ -141,14 +141,14 @@ where #[template] #[rstest::rstest] -#[case::state_update_at_block_1(1, mock_state_updates().0)] -#[case::state_update_at_block_2(2, mock_state_updates().1)] -#[case::state_update_at_block_3(3, StateUpdates::default())] -#[case::state_update_at_block_5(5, mock_state_updates().2)] +#[case::state_update_at_block_1(1, mock_state_updates()[0].clone())] +#[case::state_update_at_block_2(2, mock_state_updates()[1].clone())] +#[case::state_update_at_block_3(3, StateUpdatesWithDeclaredClasses::default())] +#[case::state_update_at_block_5(5, mock_state_updates()[2].clone())] fn test_read_state_update( #[from(provider_with_states)] provider: BlockchainProvider, #[case] block_num: BlockNumber, - #[case] expected_state_update: StateUpdates, + #[case] expected_state_update: StateUpdatesWithDeclaredClasses, ) { } @@ -156,7 +156,7 @@ fn test_read_state_update( fn test_read_state_update_with_in_memory_provider( #[with(in_memory_provider())] provider: BlockchainProvider, #[case] block_num: BlockNumber, - #[case] expected_state_update: StateUpdates, + #[case] expected_state_update: StateUpdatesWithDeclaredClasses, ) -> Result<()> { test_read_state_update_impl(provider, block_num, expected_state_update) } @@ -167,7 +167,7 @@ fn test_read_state_update_with_fork_provider( ForkedProvider, >, #[case] block_num: BlockNumber, - #[case] expected_state_update: StateUpdates, + #[case] expected_state_update: StateUpdatesWithDeclaredClasses, ) -> Result<()> { test_read_state_update_impl(provider, block_num, expected_state_update) } @@ -176,7 +176,7 @@ fn test_read_state_update_with_fork_provider( fn test_read_state_update_with_db_provider( #[with(db_provider())] provider: BlockchainProvider, #[case] block_num: BlockNumber, - #[case] expected_state_update: StateUpdates, + #[case] expected_state_update: StateUpdatesWithDeclaredClasses, ) -> Result<()> { test_read_state_update_impl(provider, block_num, expected_state_update) } @@ -184,12 +184,12 @@ fn test_read_state_update_with_db_provider( fn test_read_state_update_impl( provider: BlockchainProvider, block_num: BlockNumber, - expected_state_update: StateUpdates, + expected_state_update: StateUpdatesWithDeclaredClasses, ) -> Result<()> where Db: StateUpdateProvider, { let actual_state_update = provider.state_update(BlockHashOrNumber::from(block_num))?; - assert_eq!(actual_state_update, Some(expected_state_update)); + assert_eq!(actual_state_update, Some(expected_state_update.state_updates)); Ok(()) } diff --git a/crates/katana/storage/provider/tests/class.rs b/crates/katana/storage/provider/tests/class.rs index 58f399fc0f..2fb15a3cea 100644 --- a/crates/katana/storage/provider/tests/class.rs +++ b/crates/katana/storage/provider/tests/class.rs @@ -1,9 +1,15 @@ mod fixtures; use anyhow::Result; -use fixtures::{fork_provider_with_spawned_fork_network, in_memory_provider, provider_with_states}; +use fixtures::{ + fork_provider_with_spawned_fork_network, in_memory_provider, provider_with_states, + DOJO_WORLD_COMPILED_CLASS, DOJO_WORLD_SIERRA_CLASS, +}; +use katana_core::constants::{ERC20_CONTRACT, UDC_CONTRACT}; use katana_primitives::block::{BlockHashOrNumber, BlockNumber}; -use katana_primitives::contract::{ClassHash, CompiledClassHash}; +use katana_primitives::contract::{ + ClassHash, CompiledClassHash, CompiledContractClass, SierraClass, +}; use katana_provider::providers::fork::ForkedProvider; use katana_provider::providers::in_memory::InMemoryProvider; use katana_provider::traits::state::{StateFactoryProvider, StateProvider}; @@ -11,13 +17,32 @@ use katana_provider::BlockchainProvider; use rstest_reuse::{self, *}; use starknet::macros::felt; +type ClassHashAndClasses = + (ClassHash, Option, Option, Option); + fn assert_state_provider_class( state_provider: Box, - expected_class: Vec<(ClassHash, Option)>, + expected_class: Vec, ) -> Result<()> { - for (class_hash, expected_compiled_hash) in expected_class { + for (class_hash, expected_compiled_hash, expected_compiled_class, expected_sierra_class) in + expected_class + { let actual_compiled_hash = state_provider.compiled_class_hash_of_class_hash(class_hash)?; + let actual_compiled_class = state_provider.class(class_hash)?; + let actual_sierra_class = state_provider.sierra_class(class_hash)?; + + assert!( + if let Some(CompiledContractClass::V1(_)) = &actual_compiled_class { + actual_sierra_class.is_some() + } else { + actual_sierra_class.is_none() + }, + "V1 compiled class should have its Sierra class" + ); + assert_eq!(actual_compiled_hash, expected_compiled_hash); + assert_eq!(actual_compiled_class, expected_compiled_class); + assert_eq!(actual_sierra_class, expected_sierra_class); } Ok(()) } @@ -30,7 +55,7 @@ mod latest { fn assert_latest_class( provider: BlockchainProvider, - expected_class: Vec<(ClassHash, Option)>, + expected_class: Vec, ) -> Result<()> { let state_provider = provider.latest()?; assert_state_provider_class(state_provider, expected_class) @@ -40,21 +65,21 @@ mod latest { #[rstest::rstest] #[case( vec![ - (felt!("11"), Some(felt!("1000"))), - (felt!("22"), Some(felt!("2000"))), - (felt!("33"), Some(felt!("3000"))), + (felt!("11"), Some(felt!("1000")), Some((*ERC20_CONTRACT).clone()), None), + (felt!("22"), Some(felt!("2000")), Some((*UDC_CONTRACT).clone()), None), + (felt!("33"), Some(felt!("3000")), Some((*DOJO_WORLD_COMPILED_CLASS).clone()), Some((*DOJO_WORLD_SIERRA_CLASS).clone())), ] )] fn test_latest_class_read( #[from(provider_with_states)] provider: BlockchainProvider, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) { } #[apply(test_latest_class_read)] fn read_class_from_in_memory_provider( #[with(in_memory_provider())] provider: BlockchainProvider, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) -> Result<()> { assert_latest_class(provider, expected_class) } @@ -64,7 +89,7 @@ mod latest { #[with(fork_provider_with_spawned_fork_network::default())] provider: BlockchainProvider< ForkedProvider, >, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) -> Result<()> { assert_latest_class(provider, expected_class) } @@ -72,7 +97,7 @@ mod latest { #[apply(test_latest_class_read)] fn read_class_from_db_provider( #[with(db_provider())] provider: BlockchainProvider, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) -> Result<()> { assert_latest_class(provider, expected_class) } @@ -87,7 +112,7 @@ mod historical { fn assert_historical_class( provider: BlockchainProvider, block_num: BlockNumber, - expected_class: Vec<(ClassHash, Option)>, + expected_class: Vec, ) -> Result<()> { let state_provider = provider .historical(BlockHashOrNumber::Num(block_num))? @@ -102,39 +127,39 @@ mod historical { #[case::class_hash_at_block_0( 0, vec![ - (felt!("11"), None), - (felt!("22"), None), - (felt!("33"), None) + (felt!("11"), None, None, None), + (felt!("22"), None, None, None), + (felt!("33"), None, None, None) ]) ] #[case::class_hash_at_block_1( 1, vec![ - (felt!("11"), Some(felt!("1000"))), - (felt!("22"), None), - (felt!("33"), None), + (felt!("11"), Some(felt!("1000")), Some((*ERC20_CONTRACT).clone()), None), + (felt!("22"), None, None, None), + (felt!("33"), None, None, None), ]) ] #[case::class_hash_at_block_4( 4, vec![ - (felt!("11"), Some(felt!("1000"))), - (felt!("22"), Some(felt!("2000"))), - (felt!("33"), None), + (felt!("11"), Some(felt!("1000")), Some((*ERC20_CONTRACT).clone()), None), + (felt!("22"), Some(felt!("2000")), Some((*UDC_CONTRACT).clone()), None), + (felt!("33"), None, None, None), ]) ] #[case::class_hash_at_block_5( 5, vec![ - (felt!("11"), Some(felt!("1000"))), - (felt!("22"), Some(felt!("2000"))), - (felt!("33"), Some(felt!("3000"))), + (felt!("11"), Some(felt!("1000")), Some((*ERC20_CONTRACT).clone()), None), + (felt!("22"), Some(felt!("2000")), Some((*UDC_CONTRACT).clone()), None), + (felt!("33"), Some(felt!("3000")), Some((*DOJO_WORLD_COMPILED_CLASS).clone()), Some((*DOJO_WORLD_SIERRA_CLASS).clone())), ]) ] fn test_historical_class_read( #[from(provider_with_states)] provider: BlockchainProvider, #[case] block_num: BlockNumber, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) { } @@ -142,7 +167,7 @@ mod historical { fn read_class_from_in_memory_provider( #[with(in_memory_provider())] provider: BlockchainProvider, #[case] block_num: BlockNumber, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) -> Result<()> { assert_historical_class(provider, block_num, expected_class) } @@ -153,7 +178,7 @@ mod historical { ForkedProvider, >, #[case] block_num: BlockNumber, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) -> Result<()> { assert_historical_class(provider, block_num, expected_class) } @@ -162,7 +187,7 @@ mod historical { fn read_class_from_db_provider( #[with(db_provider())] provider: BlockchainProvider, #[case] block_num: BlockNumber, - #[case] expected_class: Vec<(ClassHash, Option)>, + #[case] expected_class: Vec, ) -> Result<()> { assert_historical_class(provider, block_num, expected_class) } diff --git a/crates/katana/storage/provider/tests/fixtures.rs b/crates/katana/storage/provider/tests/fixtures.rs index 3f0a685001..3dacb8735d 100644 --- a/crates/katana/storage/provider/tests/fixtures.rs +++ b/crates/katana/storage/provider/tests/fixtures.rs @@ -1,12 +1,14 @@ use std::collections::HashMap; use std::sync::Arc; +use katana_core::constants::{ERC20_CONTRACT, UDC_CONTRACT}; use katana_db::mdbx; use katana_primitives::block::{ BlockHashOrNumber, FinalityStatus, Header, SealedBlock, SealedBlockWithStatus, SealedHeader, }; -use katana_primitives::contract::ContractAddress; +use katana_primitives::contract::{CompiledContractClass, ContractAddress, SierraClass}; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; +use katana_primitives::utils::class::parse_compiled_class; use katana_provider::providers::db::DbProvider; use katana_provider::providers::fork::ForkedProvider; use katana_provider::providers::in_memory::InMemoryProvider; @@ -25,6 +27,15 @@ lazy_static! { let (runner, provider) = katana_runner::KatanaRunner::new().unwrap(); (runner, Arc::new(provider)) }; + pub static ref DOJO_WORLD_COMPILED_CLASS: CompiledContractClass = + parse_compiled_class(include_str!("../../db/benches/artifacts/dojo_world_240.json")) + .unwrap(); + pub static ref DOJO_WORLD_SIERRA_CLASS: SierraClass = { + let sierra_class: starknet::core::types::contract::SierraClass = + serde_json::from_str(include_str!("../../db/benches/artifacts/dojo_world_240.json")) + .unwrap(); + sierra_class.flatten().unwrap() + }; } #[rstest::fixture] @@ -58,7 +69,7 @@ pub fn db_provider() -> BlockchainProvider { } #[rstest::fixture] -pub fn mock_state_updates() -> (StateUpdates, StateUpdates, StateUpdates) { +pub fn mock_state_updates() -> [StateUpdatesWithDeclaredClasses; 3] { let address_1 = ContractAddress::from(felt!("1")); let address_2 = ContractAddress::from(felt!("2")); @@ -71,64 +82,82 @@ pub fn mock_state_updates() -> (StateUpdates, StateUpdates, StateUpdates) { let class_hash_3 = felt!("33"); let compiled_class_hash_3 = felt!("3000"); - let state_update_1 = StateUpdates { - nonce_updates: HashMap::from([(address_1, 1u8.into()), (address_2, 1u8.into())]), - storage_updates: HashMap::from([ - (address_1, HashMap::from([(1u8.into(), 100u32.into()), (2u8.into(), 101u32.into())])), - (address_2, HashMap::from([(1u8.into(), 200u32.into()), (2u8.into(), 201u32.into())])), - ]), - declared_classes: HashMap::from([(class_hash_1, compiled_class_hash_1)]), - contract_updates: HashMap::from([(address_1, class_hash_1), (address_2, class_hash_1)]), + let state_update_1 = StateUpdatesWithDeclaredClasses { + state_updates: StateUpdates { + nonce_updates: HashMap::from([(address_1, 1u8.into()), (address_2, 1u8.into())]), + storage_updates: HashMap::from([ + ( + address_1, + HashMap::from([(1u8.into(), 100u32.into()), (2u8.into(), 101u32.into())]), + ), + ( + address_2, + HashMap::from([(1u8.into(), 200u32.into()), (2u8.into(), 201u32.into())]), + ), + ]), + declared_classes: HashMap::from([(class_hash_1, compiled_class_hash_1)]), + contract_updates: HashMap::from([(address_1, class_hash_1), (address_2, class_hash_1)]), + }, + declared_compiled_classes: HashMap::from([(class_hash_1, (*ERC20_CONTRACT).clone())]), + ..Default::default() }; - let state_update_2 = StateUpdates { - nonce_updates: HashMap::from([(address_1, 2u8.into())]), - storage_updates: HashMap::from([( - address_1, - HashMap::from([(felt!("1"), felt!("111")), (felt!("2"), felt!("222"))]), - )]), - declared_classes: HashMap::from([(class_hash_2, compiled_class_hash_2)]), - contract_updates: HashMap::from([(address_2, class_hash_2)]), + let state_update_2 = StateUpdatesWithDeclaredClasses { + state_updates: StateUpdates { + nonce_updates: HashMap::from([(address_1, 2u8.into())]), + storage_updates: HashMap::from([( + address_1, + HashMap::from([(felt!("1"), felt!("111")), (felt!("2"), felt!("222"))]), + )]), + declared_classes: HashMap::from([(class_hash_2, compiled_class_hash_2)]), + contract_updates: HashMap::from([(address_2, class_hash_2)]), + }, + declared_compiled_classes: HashMap::from([(class_hash_2, (*UDC_CONTRACT).clone())]), + ..Default::default() }; - let state_update_3 = StateUpdates { - nonce_updates: HashMap::from([(address_1, 3u8.into()), (address_2, 2u8.into())]), - storage_updates: HashMap::from([ - (address_1, HashMap::from([(3u8.into(), 77u32.into())])), - (address_2, HashMap::from([(1u8.into(), 12u32.into()), (2u8.into(), 13u32.into())])), - ]), - contract_updates: HashMap::from([(address_1, class_hash_2), (address_2, class_hash_3)]), - declared_classes: HashMap::from([(class_hash_3, compiled_class_hash_3)]), + let state_update_3 = StateUpdatesWithDeclaredClasses { + state_updates: StateUpdates { + nonce_updates: HashMap::from([(address_1, 3u8.into()), (address_2, 2u8.into())]), + storage_updates: HashMap::from([ + (address_1, HashMap::from([(3u8.into(), 77u32.into())])), + ( + address_2, + HashMap::from([(1u8.into(), 12u32.into()), (2u8.into(), 13u32.into())]), + ), + ]), + contract_updates: HashMap::from([(address_1, class_hash_2), (address_2, class_hash_3)]), + declared_classes: HashMap::from([(class_hash_3, compiled_class_hash_3)]), + }, + declared_compiled_classes: HashMap::from([( + class_hash_3, + (*DOJO_WORLD_COMPILED_CLASS).clone(), + )]), + declared_sierra_classes: HashMap::from([( + class_hash_3, + (*DOJO_WORLD_SIERRA_CLASS).clone(), + )]), }; - (state_update_1, state_update_2, state_update_3) + [state_update_1, state_update_2, state_update_3] } #[rstest::fixture] #[default(BlockchainProvider)] pub fn provider_with_states( #[default(in_memory_provider())] provider: BlockchainProvider, - #[from(mock_state_updates)] state_updates: (StateUpdates, StateUpdates, StateUpdates), + #[from(mock_state_updates)] state_updates: [StateUpdatesWithDeclaredClasses; 3], ) -> BlockchainProvider where Db: BlockWriter + StateFactoryProvider, { - let state_update_at_block_1 = - StateUpdatesWithDeclaredClasses { state_updates: state_updates.0, ..Default::default() }; - let state_update_at_block_2 = - StateUpdatesWithDeclaredClasses { state_updates: state_updates.1, ..Default::default() }; - let state_update_at_block_5 = - StateUpdatesWithDeclaredClasses { state_updates: state_updates.2, ..Default::default() }; - - // Fill provider with states. - for i in 0..=5 { let block_id = BlockHashOrNumber::from(i); let state_update = match block_id { - BlockHashOrNumber::Num(1) => state_update_at_block_1.clone(), - BlockHashOrNumber::Num(2) => state_update_at_block_2.clone(), - BlockHashOrNumber::Num(5) => state_update_at_block_5.clone(), + BlockHashOrNumber::Num(1) => state_updates[0].clone(), + BlockHashOrNumber::Num(2) => state_updates[1].clone(), + BlockHashOrNumber::Num(5) => state_updates[2].clone(), _ => StateUpdatesWithDeclaredClasses::default(), }; From e083f7d32a979c5b733e1d6c539d2dbc6c0745f6 Mon Sep 17 00:00:00 2001 From: Yun Date: Wed, 27 Dec 2023 14:28:37 -0800 Subject: [PATCH 04/16] Fix torii indexing models having >1 same nested types (#1331) --- crates/torii/core/src/model.rs | 25 +++++---- crates/torii/core/src/sql.rs | 7 +-- crates/torii/graphql/src/object/entity.rs | 12 ++--- crates/torii/graphql/src/object/model_data.rs | 52 +++++++++++-------- crates/torii/graphql/src/query/mod.rs | 11 ++-- crates/torii/graphql/src/tests/mod.rs | 8 +-- crates/torii/graphql/src/tests/models_test.rs | 34 ++++++++---- crates/torii/types-test/Scarb.lock | 2 +- crates/torii/types-test/src/contracts.cairo | 18 +++++-- crates/torii/types-test/src/models.cairo | 8 +-- 10 files changed, 111 insertions(+), 66 deletions(-) diff --git a/crates/torii/core/src/model.rs b/crates/torii/core/src/model.rs index cf0bd22154..013163b10d 100644 --- a/crates/torii/core/src/model.rs +++ b/crates/torii/core/src/model.rs @@ -99,7 +99,11 @@ pub struct SqlModelMember { // `id` is the type id of the model member /// A helper function to parse the model members from sql table to `Ty` pub fn parse_sql_model_members(model: &str, model_members_all: &[SqlModelMember]) -> Ty { - fn parse_sql_model_members_impl(path: &str, model_members_all: &[SqlModelMember]) -> Ty { + fn parse_sql_model_members_impl( + path: &str, + r#type: &str, + model_members_all: &[SqlModelMember], + ) -> Ty { let children = model_members_all .iter() .filter(|member| member.id == path) @@ -114,7 +118,8 @@ pub fn parse_sql_model_members(model: &str, model_members_all: &[SqlModelMember] key: child.key, name: child.name.to_owned(), ty: parse_sql_model_members_impl( - &format!("{}${}", child.id, child.r#type), + &format!("{}${}", child.id, child.name), + &child.r#type, model_members_all, ), }, @@ -142,12 +147,10 @@ pub fn parse_sql_model_members(model: &str, model_members_all: &[SqlModelMember] .collect::>(); // refer to the sql table for `model_members` - let model_name = path.split('$').last().unwrap_or(path); - - Ty::Struct(Struct { name: model_name.to_owned(), children }) + Ty::Struct(Struct { name: r#type.into(), children }) } - parse_sql_model_members_impl(model, model_members_all) + parse_sql_model_members_impl(model, model, model_members_all) } /// Creates a query that fetches all models and their nested data. @@ -161,7 +164,7 @@ pub fn build_sql_query(model_schemas: &Vec) -> Result { for child in &schema.children { match &child.ty { Ty::Struct(s) => { - let table_name = format!("{}${}", path, s.name); + let table_name = format!("{}${}", path, child.name); parse_struct(&table_name, s, selections, tables); tables.push(table_name); @@ -276,7 +279,7 @@ pub fn map_row_to_ty(path: &str, struct_ty: &mut Struct, row: &SqliteRow) -> Res enum_ty.set_option(&value)?; } Ty::Struct(struct_ty) => { - let path = [path, &struct_ty.name].join("$"); + let path = [path, &member.name].join("$"); map_row_to_ty(&path, struct_ty, row)?; } ty => { @@ -373,7 +376,7 @@ mod tests { enum_options: None, }, SqlModelMember { - id: "Position$Vec2".into(), + id: "Position$vec".into(), name: "x".into(), r#type: "u256".into(), key: false, @@ -383,7 +386,7 @@ mod tests { enum_options: None, }, SqlModelMember { - id: "Position$Vec2".into(), + id: "Position$vec".into(), name: "y".into(), r#type: "u256".into(), key: false, @@ -506,7 +509,7 @@ mod tests { let query = build_sql_query(&vec![ty]).unwrap(); assert_eq!( query, - r#"SELECT entities.id, entities.keys, Position.external_name AS "Position.name", Position.external_age AS "Position.age", Position$Vec2.external_x AS "Position$Vec2.x", Position$Vec2.external_y AS "Position$Vec2.y" FROM entities JOIN Position ON entities.id = Position.entity_id JOIN Position$Vec2 ON entities.id = Position$Vec2.entity_id"# + r#"SELECT entities.id, entities.keys, Position.external_name AS "Position.name", Position.external_age AS "Position.age", Position$vec.external_x AS "Position$vec.x", Position$vec.external_y AS "Position$vec.y" FROM entities JOIN Position ON entities.id = Position.entity_id JOIN Position$vec ON entities.id = Position$vec.entity_id"# ); } } diff --git a/crates/torii/core/src/sql.rs b/crates/torii/core/src/sql.rs index 3d99a1c6b3..33df27b40c 100644 --- a/crates/torii/core/src/sql.rs +++ b/crates/torii/core/src/sql.rs @@ -290,7 +290,7 @@ impl Sql { } let mut path_clone = path.clone(); - path_clone.push(member.ty.name()); + path_clone.push(member.name.clone()); self.build_register_queries_recursive( &member.ty, @@ -337,12 +337,13 @@ impl Sql { columns.join(","), placeholders.join(",") ); + self.query_queue.enqueue(statement, arguments); for member in s.children.iter() { if let Ty::Struct(_) = &member.ty { let mut path_clone = path.clone(); - path_clone.push(member.ty.name()); + path_clone.push(member.name.clone()); self.build_set_entity_queries_recursive( path_clone, event_id, entity_id, &member.ty, @@ -353,7 +354,7 @@ impl Sql { Ty::Enum(e) => { for child in e.options.iter() { let mut path_clone = path.clone(); - path_clone.push(child.ty.name()); + path_clone.push(child.name.clone()); self.build_set_entity_queries_recursive( path_clone, event_id, entity_id, &child.ty, ); diff --git a/crates/torii/graphql/src/object/entity.rs b/crates/torii/graphql/src/object/entity.rs index fc0e90077c..ff5a4a21ba 100644 --- a/crates/torii/graphql/src/object/entity.rs +++ b/crates/torii/graphql/src/object/entity.rs @@ -145,11 +145,10 @@ fn model_union_field() -> Field { let mut results: Vec> = Vec::new(); for (name,) in model_ids { let type_mapping = type_mapping_query(&mut conn, &name).await?; - let mut path_array = vec![name.clone()]; let data = model_data_recursive_query( &mut conn, - &mut path_array, + vec![name.clone()], &entity_id, &type_mapping, ) @@ -170,7 +169,7 @@ fn model_union_field() -> Field { #[async_recursion] pub async fn model_data_recursive_query( conn: &mut PoolConnection, - path_array: &mut Vec, + path_array: Vec, entity_id: &str, type_mapping: &TypeMapping, ) -> sqlx::Result { @@ -182,11 +181,12 @@ pub async fn model_data_recursive_query( let mut value_mapping = value_mapping_from_row(&row, type_mapping, true)?; for (field_name, type_data) in type_mapping { - if let TypeData::Nested((nested_type_ref, nested_mapping)) = type_data { - path_array.push(nested_type_ref.to_string()); + if let TypeData::Nested((_, nested_mapping)) = type_data { + let mut nested_path = path_array.clone(); + nested_path.push(field_name.to_string()); let nested_values = - model_data_recursive_query(conn, path_array, entity_id, nested_mapping).await?; + model_data_recursive_query(conn, nested_path, entity_id, nested_mapping).await?; value_mapping.insert(Name::new(field_name), Value::Object(nested_values)); } diff --git a/crates/torii/graphql/src/object/model_data.rs b/crates/torii/graphql/src/object/model_data.rs index 642dfc7e2d..b193674ce8 100644 --- a/crates/torii/graphql/src/object/model_data.rs +++ b/crates/torii/graphql/src/object/model_data.rs @@ -125,9 +125,11 @@ impl ObjectTrait for ModelDataObject { } fn objects(&self) -> Vec { - let mut path_array = vec![self.type_name().to_string()]; - let mut objects = - data_objects_recursion(self.type_name(), self.type_mapping(), &mut path_array); + let mut objects = data_objects_recursion( + self.type_name(), + self.type_mapping(), + vec![self.type_name().to_string()], + ); // root object requires entity_field association let mut root = objects.pop().unwrap(); @@ -141,36 +143,44 @@ impl ObjectTrait for ModelDataObject { fn data_objects_recursion( type_name: &str, type_mapping: &TypeMapping, - path_array: &mut Vec, + path_array: Vec, ) -> Vec { - let mut objects = Vec::::new(); - - for (_, type_data) in type_mapping { - if let TypeData::Nested((nested_type, nested_mapping)) = type_data { - path_array.push(nested_type.to_string()); - objects.extend(data_objects_recursion( - &nested_type.to_string(), - nested_mapping, - &mut path_array.clone(), - )); - } - } + let mut objects: Vec = type_mapping + .iter() + .filter_map(|(field_name, type_data)| { + if let TypeData::Nested((nested_type, nested_mapping)) = type_data { + let mut nested_path = path_array.clone(); + nested_path.push(field_name.to_string()); + let nested_objects = + data_objects_recursion(&nested_type.to_string(), nested_mapping, nested_path); + + Some(nested_objects) + } else { + None + } + }) + .flatten() + .collect(); objects.push(object(type_name, type_mapping, path_array)); objects } -pub fn object(type_name: &str, type_mapping: &TypeMapping, path_array: &[String]) -> Object { +pub fn object(type_name: &str, type_mapping: &TypeMapping, path_array: Vec) -> Object { let mut object = Object::new(type_name); for (field_name, type_data) in type_mapping.clone() { - // For nested types, we need to remove prefix in path array - let namespace = format!("{}_", path_array[0]); - let table_name = path_array.join("$").replace(&namespace, ""); + let path_array = path_array.clone(); + let field = Field::new(field_name.to_string(), type_data.type_ref(), move |ctx| { let field_name = field_name.clone(); let type_data = type_data.clone(); - let table_name = table_name.clone(); + let mut path_array = path_array.clone(); + + // For nested types, we need to remove prefix in path array + let namespace = format!("{}_", path_array[0]); + path_array.push(field_name.to_string()); + let table_name = path_array.join("$").replace(&namespace, ""); return FieldFuture::new(async move { if let Some(value) = ctx.parent_value.as_value() { diff --git a/crates/torii/graphql/src/query/mod.rs b/crates/torii/graphql/src/query/mod.rs index c7ff3afd09..95e9095c79 100644 --- a/crates/torii/graphql/src/query/mod.rs +++ b/crates/torii/graphql/src/query/mod.rs @@ -70,19 +70,20 @@ fn member_to_type_data(member: &ModelMember, nested_members: &[&ModelMember]) -> match member.type_enum.as_str() { "Primitive" => TypeData::Simple(TypeRef::named(&member.ty)), "Enum" => TypeData::Simple(TypeRef::named("Enum")), - _ => parse_nested_type(&member.model_id, &member.ty, nested_members), + _ => parse_nested_type(&member.model_id, &member.name, &member.ty, nested_members), } } fn parse_nested_type( - target_id: &str, - target_type: &str, + model_id: &str, + member_name: &str, + member_type: &str, nested_members: &[&ModelMember], ) -> TypeData { let nested_mapping: TypeMapping = nested_members .iter() .filter_map(|&member| { - if target_id == member.model_id && member.id.ends_with(target_type) { + if model_id == member.model_id && member.id.ends_with(member_name) { let type_data = member_to_type_data(member, nested_members); Some((Name::new(&member.name), type_data)) } else { @@ -90,7 +91,7 @@ fn parse_nested_type( } }) .collect(); - let namespaced = format!("{}_{}", target_id, target_type); + let namespaced = format!("{}_{}", model_id, member_type); TypeData::Nested((TypeRef::named(namespaced), nested_mapping)) } diff --git a/crates/torii/graphql/src/tests/mod.rs b/crates/torii/graphql/src/tests/mod.rs index 793ece1473..ec5582828c 100644 --- a/crates/torii/graphql/src/tests/mod.rs +++ b/crates/torii/graphql/src/tests/mod.rs @@ -86,7 +86,9 @@ pub struct Record { pub type_contract_address: String, pub random_u8: u8, pub random_u128: String, - pub type_nested: Option, + pub type_deeply_nested: Option, + pub type_nested_one: Option, + pub type_nested_two: Option, pub entity: Option, } @@ -105,11 +107,11 @@ pub struct NestedMore { pub depth: String, pub type_number: u8, pub type_string: String, - pub type_nested_more_more: NestedMoreMore, + pub type_nested_most: NestedMost, } #[derive(Deserialize, Debug, PartialEq)] -pub struct NestedMoreMore { +pub struct NestedMost { pub __typename: String, pub depth: String, pub type_number: u8, diff --git a/crates/torii/graphql/src/tests/models_test.rs b/crates/torii/graphql/src/tests/models_test.rs index d28df29a2d..75e2b7c07b 100644 --- a/crates/torii/graphql/src/tests/models_test.rs +++ b/crates/torii/graphql/src/tests/models_test.rs @@ -34,7 +34,7 @@ mod tests { type_contract_address random_u8 random_u128 - type_nested {{ + type_deeply_nested {{ __typename depth type_number @@ -44,7 +44,7 @@ mod tests { depth type_number type_string - type_nested_more_more {{ + type_nested_most {{ __typename depth type_number @@ -52,6 +52,18 @@ mod tests { }} }} }} + type_nested_one {{ + __typename + depth + type_number + type_string + }} + type_nested_two {{ + __typename + depth + type_number + type_string + }} entity {{ keys }} @@ -80,22 +92,26 @@ mod tests { let pool = spinup_types_test().await?; let schema = build_schema(&pool).await.unwrap(); - // default params, test entity relationship, test deeply nested types + // default params, test entity relationship, test nested types let records = records_model_query(&schema, "").await; let connection: Connection = serde_json::from_value(records).unwrap(); let record = connection.edges.last().unwrap(); let entity = record.node.entity.as_ref().unwrap(); - let nested = record.node.type_nested.as_ref().unwrap(); - let nested_more = &nested.type_nested_more; - let nested_more_more = &nested_more.type_nested_more_more; + let deeply_nested = record.node.type_deeply_nested.as_ref().unwrap(); + let deeply_nested_more = &deeply_nested.type_nested_more; + let deeply_nested_most = &deeply_nested_more.type_nested_most; + let nested_one = record.node.type_nested_one.as_ref().unwrap(); + let nested_two = record.node.type_nested_two.as_ref().unwrap(); assert_eq!(connection.total_count, 10); assert_eq!(connection.edges.len(), 10); assert_eq!(&record.node.__typename, "Record"); assert_eq!(entity.keys.clone().unwrap(), vec!["0x0"]); assert_eq!(record.node.depth, "Zero"); - assert_eq!(nested.depth, "One"); - assert_eq!(nested_more.depth, "Two"); - assert_eq!(nested_more_more.depth, "Three"); + assert_eq!(deeply_nested.depth, "One"); + assert_eq!(deeply_nested_more.depth, "Two"); + assert_eq!(deeply_nested_most.depth, "Three"); + assert_eq!(nested_one.type_number, 1); + assert_eq!(nested_two.type_number, 2); // *** WHERE FILTER TESTING *** diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index 736f84366b..645c3a5107 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -15,7 +15,7 @@ source = "git+https://github.com/dojoengine/dojo?tag=v0.3.11#1e651b5d4d3b79b14a7 [[package]] name = "types_test" -version = "0.1.0" +version = "0.4.1" dependencies = [ "dojo", ] diff --git a/crates/torii/types-test/src/contracts.cairo b/crates/torii/types-test/src/contracts.cairo index 638df904a6..0ac77665cb 100644 --- a/crates/torii/types-test/src/contracts.cairo +++ b/crates/torii/types-test/src/contracts.cairo @@ -8,7 +8,7 @@ trait IRecords { #[dojo::contract] mod records { use starknet::{ContractAddress, get_caller_address}; - use types_test::models::{Record, RecordSibling, Subrecord, Nested, NestedMore, NestedMoreMore, Depth}; + use types_test::models::{Record, RecordSibling, Subrecord, Nested, NestedMore, NestedMost, Depth}; use types_test::{seed, random}; use super::IRecords; @@ -40,7 +40,7 @@ mod records { } let type_felt: felt252 = record_idx.into(); - let random_u8 = random(pedersen::pedersen(seed(), record_idx.into()), 0, 100) + let random_u8: u8 = random(pedersen::pedersen(seed(), record_idx.into()), 0, 100) .try_into() .unwrap(); let random_u128 = random( @@ -72,7 +72,7 @@ mod records { type_felt: record_idx.into(), type_class_hash: type_felt.try_into().unwrap(), type_contract_address: type_felt.try_into().unwrap(), - type_nested: Nested { + type_deeply_nested: Nested { depth: Depth::One, type_number: record_idx.into(), type_string: type_felt, @@ -80,13 +80,23 @@ mod records { depth: Depth::Two, type_number: record_idx.into(), type_string: type_felt, - type_nested_more_more: NestedMoreMore { + type_nested_most: NestedMost { depth: Depth::Three, type_number: record_idx.into(), type_string: type_felt, } } }, + type_nested_one: NestedMost { + depth: Depth::One, + type_number: 1, + type_string: 1, + }, + type_nested_two: NestedMost { + depth: Depth::One, + type_number: 2, + type_string: 2, + }, random_u8, random_u128 }, diff --git a/crates/torii/types-test/src/models.cairo b/crates/torii/types-test/src/models.cairo index a68b11ae8e..bc98d75763 100644 --- a/crates/torii/types-test/src/models.cairo +++ b/crates/torii/types-test/src/models.cairo @@ -16,7 +16,9 @@ struct Record { type_felt: felt252, type_class_hash: ClassHash, type_contract_address: ContractAddress, - type_nested: Nested, + type_deeply_nested: Nested, + type_nested_one: NestedMost, + type_nested_two: NestedMost, random_u8: u8, random_u128: u128, } @@ -41,11 +43,11 @@ struct NestedMore { depth: Depth, type_number: u8, type_string: felt252, - type_nested_more_more: NestedMoreMore, + type_nested_most: NestedMost, } #[derive(Copy, Drop, Serde, Introspect)] -struct NestedMoreMore { +struct NestedMost { depth: Depth, type_number: u8, type_string: felt252, From 3fa7549ecd829761a345279fe25a30a5a3dd2843 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Thu, 28 Dec 2023 10:57:19 +0800 Subject: [PATCH 05/16] chore(katana): remove redundant code + rename functions (#1334) --- crates/katana/core/src/sequencer.rs | 2 +- crates/katana/core/src/sequencer_error.rs | 3 +- crates/katana/core/src/utils/contract.rs | 147 ------------------ crates/katana/core/src/utils/event.rs | 96 ------------ crates/katana/core/src/utils/mod.rs | 74 +-------- crates/katana/primitives/src/constants.rs | 46 ------ .../katana/primitives/src/conversion/rpc.rs | 102 ++++++------ .../katana/rpc/rpc-types/src/transaction.rs | 8 +- crates/katana/rpc/src/starknet.rs | 2 +- .../provider/src/providers/fork/backend.rs | 7 +- 10 files changed, 70 insertions(+), 417 deletions(-) delete mode 100644 crates/katana/core/src/utils/contract.rs delete mode 100644 crates/katana/core/src/utils/event.rs delete mode 100644 crates/katana/primitives/src/constants.rs diff --git a/crates/katana/core/src/sequencer.rs b/crates/katana/core/src/sequencer.rs index 7740456bf7..73d7ffdab8 100644 --- a/crates/katana/core/src/sequencer.rs +++ b/crates/katana/core/src/sequencer.rs @@ -13,6 +13,7 @@ use katana_primitives::block::{BlockHash, BlockHashOrNumber, BlockIdOrTag, Block use katana_primitives::contract::{ ClassHash, CompiledContractClass, ContractAddress, Nonce, StorageKey, StorageValue, }; +use katana_primitives::event::{ContinuationToken, ContinuationTokenError}; use katana_primitives::receipt::Event; use katana_primitives::transaction::{ExecutableTxWithHash, TxHash, TxWithHash}; use katana_primitives::FieldElement; @@ -38,7 +39,6 @@ use crate::service::messaging::MessagingConfig; #[cfg(feature = "messaging")] use crate::service::messaging::MessagingService; use crate::service::{NodeService, TransactionMiner}; -use crate::utils::event::{ContinuationToken, ContinuationTokenError}; type SequencerResult = Result; diff --git a/crates/katana/core/src/sequencer_error.rs b/crates/katana/core/src/sequencer_error.rs index 6b58f0540d..2374112f9e 100644 --- a/crates/katana/core/src/sequencer_error.rs +++ b/crates/katana/core/src/sequencer_error.rs @@ -3,11 +3,10 @@ use blockifier::state::errors::StateError; use blockifier::transaction::errors::TransactionExecutionError; use katana_primitives::block::BlockIdOrTag; use katana_primitives::contract::ContractAddress; +use katana_primitives::event::ContinuationTokenError; use katana_primitives::transaction::TxHash; use starknet_api::StarknetApiError; -use crate::utils::event::ContinuationTokenError; - #[derive(Debug, thiserror::Error)] pub enum SequencerError { #[error("Block {0:?} not found.")] diff --git a/crates/katana/core/src/utils/contract.rs b/crates/katana/core/src/utils/contract.rs deleted file mode 100644 index df2282158e..0000000000 --- a/crates/katana/core/src/utils/contract.rs +++ /dev/null @@ -1,147 +0,0 @@ -use std::collections::HashMap; -use std::io::{Read, Write}; - -use anyhow::{anyhow, Result}; -use blockifier::execution::contract_class::{ - ContractClass as InnerContractClass, ContractClassV0 as InnerContractClassV0, -}; -use cairo_lang_starknet::casm_contract_class::CasmContractClass; -use cairo_vm::serde::deserialize_program::ProgramJson; -use serde_json::json; -use starknet::core::types::contract::legacy::{LegacyContractClass, LegacyProgram}; -use starknet::core::types::contract::CompiledClass; -use starknet::core::types::{ - CompressedLegacyContractClass, ContractClass, FieldElement, FlattenedSierraClass, - LegacyContractEntryPoint, LegacyEntryPointsByType, -}; -use starknet_api::core::ClassHash; -use starknet_api::deprecated_contract_class::{EntryPoint, EntryPointType}; - -pub fn get_contract_class(contract_class_str: &str) -> InnerContractClass { - let legacy_contract_class: InnerContractClassV0 = - serde_json::from_str(contract_class_str).unwrap(); - InnerContractClass::V0(legacy_contract_class) -} - -pub fn compute_legacy_class_hash(contract_class_str: &str) -> Result { - let contract_class: LegacyContractClass = ::serde_json::from_str(contract_class_str)?; - let seirra_class_hash = contract_class.class_hash()?; - Ok(ClassHash(seirra_class_hash.into())) -} - -pub fn legacy_inner_to_rpc_class( - legacy_contract_class: InnerContractClassV0, -) -> Result { - let entry_points_by_type = - to_rpc_legacy_entry_points_by_type(&legacy_contract_class.entry_points_by_type) - .expect("Failed to convert entry points"); - - let program = { - let program: ProgramJson = legacy_contract_class.program.clone().into(); - compress(&serde_json::to_vec(&program)?)? - }; - - Ok(ContractClass::Legacy(CompressedLegacyContractClass { - program, - entry_points_by_type, - abi: None, - })) -} - -pub fn rpc_to_inner_class( - contract_class: &FlattenedSierraClass, -) -> Result<(FieldElement, InnerContractClass)> { - let class_hash = contract_class.class_hash(); - let contract_class = rpc_to_cairo_contract_class(contract_class)?; - let casm_contract = CasmContractClass::from_contract_class(contract_class, true)?; - Ok((class_hash, InnerContractClass::V1(casm_contract.try_into()?))) -} - -/// Converts `starknet-rs` RPC [FlattenedSierraClass] type to Cairo's -/// [ContractClass](cairo_lang_starknet::contract_class::ContractClass) type. -pub fn rpc_to_cairo_contract_class( - contract_class: &FlattenedSierraClass, -) -> Result { - let value = serde_json::to_value(contract_class)?; - - Ok(cairo_lang_starknet::contract_class::ContractClass { - abi: serde_json::from_value(value["abi"].clone()).ok(), - sierra_program: serde_json::from_value(value["sierra_program"].clone())?, - entry_points_by_type: serde_json::from_value(value["entry_points_by_type"].clone())?, - contract_class_version: serde_json::from_value(value["contract_class_version"].clone())?, - sierra_program_debug_info: serde_json::from_value( - value["sierra_program_debug_info"].clone(), - ) - .ok(), - }) -} - -/// Compute the compiled class hash from the given [FlattenedSierraClass]. -pub fn compiled_class_hash_from_flattened_sierra_class( - contract_class: &FlattenedSierraClass, -) -> Result { - let contract_class = rpc_to_cairo_contract_class(contract_class)?; - let casm_contract = CasmContractClass::from_contract_class(contract_class, true)?; - let res = serde_json::to_string_pretty(&casm_contract)?; - let compiled_class: CompiledClass = serde_json::from_str(&res)?; - Ok(compiled_class.class_hash()?) -} - -pub fn legacy_rpc_to_inner_class( - compressed_legacy_contract: &CompressedLegacyContractClass, -) -> Result<(FieldElement, InnerContractClass)> { - let legacy_program_json = decompress(&compressed_legacy_contract.program)?; - let legacy_program: LegacyProgram = serde_json::from_str(&legacy_program_json)?; - - let flattened = json!({ - "program": legacy_program, - "abi": compressed_legacy_contract.abi, - "entry_points_by_type": compressed_legacy_contract.entry_points_by_type, - }); - - let legacy_contract_class: LegacyContractClass = serde_json::from_value(flattened.clone())?; - let class_hash = legacy_contract_class.class_hash()?; - let contract_class = serde_json::from_value::(flattened)?; - - Ok((class_hash, InnerContractClass::V0(contract_class))) -} - -/// Returns a [LegacyEntryPointsByType] (RPC type) from a [EntryPointType] (blockifier type) -fn to_rpc_legacy_entry_points_by_type( - entries: &HashMap>, -) -> Result { - fn collect_entry_points( - entries: &HashMap>, - entry_point_type: &EntryPointType, - ) -> Result> { - Ok(entries - .get(entry_point_type) - .ok_or(anyhow!("Missing {:?} entry point", entry_point_type))? - .iter() - .map(|e| LegacyContractEntryPoint { - offset: e.offset.0 as u64, - selector: FieldElement::from(e.selector.0), - }) - .collect::>()) - } - - let constructor = collect_entry_points(entries, &EntryPointType::Constructor)?; - let external = collect_entry_points(entries, &EntryPointType::External)?; - let l1_handler = collect_entry_points(entries, &EntryPointType::L1Handler)?; - - Ok(LegacyEntryPointsByType { constructor, external, l1_handler }) -} - -/// Returns a compressed vector of bytes -fn compress(data: &[u8]) -> Result> { - let mut gzip_encoder = flate2::write::GzEncoder::new(Vec::new(), flate2::Compression::fast()); - gzip_encoder.write_all(data)?; - Ok(gzip_encoder.finish()?) -} - -fn decompress(data: &[u8]) -> Result { - let mut decoder = flate2::read::GzDecoder::new(data); - let mut decoded = String::new(); - decoder.read_to_string(&mut decoded)?; - Ok(decoded) -} diff --git a/crates/katana/core/src/utils/event.rs b/crates/katana/core/src/utils/event.rs deleted file mode 100644 index ebe08293cd..0000000000 --- a/crates/katana/core/src/utils/event.rs +++ /dev/null @@ -1,96 +0,0 @@ -use core::fmt; -use std::num::ParseIntError; - -#[derive(PartialEq, Eq, Debug, Default)] -pub struct ContinuationToken { - pub block_n: u64, - pub txn_n: u64, - pub event_n: u64, -} - -#[derive(PartialEq, Eq, Debug, thiserror::Error)] -pub enum ContinuationTokenError { - #[error("Invalid data")] - InvalidToken, - #[error("Invalid format: {0}")] - ParseFailed(ParseIntError), -} - -impl ContinuationToken { - pub fn parse(token: String) -> Result { - let arr: Vec<&str> = token.split(',').collect(); - if arr.len() != 3 { - return Err(ContinuationTokenError::InvalidToken); - } - let block_n = - u64::from_str_radix(arr[0], 16).map_err(ContinuationTokenError::ParseFailed)?; - let receipt_n = - u64::from_str_radix(arr[1], 16).map_err(ContinuationTokenError::ParseFailed)?; - let event_n = - u64::from_str_radix(arr[2], 16).map_err(ContinuationTokenError::ParseFailed)?; - - Ok(ContinuationToken { block_n, txn_n: receipt_n, event_n }) - } -} - -impl fmt::Display for ContinuationToken { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{:x},{:x},{:x}", self.block_n, self.txn_n, self.event_n) - } -} - -#[cfg(test)] -mod test { - use super::*; - - #[test] - fn to_string_works() { - fn helper(block_n: u64, txn_n: u64, event_n: u64) -> String { - ContinuationToken { block_n, txn_n, event_n }.to_string() - } - - assert_eq!(helper(0, 0, 0), "0,0,0"); - assert_eq!(helper(30, 255, 4), "1e,ff,4"); - } - - #[test] - fn parse_works() { - fn helper(token: &str) -> ContinuationToken { - ContinuationToken::parse(token.to_owned()).unwrap() - } - assert_eq!(helper("0,0,0"), ContinuationToken { block_n: 0, txn_n: 0, event_n: 0 }); - assert_eq!(helper("1e,ff,4"), ContinuationToken { block_n: 30, txn_n: 255, event_n: 4 }); - } - - #[test] - fn parse_should_fail() { - assert_eq!( - ContinuationToken::parse("100".to_owned()).unwrap_err(), - ContinuationTokenError::InvalidToken - ); - assert_eq!( - ContinuationToken::parse("0,".to_owned()).unwrap_err(), - ContinuationTokenError::InvalidToken - ); - assert_eq!( - ContinuationToken::parse("0,0".to_owned()).unwrap_err(), - ContinuationTokenError::InvalidToken - ); - } - - #[test] - fn parse_u64_should_fail() { - matches!( - ContinuationToken::parse("2y,100,4".to_owned()).unwrap_err(), - ContinuationTokenError::ParseFailed(_) - ); - matches!( - ContinuationToken::parse("30,255g,4".to_owned()).unwrap_err(), - ContinuationTokenError::ParseFailed(_) - ); - matches!( - ContinuationToken::parse("244,1,fv".to_owned()).unwrap_err(), - ContinuationTokenError::ParseFailed(_) - ); - } -} diff --git a/crates/katana/core/src/utils/mod.rs b/crates/katana/core/src/utils/mod.rs index 825533216c..820f5adfc7 100644 --- a/crates/katana/core/src/utils/mod.rs +++ b/crates/katana/core/src/utils/mod.rs @@ -1,18 +1,7 @@ -pub mod contract; -pub mod event; - use std::collections::HashMap; -use std::time::{Duration, SystemTime}; +use std::time::SystemTime; -use anyhow::Result; -use blockifier::state::cached_state::CommitmentStateDiff; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; -use starknet::core::types::{ - ContractStorageDiffItem, DeclaredClassItem, DeployedContractItem, NonceUpdate, StateDiff, - StorageEntry, -}; -use starknet_api::hash::StarkFelt; -use starknet_api::StarknetApiError; use crate::constants::{ ERC20_CONTRACT, ERC20_CONTRACT_CLASS_HASH, ERC20_CONTRACT_COMPILED_CLASS_HASH, @@ -22,71 +11,12 @@ use crate::constants::{ UDC_COMPILED_CLASS_HASH, UDC_CONTRACT, }; -pub fn get_current_timestamp() -> Duration { +pub(super) fn get_current_timestamp() -> std::time::Duration { SystemTime::now() .duration_since(SystemTime::UNIX_EPOCH) .expect("should get current UNIX timestamp") } -pub fn starkfelt_to_u128(felt: StarkFelt) -> Result { - const COMPLIMENT_OF_U128: usize = - std::mem::size_of::() - std::mem::size_of::(); - - let (rest, u128_bytes) = felt.bytes().split_at(COMPLIMENT_OF_U128); - if rest != [0u8; COMPLIMENT_OF_U128] { - Err(StarknetApiError::OutOfRange { string: felt.to_string() }) - } else { - Ok(u128::from_be_bytes(u128_bytes.try_into().expect("u128_bytes should be of size usize."))) - } -} - -pub fn convert_state_diff_to_rpc_state_diff(state_diff: CommitmentStateDiff) -> StateDiff { - StateDiff { - storage_diffs: state_diff - .storage_updates - .iter() - .map(|(address, entries)| ContractStorageDiffItem { - address: (*address.0.key()).into(), - storage_entries: entries - .iter() - .map(|(key, value)| StorageEntry { - key: (*key.0.key()).into(), - value: (*value).into(), - }) - .collect(), - }) - .collect(), - deprecated_declared_classes: vec![], - // TODO: This will change with RPC spec v3.0.0. Also, are we supposed to return the class - // hash or the compiled class hash? - declared_classes: state_diff - .class_hash_to_compiled_class_hash - .iter() - .map(|(class_hash, compiled_class_hash)| DeclaredClassItem { - class_hash: class_hash.0.into(), - compiled_class_hash: compiled_class_hash.0.into(), - }) - .collect(), - deployed_contracts: state_diff - .address_to_class_hash - .iter() - .map(|(address, class_hash)| DeployedContractItem { - address: (*address.0.key()).into(), - class_hash: class_hash.0.into(), - }) - .collect(), - replaced_classes: vec![], - nonces: state_diff - .address_to_nonce - .iter() - .map(|(address, nonce)| NonceUpdate { - contract_address: (*address.0.key()).into(), - nonce: nonce.0.into(), - }) - .collect(), - } -} - pub(super) fn get_genesis_states_for_testing() -> StateUpdatesWithDeclaredClasses { let nonce_updates = HashMap::from([(*UDC_ADDRESS, 0u8.into()), (*FEE_TOKEN_ADDRESS, 0u8.into())]); diff --git a/crates/katana/primitives/src/constants.rs b/crates/katana/primitives/src/constants.rs deleted file mode 100644 index 22e4b36201..0000000000 --- a/crates/katana/primitives/src/constants.rs +++ /dev/null @@ -1,46 +0,0 @@ -use lazy_static::lazy_static; -use starknet::macros::felt; - -use crate::contract::{ - CompiledContractClass, CompiledContractClassV0, ContractAddress, StorageKey, -}; -use crate::FieldElement; - -pub const DEFAULT_GAS_PRICE: u128 = 100 * u128::pow(10, 9); // Given in units of wei. - -pub const DEFAULT_INVOKE_MAX_STEPS: u32 = 1_000_000; -pub const DEFAULT_VALIDATE_MAX_STEPS: u32 = 1_000_000; - -lazy_static! { - - // Predefined contract addresses - - pub static ref SEQUENCER_ADDRESS: ContractAddress = ContractAddress(felt!("0x69420")); - pub static ref UDC_ADDRESS: ContractAddress = ContractAddress(felt!("0x041a78e741e5af2fec34b695679bc6891742439f7afb8484ecd7766661ad02bf")); - pub static ref FEE_TOKEN_ADDRESS: ContractAddress = ContractAddress(felt!("0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7")); - - // Predefined class hashes - - pub static ref DEFAULT_ACCOUNT_CONTRACT_CLASS_HASH: FieldElement = felt!("0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f"); - pub static ref ERC20_CONTRACT_CLASS_HASH: FieldElement = felt!("0x02a8846878b6ad1f54f6ba46f5f40e11cee755c677f130b2c4b60566c9003f1f"); - pub static ref UDC_CLASS_HASH: FieldElement = felt!("0x07b3e05f48f0c69e4a65ce5e076a66271a527aff2c34ce1083ec6e1526997a69"); - - // Predefined contract classes - - pub static ref ERC20_CONTRACT: CompiledContractClass = parse_legacy_contract_class(include_str!("../contracts/compiled/erc20.json")); - pub static ref UDC_CONTRACT: CompiledContractClass = parse_legacy_contract_class(include_str!("../contracts/compiled/universal_deployer.json")); - pub static ref DEFAULT_ACCOUNT_CONTRACT: CompiledContractClass = parse_legacy_contract_class(include_str!("../contracts/compiled/account.json")); - - pub static ref DEFAULT_PREFUNDED_ACCOUNT_BALANCE: FieldElement = felt!("0x3635c9adc5dea00000"); // 10^21 - - // Storage slots - - pub static ref ERC20_NAME_STORAGE_SLOT: StorageKey = felt!("0x0341c1bdfd89f69748aa00b5742b03adbffd79b8e80cab5c50d91cd8c2a79be1"); - pub static ref ERC20_SYMBOL_STORAGE_SLOT: StorageKey = felt!("0x00b6ce5410fca59d078ee9b2a4371a9d684c530d697c64fbef0ae6d5e8f0ac72"); - pub static ref ERC20_DECIMALS_STORAGE_SLOT: StorageKey = felt!("0x01f0d4aa99431d246bac9b8e48c33e888245b15e9678f64f9bdfc8823dc8f979"); -} - -fn parse_legacy_contract_class(content: impl AsRef) -> CompiledContractClass { - let class: CompiledContractClassV0 = serde_json::from_str(content.as_ref()).unwrap(); - CompiledContractClass::V0(class) -} diff --git a/crates/katana/primitives/src/conversion/rpc.rs b/crates/katana/primitives/src/conversion/rpc.rs index f95eef2eb1..728d07378a 100644 --- a/crates/katana/primitives/src/conversion/rpc.rs +++ b/crates/katana/primitives/src/conversion/rpc.rs @@ -13,7 +13,9 @@ use starknet::core::types::{ }; use starknet_api::deprecated_contract_class::{EntryPoint, EntryPointType}; -use crate::contract::{ClassHash, CompiledClassHash, CompiledContractClass, SierraClass}; +use crate::contract::{ + ClassHash, CompiledClassHash, CompiledContractClass, CompiledContractClassV0, SierraClass, +}; use crate::FieldElement; mod primitives { @@ -22,7 +24,37 @@ mod primitives { pub use crate::FieldElement; } -pub fn legacy_inner_to_rpc_class(legacy_contract_class: ContractClassV0) -> Result { +/// Converts the legacy inner compiled class type [CompiledContractClassV0] into its RPC equivalent +/// [`ContractClass`]. +pub fn legacy_inner_to_rpc_class( + legacy_contract_class: CompiledContractClassV0, +) -> Result { + // Convert [EntryPointType] (blockifier type) into [LegacyEntryPointsByType] (RPC type) + fn to_rpc_legacy_entry_points_by_type( + entries: &HashMap>, + ) -> Result { + fn collect_entry_points( + entries: &HashMap>, + entry_point_type: &EntryPointType, + ) -> Result> { + Ok(entries + .get(entry_point_type) + .ok_or(anyhow!("Missing {entry_point_type:?} entry point",))? + .iter() + .map(|e| LegacyContractEntryPoint { + offset: e.offset.0 as u64, + selector: FieldElement::from(e.selector.0), + }) + .collect::>()) + } + + Ok(LegacyEntryPointsByType { + external: collect_entry_points(entries, &EntryPointType::External)?, + l1_handler: collect_entry_points(entries, &EntryPointType::L1Handler)?, + constructor: collect_entry_points(entries, &EntryPointType::Constructor)?, + }) + } + let entry_points_by_type = to_rpc_legacy_entry_points_by_type(&legacy_contract_class.entry_points_by_type)?; @@ -38,7 +70,9 @@ pub fn legacy_inner_to_rpc_class(legacy_contract_class: ContractClassV0) -> Resu })) } -pub fn rpc_to_inner_class( +/// Convert the given [`SierraClass`] into the inner compiled class type [`CompiledContractClass`] +/// along with its class hashes. +pub fn sierra_to_compiled_class( contract_class: &SierraClass, ) -> Result<(ClassHash, CompiledClassHash, CompiledContractClass)> { let class_hash = contract_class.class_hash(); @@ -57,25 +91,6 @@ pub fn rpc_to_inner_class( )) } -/// Converts `starknet-rs` RPC [SierraClass] type to Cairo's -/// [ContractClass](cairo_lang_starknet::contract_class::ContractClass) type. -pub fn rpc_to_cairo_contract_class( - contract_class: &SierraClass, -) -> Result { - let value = serde_json::to_value(contract_class)?; - - Ok(cairo_lang_starknet::contract_class::ContractClass { - abi: serde_json::from_value(value["abi"].clone()).ok(), - sierra_program: serde_json::from_value(value["sierra_program"].clone())?, - entry_points_by_type: serde_json::from_value(value["entry_points_by_type"].clone())?, - contract_class_version: serde_json::from_value(value["contract_class_version"].clone())?, - sierra_program_debug_info: serde_json::from_value( - value["sierra_program_debug_info"].clone(), - ) - .ok(), - }) -} - /// Compute the compiled class hash from the given [`SierraClass`]. pub fn compiled_class_hash_from_flattened_sierra_class( contract_class: &SierraClass, @@ -86,7 +101,9 @@ pub fn compiled_class_hash_from_flattened_sierra_class( Ok(compiled_class.class_hash()?) } -pub fn legacy_rpc_to_inner_class( +/// Converts a legacy RPC compiled contract class [CompressedLegacyContractClass] type to the inner +/// compiled class type [CompiledContractClass] along with its class hash. +pub fn legacy_rpc_to_inner_compiled_class( compressed_legacy_contract: &CompressedLegacyContractClass, ) -> Result<(ClassHash, CompiledContractClass)> { let legacy_program_json = decompress(&compressed_legacy_contract.program)?; @@ -105,30 +122,23 @@ pub fn legacy_rpc_to_inner_class( Ok((class_hash, CompiledContractClass::V0(contract_class))) } -/// Returns a [LegacyEntryPointsByType] (RPC type) from a [EntryPointType] (blockifier type) -fn to_rpc_legacy_entry_points_by_type( - entries: &HashMap>, -) -> Result { - fn collect_entry_points( - entries: &HashMap>, - entry_point_type: &EntryPointType, - ) -> Result> { - Ok(entries - .get(entry_point_type) - .ok_or(anyhow!("Missing {entry_point_type:?} entry point",))? - .iter() - .map(|e| LegacyContractEntryPoint { - offset: e.offset.0 as u64, - selector: FieldElement::from(e.selector.0), - }) - .collect::>()) - } - - let constructor = collect_entry_points(entries, &EntryPointType::Constructor)?; - let external = collect_entry_points(entries, &EntryPointType::External)?; - let l1_handler = collect_entry_points(entries, &EntryPointType::L1Handler)?; +/// Converts `starknet-rs` RPC [SierraClass] type to Cairo's +/// [ContractClass](cairo_lang_starknet::contract_class::ContractClass) type. +fn rpc_to_cairo_contract_class( + contract_class: &SierraClass, +) -> Result { + let value = serde_json::to_value(contract_class)?; - Ok(LegacyEntryPointsByType { constructor, external, l1_handler }) + Ok(cairo_lang_starknet::contract_class::ContractClass { + abi: serde_json::from_value(value["abi"].clone()).ok(), + sierra_program: serde_json::from_value(value["sierra_program"].clone())?, + entry_points_by_type: serde_json::from_value(value["entry_points_by_type"].clone())?, + contract_class_version: serde_json::from_value(value["contract_class_version"].clone())?, + sierra_program_debug_info: serde_json::from_value( + value["sierra_program_debug_info"].clone(), + ) + .ok(), + }) } fn compress(data: &[u8]) -> Result, std::io::Error> { diff --git a/crates/katana/rpc/rpc-types/src/transaction.rs b/crates/katana/rpc/rpc-types/src/transaction.rs index ee2934e8ed..dfea42172f 100644 --- a/crates/katana/rpc/rpc-types/src/transaction.rs +++ b/crates/katana/rpc/rpc-types/src/transaction.rs @@ -4,7 +4,8 @@ use anyhow::Result; use derive_more::Deref; use katana_primitives::contract::{ClassHash, ContractAddress}; use katana_primitives::conversion::rpc::{ - compiled_class_hash_from_flattened_sierra_class, legacy_rpc_to_inner_class, rpc_to_inner_class, + compiled_class_hash_from_flattened_sierra_class, legacy_rpc_to_inner_compiled_class, + sierra_to_compiled_class, }; use katana_primitives::transaction::{ DeclareTx, DeclareTxV1, DeclareTxV2, DeclareTxWithClass, DeployAccountTx, InvokeTx, TxHash, @@ -59,7 +60,8 @@ impl BroadcastedDeclareTx { pub fn try_into_tx_with_chain_id(self, chain_id: FieldElement) -> Result { match self.0 { BroadcastedDeclareTransaction::V1(tx) => { - let (class_hash, compiled_class) = legacy_rpc_to_inner_class(&tx.contract_class)?; + let (class_hash, compiled_class) = + legacy_rpc_to_inner_compiled_class(&tx.contract_class)?; Ok(DeclareTxWithClass { compiled_class, @@ -77,7 +79,7 @@ impl BroadcastedDeclareTx { BroadcastedDeclareTransaction::V2(tx) => { // TODO: avoid computing the class hash again - let (class_hash, _, compiled_class) = rpc_to_inner_class(&tx.contract_class)?; + let (class_hash, _, compiled_class) = sierra_to_compiled_class(&tx.contract_class)?; Ok(DeclareTxWithClass { compiled_class, diff --git a/crates/katana/rpc/src/starknet.rs b/crates/katana/rpc/src/starknet.rs index 8d8d13ff1f..a6a1a750b8 100644 --- a/crates/katana/rpc/src/starknet.rs +++ b/crates/katana/rpc/src/starknet.rs @@ -5,11 +5,11 @@ use jsonrpsee::core::{async_trait, Error}; use katana_core::backend::contract::StarknetContract; use katana_core::sequencer::KatanaSequencer; use katana_core::sequencer_error::SequencerError; -use katana_core::utils::contract::legacy_inner_to_rpc_class; use katana_executor::blockifier::utils::EntryPointCall; use katana_primitives::block::{ BlockHashOrNumber, BlockIdOrTag, FinalityStatus, GasPrices, PartialHeader, }; +use katana_primitives::conversion::rpc::legacy_inner_to_rpc_class; use katana_primitives::transaction::{ExecutableTx, ExecutableTxWithHash, TxHash}; use katana_primitives::version::CURRENT_STARKNET_VERSION; use katana_primitives::FieldElement; diff --git a/crates/katana/storage/provider/src/providers/fork/backend.rs b/crates/katana/storage/provider/src/providers/fork/backend.rs index 5dc059d6c8..885974482f 100644 --- a/crates/katana/storage/provider/src/providers/fork/backend.rs +++ b/crates/katana/storage/provider/src/providers/fork/backend.rs @@ -16,7 +16,8 @@ use katana_primitives::contract::{ Nonce, SierraClass, StorageKey, StorageValue, }; use katana_primitives::conversion::rpc::{ - compiled_class_hash_from_flattened_sierra_class, legacy_rpc_to_inner_class, rpc_to_inner_class, + compiled_class_hash_from_flattened_sierra_class, legacy_rpc_to_inner_compiled_class, + sierra_to_compiled_class, }; use katana_primitives::FieldElement; use parking_lot::Mutex; @@ -453,7 +454,7 @@ impl ContractClassProvider for SharedStateProvider { let (class_hash, compiled_class_hash, casm, sierra) = match class { ContractClass::Legacy(class) => { - let (_, compiled_class) = legacy_rpc_to_inner_class(&class).map_err(|e| { + let (_, compiled_class) = legacy_rpc_to_inner_compiled_class(&class).map_err(|e| { error!(target: "forked_backend", "error while parsing legacy class {hash:#x}: {e}"); e })?; @@ -462,7 +463,7 @@ impl ContractClassProvider for SharedStateProvider { } ContractClass::Sierra(sierra_class) => { - let (_, compiled_class_hash, compiled_class) = rpc_to_inner_class(&sierra_class).map_err(|e|{ + let (_, compiled_class_hash, compiled_class) = sierra_to_compiled_class(&sierra_class).map_err(|e|{ error!(target: "forked_backend", "error while parsing sierra class {hash:#x}: {e}"); e })?; From dfc48d060f4376bc66b52768e7690fb89111814e Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Thu, 28 Dec 2023 20:49:04 +0800 Subject: [PATCH 06/16] Add database version file for `katana-db` (#1338) * add db version file * add more test --- crates/katana/storage/db/src/lib.rs | 94 +++++++++++++++++++++++-- crates/katana/storage/db/src/version.rs | 76 ++++++++++++++++++++ 2 files changed, 166 insertions(+), 4 deletions(-) create mode 100644 crates/katana/storage/db/src/version.rs diff --git a/crates/katana/storage/db/src/lib.rs b/crates/katana/storage/db/src/lib.rs index 18fc97da04..4d2642c168 100644 --- a/crates/katana/storage/db/src/lib.rs +++ b/crates/katana/storage/db/src/lib.rs @@ -1,8 +1,9 @@ //! Code adapted from Paradigm's [`reth`](https://github.com/paradigmxyz/reth/tree/main/crates/storage/db) DB implementation. +use std::fs; use std::path::Path; -use anyhow::Context; +use anyhow::{anyhow, Context}; pub mod codecs; pub mod error; @@ -10,9 +11,11 @@ pub mod mdbx; pub mod models; pub mod tables; pub mod utils; +pub mod version; use mdbx::{DbEnv, DbEnvKind}; use utils::is_database_empty; +use version::{check_db_version, create_db_version_file, DatabaseVersionError, CURRENT_DB_VERSION}; /// Initialize the database at the given path and returning a handle to the its /// environment. @@ -20,13 +23,27 @@ use utils::is_database_empty; /// This will create the default tables, if necessary. pub fn init_db>(path: P) -> anyhow::Result { if is_database_empty(path.as_ref()) { - // TODO: create dir if it doesn't exist and insert db version file - std::fs::create_dir_all(path.as_ref()).with_context(|| { + fs::create_dir_all(&path).with_context(|| { format!("Creating database directory at path {}", path.as_ref().display()) })?; + create_db_version_file(&path, CURRENT_DB_VERSION).with_context(|| { + format!("Inserting database version file at path {}", path.as_ref().display()) + })? } else { - // TODO: check if db version file exists and if it's compatible + match check_db_version(&path) { + Ok(_) => {} + Err(DatabaseVersionError::FileNotFound) => { + create_db_version_file(&path, CURRENT_DB_VERSION).with_context(|| { + format!( + "No database version file found. Inserting version file at path {}", + path.as_ref().display() + ) + })? + } + Err(err) => return Err(anyhow!(err)), + } } + let env = open_db(path)?; env.create_tables()?; Ok(env) @@ -38,3 +55,72 @@ pub fn open_db>(path: P) -> anyhow::Result { format!("Opening database in read-write mode at path {}", path.as_ref().display()) }) } + +#[cfg(test)] +mod tests { + + use std::fs; + + use crate::init_db; + use crate::version::{default_version_file_path, get_db_version, CURRENT_DB_VERSION}; + + #[test] + fn initialize_db_in_empty_dir() { + let path = tempfile::tempdir().unwrap(); + init_db(path.path()).unwrap(); + + let version_file = fs::File::open(default_version_file_path(path.path())).unwrap(); + let actual_version = get_db_version(path.path()).unwrap(); + + assert!( + version_file.metadata().unwrap().permissions().readonly(), + "version file should set to read-only" + ); + assert_eq!(actual_version, CURRENT_DB_VERSION); + } + + #[test] + fn initialize_db_in_existing_db_dir() { + let path = tempfile::tempdir().unwrap(); + + init_db(path.path()).unwrap(); + let version = get_db_version(path.path()).unwrap(); + + init_db(path.path()).unwrap(); + let same_version = get_db_version(path.path()).unwrap(); + + assert_eq!(version, same_version); + } + + #[test] + fn initialize_db_with_malformed_version_file() { + let path = tempfile::tempdir().unwrap(); + let version_file_path = default_version_file_path(path.path()); + fs::write(version_file_path, b"malformed").unwrap(); + + let err = init_db(path.path()).unwrap_err(); + assert!(err.to_string().contains("Malformed database version file")); + } + + #[test] + fn initialize_db_with_mismatch_version() { + let path = tempfile::tempdir().unwrap(); + let version_file_path = default_version_file_path(path.path()); + fs::write(version_file_path, 99u32.to_be_bytes()).unwrap(); + + let err = init_db(path.path()).unwrap_err(); + assert!(err.to_string().contains("Database version mismatch")); + } + + #[test] + fn initialize_db_with_missing_version_file() { + let path = tempfile::tempdir().unwrap(); + init_db(path.path()).unwrap(); + + fs::remove_file(default_version_file_path(path.path())).unwrap(); + + init_db(path.path()).unwrap(); + let actual_version = get_db_version(path.path()).unwrap(); + assert_eq!(actual_version, CURRENT_DB_VERSION); + } +} diff --git a/crates/katana/storage/db/src/version.rs b/crates/katana/storage/db/src/version.rs new file mode 100644 index 0000000000..58e68f6ae4 --- /dev/null +++ b/crates/katana/storage/db/src/version.rs @@ -0,0 +1,76 @@ +use std::array::TryFromSliceError; +use std::fs::{self}; +use std::io::{Read, Write}; +use std::mem; +use std::path::{Path, PathBuf}; + +/// Current version of the database. +pub const CURRENT_DB_VERSION: u32 = 0; + +/// Name of the version file. +const DB_VERSION_FILE_NAME: &str = "db.version"; + +#[derive(Debug, thiserror::Error)] +pub enum DatabaseVersionError { + #[error("Database version file not found.")] + FileNotFound, + #[error(transparent)] + Io(#[from] std::io::Error), + #[error("Malformed database version file: {0}")] + MalformedContent(#[from] TryFromSliceError), + #[error("Database version mismatch. Expected version {expected}, found version {found}.")] + MismatchVersion { expected: u32, found: u32 }, +} + +/// Insert a version file at the given `path` with the specified `version`. If the `path` is a +/// directory, the version file will be created inside it. Otherwise, the version file will be +/// created exactly at `path`. +/// +/// Ideally the version file should be included in the database directory. +/// +/// # Errors +/// +/// Will fail if all the directories in `path` has not already been created. +pub(super) fn create_db_version_file( + path: impl AsRef, + version: u32, +) -> Result<(), DatabaseVersionError> { + let path = path.as_ref(); + let path = if path.is_dir() { default_version_file_path(path) } else { path.to_path_buf() }; + + let mut file = fs::File::create(path)?; + let mut permissions = file.metadata()?.permissions(); + permissions.set_readonly(true); + + file.set_permissions(permissions)?; + file.write_all(&version.to_be_bytes()).map_err(DatabaseVersionError::Io) +} + +/// Check the version of the database at the given `path`. +/// +/// Returning `Ok` if the version matches with [`CURRENT_DB_VERSION`], otherwise `Err` is returned. +pub(super) fn check_db_version(path: impl AsRef) -> Result<(), DatabaseVersionError> { + let version = get_db_version(path)?; + if version != CURRENT_DB_VERSION { + Err(DatabaseVersionError::MismatchVersion { expected: CURRENT_DB_VERSION, found: version }) + } else { + Ok(()) + } +} + +/// Get the version of the database at the given `path`. +pub(super) fn get_db_version(path: impl AsRef) -> Result { + let path = path.as_ref(); + let path = if path.is_dir() { default_version_file_path(path) } else { path.to_path_buf() }; + + let mut file = fs::File::open(path).map_err(|_| DatabaseVersionError::FileNotFound)?; + let mut buf: Vec = Vec::new(); + file.read_to_end(&mut buf)?; + + let bytes = <[u8; mem::size_of::()]>::try_from(buf.as_slice())?; + Ok(u32::from_be_bytes(bytes)) +} + +pub(super) fn default_version_file_path(path: &Path) -> PathBuf { + path.join(DB_VERSION_FILE_NAME) +} From bd1fe3a5d9b27b5e9af11218b08e504abf352548 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Fri, 29 Dec 2023 02:29:52 +0800 Subject: [PATCH 07/16] feat(sozo): wait for tx to be accepted (#1341) --- crates/sozo/src/commands/auth.rs | 4 ++++ crates/sozo/src/commands/execute.rs | 4 ++++ crates/sozo/src/commands/options/account.rs | 2 +- crates/sozo/src/commands/options/transaction.rs | 7 +++++++ crates/sozo/src/commands/register.rs | 4 ++++ crates/sozo/src/ops/auth.rs | 12 +++++++++--- crates/sozo/src/ops/execute.rs | 14 ++++++++++---- crates/sozo/src/ops/migration/migration_test.rs | 2 +- crates/sozo/src/ops/register.rs | 12 +++++++++--- 9 files changed, 49 insertions(+), 12 deletions(-) diff --git a/crates/sozo/src/commands/auth.rs b/crates/sozo/src/commands/auth.rs index 44dea9df7b..b6584a840b 100644 --- a/crates/sozo/src/commands/auth.rs +++ b/crates/sozo/src/commands/auth.rs @@ -6,6 +6,7 @@ use starknet::core::types::FieldElement; use super::options::account::AccountOptions; use super::options::starknet::StarknetOptions; +use super::options::transaction::TransactionOptions; use super::options::world::WorldOptions; use crate::ops::auth; @@ -33,6 +34,9 @@ pub enum AuthCommand { #[command(flatten)] account: AccountOptions, + + #[command(flatten)] + transaction: TransactionOptions, }, } diff --git a/crates/sozo/src/commands/execute.rs b/crates/sozo/src/commands/execute.rs index a2110a0231..6eeeada678 100644 --- a/crates/sozo/src/commands/execute.rs +++ b/crates/sozo/src/commands/execute.rs @@ -6,6 +6,7 @@ use starknet::core::types::FieldElement; use super::options::account::AccountOptions; use super::options::starknet::StarknetOptions; +use super::options::transaction::TransactionOptions; use crate::ops::execute; #[derive(Debug, Args)] @@ -29,6 +30,9 @@ pub struct ExecuteArgs { #[command(flatten)] pub account: AccountOptions, + + #[command(flatten)] + pub transaction: TransactionOptions, } impl ExecuteArgs { diff --git a/crates/sozo/src/commands/options/account.rs b/crates/sozo/src/commands/options/account.rs index 9936eebe81..7aa027a7bc 100644 --- a/crates/sozo/src/commands/options/account.rs +++ b/crates/sozo/src/commands/options/account.rs @@ -42,7 +42,7 @@ impl AccountOptions { env_metadata: Option<&Environment>, ) -> Result> where - P: Provider + Send + Sync + 'static, + P: Provider + Send + Sync, { let account_address = self.account_address(env_metadata)?; let signer = self.signer(env_metadata)?; diff --git a/crates/sozo/src/commands/options/transaction.rs b/crates/sozo/src/commands/options/transaction.rs index e1e4a6a94b..23874ac93d 100644 --- a/crates/sozo/src/commands/options/transaction.rs +++ b/crates/sozo/src/commands/options/transaction.rs @@ -11,6 +11,13 @@ pub struct TransactionOptions { the estimated fee which will be used as the max fee for the transaction. \ (max_fee = estimated_fee * multiplier)")] pub fee_estimate_multiplier: Option, + + #[arg(short, long)] + #[arg(help = "Wait until the transaction is accepted by the sequencer, returning the receipt.")] + #[arg(long_help = "Wait until the transaction is accepted by the sequencer, returning the \ + receipt. This will poll the transaction status until it gets accepted or \ + rejected by the sequencer.")] + pub wait: bool, } impl From for TxConfig { diff --git a/crates/sozo/src/commands/register.rs b/crates/sozo/src/commands/register.rs index 74cfa2ae22..6ff53cdfd6 100644 --- a/crates/sozo/src/commands/register.rs +++ b/crates/sozo/src/commands/register.rs @@ -6,6 +6,7 @@ use starknet::core::types::FieldElement; use super::options::account::AccountOptions; use super::options::starknet::StarknetOptions; +use super::options::transaction::TransactionOptions; use super::options::world::WorldOptions; use crate::ops::register; @@ -33,6 +34,9 @@ pub enum RegisterCommand { #[command(flatten)] account: AccountOptions, + + #[command(flatten)] + transaction: TransactionOptions, }, } diff --git a/crates/sozo/src/ops/auth.rs b/crates/sozo/src/ops/auth.rs index e2757f59e6..369313ee30 100644 --- a/crates/sozo/src/ops/auth.rs +++ b/crates/sozo/src/ops/auth.rs @@ -2,16 +2,17 @@ use anyhow::{Context, Result}; use dojo_world::contracts::cairo_utils; use dojo_world::contracts::world::WorldContract; use dojo_world::metadata::Environment; +use dojo_world::utils::TransactionWaiter; use crate::commands::auth::AuthCommand; pub async fn execute(command: AuthCommand, env_metadata: Option) -> Result<()> { match command { - AuthCommand::Writer { model, contract, world, starknet, account } => { + AuthCommand::Writer { model, contract, world, starknet, account, transaction } => { let world_address = world.address(env_metadata.as_ref())?; let provider = starknet.provider(env_metadata.as_ref())?; - let account = account.account(provider, env_metadata.as_ref()).await?; + let account = account.account(&provider, env_metadata.as_ref()).await?; let world = WorldContract::new(world_address, &account); let res = world @@ -20,7 +21,12 @@ pub async fn execute(command: AuthCommand, env_metadata: Option) -> .await .with_context(|| "Failed to send transaction")?; - println!("Transaction: {:#x}", res.transaction_hash); + if transaction.wait { + let receipt = TransactionWaiter::new(res.transaction_hash, &provider).await?; + println!("{}", serde_json::to_string_pretty(&receipt)?); + } else { + println!("Transaction hash: {:#x}", res.transaction_hash); + } } } diff --git a/crates/sozo/src/ops/execute.rs b/crates/sozo/src/ops/execute.rs index 9cc727badc..868f69993c 100644 --- a/crates/sozo/src/ops/execute.rs +++ b/crates/sozo/src/ops/execute.rs @@ -1,6 +1,7 @@ use anyhow::{Context, Result}; use dojo_world::metadata::Environment; use dojo_world::migration::strategy::generate_salt; +use dojo_world::utils::TransactionWaiter; use starknet::accounts::{Account, Call}; use starknet::core::types::{BlockId, BlockTag, FieldElement, FunctionCall}; use starknet::core::utils::{get_contract_address, get_selector_from_name}; @@ -10,7 +11,7 @@ use starknet::providers::Provider; use crate::commands::execute::ExecuteArgs; pub async fn execute(args: ExecuteArgs, env_metadata: Option) -> Result<()> { - let ExecuteArgs { contract, entrypoint, calldata, starknet, account } = args; + let ExecuteArgs { contract, entrypoint, calldata, starknet, account, transaction } = args; let provider = starknet.provider(env_metadata.as_ref())?; @@ -42,19 +43,24 @@ pub async fn execute(args: ExecuteArgs, env_metadata: Option) -> Re ) }; - let account = account.account(provider, env_metadata.as_ref()).await?; + let account = account.account(&provider, env_metadata.as_ref()).await?; let res = account .execute(vec![Call { calldata, to: contract_address, - selector: get_selector_from_name(&entrypoint).unwrap(), + selector: get_selector_from_name(&entrypoint)?, }]) .send() .await .with_context(|| "Failed to send transaction")?; - println!("Transaction: {:#x}", res.transaction_hash); + if transaction.wait { + let receipt = TransactionWaiter::new(res.transaction_hash, &provider).await?; + println!("{}", serde_json::to_string_pretty(&receipt)?); + } else { + println!("Transaction hash: {:#x}", res.transaction_hash); + } Ok(()) } diff --git a/crates/sozo/src/ops/migration/migration_test.rs b/crates/sozo/src/ops/migration/migration_test.rs index 3e1966208a..02742afd16 100644 --- a/crates/sozo/src/ops/migration/migration_test.rs +++ b/crates/sozo/src/ops/migration/migration_test.rs @@ -88,7 +88,7 @@ async fn migrate_with_small_fee_multiplier_will_fail() { &ws, &migration, &account, - Some(TransactionOptions { fee_estimate_multiplier: Some(0.2f64) }), + Some(TransactionOptions { fee_estimate_multiplier: Some(0.2f64), wait: false }), ) .await .is_err() diff --git a/crates/sozo/src/ops/register.rs b/crates/sozo/src/ops/register.rs index 5906a90fc6..c0d37d8199 100644 --- a/crates/sozo/src/ops/register.rs +++ b/crates/sozo/src/ops/register.rs @@ -1,17 +1,18 @@ use anyhow::{Context, Result}; use dojo_world::contracts::WorldContract; use dojo_world::metadata::Environment; +use dojo_world::utils::TransactionWaiter; use starknet::accounts::Account; use crate::commands::register::RegisterCommand; pub async fn execute(command: RegisterCommand, env_metadata: Option) -> Result<()> { match command { - RegisterCommand::Model { models, world, starknet, account } => { + RegisterCommand::Model { models, world, starknet, account, transaction } => { let world_address = world.address(env_metadata.as_ref())?; let provider = starknet.provider(env_metadata.as_ref())?; - let account = account.account(provider, env_metadata.as_ref()).await?; + let account = account.account(&provider, env_metadata.as_ref()).await?; let world = WorldContract::new(world_address, &account); let calls = models @@ -25,7 +26,12 @@ pub async fn execute(command: RegisterCommand, env_metadata: Option .await .with_context(|| "Failed to send transaction")?; - println!("Models registered at transaction: {:#x}", res.transaction_hash) + if transaction.wait { + let receipt = TransactionWaiter::new(res.transaction_hash, &provider).await?; + println!("{}", serde_json::to_string_pretty(&receipt)?); + } else { + println!("Transaction hash: {:#x}", res.transaction_hash); + } } } Ok(()) From b45ef4a14945f89aaa2550447a8d3e39f82d9d5c Mon Sep 17 00:00:00 2001 From: Tarrence van As Date: Thu, 28 Dec 2023 12:43:30 -0600 Subject: [PATCH 08/16] Prepare release: v0.4.3 (#1324) --- Cargo.lock | 62 +++++++++++++++--------------- Cargo.toml | 2 +- crates/dojo-core/Scarb.lock | 2 +- crates/dojo-core/Scarb.toml | 2 +- crates/torii/types-test/Scarb.lock | 2 +- crates/torii/types-test/Scarb.toml | 2 +- examples/spawn-and-move/Scarb.lock | 2 +- examples/spawn-and-move/Scarb.toml | 2 +- 8 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7d61987c3d..7dd7236a47 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -801,7 +801,7 @@ dependencies = [ [[package]] name = "benches" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "clap_builder", @@ -2661,15 +2661,15 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dojo-core" -version = "0.4.2" +version = "0.4.3" [[package]] name = "dojo-examples-spawn-and-move" -version = "0.4.2" +version = "0.4.3" [[package]] name = "dojo-lang" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2717,7 +2717,7 @@ dependencies = [ [[package]] name = "dojo-language-server" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2739,7 +2739,7 @@ dependencies = [ [[package]] name = "dojo-signers" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "starknet", @@ -2747,7 +2747,7 @@ dependencies = [ [[package]] name = "dojo-test-utils" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "assert_fs", @@ -2778,7 +2778,7 @@ dependencies = [ [[package]] name = "dojo-types" -version = "0.4.2" +version = "0.4.3" dependencies = [ "crypto-bigint", "hex", @@ -2793,7 +2793,7 @@ dependencies = [ [[package]] name = "dojo-world" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "assert_fs", @@ -5432,7 +5432,7 @@ dependencies = [ [[package]] name = "katana" -version = "0.4.2" +version = "0.4.3" dependencies = [ "assert_matches", "clap", @@ -5440,7 +5440,7 @@ dependencies = [ "console", "katana-core", "katana-rpc", - "metrics 0.4.2", + "metrics 0.4.3", "metrics-process", "serde_json", "starknet_api", @@ -5452,7 +5452,7 @@ dependencies = [ [[package]] name = "katana-codecs" -version = "0.4.2" +version = "0.4.3" dependencies = [ "bytes", "katana-primitives", @@ -5460,7 +5460,7 @@ dependencies = [ [[package]] name = "katana-codecs-derive" -version = "0.4.2" +version = "0.4.3" dependencies = [ "proc-macro2", "quote", @@ -5470,7 +5470,7 @@ dependencies = [ [[package]] name = "katana-core" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "assert_matches", @@ -5503,7 +5503,7 @@ dependencies = [ [[package]] name = "katana-db" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "blockifier", @@ -5525,7 +5525,7 @@ dependencies = [ [[package]] name = "katana-executor" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "blockifier", @@ -5541,7 +5541,7 @@ dependencies = [ [[package]] name = "katana-primitives" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "blockifier", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "katana-provider" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "auto_impl", @@ -5584,7 +5584,7 @@ dependencies = [ [[package]] name = "katana-rpc" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "assert_matches", @@ -5616,7 +5616,7 @@ dependencies = [ [[package]] name = "katana-rpc-types" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "derive_more", @@ -5629,7 +5629,7 @@ dependencies = [ [[package]] name = "katana-rpc-types-builder" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "katana-executor", @@ -5641,7 +5641,7 @@ dependencies = [ [[package]] name = "katana-runner" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "home", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "metrics" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "hyper", @@ -8601,7 +8601,7 @@ dependencies = [ [[package]] name = "sozo" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "assert_fs", @@ -9795,7 +9795,7 @@ dependencies = [ [[package]] name = "torii-client" -version = "0.4.2" +version = "0.4.3" dependencies = [ "async-trait", "camino", @@ -9821,7 +9821,7 @@ dependencies = [ [[package]] name = "torii-core" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "async-trait", @@ -9857,7 +9857,7 @@ dependencies = [ [[package]] name = "torii-graphql" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "async-graphql", @@ -9896,7 +9896,7 @@ dependencies = [ [[package]] name = "torii-grpc" -version = "0.4.2" +version = "0.4.3" dependencies = [ "bytes", "crypto-bigint", @@ -9935,7 +9935,7 @@ dependencies = [ [[package]] name = "torii-server" -version = "0.4.2" +version = "0.4.3" dependencies = [ "anyhow", "async-trait", @@ -9954,7 +9954,7 @@ dependencies = [ "hyper-reverse-proxy", "indexmap 1.9.3", "lazy_static", - "metrics 0.4.2", + "metrics 0.4.3", "metrics-process", "scarb", "serde", @@ -10222,7 +10222,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "types-test" -version = "0.4.2" +version = "0.4.3" [[package]] name = "ucd-trie" diff --git a/Cargo.toml b/Cargo.toml index 1ece9cfe98..998e142568 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ edition = "2021" license = "Apache-2.0" license-file = "LICENSE" repository = "https://github.com/dojoengine/dojo/" -version = "0.4.2" +version = "0.4.3" [profile.performance] codegen-units = 1 diff --git a/crates/dojo-core/Scarb.lock b/crates/dojo-core/Scarb.lock index 14d33d1dbb..5088674763 100644 --- a/crates/dojo-core/Scarb.lock +++ b/crates/dojo-core/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.4.2" +version = "0.4.3" dependencies = [ "dojo_plugin", ] diff --git a/crates/dojo-core/Scarb.toml b/crates/dojo-core/Scarb.toml index ef1080e43a..5c40f430e0 100644 --- a/crates/dojo-core/Scarb.toml +++ b/crates/dojo-core/Scarb.toml @@ -2,7 +2,7 @@ cairo-version = "2.4.0" description = "The Dojo Core library for autonomous worlds." name = "dojo" -version = "0.4.2" +version = "0.4.3" [dependencies] dojo_plugin = { git = "https://github.com/dojoengine/dojo", tag = "v0.3.11" } diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index 645c3a5107..dc4edc4797 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.4.2" +version = "0.4.3" dependencies = [ "dojo_plugin", ] diff --git a/crates/torii/types-test/Scarb.toml b/crates/torii/types-test/Scarb.toml index ac5bfa187f..ee29cc6fa6 100644 --- a/crates/torii/types-test/Scarb.toml +++ b/crates/torii/types-test/Scarb.toml @@ -1,7 +1,7 @@ [package] cairo-version = "2.4.0" name = "types_test" -version = "0.4.2" +version = "0.4.3" [cairo] sierra-replace-ids = true diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index c28e96ff39..698dac63e0 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.4.2" +version = "0.4.3" dependencies = [ "dojo_plugin", ] diff --git a/examples/spawn-and-move/Scarb.toml b/examples/spawn-and-move/Scarb.toml index 2383af1a8e..42937f7661 100644 --- a/examples/spawn-and-move/Scarb.toml +++ b/examples/spawn-and-move/Scarb.toml @@ -1,7 +1,7 @@ [package] cairo-version = "2.4.0" name = "dojo_examples" -version = "0.4.2" +version = "0.4.3" # Use the prelude with the less imports as possible # from corelib. edition = "2023_10" From bc5dd6f4f403548141e115a3a4e91b9fbe1a4801 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Fri, 29 Dec 2023 10:17:21 +0800 Subject: [PATCH 09/16] refactor: improve `TransactionWaiter` (#1340) --- crates/dojo-world/src/utils.rs | 434 ++++++++++++++++++++++++++++----- 1 file changed, 369 insertions(+), 65 deletions(-) diff --git a/crates/dojo-world/src/utils.rs b/crates/dojo-world/src/utils.rs index 1c0bc88037..fce459d9bf 100644 --- a/crates/dojo-world/src/utils.rs +++ b/crates/dojo-world/src/utils.rs @@ -6,20 +6,25 @@ use std::time::Duration; use futures::FutureExt; use starknet::core::types::{ ExecutionResult, FieldElement, MaybePendingTransactionReceipt, PendingTransactionReceipt, - StarknetError, TransactionFinalityStatus, TransactionReceipt, + StarknetError, TransactionFinalityStatus, TransactionReceipt, TransactionStatus, }; use starknet::providers::{Provider, ProviderError}; use tokio::time::{Instant, Interval}; -type GetReceiptResult = Result; -type GetReceiptFuture<'a> = Pin + Send + 'a>>; +type GetTxStatusResult = Result; +type GetTxReceiptResult = Result; + +type GetTxStatusFuture<'a> = Pin + Send + 'a>>; +type GetTxReceiptFuture<'a> = Pin + Send + 'a>>; #[derive(Debug, thiserror::Error)] pub enum TransactionWaitingError { #[error("request timed out")] Timeout, - #[error("transaction reverted due to failed execution: {0}")] + #[error("transaction reverted with reason: {0}")] TransactionReverted(String), + #[error("transaction rejected")] + TransactionRejected, #[error(transparent)] Provider(ProviderError), } @@ -49,21 +54,19 @@ pub enum TransactionWaitingError { pub struct TransactionWaiter<'a, P: Provider> { /// The hash of the transaction to wait for. tx_hash: FieldElement, - /// The finality status to wait for. + /// The transaction finality status to wait for. /// - /// If set, the waiter will wait for the transaction to achieve this finality status. - /// Otherwise, the waiter will only wait for the transaction until it is included in the - /// _pending_ block. - finality_status: Option, + /// If not set, then it will wait until it is `ACCEPTED_ON_L2` whether it is reverted or not. + tx_finality_status: Option, /// A flag to indicate that the waited transaction must either be successfully executed or not. /// - /// If it's set to `true`, then the transaction execution status must be `SUCCEEDED` otherwise + /// If it's set to `true`, then the transaction execution result must be `SUCCEEDED` otherwise /// an error will be returned. However, if set to `false`, then the execution status will not /// be considered when waiting for the transaction, meaning `REVERTED` transaction will not /// return an error. must_succeed: bool, /// Poll the transaction every `interval` miliseconds. Miliseconds are used so that - /// we can be more precise with the polling interval. Defaults to 250ms. + /// we can be more precise with the polling interval. Defaults to 2.5 seconds. interval: Interval, /// The maximum amount of time to wait for the transaction to achieve the desired status. An /// error will be returned if it is unable to finish within the `timeout` duration. Defaults to @@ -71,8 +74,10 @@ pub struct TransactionWaiter<'a, P: Provider> { timeout: Duration, /// The provider to use for polling the transaction. provider: &'a P, + /// The future that gets the transaction status. + tx_status_request_fut: Option>, /// The future that gets the transaction receipt. - receipt_request_fut: Option>, + tx_receipt_request_fut: Option>, /// The time when the transaction waiter was first polled. started_at: Option, } @@ -82,6 +87,7 @@ where P: Provider + Send, { const DEFAULT_TIMEOUT: Duration = Duration::from_secs(300); + /// Interval for use with 3rd party provider without burning the API rate limit. const DEFAULT_INTERVAL: Duration = Duration::from_millis(2500); pub fn new(tx: FieldElement, provider: &'a P) -> Self { @@ -90,8 +96,9 @@ where tx_hash: tx, started_at: None, must_succeed: true, - finality_status: None, - receipt_request_fut: None, + tx_finality_status: None, + tx_status_request_fut: None, + tx_receipt_request_fut: None, timeout: Self::DEFAULT_TIMEOUT, interval: tokio::time::interval_at( Instant::now() + Self::DEFAULT_INTERVAL, @@ -105,13 +112,68 @@ where Self { interval: tokio::time::interval_at(Instant::now() + interval, interval), ..self } } - pub fn with_finality(self, status: TransactionFinalityStatus) -> Self { - Self { finality_status: Some(status), ..self } + pub fn with_tx_status(self, status: TransactionFinalityStatus) -> Self { + Self { tx_finality_status: Some(status), ..self } } pub fn with_timeout(self, timeout: Duration) -> Self { Self { timeout, ..self } } + + // Helper function to evaluate if the transaction receipt should be accepted yet or not, based + // on the waiter's parameters. Used in the `Future` impl. + fn evaluate_receipt_from_params( + receipt: MaybePendingTransactionReceipt, + expected_finality_status: Option, + must_succeed: bool, + ) -> Option> { + match &receipt { + MaybePendingTransactionReceipt::PendingReceipt(r) => { + // pending receipt doesn't include finality status, so we cant check it. + if expected_finality_status.is_some() { + return None; + } + + if !must_succeed { + return Some(Ok(receipt)); + } + + match execution_status_from_pending_receipt(r) { + ExecutionResult::Succeeded => Some(Ok(receipt)), + ExecutionResult::Reverted { reason } => { + Some(Err(TransactionWaitingError::TransactionReverted(reason.clone()))) + } + } + } + + MaybePendingTransactionReceipt::Receipt(r) => { + if let Some(expected_status) = expected_finality_status { + match finality_status_from_receipt(r) { + TransactionFinalityStatus::AcceptedOnL2 + if expected_status == TransactionFinalityStatus::AcceptedOnL1 => + { + None + } + + _ => { + if !must_succeed { + return Some(Ok(receipt)); + } + + match execution_status_from_receipt(r) { + ExecutionResult::Succeeded => Some(Ok(receipt)), + ExecutionResult::Reverted { reason } => Some(Err( + TransactionWaitingError::TransactionReverted(reason.clone()), + )), + } + } + } + } else { + Some(Ok(receipt)) + } + } + } + } } impl<'a, P> Future for TransactionWaiter<'a, P> @@ -134,53 +196,24 @@ where } } - if let Some(mut flush) = this.receipt_request_fut.take() { - match flush.poll_unpin(cx) { + if let Some(mut fut) = this.tx_status_request_fut.take() { + match fut.poll_unpin(cx) { Poll::Ready(res) => match res { - Ok(receipt) => match &receipt { - MaybePendingTransactionReceipt::PendingReceipt(r) => { - if this.finality_status.is_none() { - if this.must_succeed { - let res = match execution_status_from_pending_receipt(r) { - ExecutionResult::Succeeded => Ok(receipt), - ExecutionResult::Reverted { reason } => { - Err(TransactionWaitingError::TransactionReverted( - reason.clone(), - )) - } - }; - return Poll::Ready(res); - } - - return Poll::Ready(Ok(receipt)); - } + Ok(status) => match status { + TransactionStatus::AcceptedOnL2(_) + | TransactionStatus::AcceptedOnL1(_) => { + this.tx_receipt_request_fut = Some(Box::pin( + this.provider.get_transaction_receipt(this.tx_hash), + )); } - MaybePendingTransactionReceipt::Receipt(r) => { - if let Some(finality_status) = this.finality_status { - match finality_status_from_receipt(r) { - status if status == finality_status => { - if this.must_succeed { - let res = match execution_status_from_receipt(r) { - ExecutionResult::Succeeded => Ok(receipt), - ExecutionResult::Reverted { reason } => { - Err(TransactionWaitingError::TransactionReverted( - reason.clone(), - )) - } - }; - return Poll::Ready(res); - } - - return Poll::Ready(Ok(receipt)); - } - - _ => {} - } - } else { - return Poll::Ready(Ok(receipt)); - } + TransactionStatus::Rejected => { + return Poll::Ready(Err( + TransactionWaitingError::TransactionRejected, + )); } + + TransactionStatus::Received => {} }, Err(ProviderError::StarknetError( @@ -193,15 +226,40 @@ where }, Poll::Pending => { - this.receipt_request_fut = Some(flush); + this.tx_status_request_fut = Some(fut); + return Poll::Pending; + } + } + } + + if let Some(mut fut) = this.tx_receipt_request_fut.take() { + match fut.poll_unpin(cx) { + Poll::Pending => { + this.tx_receipt_request_fut = Some(fut); return Poll::Pending; } + + Poll::Ready(res) => match res { + Err(e) => { + return Poll::Ready(Err(TransactionWaitingError::Provider(e))); + } + + Ok(receipt) => { + if let Some(res) = Self::evaluate_receipt_from_params( + receipt, + this.tx_finality_status, + this.must_succeed, + ) { + return Poll::Ready(res); + } + } + }, } } if this.interval.poll_tick(cx).is_ready() { - this.receipt_request_fut = - Some(Box::pin(this.provider.get_transaction_receipt(this.tx_hash))); + this.tx_status_request_fut = + Some(Box::pin(this.provider.get_transaction_status(this.tx_hash))); } else { break; } @@ -260,18 +318,68 @@ mod tests { use dojo_test_utils::sequencer::{ get_default_test_starknet_config, SequencerConfig, TestSequencer, }; - use starknet::core::types::FieldElement; + use starknet::core::types::{ + ExecutionResources, ExecutionResult, FieldElement, InvokeTransactionReceipt, + MaybePendingTransactionReceipt, PendingInvokeTransactionReceipt, PendingTransactionReceipt, + TransactionFinalityStatus, TransactionReceipt, + }; use starknet::providers::jsonrpc::HttpTransport; use starknet::providers::JsonRpcClient; use super::{Duration, TransactionWaiter}; - #[tokio::test] - async fn should_timeout_on_nonexistant_transaction() { + async fn create_test_sequencer() -> (TestSequencer, JsonRpcClient) { let sequencer = TestSequencer::start(SequencerConfig::default(), get_default_test_starknet_config()) .await; let provider = JsonRpcClient::new(HttpTransport::new(sequencer.url())); + (sequencer, provider) + } + + const EXECUTION_RESOURCES: ExecutionResources = ExecutionResources { + steps: 0, + memory_holes: None, + ec_op_builtin_applications: 0, + ecdsa_builtin_applications: 0, + keccak_builtin_applications: 0, + bitwise_builtin_applications: 0, + pedersen_builtin_applications: 0, + poseidon_builtin_applications: 0, + range_check_builtin_applications: 0, + }; + + fn mock_receipt( + finality_status: TransactionFinalityStatus, + execution_result: ExecutionResult, + ) -> TransactionReceipt { + TransactionReceipt::Invoke(InvokeTransactionReceipt { + finality_status, + execution_result, + events: Default::default(), + actual_fee: Default::default(), + block_hash: Default::default(), + block_number: Default::default(), + messages_sent: Default::default(), + transaction_hash: Default::default(), + execution_resources: EXECUTION_RESOURCES, + }) + } + + fn mock_pending_receipt(execution_result: ExecutionResult) -> PendingTransactionReceipt { + PendingTransactionReceipt::Invoke(PendingInvokeTransactionReceipt { + execution_result, + events: Default::default(), + actual_fee: Default::default(), + messages_sent: Default::default(), + transaction_hash: Default::default(), + execution_resources: EXECUTION_RESOURCES, + }) + } + + #[tokio::test] + async fn should_timeout_on_nonexistant_transaction() { + let (_sequencer, provider) = create_test_sequencer().await; + assert_matches!( TransactionWaiter::new(FieldElement::from_hex_be("0x1234").unwrap(), &provider) .with_timeout(Duration::from_secs(1)) @@ -279,4 +387,200 @@ mod tests { Err(super::TransactionWaitingError::Timeout) ); } + + #[test] + fn wait_for_no_finality_status() { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL2, + ExecutionResult::Succeeded, + )); + + assert_eq!( + TransactionWaiter::>::evaluate_receipt_from_params( + receipt.clone(), + None, + false + ) + .unwrap() + .unwrap(), + receipt + ); + } + + macro_rules! assert_eval_receipt { + (($receipt:expr, $expected_status:expr), $expected_receipt:expr) => { + assert_eq!( + TransactionWaiter::>::evaluate_receipt_from_params( + $receipt, + $expected_status, + false + ) + .unwrap() + .unwrap(), + $expected_receipt + ); + }; + } + + #[test] + fn wait_for_finality_status_with_no_succeed() { + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL2, + ExecutionResult::Succeeded, + )); + + assert_eval_receipt!( + (receipt.clone(), Some(TransactionFinalityStatus::AcceptedOnL2)), + receipt + ); + } + + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL2, + ExecutionResult::Succeeded, + )); + + assert!( + TransactionWaiter::>::evaluate_receipt_from_params( + receipt, + Some(TransactionFinalityStatus::AcceptedOnL1), + true, + ) + .is_none() + ); + } + + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL1, + ExecutionResult::Succeeded, + )); + + assert_eval_receipt!( + (receipt.clone(), Some(TransactionFinalityStatus::AcceptedOnL2)), + receipt + ); + } + + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL1, + ExecutionResult::Succeeded, + )); + + assert_eval_receipt!( + (receipt.clone(), Some(TransactionFinalityStatus::AcceptedOnL1)), + receipt + ); + } + } + + #[test] + fn wait_for_finality_status_with_must_succeed() { + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL2, + ExecutionResult::Succeeded, + )); + + assert_eq!( + TransactionWaiter::>::evaluate_receipt_from_params( + receipt.clone(), + Some(TransactionFinalityStatus::AcceptedOnL2), + true + ) + .unwrap() + .unwrap(), + receipt + ) + } + + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL1, + ExecutionResult::Succeeded, + )); + + assert_eq!( + TransactionWaiter::>::evaluate_receipt_from_params( + receipt.clone(), + Some(TransactionFinalityStatus::AcceptedOnL2), + true + ) + .unwrap() + .unwrap(), + receipt + ) + } + + { + let receipt = MaybePendingTransactionReceipt::Receipt(mock_receipt( + TransactionFinalityStatus::AcceptedOnL1, + ExecutionResult::Reverted { reason: Default::default() }, + )); + + let err = + TransactionWaiter::>::evaluate_receipt_from_params( + receipt, + Some(TransactionFinalityStatus::AcceptedOnL1), + true, + ) + .unwrap() + .unwrap_err(); + + assert!(err.to_string().contains("transaction reverted")) + } + } + + #[test] + fn wait_for_pending_tx() { + { + let receipt = MaybePendingTransactionReceipt::PendingReceipt(mock_pending_receipt( + ExecutionResult::Succeeded, + )); + + assert!( + TransactionWaiter::>::evaluate_receipt_from_params( + receipt, + Some(TransactionFinalityStatus::AcceptedOnL2), + true + ) + .is_none() + ) + } + + { + let receipt = MaybePendingTransactionReceipt::PendingReceipt(mock_pending_receipt( + ExecutionResult::Reverted { reason: Default::default() }, + )); + + assert_eq!( + TransactionWaiter::>::evaluate_receipt_from_params( + receipt.clone(), + None, + false + ) + .unwrap() + .unwrap(), + receipt + ) + } + + { + let receipt = MaybePendingTransactionReceipt::PendingReceipt(mock_pending_receipt( + ExecutionResult::Reverted { reason: Default::default() }, + )); + + let err = + TransactionWaiter::>::evaluate_receipt_from_params( + receipt, None, true, + ) + .unwrap() + .unwrap_err(); + + assert!(err.to_string().contains("transaction reverted")) + } + } } From f5d6ea0f94c39b5b8aaa4eba6fbef7e02e98118e Mon Sep 17 00:00:00 2001 From: Yun Date: Sat, 30 Dec 2023 11:46:18 -0800 Subject: [PATCH 10/16] Implement u256 support torii grpc (#1345) --- crates/torii/grpc/src/types/schema.rs | 13 +++++-------- crates/torii/types-test/src/contracts.cairo | 9 +++++++-- crates/torii/types-test/src/models.cairo | 1 + 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/crates/torii/grpc/src/types/schema.rs b/crates/torii/grpc/src/types/schema.rs index ecb97f0a5c..894ea4e85b 100644 --- a/crates/torii/grpc/src/types/schema.rs +++ b/crates/torii/grpc/src/types/schema.rs @@ -1,3 +1,4 @@ +use crypto_bigint::{Encoding, U256}; use dojo_types::primitive::Primitive; use dojo_types::schema::{Enum, EnumOption, Member, Struct, Ty}; use serde::{Deserialize, Serialize}; @@ -198,14 +199,8 @@ impl TryFrom for Primitive { .map_err(ClientError::SliceError)?, )) } - _ => return Err(ClientError::UnsupportedType), - } - } - proto::types::value::ValueType::StringValue(_string) => { - match proto::types::PrimitiveType::from_i32(primitive_type) { Some(proto::types::PrimitiveType::U256) => { - // TODO: Handle u256 - Primitive::U256(None) + Primitive::U256(Some(U256::from_be_slice(bytes))) } _ => return Err(ClientError::UnsupportedType), } @@ -234,7 +229,9 @@ impl TryFrom for proto::types::Primitive { Primitive::U128(u128) => { u128.map(|val| ValueType::ByteValue(val.to_be_bytes().to_vec())) } - Primitive::U256(u256) => u256.map(|val| ValueType::StringValue(val.to_string())), + Primitive::U256(u256) => { + u256.map(|val| ValueType::ByteValue(val.to_be_bytes().to_vec())) + } Primitive::Felt252(felt) => { felt.map(|val| ValueType::ByteValue(val.to_bytes_be().to_vec())) } diff --git a/crates/torii/types-test/src/contracts.cairo b/crates/torii/types-test/src/contracts.cairo index 0ac77665cb..166ad6d26a 100644 --- a/crates/torii/types-test/src/contracts.cairo +++ b/crates/torii/types-test/src/contracts.cairo @@ -40,7 +40,7 @@ mod records { } let type_felt: felt252 = record_idx.into(); - let random_u8: u8 = random(pedersen::pedersen(seed(), record_idx.into()), 0, 100) + let random_u8 = random(pedersen::pedersen(seed(), record_idx.into()), 0, 100) .try_into() .unwrap(); let random_u128 = random( @@ -48,6 +48,10 @@ mod records { 0, 0xffffffffffffffffffffffffffffffff_u128 ); + let composite_u256 = u256 { + low: random_u128, + high: random_u128 + }; let record_id = world.uuid(); let subrecord_id = world.uuid(); @@ -98,7 +102,8 @@ mod records { type_string: 2, }, random_u8, - random_u128 + random_u128, + composite_u256 }, RecordSibling { record_id, random_u8 diff --git a/crates/torii/types-test/src/models.cairo b/crates/torii/types-test/src/models.cairo index bc98d75763..ad019425ad 100644 --- a/crates/torii/types-test/src/models.cairo +++ b/crates/torii/types-test/src/models.cairo @@ -21,6 +21,7 @@ struct Record { type_nested_two: NestedMost, random_u8: u8, random_u128: u128, + composite_u256: u256, } #[derive(Model, Copy, Drop, Serde)] From e599968f85f75e879346a789ae4d33ca8f590987 Mon Sep 17 00:00:00 2001 From: lambda-0x <0xlambda@protonmail.com> Date: Wed, 3 Jan 2024 02:33:20 +0530 Subject: [PATCH 11/16] fix: add dojo compiler pluging for `migrate` (#1348) --- crates/sozo/src/main.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/sozo/src/main.rs b/crates/sozo/src/main.rs index 93ec26d3ee..e0385cf849 100644 --- a/crates/sozo/src/main.rs +++ b/crates/sozo/src/main.rs @@ -29,7 +29,9 @@ fn cli_main(args: SozoArgs) -> Result<()> { let cairo_plugins = CairoPluginRepository::default(); match &args.command { - Commands::Build(_) | Commands::Dev(_) => compilers.add(Box::new(DojoCompiler)).unwrap(), + Commands::Build(_) | Commands::Dev(_) | Commands::Migrate(_) => { + compilers.add(Box::new(DojoCompiler)).unwrap() + } _ => {} } From 1d687071804b2cddb6e76e9cb76ad17b3c3e0e04 Mon Sep 17 00:00:00 2001 From: lambda-0x <0xlambda@protonmail.com> Date: Wed, 3 Jan 2024 03:34:42 +0530 Subject: [PATCH 12/16] CI: build with an older version of Ubuntu (#1350) --- .github/workflows/release.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d5b8d295ca..1212b3094c 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -41,11 +41,11 @@ jobs: # The target is used by Cargo # The arch is either 386, arm64 or amd64 # The svm target platform to use for the binary https://github.com/roynalnaruto/svm-rs/blob/84cbe0ac705becabdc13168bae28a45ad2299749/svm-builds/build.rs#L4-L24 - - os: ubuntu-latest-4-cores + - os: ubuntu-20.04-4-cores platform: linux target: x86_64-unknown-linux-gnu arch: amd64 - - os: ubuntu-latest-8-cores + - os: ubuntu-20.04-8-cores platform: linux target: aarch64-unknown-linux-gnu arch: arm64 @@ -144,7 +144,7 @@ jobs: retention-days: 1 create-draft-release: - runs-on: ubuntu-latest-4-cores + runs-on: ubuntu-20.04-4-cores needs: [prepare, release] env: GITHUB_USER: ${{ github.repository_owner }} @@ -165,7 +165,7 @@ jobs: - run: gh release create v${{ steps.version_info.outputs.version }} ./artifacts/*.gz --generate-notes --draft docker-build-and-push: - runs-on: ubuntu-latest-4-cores + runs-on: ubuntu-20.04-4-cores needs: [prepare, release] steps: From 8afd8c903d71083b8487a5b4a0cfc9360dee0772 Mon Sep 17 00:00:00 2001 From: Tarrence van As Date: Tue, 2 Jan 2024 20:31:39 -0500 Subject: [PATCH 13/16] Prepare release: v0.4.4 (#1352) --- Cargo.lock | 62 +++++++++++++++--------------- Cargo.toml | 2 +- crates/dojo-core/Scarb.lock | 2 +- crates/dojo-core/Scarb.toml | 2 +- crates/torii/types-test/Scarb.lock | 2 +- crates/torii/types-test/Scarb.toml | 2 +- examples/spawn-and-move/Scarb.lock | 2 +- examples/spawn-and-move/Scarb.toml | 2 +- 8 files changed, 38 insertions(+), 38 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7dd7236a47..c2ce01f4e4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -801,7 +801,7 @@ dependencies = [ [[package]] name = "benches" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "clap_builder", @@ -2661,15 +2661,15 @@ checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "dojo-core" -version = "0.4.3" +version = "0.4.4" [[package]] name = "dojo-examples-spawn-and-move" -version = "0.4.3" +version = "0.4.4" [[package]] name = "dojo-lang" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2717,7 +2717,7 @@ dependencies = [ [[package]] name = "dojo-language-server" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "cairo-lang-compiler", @@ -2739,7 +2739,7 @@ dependencies = [ [[package]] name = "dojo-signers" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "starknet", @@ -2747,7 +2747,7 @@ dependencies = [ [[package]] name = "dojo-test-utils" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "assert_fs", @@ -2778,7 +2778,7 @@ dependencies = [ [[package]] name = "dojo-types" -version = "0.4.3" +version = "0.4.4" dependencies = [ "crypto-bigint", "hex", @@ -2793,7 +2793,7 @@ dependencies = [ [[package]] name = "dojo-world" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "assert_fs", @@ -5432,7 +5432,7 @@ dependencies = [ [[package]] name = "katana" -version = "0.4.3" +version = "0.4.4" dependencies = [ "assert_matches", "clap", @@ -5440,7 +5440,7 @@ dependencies = [ "console", "katana-core", "katana-rpc", - "metrics 0.4.3", + "metrics 0.4.4", "metrics-process", "serde_json", "starknet_api", @@ -5452,7 +5452,7 @@ dependencies = [ [[package]] name = "katana-codecs" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bytes", "katana-primitives", @@ -5460,7 +5460,7 @@ dependencies = [ [[package]] name = "katana-codecs-derive" -version = "0.4.3" +version = "0.4.4" dependencies = [ "proc-macro2", "quote", @@ -5470,7 +5470,7 @@ dependencies = [ [[package]] name = "katana-core" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "assert_matches", @@ -5503,7 +5503,7 @@ dependencies = [ [[package]] name = "katana-db" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "blockifier", @@ -5525,7 +5525,7 @@ dependencies = [ [[package]] name = "katana-executor" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "blockifier", @@ -5541,7 +5541,7 @@ dependencies = [ [[package]] name = "katana-primitives" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "blockifier", @@ -5559,7 +5559,7 @@ dependencies = [ [[package]] name = "katana-provider" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "auto_impl", @@ -5584,7 +5584,7 @@ dependencies = [ [[package]] name = "katana-rpc" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "assert_matches", @@ -5616,7 +5616,7 @@ dependencies = [ [[package]] name = "katana-rpc-types" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "derive_more", @@ -5629,7 +5629,7 @@ dependencies = [ [[package]] name = "katana-rpc-types-builder" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "katana-executor", @@ -5641,7 +5641,7 @@ dependencies = [ [[package]] name = "katana-runner" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "home", @@ -5932,7 +5932,7 @@ dependencies = [ [[package]] name = "metrics" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "hyper", @@ -8601,7 +8601,7 @@ dependencies = [ [[package]] name = "sozo" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "assert_fs", @@ -9795,7 +9795,7 @@ dependencies = [ [[package]] name = "torii-client" -version = "0.4.3" +version = "0.4.4" dependencies = [ "async-trait", "camino", @@ -9821,7 +9821,7 @@ dependencies = [ [[package]] name = "torii-core" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "async-trait", @@ -9857,7 +9857,7 @@ dependencies = [ [[package]] name = "torii-graphql" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "async-graphql", @@ -9896,7 +9896,7 @@ dependencies = [ [[package]] name = "torii-grpc" -version = "0.4.3" +version = "0.4.4" dependencies = [ "bytes", "crypto-bigint", @@ -9935,7 +9935,7 @@ dependencies = [ [[package]] name = "torii-server" -version = "0.4.3" +version = "0.4.4" dependencies = [ "anyhow", "async-trait", @@ -9954,7 +9954,7 @@ dependencies = [ "hyper-reverse-proxy", "indexmap 1.9.3", "lazy_static", - "metrics 0.4.3", + "metrics 0.4.4", "metrics-process", "scarb", "serde", @@ -10222,7 +10222,7 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "types-test" -version = "0.4.3" +version = "0.4.4" [[package]] name = "ucd-trie" diff --git a/Cargo.toml b/Cargo.toml index 998e142568..e8d490c2d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ edition = "2021" license = "Apache-2.0" license-file = "LICENSE" repository = "https://github.com/dojoengine/dojo/" -version = "0.4.3" +version = "0.4.4" [profile.performance] codegen-units = 1 diff --git a/crates/dojo-core/Scarb.lock b/crates/dojo-core/Scarb.lock index 5088674763..495d892bf3 100644 --- a/crates/dojo-core/Scarb.lock +++ b/crates/dojo-core/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.4.3" +version = "0.4.4" dependencies = [ "dojo_plugin", ] diff --git a/crates/dojo-core/Scarb.toml b/crates/dojo-core/Scarb.toml index 5c40f430e0..fb7ed12b0a 100644 --- a/crates/dojo-core/Scarb.toml +++ b/crates/dojo-core/Scarb.toml @@ -2,7 +2,7 @@ cairo-version = "2.4.0" description = "The Dojo Core library for autonomous worlds." name = "dojo" -version = "0.4.3" +version = "0.4.4" [dependencies] dojo_plugin = { git = "https://github.com/dojoengine/dojo", tag = "v0.3.11" } diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index dc4edc4797..49eb278bdc 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.4.3" +version = "0.4.4" dependencies = [ "dojo_plugin", ] diff --git a/crates/torii/types-test/Scarb.toml b/crates/torii/types-test/Scarb.toml index ee29cc6fa6..c1c2085b08 100644 --- a/crates/torii/types-test/Scarb.toml +++ b/crates/torii/types-test/Scarb.toml @@ -1,7 +1,7 @@ [package] cairo-version = "2.4.0" name = "types_test" -version = "0.4.3" +version = "0.4.4" [cairo] sierra-replace-ids = true diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index 698dac63e0..e2260b3142 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -3,7 +3,7 @@ version = 1 [[package]] name = "dojo" -version = "0.4.3" +version = "0.4.4" dependencies = [ "dojo_plugin", ] diff --git a/examples/spawn-and-move/Scarb.toml b/examples/spawn-and-move/Scarb.toml index 42937f7661..7b95bad166 100644 --- a/examples/spawn-and-move/Scarb.toml +++ b/examples/spawn-and-move/Scarb.toml @@ -1,7 +1,7 @@ [package] cairo-version = "2.4.0" name = "dojo_examples" -version = "0.4.3" +version = "0.4.4" # Use the prelude with the less imports as possible # from corelib. edition = "2023_10" From 24989397bd7507160777dae0794f7c796fa0a350 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Wed, 3 Jan 2024 21:43:54 +0800 Subject: [PATCH 14/16] fix(sozo): fix `events` command after Cairo `2.3.0` update (#1354) --- crates/sozo/src/commands/events.rs | 79 ++++++++++++++++++------------ crates/sozo/src/ops/events.rs | 19 +++---- 2 files changed, 59 insertions(+), 39 deletions(-) diff --git a/crates/sozo/src/commands/events.rs b/crates/sozo/src/commands/events.rs index 50592f565e..7916a66d6a 100644 --- a/crates/sozo/src/commands/events.rs +++ b/crates/sozo/src/commands/events.rs @@ -1,11 +1,12 @@ use std::collections::HashMap; use anyhow::{anyhow, Result}; -use cairo_lang_starknet::abi::{self, Event}; +use cairo_lang_starknet::abi::{self, Event, Item}; use clap::Parser; use dojo_world::manifest::Manifest; use dojo_world::metadata::dojo_metadata_from_workspace; use scarb::core::Config; +use starknet::core::utils::starknet_keccak; use super::options::starknet::StarknetOptions; use super::options::world::WorldOptions; @@ -46,15 +47,20 @@ pub struct EventsArgs { impl EventsArgs { pub fn run(self, config: &Config) -> Result<()> { - let target_dir = config.target_dir_override().unwrap(); - let manifest_path = target_dir.join(config.profile().as_str()).join("manifest.json"); + let event_map = if !self.json { + let ws = scarb::ops::read_workspace(config.manifest_path(), config)?; + let target_dir = ws.target_dir().path_existent()?; + let manifest_path = target_dir.join(config.profile().as_str()).join("manifest.json"); - if !manifest_path.exists() { - return Err(anyhow!("Run scarb migrate before running this command")); - } + if !manifest_path.exists() { + return Err(anyhow!("Run scarb migrate before running this command")); + } + + Some(extract_events(&Manifest::load_from_path(manifest_path)?)) + } else { + None + }; - let manifest = Manifest::load_from_path(manifest_path)?; - let events = extract_events(&manifest); let env_metadata = if config.manifest_path().exists() { let ws = scarb::ops::read_workspace(config.manifest_path(), config)?; @@ -63,40 +69,53 @@ impl EventsArgs { } else { None }; - config.tokio_handle().block_on(events::execute(self, env_metadata, events)) + + config.tokio_handle().block_on(events::execute(self, env_metadata, event_map)) } } fn extract_events(manifest: &Manifest) -> HashMap> { - fn inner_helper(_events: &mut HashMap>, _contract: &Option) { - // if let Some(contract) = contract { - // for item in &contract.items { - // if let Item::Event(e) = item { - // match e.kind { - // abi::EventKind::Struct { .. } => { - // let event_name = - // starknet_keccak(e.name.split("::").last().unwrap().as_bytes()); - // let vec = events.entry(event_name.to_string()).or_default(); - // vec.push(e.clone()); - // } - // abi::EventKind::Enum { .. } => (), - // } - // } - // } - // } + fn inner_helper(events: &mut HashMap>, abi: abi::Contract) { + for item in abi.into_iter() { + if let Item::Event(e) = item { + match e.kind { + abi::EventKind::Struct { .. } => { + let event_name = starknet_keccak( + e.name + .split("::") + .last() + .expect("valid fully qualified name") + .as_bytes(), + ); + let vec = events.entry(event_name.to_string()).or_default(); + vec.push(e.clone()); + } + abi::EventKind::Enum { .. } => (), + } + } + } } let mut events_map = HashMap::new(); - inner_helper(&mut events_map, &manifest.world.abi); - inner_helper(&mut events_map, &manifest.executor.abi); + if let Some(abi) = manifest.world.abi.clone() { + inner_helper(&mut events_map, abi); + } + + if let Some(abi) = manifest.executor.abi.clone() { + inner_helper(&mut events_map, abi); + } for contract in &manifest.contracts { - inner_helper(&mut events_map, &contract.abi); + if let Some(abi) = contract.abi.clone() { + inner_helper(&mut events_map, abi); + } } - for model in &manifest.models { - inner_helper(&mut events_map, &model.abi); + for model in &manifest.contracts { + if let Some(abi) = model.abi.clone() { + inner_helper(&mut events_map, abi); + } } events_map diff --git a/crates/sozo/src/ops/events.rs b/crates/sozo/src/ops/events.rs index 2d5996d971..6abb64e09a 100644 --- a/crates/sozo/src/ops/events.rs +++ b/crates/sozo/src/ops/events.rs @@ -13,7 +13,7 @@ use crate::commands::events::EventsArgs; pub async fn execute( args: EventsArgs, env_metadata: Option, - events_map: HashMap>, + events_map: Option>>, ) -> Result<()> { let EventsArgs { chunk_size, @@ -23,7 +23,7 @@ pub async fn execute( to_block, events, continuation_token, - json, + .. } = args; let from_block = from_block.map(BlockId::Number); @@ -38,29 +38,30 @@ pub async fn execute( let res = provider.get_events(event_filter, continuation_token, chunk_size).await?; - if json { - let value = serde_json::to_value(res)?; - println!("{}", serde_json::to_string_pretty(&value)?); + if let Some(events_map) = events_map { + parse_and_print_events(res, events_map)?; } else { - parse_and_print_events(res, events_map); + println!("{}", serde_json::to_string_pretty(&res)?); } + Ok(()) } fn parse_and_print_events( res: starknet::core::types::EventsPage, events_map: HashMap>, -) { +) -> Result<()> { println!("Continuation token: {:?}", res.continuation_token); println!("----------------------------------------------"); for event in res.events { if let Some(e) = parse_event(event.clone(), &events_map) { - println!("{}\n", e); + println!("{e}"); } else { // Couldn't parse event - println!("{}\n", serde_json::to_string_pretty(&event).unwrap()); + println!("{}", serde_json::to_string_pretty(&event)?); } } + Ok(()) } fn parse_event( From 319c98599a2b37cb10f076e46dde90c50a0a1a0a Mon Sep 17 00:00:00 2001 From: 0xevolve Date: Thu, 4 Jan 2024 06:37:35 +0100 Subject: [PATCH 15/16] =?UTF-8?q?=E2=9C=A8=20Cairo=201=20Account=20support?= =?UTF-8?q?=20(#1176)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ✨ cairo 1 account * ✨ no_validate option * udpate execution encoding to new * update * remove files and cleanup * fix class hash with compiled one for generated accounts * rename SierraClass to FlattenedSierraClass * fix starknet test by adding more delay on tx watcher * fix account class hash in state * standardize the naming * add validate flag to estimate_fee * update Scarb.lock files with new main version * fix addr * fix addr * Update Scarb.lock --------- Co-authored-by: Kariy Co-authored-by: glihm Co-authored-by: Ammar Arif --- .../compiler_cairo_v240/Scarb.lock | 2 +- crates/dojo-test-utils/src/sequencer.rs | 2 +- .../account_without_validation.cairo | 67 - .../compiled/account_without_validation.json | 2226 ----------------- .../contracts/compiled/oz_account_080.json | 1 + .../core/contracts/messaging/cairo/Makefile | 2 +- .../contracts/messaging/cairo/account_l2.json | 2 +- .../contracts/messaging/solidity/Makefile | 4 +- crates/katana/core/src/accounts.rs | 6 +- crates/katana/core/src/backend/config.rs | 2 + crates/katana/core/src/constants.rs | 13 +- crates/katana/core/src/sequencer.rs | 1 + .../katana/core/src/service/block_producer.rs | 2 + .../core/src/service/messaging/starknet.rs | 2 +- crates/katana/core/src/utils/mod.rs | 15 +- crates/katana/executor/src/blockifier/mod.rs | 15 +- .../katana/executor/src/blockifier/state.rs | 10 +- .../katana/executor/src/blockifier/utils.rs | 3 +- crates/katana/primitives/src/contract.rs | 3 +- .../katana/primitives/src/conversion/rpc.rs | 19 +- crates/katana/primitives/src/state.rs | 6 +- crates/katana/primitives/src/transaction.rs | 7 +- crates/katana/primitives/src/utils/class.rs | 9 +- .../katana/rpc/rpc-types/src/transaction.rs | 7 +- crates/katana/rpc/tests/starknet.rs | 10 +- crates/katana/src/args.rs | 7 +- crates/katana/storage/db/src/codecs/mod.rs | 6 +- crates/katana/storage/db/src/tables.rs | 5 +- crates/katana/storage/provider/src/lib.rs | 8 +- .../provider/src/providers/db/state.rs | 10 +- .../provider/src/providers/fork/backend.rs | 12 +- .../provider/src/providers/fork/mod.rs | 4 +- .../provider/src/providers/fork/state.rs | 10 +- .../provider/src/providers/in_memory/cache.rs | 6 +- .../provider/src/providers/in_memory/mod.rs | 4 +- .../provider/src/providers/in_memory/state.rs | 8 +- .../storage/provider/src/traits/contract.rs | 8 +- crates/katana/storage/provider/tests/class.rs | 10 +- .../katana/storage/provider/tests/fixtures.rs | 8 +- crates/sozo/src/commands/options/account.rs | 6 +- .../sozo/src/ops/migration/migration_test.rs | 4 +- crates/torii/types-test/Scarb.lock | 2 +- crates/torii/types-test/Scarb.toml | 6 +- examples/rpc/starknet/starknet_getClass.hurl | 2 +- .../rpc/starknet/starknet_getClassAt.hurl | 2 +- .../rpc/starknet/starknet_getClassHashAt.hurl | 2 +- examples/rpc/starknet/starknet_getNonce.hurl | 2 +- examples/spawn-and-move/Scarb.lock | 2 +- examples/spawn-and-move/Scarb.toml | 2 +- 49 files changed, 157 insertions(+), 2415 deletions(-) delete mode 100644 crates/katana/core/contracts/account_without_validation.cairo delete mode 100644 crates/katana/core/contracts/compiled/account_without_validation.json create mode 100644 crates/katana/core/contracts/compiled/oz_account_080.json diff --git a/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock b/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock index b0e7da2d12..6f0435b5b6 100644 --- a/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock +++ b/crates/dojo-lang/src/manifest_test_data/compiler_cairo_v240/Scarb.lock @@ -10,7 +10,7 @@ dependencies = [ [[package]] name = "dojo" -version = "0.4.2" +version = "0.4.4" dependencies = [ "dojo_plugin", ] diff --git a/crates/dojo-test-utils/src/sequencer.rs b/crates/dojo-test-utils/src/sequencer.rs index 1ed8704c05..29e1b97c96 100644 --- a/crates/dojo-test-utils/src/sequencer.rs +++ b/crates/dojo-test-utils/src/sequencer.rs @@ -59,7 +59,7 @@ impl TestSequencer { LocalWallet::from_signing_key(SigningKey::from_secret_scalar(self.account.private_key)), self.account.account_address, chain_id::TESTNET, - ExecutionEncoding::Legacy, + ExecutionEncoding::New, ) } diff --git a/crates/katana/core/contracts/account_without_validation.cairo b/crates/katana/core/contracts/account_without_validation.cairo deleted file mode 100644 index 893a21a5a5..0000000000 --- a/crates/katana/core/contracts/account_without_validation.cairo +++ /dev/null @@ -1,67 +0,0 @@ -// A dummy account contract without any validations. - -%lang starknet - -from starkware.cairo.common.bool import FALSE -from starkware.cairo.common.cairo_builtins import HashBuiltin -from starkware.starknet.common.syscalls import ( - call_contract, - deploy, - get_caller_address, - get_contract_address, -) - -@view -func assert_only_self{syscall_ptr: felt*}() { - let (self) = get_contract_address(); - let (caller) = get_caller_address(); - assert self = caller; - return (); -} - -@external -func __validate_declare__(class_hash: felt) { - return (); -} - -@external -func __validate_deploy__(class_hash: felt, contract_address_salt: felt) { - return (); -} - -@external -func __validate__(contract_address, selector: felt, calldata_len: felt, calldata: felt*) { - return (); -} - -@external -@raw_output -func __execute__{syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr}( - contract_address, selector: felt, calldata_len: felt, calldata: felt* -) -> (retdata_size: felt, retdata: felt*) { - let (retdata_size: felt, retdata: felt*) = call_contract( - contract_address=contract_address, - function_selector=selector, - calldata_size=calldata_len, - calldata=calldata, - ); - return (retdata_size=retdata_size, retdata=retdata); -} - -@external -func deploy_contract{syscall_ptr: felt*}( - class_hash: felt, - contract_address_salt: felt, - constructor_calldata_len: felt, - constructor_calldata: felt*, -) -> (contract_address: felt) { - assert_only_self(); - let (contract_address) = deploy( - class_hash=class_hash, - contract_address_salt=contract_address_salt, - constructor_calldata_size=constructor_calldata_len, - constructor_calldata=constructor_calldata, - deploy_from_zero=FALSE, - ); - return (contract_address=contract_address); -} diff --git a/crates/katana/core/contracts/compiled/account_without_validation.json b/crates/katana/core/contracts/compiled/account_without_validation.json deleted file mode 100644 index 46524b792c..0000000000 --- a/crates/katana/core/contracts/compiled/account_without_validation.json +++ /dev/null @@ -1,2226 +0,0 @@ -{ - "abi": [ - { - "inputs": [], - "name": "assert_only_self", - "outputs": [], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [ - { - "name": "class_hash", - "type": "felt" - } - ], - "name": "__validate_declare__", - "outputs": [], - "type": "function" - }, - { - "inputs": [ - { - "name": "class_hash", - "type": "felt" - }, - { - "name": "contract_address_salt", - "type": "felt" - } - ], - "name": "__validate_deploy__", - "outputs": [], - "type": "function" - }, - { - "inputs": [ - { - "name": "contract_address", - "type": "felt" - }, - { - "name": "selector", - "type": "felt" - }, - { - "name": "calldata_len", - "type": "felt" - }, - { - "name": "calldata", - "type": "felt*" - } - ], - "name": "__validate__", - "outputs": [], - "type": "function" - }, - { - "inputs": [ - { - "name": "contract_address", - "type": "felt" - }, - { - "name": "selector", - "type": "felt" - }, - { - "name": "calldata_len", - "type": "felt" - }, - { - "name": "calldata", - "type": "felt*" - } - ], - "name": "__execute__", - "outputs": [ - { - "name": "retdata_size", - "type": "felt" - }, - { - "name": "retdata", - "type": "felt*" - } - ], - "type": "function" - }, - { - "inputs": [ - { - "name": "class_hash", - "type": "felt" - }, - { - "name": "contract_address_salt", - "type": "felt" - }, - { - "name": "constructor_calldata_len", - "type": "felt" - }, - { - "name": "constructor_calldata", - "type": "felt*" - } - ], - "name": "deploy_contract", - "outputs": [ - { - "name": "contract_address", - "type": "felt" - } - ], - "type": "function" - } - ], - "entry_points_by_type": { - "CONSTRUCTOR": [], - "EXTERNAL": [ - { - "offset": 133, - "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad" - }, - { - "offset": 94, - "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775" - }, - { - "offset": 175, - "selector": "0x2730079d734ee55315f4f141eaed376bddd8c2133523d223a344c5604e0f7f8" - }, - { - "offset": 61, - "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3" - }, - { - "offset": 47, - "selector": "0x2de154d8a89be65c1724e962dc4c65637c05532a6c2825d0a7b7d774169dbba" - }, - { - "offset": 77, - "selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895" - } - ], - "L1_HANDLER": [] - }, - "program": { - "attributes": [], - "builtins": ["pedersen", "range_check"], - "compiler_version": "0.11.0.2", - "data": [ - "0x480680017fff8000", - "0x43616c6c436f6e7472616374", - "0x400280007ff97fff", - "0x400380017ff97ffa", - "0x400380027ff97ffb", - "0x400380037ff97ffc", - "0x400380047ff97ffd", - "0x482680017ff98000", - "0x7", - "0x480280057ff98000", - "0x480280067ff98000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x4465706c6f79", - "0x400280007ff87fff", - "0x400380017ff87ff9", - "0x400380027ff87ffa", - "0x400380037ff87ffb", - "0x400380047ff87ffc", - "0x400380057ff87ffd", - "0x482680017ff88000", - "0x9", - "0x480280067ff88000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x47657443616c6c657241646472657373", - "0x400280007ffd7fff", - "0x482680017ffd8000", - "0x2", - "0x480280017ffd8000", - "0x208b7fff7fff7ffe", - "0x480680017fff8000", - "0x476574436f6e747261637441646472657373", - "0x400280007ffd7fff", - "0x482680017ffd8000", - "0x2", - "0x480280017ffd8000", - "0x208b7fff7fff7ffe", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff9", - "0x48127ffe7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffef", - "0x40127fff7fff7ff9", - "0x48127ffe7fff8000", - "0x208b7fff7fff7ffe", - "0x402b7ffd7ffc7ffd", - "0x480280007ffb8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff6", - "0x40780017fff7fff", - "0x1", - "0x48127ffe7fff8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x1", - "0x402a7ffd7ffc7fff", - "0x480280007ffd8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffc", - "0x40780017fff7fff", - "0x1", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x208b7fff7fff7ffe", - "0x482680017ffd8000", - "0x2", - "0x402a7ffd7ffc7fff", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb", - "0x40780017fff7fff", - "0x1", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x480280027ffb8000", - "0x480680017fff8000", - "0x0", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x208b7fff7fff7ffe", - "0x480280027ffb8000", - "0x480280027ffd8000", - "0x400080007ffe7fff", - "0x482680017ffd8000", - "0x3", - "0x480280027ffd8000", - "0x48307fff7ffe8000", - "0x402a7ffd7ffc7fff", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x480280027ffd8000", - "0x482680017ffd8000", - "0x3", - "0x1104800180018000", - "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", - "0x40780017fff7fff", - "0x1", - "0x480280027ffb8000", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x482480017ffd8000", - "0x1", - "0x480680017fff8000", - "0x0", - "0x48127ffa7fff8000", - "0x208b7fff7fff7ffe", - "0x480a7ff77fff8000", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff84", - "0x48127ffd7fff8000", - "0x480a7ff87fff8000", - "0x480a7ff97fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe", - "0x480280027ffb8000", - "0x480280027ffd8000", - "0x400080007ffe7fff", - "0x482680017ffd8000", - "0x3", - "0x480280027ffd8000", - "0x48307fff7ffe8000", - "0x402a7ffd7ffc7fff", - "0x480280027ffb8000", - "0x480280007ffb8000", - "0x480280017ffb8000", - "0x482480017ffd8000", - "0x1", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x480280027ffd8000", - "0x482680017ffd8000", - "0x3", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe2", - "0x208b7fff7fff7ffe", - "0x480a7ff97fff8000", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c", - "0x480a7ffa7fff8000", - "0x480a7ffb7fff8000", - "0x480a7ffc7fff8000", - "0x480a7ffd7fff8000", - "0x480680017fff8000", - "0x0", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff6a", - "0x208b7fff7fff7ffe", - "0x40780017fff7fff", - "0x1", - "0x4003800080007ffc", - "0x4826800180008000", - "0x1", - "0x480a7ffd7fff8000", - "0x4828800080007ffe", - "0x480a80007fff8000", - "0x208b7fff7fff7ffe", - "0x480280027ffb8000", - "0x480280027ffd8000", - "0x400080007ffe7fff", - "0x482680017ffd8000", - "0x3", - "0x480280027ffd8000", - "0x48307fff7ffe8000", - "0x402a7ffd7ffc7fff", - "0x480280007ffb8000", - "0x480280007ffd8000", - "0x480280017ffd8000", - "0x480280027ffd8000", - "0x482680017ffd8000", - "0x3", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffde", - "0x480280027ffb8000", - "0x48127ffe7fff8000", - "0x482480017ffe8000", - "0x1", - "0x1104800180018000", - "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", - "0x48127ff47fff8000", - "0x480280017ffb8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x48127ffb7fff8000", - "0x208b7fff7fff7ffe" - ], - "debug_info": null, - "hints": { - "7": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.call_contract" - ], - "code": "syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 0, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.call_contract.syscall_ptr": 0 - } - } - } - ], - "20": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.deploy" - ], - "code": "syscall_handler.deploy(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 1, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.deploy.syscall_ptr": 1 - } - } - } - ], - "27": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.get_caller_address" - ], - "code": "syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 2, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": 2 - } - } - } - ], - "34": [ - { - "accessible_scopes": [ - "starkware.starknet.common.syscalls", - "starkware.starknet.common.syscalls.get_contract_address" - ], - "code": "syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)", - "flow_tracking_data": { - "ap_tracking": { - "group": 3, - "offset": 1 - }, - "reference_ids": { - "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": 3 - } - } - } - ], - "51": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.assert_only_self" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 5, - "offset": 16 - }, - "reference_ids": {} - } - } - ], - "67": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__validate_declare__" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 7, - "offset": 4 - }, - "reference_ids": {} - } - } - ], - "84": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__validate_deploy__" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 9, - "offset": 5 - }, - "reference_ids": {} - } - } - ], - "109": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.__validate__" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 11, - "offset": 11 - }, - "reference_ids": {} - } - } - ], - "166": [ - { - "accessible_scopes": [ - "__main__", - "__main__", - "__wrappers__", - "__wrappers__.deploy_contract_encode_return" - ], - "code": "memory[ap] = segments.add()", - "flow_tracking_data": { - "ap_tracking": { - "group": 15, - "offset": 0 - }, - "reference_ids": {} - } - } - ] - }, - "identifiers": { - "__main__.FALSE": { - "destination": "starkware.cairo.common.bool.FALSE", - "type": "alias" - }, - "__main__.HashBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "type": "alias" - }, - "__main__.__execute__": { - "decorators": ["external", "raw_output"], - "pc": 120, - "type": "function" - }, - "__main__.__execute__.Args": { - "full_name": "__main__.__execute__.Args", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_len": { - "cairo_type": "felt", - "offset": 2 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 0 - }, - "selector": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__execute__.ImplicitArgs": { - "full_name": "__main__.__execute__.ImplicitArgs", - "members": { - "pedersen_ptr": { - "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", - "offset": 1 - }, - "range_check_ptr": { - "cairo_type": "felt", - "offset": 2 - }, - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "__main__.__execute__.Return": { - "cairo_type": "(retdata_size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__main__.__execute__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.__validate__": { - "decorators": ["external"], - "pc": 93, - "type": "function" - }, - "__main__.__validate__.Args": { - "full_name": "__main__.__validate__.Args", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_len": { - "cairo_type": "felt", - "offset": 2 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 0 - }, - "selector": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.__validate__.ImplicitArgs": { - "full_name": "__main__.__validate__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__main__.__validate__.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.__validate__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.__validate_declare__": { - "decorators": ["external"], - "pc": 60, - "type": "function" - }, - "__main__.__validate_declare__.Args": { - "full_name": "__main__.__validate_declare__.Args", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.__validate_declare__.ImplicitArgs": { - "full_name": "__main__.__validate_declare__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__main__.__validate_declare__.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.__validate_declare__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.__validate_deploy__": { - "decorators": ["external"], - "pc": 76, - "type": "function" - }, - "__main__.__validate_deploy__.Args": { - "full_name": "__main__.__validate_deploy__.Args", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 0 - }, - "contract_address_salt": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "__main__.__validate_deploy__.ImplicitArgs": { - "full_name": "__main__.__validate_deploy__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__main__.__validate_deploy__.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.__validate_deploy__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.assert_only_self": { - "decorators": ["view"], - "pc": 38, - "type": "function" - }, - "__main__.assert_only_self.Args": { - "full_name": "__main__.assert_only_self.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__main__.assert_only_self.ImplicitArgs": { - "full_name": "__main__.assert_only_self.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.assert_only_self.Return": { - "cairo_type": "()", - "type": "type_definition" - }, - "__main__.assert_only_self.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.call_contract": { - "destination": "starkware.starknet.common.syscalls.call_contract", - "type": "alias" - }, - "__main__.deploy": { - "destination": "starkware.starknet.common.syscalls.deploy", - "type": "alias" - }, - "__main__.deploy_contract": { - "decorators": ["external"], - "pc": 154, - "type": "function" - }, - "__main__.deploy_contract.Args": { - "full_name": "__main__.deploy_contract.Args", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 0 - }, - "constructor_calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "constructor_calldata_len": { - "cairo_type": "felt", - "offset": 2 - }, - "contract_address_salt": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "__main__.deploy_contract.ImplicitArgs": { - "full_name": "__main__.deploy_contract.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "__main__.deploy_contract.Return": { - "cairo_type": "(contract_address: felt)", - "type": "type_definition" - }, - "__main__.deploy_contract.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__main__.get_caller_address": { - "destination": "starkware.starknet.common.syscalls.get_caller_address", - "type": "alias" - }, - "__main__.get_contract_address": { - "destination": "starkware.starknet.common.syscalls.get_contract_address", - "type": "alias" - }, - "__wrappers__.__execute__": { - "decorators": ["external", "raw_output"], - "pc": 133, - "type": "function" - }, - "__wrappers__.__execute__.Args": { - "full_name": "__wrappers__.__execute__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__execute__.ImplicitArgs": { - "full_name": "__wrappers__.__execute__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__execute__.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__execute__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__execute__.__wrapped_func": { - "destination": "__main__.__execute__", - "type": "alias" - }, - "__wrappers__.__execute___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.__validate__": { - "decorators": ["external"], - "pc": 94, - "type": "function" - }, - "__wrappers__.__validate__.Args": { - "full_name": "__wrappers__.__validate__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate__.ImplicitArgs": { - "full_name": "__wrappers__.__validate__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate__.Return": { - "cairo_type": "(syscall_ptr: felt, pedersen_ptr: felt, range_check_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__validate__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__validate__.__wrapped_func": { - "destination": "__main__.__validate__", - "type": "alias" - }, - "__wrappers__.__validate___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.__validate_declare__": { - "decorators": ["external"], - "pc": 61, - "type": "function" - }, - "__wrappers__.__validate_declare__.Args": { - "full_name": "__wrappers__.__validate_declare__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_declare__.ImplicitArgs": { - "full_name": "__wrappers__.__validate_declare__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_declare__.Return": { - "cairo_type": "(syscall_ptr: felt, pedersen_ptr: felt, range_check_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__validate_declare__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__validate_declare__.__wrapped_func": { - "destination": "__main__.__validate_declare__", - "type": "alias" - }, - "__wrappers__.__validate_declare___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.__validate_deploy__": { - "decorators": ["external"], - "pc": 77, - "type": "function" - }, - "__wrappers__.__validate_deploy__.Args": { - "full_name": "__wrappers__.__validate_deploy__.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_deploy__.ImplicitArgs": { - "full_name": "__wrappers__.__validate_deploy__.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.__validate_deploy__.Return": { - "cairo_type": "(syscall_ptr: felt, pedersen_ptr: felt, range_check_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.__validate_deploy__.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.__validate_deploy__.__wrapped_func": { - "destination": "__main__.__validate_deploy__", - "type": "alias" - }, - "__wrappers__.__validate_deploy___encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.assert_only_self": { - "decorators": ["view"], - "pc": 47, - "type": "function" - }, - "__wrappers__.assert_only_self.Args": { - "full_name": "__wrappers__.assert_only_self.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.assert_only_self.ImplicitArgs": { - "full_name": "__wrappers__.assert_only_self.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.assert_only_self.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: felt, range_check_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.assert_only_self.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.assert_only_self.__wrapped_func": { - "destination": "__main__.assert_only_self", - "type": "alias" - }, - "__wrappers__.assert_only_self_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "__wrappers__.deploy_contract": { - "decorators": ["external"], - "pc": 175, - "type": "function" - }, - "__wrappers__.deploy_contract.Args": { - "full_name": "__wrappers__.deploy_contract.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.deploy_contract.ImplicitArgs": { - "full_name": "__wrappers__.deploy_contract.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.deploy_contract.Return": { - "cairo_type": "(syscall_ptr: felt*, pedersen_ptr: felt, range_check_ptr: felt, size: felt, retdata: felt*)", - "type": "type_definition" - }, - "__wrappers__.deploy_contract.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "__wrappers__.deploy_contract.__wrapped_func": { - "destination": "__main__.deploy_contract", - "type": "alias" - }, - "__wrappers__.deploy_contract_encode_return": { - "decorators": [], - "pc": 166, - "type": "function" - }, - "__wrappers__.deploy_contract_encode_return.Args": { - "full_name": "__wrappers__.deploy_contract_encode_return.Args", - "members": { - "range_check_ptr": { - "cairo_type": "felt", - "offset": 1 - }, - "ret_value": { - "cairo_type": "(contract_address: felt)", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "__wrappers__.deploy_contract_encode_return.ImplicitArgs": { - "full_name": "__wrappers__.deploy_contract_encode_return.ImplicitArgs", - "members": {}, - "size": 0, - "type": "struct" - }, - "__wrappers__.deploy_contract_encode_return.Return": { - "cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", - "type": "type_definition" - }, - "__wrappers__.deploy_contract_encode_return.SIZEOF_LOCALS": { - "type": "const", - "value": 1 - }, - "__wrappers__.deploy_contract_encode_return.memcpy": { - "destination": "starkware.cairo.common.memcpy.memcpy", - "type": "alias" - }, - "starkware.cairo.common.bool.FALSE": { - "type": "const", - "value": 0 - }, - "starkware.cairo.common.bool.TRUE": { - "type": "const", - "value": 1 - }, - "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", - "members": { - "x": { - "cairo_type": "felt", - "offset": 0 - }, - "x_and_y": { - "cairo_type": "felt", - "offset": 2 - }, - "x_or_y": { - "cairo_type": "felt", - "offset": 4 - }, - "x_xor_y": { - "cairo_type": "felt", - "offset": 3 - }, - "y": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.EcOpBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", - "members": { - "m": { - "cairo_type": "felt", - "offset": 4 - }, - "p": { - "cairo_type": "starkware.cairo.common.ec_point.EcPoint", - "offset": 0 - }, - "q": { - "cairo_type": "starkware.cairo.common.ec_point.EcPoint", - "offset": 2 - }, - "r": { - "cairo_type": "starkware.cairo.common.ec_point.EcPoint", - "offset": 5 - } - }, - "size": 7, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.EcPoint": { - "destination": "starkware.cairo.common.ec_point.EcPoint", - "type": "alias" - }, - "starkware.cairo.common.cairo_builtins.HashBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "members": { - "result": { - "cairo_type": "felt", - "offset": 2 - }, - "x": { - "cairo_type": "felt", - "offset": 0 - }, - "y": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.KeccakBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", - "members": { - "input": { - "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "offset": 0 - }, - "output": { - "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "offset": 8 - } - }, - "size": 16, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": { - "destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "type": "alias" - }, - "starkware.cairo.common.cairo_builtins.PoseidonBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.PoseidonBuiltin", - "members": { - "input": { - "cairo_type": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", - "offset": 0 - }, - "output": { - "cairo_type": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", - "offset": 3 - } - }, - "size": 6, - "type": "struct" - }, - "starkware.cairo.common.cairo_builtins.PoseidonBuiltinState": { - "destination": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", - "type": "alias" - }, - "starkware.cairo.common.cairo_builtins.SignatureBuiltin": { - "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", - "members": { - "message": { - "cairo_type": "felt", - "offset": 1 - }, - "pub_key": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.dict_access.DictAccess": { - "full_name": "starkware.cairo.common.dict_access.DictAccess", - "members": { - "key": { - "cairo_type": "felt", - "offset": 0 - }, - "new_value": { - "cairo_type": "felt", - "offset": 2 - }, - "prev_value": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.cairo.common.ec_point.EcPoint": { - "full_name": "starkware.cairo.common.ec_point.EcPoint", - "members": { - "x": { - "cairo_type": "felt", - "offset": 0 - }, - "y": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.cairo.common.hash.HashBuiltin": { - "destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", - "type": "alias" - }, - "starkware.cairo.common.keccak_state.KeccakBuiltinState": { - "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", - "members": { - "s0": { - "cairo_type": "felt", - "offset": 0 - }, - "s1": { - "cairo_type": "felt", - "offset": 1 - }, - "s2": { - "cairo_type": "felt", - "offset": 2 - }, - "s3": { - "cairo_type": "felt", - "offset": 3 - }, - "s4": { - "cairo_type": "felt", - "offset": 4 - }, - "s5": { - "cairo_type": "felt", - "offset": 5 - }, - "s6": { - "cairo_type": "felt", - "offset": 6 - }, - "s7": { - "cairo_type": "felt", - "offset": 7 - } - }, - "size": 8, - "type": "struct" - }, - "starkware.cairo.common.math.FALSE": { - "destination": "starkware.cairo.common.bool.FALSE", - "type": "alias" - }, - "starkware.cairo.common.math.TRUE": { - "destination": "starkware.cairo.common.bool.TRUE", - "type": "alias" - }, - "starkware.cairo.common.poseidon_state.PoseidonBuiltinState": { - "full_name": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", - "members": { - "s0": { - "cairo_type": "felt", - "offset": 0 - }, - "s1": { - "cairo_type": "felt", - "offset": 1 - }, - "s2": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.storage.ADDR_BOUND": { - "type": "const", - "value": -106710729501573572985208420194530329073740042555888586719489 - }, - "starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE": { - "type": "const", - "value": 256 - }, - "starkware.starknet.common.storage.assert_250_bit": { - "destination": "starkware.cairo.common.math.assert_250_bit", - "type": "alias" - }, - "starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR": { - "type": "const", - "value": 20853273475220472486191784820 - }, - "starkware.starknet.common.syscalls.CallContract": { - "full_name": "starkware.starknet.common.syscalls.CallContract", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.CallContractRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", - "offset": 5 - } - }, - "size": 7, - "type": "struct" - }, - "starkware.starknet.common.syscalls.CallContractRequest": { - "full_name": "starkware.starknet.common.syscalls.CallContractRequest", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 4 - }, - "calldata_size": { - "cairo_type": "felt", - "offset": 3 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 1 - }, - "function_selector": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.CallContractResponse": { - "full_name": "starkware.starknet.common.syscalls.CallContractResponse", - "members": { - "retdata": { - "cairo_type": "felt*", - "offset": 1 - }, - "retdata_size": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR": { - "type": "const", - "value": 21167594061783206823196716140 - }, - "starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR": { - "type": "const", - "value": 23274015802972845247556842986379118667122 - }, - "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": { - "type": "const", - "value": 75202468540281 - }, - "starkware.starknet.common.syscalls.Deploy": { - "full_name": "starkware.starknet.common.syscalls.Deploy", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.DeployRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.DeployResponse", - "offset": 6 - } - }, - "size": 9, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DeployRequest": { - "full_name": "starkware.starknet.common.syscalls.DeployRequest", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 1 - }, - "constructor_calldata": { - "cairo_type": "felt*", - "offset": 4 - }, - "constructor_calldata_size": { - "cairo_type": "felt", - "offset": 3 - }, - "contract_address_salt": { - "cairo_type": "felt", - "offset": 2 - }, - "deploy_from_zero": { - "cairo_type": "felt", - "offset": 5 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 6, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DeployResponse": { - "full_name": "starkware.starknet.common.syscalls.DeployResponse", - "members": { - "constructor_retdata": { - "cairo_type": "felt*", - "offset": 2 - }, - "constructor_retdata_size": { - "cairo_type": "felt", - "offset": 1 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.DictAccess": { - "destination": "starkware.cairo.common.dict_access.DictAccess", - "type": "alias" - }, - "starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR": { - "type": "const", - "value": 1280709301550335749748 - }, - "starkware.starknet.common.syscalls.EmitEvent": { - "full_name": "starkware.starknet.common.syscalls.EmitEvent", - "members": { - "data": { - "cairo_type": "felt*", - "offset": 4 - }, - "data_len": { - "cairo_type": "felt", - "offset": 3 - }, - "keys": { - "cairo_type": "felt*", - "offset": 2 - }, - "keys_len": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR": { - "type": "const", - "value": 1448089106835523001438702345020786 - }, - "starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR": { - "type": "const", - "value": 24294903732626645868215235778792757751152 - }, - "starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR": { - "type": "const", - "value": 94901967781393078444254803017658102643 - }, - "starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR": { - "type": "const", - "value": 6219495360805491471215297013070624192820083 - }, - "starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR": { - "type": "const", - "value": 1592190833581991703053805829594610833820054387 - }, - "starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR": { - "type": "const", - "value": 1317029390204112103023 - }, - "starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR": { - "type": "const", - "value": 1448089128652340074717162277007973 - }, - "starkware.starknet.common.syscalls.GetBlockNumber": { - "full_name": "starkware.starknet.common.syscalls.GetBlockNumber", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockNumberRequest": { - "full_name": "starkware.starknet.common.syscalls.GetBlockNumberRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockNumberResponse": { - "full_name": "starkware.starknet.common.syscalls.GetBlockNumberResponse", - "members": { - "block_number": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockTimestamp": { - "full_name": "starkware.starknet.common.syscalls.GetBlockTimestamp", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockTimestampRequest": { - "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetBlockTimestampResponse": { - "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", - "members": { - "block_timestamp": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetCallerAddress": { - "full_name": "starkware.starknet.common.syscalls.GetCallerAddress", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetCallerAddressRequest": { - "full_name": "starkware.starknet.common.syscalls.GetCallerAddressRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetCallerAddressResponse": { - "full_name": "starkware.starknet.common.syscalls.GetCallerAddressResponse", - "members": { - "caller_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetContractAddress": { - "full_name": "starkware.starknet.common.syscalls.GetContractAddress", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetContractAddressRequest": { - "full_name": "starkware.starknet.common.syscalls.GetContractAddressRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetContractAddressResponse": { - "full_name": "starkware.starknet.common.syscalls.GetContractAddressResponse", - "members": { - "contract_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetSequencerAddress": { - "full_name": "starkware.starknet.common.syscalls.GetSequencerAddress", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetSequencerAddressRequest": { - "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetSequencerAddressResponse": { - "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", - "members": { - "sequencer_address": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxInfo": { - "full_name": "starkware.starknet.common.syscalls.GetTxInfo", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoResponse", - "offset": 1 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxInfoRequest": { - "full_name": "starkware.starknet.common.syscalls.GetTxInfoRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxInfoResponse": { - "full_name": "starkware.starknet.common.syscalls.GetTxInfoResponse", - "members": { - "tx_info": { - "cairo_type": "starkware.starknet.common.syscalls.TxInfo*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxSignature": { - "full_name": "starkware.starknet.common.syscalls.GetTxSignature", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureResponse", - "offset": 1 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxSignatureRequest": { - "full_name": "starkware.starknet.common.syscalls.GetTxSignatureRequest", - "members": { - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.GetTxSignatureResponse": { - "full_name": "starkware.starknet.common.syscalls.GetTxSignatureResponse", - "members": { - "signature": { - "cairo_type": "felt*", - "offset": 1 - }, - "signature_len": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": { - "type": "const", - "value": 436233452754198157705746250789557519228244616562 - }, - "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": { - "type": "const", - "value": 92376026794327011772951660 - }, - "starkware.starknet.common.syscalls.LibraryCall": { - "full_name": "starkware.starknet.common.syscalls.LibraryCall", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", - "offset": 5 - } - }, - "size": 7, - "type": "struct" - }, - "starkware.starknet.common.syscalls.LibraryCallRequest": { - "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 4 - }, - "calldata_size": { - "cairo_type": "felt", - "offset": 3 - }, - "class_hash": { - "cairo_type": "felt", - "offset": 1 - }, - "function_selector": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.REPLACE_CLASS_SELECTOR": { - "type": "const", - "value": 25500403217443378527601783667 - }, - "starkware.starknet.common.syscalls.ReplaceClass": { - "full_name": "starkware.starknet.common.syscalls.ReplaceClass", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": { - "type": "const", - "value": 433017908768303439907196859243777073 - }, - "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": { - "type": "const", - "value": 100890693370601760042082660 - }, - "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": { - "type": "const", - "value": 25828017502874050592466629733 - }, - "starkware.starknet.common.syscalls.SendMessageToL1SysCall": { - "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", - "members": { - "payload_ptr": { - "cairo_type": "felt*", - "offset": 3 - }, - "payload_size": { - "cairo_type": "felt", - "offset": 2 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - }, - "to_address": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageRead": { - "full_name": "starkware.starknet.common.syscalls.StorageRead", - "members": { - "request": { - "cairo_type": "starkware.starknet.common.syscalls.StorageReadRequest", - "offset": 0 - }, - "response": { - "cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageReadRequest": { - "full_name": "starkware.starknet.common.syscalls.StorageReadRequest", - "members": { - "address": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 2, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageReadResponse": { - "full_name": "starkware.starknet.common.syscalls.StorageReadResponse", - "members": { - "value": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.StorageWrite": { - "full_name": "starkware.starknet.common.syscalls.StorageWrite", - "members": { - "address": { - "cairo_type": "felt", - "offset": 1 - }, - "selector": { - "cairo_type": "felt", - "offset": 0 - }, - "value": { - "cairo_type": "felt", - "offset": 2 - } - }, - "size": 3, - "type": "struct" - }, - "starkware.starknet.common.syscalls.TxInfo": { - "full_name": "starkware.starknet.common.syscalls.TxInfo", - "members": { - "account_contract_address": { - "cairo_type": "felt", - "offset": 1 - }, - "chain_id": { - "cairo_type": "felt", - "offset": 6 - }, - "max_fee": { - "cairo_type": "felt", - "offset": 2 - }, - "nonce": { - "cairo_type": "felt", - "offset": 7 - }, - "signature": { - "cairo_type": "felt*", - "offset": 4 - }, - "signature_len": { - "cairo_type": "felt", - "offset": 3 - }, - "transaction_hash": { - "cairo_type": "felt", - "offset": 5 - }, - "version": { - "cairo_type": "felt", - "offset": 0 - } - }, - "size": 8, - "type": "struct" - }, - "starkware.starknet.common.syscalls.call_contract": { - "decorators": [], - "pc": 0, - "type": "function" - }, - "starkware.starknet.common.syscalls.call_contract.Args": { - "full_name": "starkware.starknet.common.syscalls.call_contract.Args", - "members": { - "calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "calldata_size": { - "cairo_type": "felt", - "offset": 2 - }, - "contract_address": { - "cairo_type": "felt", - "offset": 0 - }, - "function_selector": { - "cairo_type": "felt", - "offset": 1 - } - }, - "size": 4, - "type": "struct" - }, - "starkware.starknet.common.syscalls.call_contract.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.call_contract.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.call_contract.Return": { - "cairo_type": "(retdata_size: felt, retdata: felt*)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.call_contract.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.call_contract.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 0 - }, - "pc": 0, - "value": "[cast(fp + (-7), felt**)]" - }, - { - "ap_tracking_data": { - "group": 0, - "offset": 1 - }, - "pc": 7, - "value": "cast([fp + (-7)] + 7, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.deploy": { - "decorators": [], - "pc": 12, - "type": "function" - }, - "starkware.starknet.common.syscalls.deploy.Args": { - "full_name": "starkware.starknet.common.syscalls.deploy.Args", - "members": { - "class_hash": { - "cairo_type": "felt", - "offset": 0 - }, - "constructor_calldata": { - "cairo_type": "felt*", - "offset": 3 - }, - "constructor_calldata_size": { - "cairo_type": "felt", - "offset": 2 - }, - "contract_address_salt": { - "cairo_type": "felt", - "offset": 1 - }, - "deploy_from_zero": { - "cairo_type": "felt", - "offset": 4 - } - }, - "size": 5, - "type": "struct" - }, - "starkware.starknet.common.syscalls.deploy.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.deploy.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.deploy.Return": { - "cairo_type": "(contract_address: felt)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.deploy.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.deploy.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.deploy.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 12, - "value": "[cast(fp + (-8), felt**)]" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 1 - }, - "pc": 20, - "value": "cast([fp + (-8)] + 9, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.get_caller_address": { - "decorators": [], - "pc": 24, - "type": "function" - }, - "starkware.starknet.common.syscalls.get_caller_address.Args": { - "full_name": "starkware.starknet.common.syscalls.get_caller_address.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_caller_address.Return": { - "cairo_type": "(caller_address: felt)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 24, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 1 - }, - "pc": 27, - "value": "cast([fp + (-3)] + 2, felt*)" - } - ], - "type": "reference" - }, - "starkware.starknet.common.syscalls.get_contract_address": { - "decorators": [], - "pc": 31, - "type": "function" - }, - "starkware.starknet.common.syscalls.get_contract_address.Args": { - "full_name": "starkware.starknet.common.syscalls.get_contract_address.Args", - "members": {}, - "size": 0, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs": { - "full_name": "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs", - "members": { - "syscall_ptr": { - "cairo_type": "felt*", - "offset": 0 - } - }, - "size": 1, - "type": "struct" - }, - "starkware.starknet.common.syscalls.get_contract_address.Return": { - "cairo_type": "(contract_address: felt)", - "type": "type_definition" - }, - "starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS": { - "type": "const", - "value": 0 - }, - "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": { - "cairo_type": "felt*", - "full_name": "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr", - "references": [ - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 31, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 1 - }, - "pc": 34, - "value": "cast([fp + (-3)] + 2, felt*)" - } - ], - "type": "reference" - } - }, - "main_scope": "__main__", - "prime": "0x800000000000011000000000000000000000000000000000000000000000001", - "reference_manager": { - "references": [ - { - "ap_tracking_data": { - "group": 0, - "offset": 0 - }, - "pc": 0, - "value": "[cast(fp + (-7), felt**)]" - }, - { - "ap_tracking_data": { - "group": 1, - "offset": 0 - }, - "pc": 12, - "value": "[cast(fp + (-8), felt**)]" - }, - { - "ap_tracking_data": { - "group": 2, - "offset": 0 - }, - "pc": 24, - "value": "[cast(fp + (-3), felt**)]" - }, - { - "ap_tracking_data": { - "group": 3, - "offset": 0 - }, - "pc": 31, - "value": "[cast(fp + (-3), felt**)]" - } - ] - } - } -} diff --git a/crates/katana/core/contracts/compiled/oz_account_080.json b/crates/katana/core/contracts/compiled/oz_account_080.json new file mode 100644 index 0000000000..580b8acd45 --- /dev/null +++ b/crates/katana/core/contracts/compiled/oz_account_080.json @@ -0,0 +1 @@ +{"sierra_program":["0x1","0x3","0x0","0x2","0x3","0x1","0x38d","0x73","0x67","0x53797374656d","0x800000000000000100000000000000000000000000000000","0x556e696e697469616c697a6564","0x800000000000000200000000000000000000000000000001","0x1","0x0","0x456e756d","0x800000000000000700000000000000000000000000000001","0x4abc19acf2110f55bbd81ec736d91bfa4d6bab076c94cfdf3127449061193d","0x45635374617465","0x800000000000000700000000000000000000000000000000","0x4172726179","0x800000000000000300000000000000000000000000000001","0x8","0x536e617073686f74","0x4","0x537472756374","0x800000000000000700000000000000000000000000000002","0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62","0x5","0x800000000000000300000000000000000000000000000003","0x161ee0e6962e56453b5d68e09d1cabe5633858c1ba3a7e73fee8c70867eced0","0x6","0x66656c74323532","0x1166fe35572d4e7764dac0caf1fd7fc591901fd01156db2561a07b68ab8dca2","0x800000000000000f00000000000000000000000000000001","0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3","0x101dc0399934cc08fa0d6f6f2daead4e4a38cabeea1c743e1fc28d2d6e58e99","0xa","0x4563506f696e74","0x4e6f6e5a65726f","0xc","0x426f78","0x42","0x2c","0x2c7badf5cd070e89531ef781330a9554b04ce4ea21304b67a30ac3d43df84a2","0xf","0x381e8d33523eda2efdaa30d501b6dfe83db6bdd909086fb338103738444ec23","0x800000000000000f00000000000000000000000000000003","0x11","0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672","0x13","0x3cca7a30d12b22cfcf3842f0061708aabfc598c01f49a4529e51e7916aa5784","0x12","0x14","0x800000000000000700000000000000000000000000000003","0x3288d594b9a45d15bb2fcb7903f06cdb06b27f0ba88186ec4cfaa98307cb972","0x248e8fae2f16a35027771ffd74d6a6f3c379424b55843563a18f566bba3d905","0x16","0x28266f0414c0de3e9d181ad39a5c73a16c7514519fab3e64e293fe4c79a9fbe","0x14be226ed4a8370e9a1024f06dd500f119e3e7f909013eaaf51e63d2eca6712","0x19","0x34fbf7999a7a80ee576a7639d4a2ab5eff961e5aae01064a147a4e7193b88f7","0x1a","0x39d1bb6485850462fcfa1e5c499cd211a145258949ebe8aadd304a999165dc6","0x231d4965fc11a34a5dbf5760a6aa96609aa0166be90582301f5102b7f7eae9d","0x18","0x1c","0x32f0b6749e5a61f7f6bc38eae942ce592ae56233e8349466b243151ab3b637","0x1d","0x2","0x90d0203c41ad646d024845257a6eceb2f8b59b29ce7420dd518053d2edeedc","0x53746f7261676541646472657373","0x53746f726167654261736541646472657373","0x22","0x3ae40d407f8074730e48241717c3dd78b7128d346cf81094e31806a3a5bdf","0x23","0x800000000000000300000000000000000000000000000004","0x25","0x26","0x32cb17bdb0d0d053909169ec443a25462b7e27237007511f772a7d957ce924c","0x27","0x2e","0x3d","0x436f6e747261637441646472657373","0x800000000000000700000000000000000000000000000006","0x19367431bdedfe09ea99eed9ade3de00f195dd97087ed511b8942ebb45dbc5a","0x29","0x2a","0x2b","0x753634","0x800000000000000700000000000000000000000000000004","0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5","0x2d","0x38f4af6e44b2e0a6ad228a4874672855e693db590abc7105a5a9819dbbf5ba6","0x2f","0x3d37ad6eafb32512d2dd95a2917f6bf14858de22c27a1114392429f2e5c15d7","0x800000000000000f00000000000000000000000000000002","0x2c92579c09cc1c79d950a243b853521e6cc14629970e7763fb138c03a479139","0x33","0x220d0098370bbaab338f4e82fb69720a761536f00e15d656ddc9d3385b16e3","0x34","0xcc5e86243f861d2d64b08c35db21013e773ac5cf10097946fe0011304886d5","0x36","0x1f5d91ca543c7f9a0585a1c8beffc7a207d4af73ee640223a154b1da196a40d","0x38","0x3a","0x75313238","0x800000000000000700000000000000000000000000000008","0x2e655a7513158873ca2e5e659a9e175d23bf69a2325cdd0397ca3b8d864b967","0x3c","0x3508bb43f8880f8a37030d78eb1ac52d3a1abcccd991bf0258bdf64f81014ed","0x3e","0x3e1934b18d91949ab9afdbdd1866a30ccca06c2b1e6581582c6b27f8b4f6555","0x40","0x3693aea200ee3080885d21614d01b9532a8670f69e658a94addaadd72e9aca","0x18508a22cd4cf1437b721f596cd2277fc0a5e4dcd247b107ef2ef5fd2752cf7","0x43","0x8416421239ce8805ed9d27e6ddae62a97ab5d01883bb8f5246b4742a44b429","0x44","0x215692769bef4dad4fa84993f233ef2b9084a6d947d83521a5e257dae5d5e1b","0x47","0x3ce5192f5a34fd44f3cea940ff0f4e47518da9ada5aede3b732eb001439f046","0x48","0x28f8d296e28032baef1f420f78ea9d933102ba47a50b1c5f80fc8a3a1041da","0x29d7d57c04a880978e7b3689f6218e507f3be17588744b58dc17762447ad0e7","0xa853c166304d20fb0711becf2cbdf482dee3cac4e9717d040b7a7ab1df7eec","0x4c","0x506564657273656e","0x265bdceca7ea9a7f2bd04272ca0fae2a6498e935c71d3ef73237e17187023ec","0x4f","0xe12da67791025850b8b89abc616bc4269dff27cfc5aa224bf8f0762470ea51","0x50","0x17b6ecc31946835b0d9d92c2dd7a9c14f29af0371571ae74a1b228828b2242","0x52","0x34f9bd7c6cb2dd4263175964ad75f1ff1461ddc332fbfb274e0fb2a5d7ab968","0x53","0x11c6d8087e00642489f92d2821ad6ebd6532ad1a3b6d12833da6d6810391511","0x10203be321c62a7bd4c060d69539c1fbe065baa9e253c74d2cc48be163e259","0x57","0x45634f70","0x74584e9f10ffb1a40aa5a3582e203f6758defc4a497d1a2d5a89f274a320e9","0x5b","0x800000000000000300000000000000000000000000000002","0x25abf8fd76a01c7e2544d26b0a2e29212b05a36781e0330b46d878e43b307d1","0x5d","0x4275696c74696e436f737473","0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6","0x5a","0x753332","0x28f184fd9e4406cc4475e4faaa80e83b54a57026386ee7d5fc4fa8f347e327d","0x62","0xc1f0cb41289e2f6a79051e9af1ead07112b46ff17a492a90b3944dc53a51c8","0x63","0x4761734275696c74696e","0x52616e6765436865636b","0x1c0","0x616c6c6f635f6c6f63616c","0x66696e616c697a655f6c6f63616c73","0x7265766f6b655f61705f747261636b696e67","0x77697468647261775f676173","0x6272616e63685f616c69676e","0x73746f72655f74656d70","0x66","0x65","0x66756e6374696f6e5f63616c6c","0x3","0x656e756d5f6d61746368","0x64","0x7374727563745f6465636f6e737472756374","0x61727261795f6c656e","0x736e617073686f745f74616b65","0x61","0x64726f70","0x7533325f636f6e7374","0x72656e616d65","0x7533325f6571","0x61727261795f6e6577","0x66656c743235325f636f6e7374","0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473","0x61727261795f617070656e64","0x7374727563745f636f6e737472756374","0x656e756d5f696e6974","0x60","0x6765745f6275696c74696e5f636f737473","0x5f","0x77697468647261775f6761735f616c6c","0xd","0x73746f72655f6c6f63616c","0x5e","0xe","0x5c","0x4f7574206f6620676173","0x4661696c656420746f20646573657269616c697a6520706172616d202331","0x59","0x58","0x10","0x55","0x54","0x4661696c656420746f20646573657269616c697a6520706172616d202332","0x56","0x15","0x51","0x17","0x4661696c656420746f20646573657269616c697a6520706172616d202333","0x4e","0x1b","0x4d","0x64697361626c655f61705f747261636b696e67","0x61727261795f736e617073686f745f706f705f66726f6e74","0x4b","0x6a756d70","0x756e626f78","0x1e","0x1f","0x20","0x647570","0x7533325f746f5f66656c74323532","0x4a","0x21","0x24","0x49","0x28","0x66656c743235325f69735f7a65726f","0x46","0x45","0x66656c743235325f737562","0x41","0x636f6e74726163745f616464726573735f746f5f66656c74323532","0x3f","0x656e61626c655f61705f747261636b696e67","0x100000000000000000000000000000001","0x4163636f756e743a20696e76616c69642074782076657273696f6e","0x4163636f756e743a20696e76616c69642063616c6c6572","0x39","0x30","0x3b","0x31","0x4163636f756e743a20696e76616c6964207369676e6174757265","0x56414c4944","0x32","0x37","0x35","0x3f918d17e5ee77373b56385708f855659a07f75997f365cf87748628532a055","0x2ceccef7f994940b3962a6c67e0ba4fcd37df7d131417c604f91e03caecc1cd","0x73746f726167655f626173655f616464726573735f636f6e7374","0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f","0x73746f726167655f616464726573735f66726f6d5f62617365","0x73746f726167655f726561645f73797363616c6c","0x4163636f756e743a20756e617574686f72697a6564","0x21adb5788e32c84f69a1863d85ef9394b7bf761a0ce1190f826984e5075c371","0x6765745f657865637574696f6e5f696e666f5f73797363616c6c","0x61727261795f706f705f66726f6e74","0x61727261795f676574","0x496e646578206f7574206f6620626f756e6473","0x800000000000010ffffffffffffffffb781126dcae7b2321e66a241adc64d2f","0x65635f706f696e745f66726f6d5f785f6e7a","0x756e777261705f6e6f6e5f7a65726f","0x1ef15c18599971b7beced415a40f0c7deacfd9b0d1819e03d723d8bc943cfca","0x5668060aa49730b7be4801df46ec62de53ecd11abe43a32873000c36e8dc1f","0x65635f706f696e745f7472795f6e65775f6e7a","0x65635f706f696e745f69735f7a65726f","0x65635f706f696e745f756e77726170","0x656d69745f6576656e745f73797363616c6c","0xb","0x73746f726167655f77726974655f73797363616c6c","0x10e5fcd68658d0cf6ed280e34d0d0da9a510b7a6779230c9912806a2c939b9","0x9","0x706564657273656e","0xad292db4ff05a993c318438c1b6c8a8303266af2da151aa28ccece6726f1f1","0x626f6f6c5f6e6f745f696d706c","0x63616c6c5f636f6e74726163745f73797363616c6c","0x7","0x65635f73746174655f696e6974","0x65635f73746174655f6164645f6d756c","0x65635f73746174655f7472795f66696e616c697a655f6e7a","0x65635f706f696e745f7a65726f","0x65635f73746174655f616464","0x65635f6e6567","0x526573756c743a3a756e77726170206661696c65642e","0x38f6a5b87c23cee6e7294bcc3302e95019f70f81586ff3cac38581f5ca96381","0xca58956845fecb30a8cb3efe23582630dbe8b80cc1fb8fd5d5e866b1356ad","0x10d9","0xffffffffffffffff","0x89","0x81","0x71","0x68","0x69","0x6a","0x6b","0x6c","0x6d","0x6e","0x6f","0x70","0x72","0x73","0x74","0x75","0x76","0x77","0x78","0x79","0x7a","0x7b","0x7c","0x7d","0x7e","0x7f","0x80","0x82","0x83","0x115","0x10d","0xfd","0xbe","0xee","0xe6","0x1bf","0x1ae","0x1a5","0x194","0x153","0x184","0x17c","0x84","0x85","0x86","0x87","0x88","0x8a","0x8b","0x8c","0x8d","0x8e","0x8f","0x90","0x91","0x92","0x26a","0x259","0x250","0x23f","0x1fe","0x22f","0x227","0x2cf","0x296","0x2c2","0x2bb","0x340","0x331","0x2fe","0x323","0x31c","0x3a3","0x36a","0x396","0x38f","0x414","0x405","0x3d2","0x3f7","0x3f0","0x493","0x483","0x444","0x474","0x46c","0x544","0x534","0x523","0x511","0x4ce","0x500","0x4f8","0x93","0x94","0x95","0x5c4","0x5b4","0x575","0x5a5","0x59d","0x63c","0x62c","0x5f5","0x61d","0x615","0x653","0x658","0x674","0x66e","0x691","0x6b2","0x6cc","0x6e1","0x6e6","0x6f0","0x6ff","0x704","0x720","0x71a","0x96","0x73f","0x75c","0x97","0x773","0x98","0x99","0x78a","0x9a","0x9b","0x9c","0x9d","0x9e","0x9f","0xa0","0x7a0","0xa1","0x7b7","0x7d2","0x7f0","0xa2","0xa3","0xa4","0x80c","0xa5","0xa6","0xa7","0xa8","0xa9","0xaa","0x81b","0xab","0x81f","0xac","0xad","0xae","0x83f","0xaf","0x88e","0xb0","0xb1","0x859","0xb2","0xb3","0xb4","0xb5","0x886","0xb6","0xb7","0x87c","0xb8","0xb9","0x876","0xba","0xbb","0x923","0xbc","0xbd","0x914","0xbf","0x90c","0xc0","0xc1","0xc2","0xc3","0xc4","0xc5","0x8d8","0x8e5","0xc6","0x8fc","0xc7","0x8f5","0xc8","0xc9","0xca","0x977","0xcb","0xcc","0x93b","0xcd","0xce","0x940","0xcf","0xd0","0xd1","0x969","0xd2","0xd3","0x962","0x95c","0x970","0xd4","0xd5","0xd6","0x9c1","0xd7","0x9b9","0x9ae","0xd8","0xd9","0xa03","0x9db","0xda","0x9f9","0x9f3","0xa32","0xa26","0xa2a","0xdb","0xdc","0xdd","0xa48","0xde","0xdf","0xe0","0xa8f","0xe1","0xe2","0xa87","0xe3","0xe4","0xe5","0xa80","0xa7a","0xe7","0xe8","0xe9","0xea","0xeb","0xaa5","0xabb","0xec","0xad7","0xed","0xef","0xf0","0xaec","0xf1","0xf2","0xf3","0xb1b","0xf4","0xb13","0xf5","0xf6","0xf7","0xb61","0xf8","0xb57","0xb4f","0xb45","0xf9","0xfa","0xfb","0xfc","0xfe","0xff","0x100","0x101","0x102","0xb7d","0x103","0x104","0x105","0x106","0x107","0x108","0x109","0x10a","0x10b","0xb95","0x10c","0x10e","0x10f","0x110","0x111","0x112","0x113","0xbaf","0x114","0x116","0x117","0xbd0","0x118","0xbee","0x119","0xc1b","0xc39","0x11a","0x11b","0xc2e","0x11c","0x11d","0xc23","0x11e","0x11f","0x120","0x121","0x122","0x123","0xc50","0x124","0x125","0xc55","0x126","0x127","0x128","0xc60","0xca0","0x129","0xc99","0x12a","0x12b","0xc8c","0x12c","0x12d","0x12e","0x12f","0x130","0x131","0x132","0x133","0x134","0x135","0xcbd","0x136","0x137","0xce7","0x138","0x139","0x13a","0x13b","0xce1","0x13c","0x13d","0x13e","0x13f","0x140","0xd06","0x141","0x142","0xd27","0x143","0x144","0x145","0x146","0x147","0xd41","0x148","0xd3a","0x149","0x14a","0x14b","0x14c","0xd4e","0x14d","0x14e","0xd53","0x14f","0x150","0x151","0xd5e","0x152","0x154","0x155","0xdae","0x156","0xd72","0x157","0x158","0xd77","0xda3","0x159","0x15a","0x15b","0xd99","0x15c","0x15d","0xd92","0x15e","0x15f","0x160","0x161","0xdfa","0xdcb","0xdd0","0xdec","0xde6","0xdf3","0x162","0x163","0xe0f","0x164","0x165","0x166","0x167","0x168","0xe27","0x169","0xe39","0xe4b","0x16a","0xec8","0x16b","0x16c","0xebd","0x16d","0x16e","0x16f","0xeb1","0x170","0x171","0x172","0xe6f","0x173","0x174","0x175","0x176","0xe82","0xe95","0xe93","0x177","0xe9c","0xeab","0xea9","0x178","0xed8","0xef0","0x179","0x17a","0x17b","0x17d","0x17e","0x17f","0xf14","0x180","0x181","0xf19","0x182","0x183","0xf24","0x185","0x186","0xf3a","0xf3f","0xf4a","0x187","0x188","0x189","0x18a","0x18b","0xf68","0x18c","0x18d","0x18e","0x18f","0x190","0x191","0xfa3","0xf98","0xf9d","0x192","0x193","0x195","0x196","0xfaf","0x197","0xfc2","0xfc6","0xfd0","0xfd5","0xfe2","0x198","0x199","0x19a","0x19b","0x19c","0xff1","0x19d","0x19e","0x1003","0x19f","0x1a0","0x1008","0x1a1","0x1a2","0x1a3","0x1013","0x1020","0x1030","0x1a4","0x1a6","0x1a7","0x102b","0x102e","0x1a8","0x1a9","0x1aa","0x1039","0x103f","0x1ab","0x1ac","0x104b","0x104e","0x1056","0x1ad","0x106a","0x1af","0x1072","0x1b0","0x1b1","0x1b2","0x1b3","0x107d","0x1b4","0x1b5","0x1b6","0x1091","0x1b7","0x10a2","0x1b8","0x1b9","0x10ad","0x1ba","0x1bb","0x1bc","0x1bd","0x10bc","0x1be","0x1cf","0x27a","0x2dd","0x34e","0x3b1","0x422","0x4a2","0x553","0x5d3","0x64b","0x67e","0x698","0x6b8","0x6d4","0x6da","0x6f7","0x72a","0x747","0x764","0x779","0x791","0x7a6","0x7be","0x7da","0x7f8","0x814","0x829","0x848","0x89d","0x8a1","0x92b","0x986","0x9ca","0xa12","0xa3a","0xa4e","0xa97","0xaab","0xac1","0xac5","0xaf4","0xb25","0xb6b","0xb83","0xb9b","0xbb6","0xbd6","0xc43","0xc66","0xca6","0xcc4","0xcee","0xd0e","0xd2f","0xd47","0xd64","0xdbd","0xe08","0xe1a","0xed2","0xede","0xef6","0xef9","0xf2b","0xf51","0xf6f","0xf7d","0xfa9","0xfb5","0xfeb","0xff7","0x1019","0x1033","0x1050","0x105e","0x1060","0x1077","0x1083","0x1086","0x1095","0x10b2","0x10b5","0x10c5","0x10cf","0x92a4","0x1301812044100140803c0e0140d0300b028090180801c060140400c0200400","0x60540706c060681103805064060481102c180400505c05058060540705005","0x25014240181501c2301408084220140d084200140807c0b078100141d0141c","0x50a80506c06054110a40606811074050a00506c0609c11098060681104005","0x1001431014300181501c1d0141d0142f0182e01c2d0142c0142b0181501c10","0x50d8050d40605407074050d00506c0609c110cc0606811038050c80604811","0x1501c3d0143c0143b0182e01c3a01439014380182e01c0e01437018120442d","0x510806054071040506c0604811038050202102c4002c3f04005038050f806","0x470181501c1d01446014450141b01844044170140d030220140d0302d01443","0x51400513c0513805134061301102c4b128050202112405020210b40512005","0x550181501c250141b0181204450014540145401453018520440b1440e01450","0x609c110a00516406160111400501003074051400515c060b8070b40515805","0x5e0145d0181501c1d0141b018580442d0145c0145b0181501c1d0145a0141b","0x1102c621840501003118050200f074051800517c060b80705c05020210b405","0x1501c4f0141b018120440e0140e0140e0141701465014500140e0146401863","0x51a806110110b4051a4051a006054071400506c06048110b40519c0519806","0x6d0181501c6c014170141b018150441d014220146b0181501c100140e01450","0x605407074051c00506c0609c110d0051bc0616011038050201f0b4051b805","0x310141b018120441d01441014740182e01c6101473018120442d0147201471","0x51e40506c0609c11168051c0051e00609c11008770b4051d8051d40605407","0x7d014170141b018150441d014100147c0181501c2d0147b0147a0181501c1d","0x506c060481103805010030740503805200060b8070b4051fc051f80605407","0x1d014100141b01815044170141b018120440220c2d01482014810181501c0e","0x702c890b4052200521c06054071180506c06218110b405214052100605407","0x8e014170141b018150441d014450148d0181501c0b2302d0148b0148a01815","0x62600625c062580625406014052509300892008910b4052400523c0605407","0x9e24005014a027c050149e0809d0149c05c050149926c05014992680501499","0x5298060f405294a301405290a3014052880e0140528417014052808e01405","0x992a83d014a903805014a811405014a401405014a4018a728c050149928c05","0x601405264050f4ae0143d2b42d014052b02a014052b00e014052ac0e01405","0xac0a005014ac1c005014ac0d005014ac018b12c00501499018af2b80501499","0x5270450140526479014052647901405290790140528879014052b05a01405","0x50149911805014a411805014a222005014a02d0050149e01805014b32c89d","0x10014052881d014052908501405280b601405278b527405270100140526461","0x5014a42dc3d014a90183d2b8050f4ad22c05014ac05c05014ac04005014a4","0xe014052888201405280ba014052782527405270b901405264b80f4052a417","0x9c03805014b32f0050149e0a09d0149c03805014942ec9d0149c03805014a4","0x5290be0f4052a42a274052707d014052787f01405280bd014052782c27405","0x9d0149c1ec05014a4304050149e0c49d0149c3009d0149c0b49d0149c2fc05","0xc527405270c401405264c30f4052a4362740527034274052703927405270c2","0x9c0e89d0149c0c405014990c405014a40c405014a21d805014a0318050149e","0x6328c9014052641401405264060f4c90143d2b40e014053200631c3c27405","0x5014a608805014a803805014cb324050149e0143d324050f4ad07405014ac","0x50f49f0143d2b49f01405264060f49f0143d2b490014052b0cc274052700e","0x50f4ad22005014ac3389d0149c1c005014993349d0149c0143d238050f4ad","0x52b0063401701405284610140533c050f4b40143d2b4b401405264060f4b4","0xad2d805014990183d2d8050f4ad21405014ac3489d0149c344050149934405","0x3d2b4ba01405264060f4ba0143d2b482014052b04127405270050f4b60143d","0x9c0143d2f0050f4ad2f005014990183d2f0050f4ad07405014990143d2e805","0x3d2b4050f4bd0143d2b4bd01405264060f4bd0143d2b47f014052b04327405","0xa41c805014a0350050149e1189d0149c1149d0149c34c9d0149c0143d1f405","0x5270050f4c10143d2b4c101405264060f4c10143d2b47b014052b07001405","0x50f4ad1d805014ac13c9d0149c16805014991389d0149c3549d0149c1209d","0x60f4052a431014052783101405298050f4c60143d2b4c601405264060f4c6","0x50f4ad018d603805014cf16805014a41409d0149c1e405014a00143d014a9","0x52ac6c014052786e01405280d8014052782327405270d701405290060f48e","0x50149e1249d0149c018db1a405014a0368050149e1509d0149c018d908805","0x52a406374650140529050014052904a014052804a0140532c6701405280dc","0x5014c834405014a018405014943803d014a937c3d014a91589d0149c3783d","0xe10140527861014052cc050f4e10143d2b4e101405264060f4e10143d2b417","0xa93909d0149c34405014a438c05014a418405014a43889d0149c05c05014cb","0xe72740527034014052647001405280060f47d0143d2b4e60f4052a4e50f405","0x990e805014ac0d005014a217805014a43a0050149e1689d0149c1c005014a2","0xd401405264060f4d40143d2b472014052b0e9274052705c274052703a01405","0x9916805014a00143d0c4050f4ad3a83d014a90d005014a40143d350050f4ad","0x52505c01405290e901405278e827405270eb0f4052a45e274052702801405","0xac0183d1b0050f4ad08805014ac14005014b3390050149e1809d0149c14005","0x50f4d80143d2b4050f46c0143d2b4d801405264060f4d80143d2b46e01405","0xa408c05014a008c05014cb15805014a0388050149e3849d0149c39c05014a4","0xda0143d2b4da01405264060f4da0143d2b469014052b04f014052904e01405","0x5014a80143d370050f4ad37005014990183d370050f4ad19c05014ac0143d","0x1701405298170140533c4801405280d5014052786127405270460140526417","0x5014a034c050149e1949d0149c0183d0c4050f4ad0f43d014a538c9d0149c","0x63bcce01405264063b8ed0f4053b082014052904a27405270050f40529443","0x9c19c9d0149c33405014a60143d334050f4ad33405014990183d334050f4ad","0xe801405264060f4e80143d2b45e014052b050014052985001405288dc27405","0x990183d330050f4ad1a49d0149c1a405014a40143d3a0050f4ad3c03d014a9","0x526439014052b03601405280c5014052782227405270da27405270cc01405","0x9d0149c30805014a63609d0149c34805014991b89d0149c1b09d0149c0e405","0x5264060f4e90143d2b45c014052b02c01405280c0014052787027405270d7","0x3d390050f4ad39005014990183d390050f4ad018f10143d3a4050f4ad3a405","0x5270bb01405298050f4bb0143d2b4bb01405264060f4bb0143d2b4063c805","0x5014f30143d388050f4ad38805014990183d388050f4ad15805014ac1c89d","0x8b01405280ae01405278d42740527022014052646c01405264220140532c22","0xa40143d354050f4ad35405014990183d354050f4ad12005014ac05c05014ab","0xf50f4052a4d301405264060f4d30143d2b443014052b00e014053d01401405","0xa93e43d014a908005014f82c80501499018f73d83d014a90143d34c050f4ad","0x200140533c063f42001405290063f0d1274052702001405264063ecfa0f405","0x9d0149c0f005014990143d0f0050f4ad334050149e1d89d0149c3249d0149c","0xff01405264060f4ff0143d2b4063f8c427405270cc01405290cc01405288c6","0xad0d805014ac0190017805014a01e49d0149c3fc05014a60143d3fc050f4ad","0x52a428014052907b27405270050f4c50143d2b4c501405264060f4c50143d","0x5014990183d308050f4ad01905019040190340805014a040805014ac4043d","0x60f4c00143d2b42c014052b02801405288c201405278050f4c20143d2b4c2","0x3d41c050f4ad0190608805014a02ec050149e0143d300050f4ad3000501499","0x52640642406420c1274052710701405298050f5070143d2b5070140526406","0x50149e0190d0190c2c805014a408005014a62e405014a60190b0190a27405","0x3c0143d2b4ff0140527810014052987f274052703d014052647d27405270cc","0x3d014a92f09d0149c43c3d014a90f0050149e2f49d0149c4383d014a90183d","0x6018064443a01405280390140528107014052783d01405278bf2740527110","0x170f5120f4050183d2740601912014060f4060191201406014060500544805","0x1120150701417018b2015120141701414018064480501810019020383d44d07","0x540806080ff0749d44805094b52c89d0380609405448052740541c062d405","0xff0182a0b03d448052ec05074060191201406040060a005450bb015120f420","0xb201831015120142c01420018064480501810018c0015150b4054483d0a805","0x62ec06019120143901425018340e43d44805308052d40630805448050c405","0x50d0050a00601912014c5014250183a3143d448050d8052d4060d80544805","0x3d3303c0f42a0183c015120143c0142c018cc015120143a014280183c01512","0x6019120142d014c00180644805050050b406019120140604006018d501912","0xcd0f434018ce01512014ce01439018ce015120140630806334054480501831","0x430143a0184301512014d21043d31406104054480501836018d201512014ce","0x50f4050f00611805448053fc0505c061140544805074050500634c0544805","0xcd018064480501810018d51204611410014d501512014d3014cc0184801512","0x8e1404f0f5120f44e3fc1d274d20184e015120144e014ce0184e0151201406","0x615805448051240510c061240544805018410180644805018100185408c3d","0x48018e701512014e41583d11806390054480538805114063880544805018d3","0x505c06180054480513c0505006019120145a014d50185c1683d4480539c05","0x2d0144f018e3015120145c0144e01861015120143d0143c018e10151201450","0x5040140f423018e80405e3a41044805194e3184e118014140061940544805","0x112014060c40601912014060400619c052144a015120f4e8014540181001512","0x112014da014e2018223683d448051a405158061a40544805128051240637005","0x720151201422014e401870015120145e01417018d701512014e90141401806","0xd80145c018d81b86c27512014d41c87035c101680635005448053700539c06","0x517806318760f512014d1014e9018064480501810018c9014bd344054483d","0x51e4053840601912014c401460018793103d448051d8053a00601912014c6","0x1120146c014140187d01512014c1014e3018c1015120147b014610187b01512","0x5448051f405330062f00544805040050f0062f405448051b80505c061fc05","0x6c014140188201512014c90143a018064480501810018bf2f0bd1fc10014bf","0x5208053300622c0544805040050f0062e405448051b80505c062e80544805","0x14018b601512014670143a0180644805018100188522cb92e8100148501512","0x5330062c00544805040050f0062d005448051780505c0622005448053a405","0x601912014140142d018064480501810018ae2c0b422010014ae01512014b6","0x5238050e406238054480501865018a301512014060c406019120142d014c0","0x52409f0f4c50189f01512014060d8062400544805238a30f4340188e01512","0x1120145401417018000151201423014140189a015120149b0143a0189b01512","0x64611745800040054600544805268053300645c05448050f4050f00645805","0x1120142c0144a0180644805050050b40601912014c00145e018064480501810","0x340191a015120151a014390191a015120140619c0646405448050183101806","0x3a0191d015120151b4703d314064700544805018360191b015120151a4643d","0x50f00647c05448053fc0505c0645405448050740505006478054480547405","0x64480501810019214811f4541001521015120151e014cc01920015120143d","0x1701923015120141d014140192201512014280143a0180644805050050b406","0x123040054980544805488053300649405448050f4050f00649005448053fc05","0x310180644805274051280601912014140142d0180644805018100192649524","0x12849c3d0d0064a005448054a0050e4064a0054480501865019270151201406","0x54ac050e8064ac05448054a52a0f4c50192a01512014060d8064a40544805","0x1120143d0143c019140151201502014170192d015120140e014140192c01512","0x3d2740601912014060f4064bd2e4512d040054bc05448054b005330064b805","0x200151201414014140180644805018100180e41c3d4c0170503d4483d0f406","0x9d448052d4b20809d038062d405448050400541c062c8054480505c0505c06","0x509405074060191201406040062ec054c425015120f4ff01502018ff07502","0x28014200180644805018100182d015320a8054483d0b0053fc060b0280f512","0xc201425018393083d448050c4052d4060c40544805300052c8063000544805","0x1120143601425018c50d83d448050d0052d4060d00544805018bb0180644805","0x3a015120143a0142c0183c01512014c5014280183a01512014390142801806","0x3101806448050a8053000601912014060400601933019120f43c0e83d0a806","0xcd3303d0d0063340544805334050e4063340544805018c2018cc0151201406","0x5104050e8061040544805338d20f4c5018d201512014060d8063380544805","0x1120141d01417018450151201405014dc018d30151201502014140184301512","0xd512046114d305005354054480510c05330061200544805274050f00611805","0x102274d20184e015120144e014ce0184e015120140633406019120140604006","0x61240544805018410180644805018100185408c3d4d05013c3d4483d1381d","0x3d11806390054480538805114063880544805018d301856015120144901443","0x505006019120145a014d50185c1683d4480539c051200639c054480539056","0x9d0143c01865015120145001417018e30151201405014dc01861015120144f","0xe3184171a40637005448050a80513c0619c054480517005138061280544805","0x10018da015351a4054483d3840536806384603a05e3a414448053706712865","0x1120146c0146c0186c0151201469014220182201512014060c4060191201406","0x5448050880539c061c80544805360050e406019120146e0146e018d81b83d","0x3d4480535c053a00601912014700145e0187035c3d44805350720f4d8018d4","0xc60151201476014610187601512014c9014e101806448053440518006324d1","0x61ec054480517805370061e405448053a4050500631005448053180538c06","0x140147f01512014c4014cc0187d01512014600143c018c101512014e801417","0x112014e901414018bd01512014da0143a0180644805018100187f1f4c11ec79","0x544805180050f00620805448053a00505c062fc054480517805370062f005","0x5300060191201406040062e4ba208bf2f014014b901512014bd014cc018ba","0x544805214050e4062140544805018650188b01512014060c406019120142a","0x5448052d8880f4c50188801512014060d8062d805448052148b0f43401885","0xa30151201405014dc018ae015120142301414018b001512014b40143a018b4","0x527c05448052c005330062400544805274050f00623805448051500505c06","0x112014280144a01806448050b4051780601912014060400627c90238a32b814","0x340189a015120149a014390189a015120140619c0626c05448050183101806","0x3a0191701512014004583d3140645805448050183601800015120149a26c3d","0x505c064680544805014053700646405448054080505006460054480545c05","0x11a464140151d0151201518014cc0191c015120149d0143c0191b015120141d","0x1150151201502014140191e01512014bb0143a0180644805018100191d4711b","0x64840544805274050f00648005448050740505c0647c05448050140537006","0x50400512806019120140604006489214811f4541401522015120151e014cc","0x64900544805490050e4064900544805018650192301512014060c40601912","0x649c0544805495260f4c50192601512014060d8064940544805491230f434","0x170192a0151201405014dc019290151201507014140192801512015270143a","0x129050054b405448054a005330064b00544805274050f0064ac054480503805","0x9d01806448050183d01806448050180501817015120140635c064b52c4ad2a","0x5448050400541c06019120140604006075020f536039070f5120f43d0183d","0x54483d080051c80641c054480541c0505006080ff0f512014b201470018b2","0x5448050380505c060b0054480541c05050060191201406040062d4054dc14","0x50b42a0b09d344060500544805050170f4d40182d01512014ff015070182a","0x51d8060191201406040060c4054e0c0015120f428014c9018282ec2527512","0x2001806448050181001836015390d0054483d0e405318060e4c20f512014c0","0x25018cc0f03d448050e8052d4060e80544805314052c806314054480530805","0xce01425018d23383d44805334052d4063340544805018bb01806448050f005","0x112014410142c0184301512014d2014280184101512014cc014280180644805","0x6448050d005180060191201406040060193a019120f4431043d0a80610405","0x45014390184501512014063080634c0544805018310180644805050051b806","0x461203d3140612005448050183601846015120144534c3d0d0061140544805","0x5014053700613c054480509405050061380544805354050e8063540544805","0x1120144e014cc01854015120149d0143c0182301512014bb014170185001512","0x5338061580544805018cd01806448050181001849150231404f0500512405","0x1120140604006168e70f53b390e20f5120f4562ec25274d2018560151201456","0x450185e015120140634c063a405448051700510c0617005448050184101806","0x6184e10f51201460014480186001512014e83a43d118063a0054480517805","0x505c06368054480501405370061a40544805388050500601912014e1014d5","0x14014390186e01512014610144e0186c015120149d0143c0182201512014e4","0x144480535cd81b86c088da1a5073100635c05448050d00539c063600544805","0x60c4060191201406040061c8054f070015120f4dc014da018dc19c4a194e3","0xc90146e018763243d44805344051b00634405448051c005088063500544805","0x51ec790f4d80187b01512014d4014e7018790151201476014390180644805","0x530405180061f4c10f512014c6014e801806448053100517806310c60f512","0x5448052f40538c062f405448051fc05184061fc05448051f4053840601912","0xba015120144a01417018820151201465014dc018bf01512014e301414018bc","0x100188b2e4ba208bf0500522c05448052f005330062e4054480519c050f006","0x519405370062d8054480538c050500621405448051c8050e8060191201406","0x11201485014cc018b001512014670143c018b4015120144a014170188801512","0x51b806019120143401460018064480501810018ae2c0b4220b6050052b805","0x544805238050e406238054480501865018a301512014060c4060191201414","0x5448052409f0f4c50189f01512014060d8062400544805238a30f4340188e","0x1160151201405014dc0180001512014e7014140189a015120149b0143a0189b","0x5464054480526805330064600544805274050f00645c05448051680505c06","0x112014c20144a01806448050d805178060191201406040064651845d1600014","0x50e40646c0544805018790191a01512014060c40601912014140146e01806","0x11d0f4c50191d01512014060d806470054480546d1a0f4340191b015120151b","0x5014dc0191f01512014250141401915015120151e0143a0191e015120151c","0x545405330064880544805274050f00648405448052ec0505c064800544805","0x3a0180644805050051b80601912014060400648d224852047c140152301512","0x505c06498054480501405370064940544805094050500649005448050c405","0x12649414015290151201524014cc01928015120149d0143c0192701512014bb","0x7b01806448053fc051280601912014b50145e018064480501810019294a127","0x1120152b014390192b015120140619c064a8054480501831018064480505c05","0x1120152c4b43d314064b40544805018360192c015120152b4a83d0d0064ac05","0x54480501405370064bc054480541c05050064b80544805450050e80645005","0x140015120152e014cc0193f015120149d0143c0193e015120140e014170193d","0x505c051ec0601912014100144a018064480501810019404fd3e4f52f05005","0x644c054480544c050e40644c0544805018650194101512014060c40601912","0x65100544805509430f4c50194301512014060d806508054480544d410f434","0x17019470151201405014dc019460151201502014140194501512015440143a","0x14605005528054480551405330065240544805274050f006520054480507405","0x9d01806448050183d01806448050180501817015120140635c065294952147","0x5448050400541c06019120140604006075020f54b039070f5120f43d0183d","0x54483d080051c80641c054480541c0505006080ff0f512014b201470018b2","0x5448050380505c060b0054480541c05050060191201406040062d40553014","0x50b42a0b09d344060500544805050170f4d40182d01512014ff015070182a","0x51d8060191201406040060c405534c0015120f428014c9018282ec2527512","0x20018064480501810018360154e0d0054483d0e405318060e4c20f512014c0","0x25018cc0f03d448050e8052d4060e80544805314052c806314054480530805","0xce01425018d23383d44805334052d4063340544805018bb01806448050f005","0x112014410142c0184301512014d2014280184101512014cc014280180644805","0x6448050d005180060191201406040060194f019120f4431043d0a80610405","0x45014390184501512014063080634c0544805018310180644805050051b806","0x461203d3140612005448050183601846015120144534c3d0d0061140544805","0x5014053700613c054480509405050061380544805354050e8063540544805","0x1120144e014cc01854015120149d0143c0182301512014bb014170185001512","0x5338061580544805018cd01806448050181001849150231404f0500512405","0x1120140604006168e70f550390e20f5120f4562ec25274d2018560151201456","0x450185e015120140634c063a405448051700510c0617005448050184101806","0x6184e10f51201460014480186001512014e83a43d118063a0054480517805","0x505c06368054480501405370061a40544805388050500601912014e1014d5","0x14014390186e01512014610144e0186c015120149d0143c0182201512014e4","0x144480535cd81b86c088da1a5073040635c05448050d00539c063600544805","0x60c4060191201406040061c80554470015120f4dc014da018dc19c4a194e3","0xc90146e018763243d44805344051b00634405448051c005088063500544805","0x51ec790f4d80187b01512014d4014e7018790151201476014390180644805","0x530405180061f4c10f512014c6014e801806448053100517806310c60f512","0x5448052f40538c062f405448051fc05184061fc05448051f4053840601912","0xba015120144a01417018820151201465014dc018bf01512014e301414018bc","0x100188b2e4ba208bf0500522c05448052f005330062e4054480519c050f006","0x519405370062d8054480538c050500621405448051c8050e8060191201406","0x11201485014cc018b001512014670143c018b4015120144a014170188801512","0x51b806019120143401460018064480501810018ae2c0b4220b6050052b805","0x544805238050e406238054480501865018a301512014060c4060191201414","0x5448052409f0f4c50189f01512014060d8062400544805238a30f4340188e","0x1160151201405014dc0180001512014e7014140189a015120149b0143a0189b","0x5464054480526805330064600544805274050f00645c05448051680505c06","0x112014c20144a01806448050d805178060191201406040064651845d1600014","0x50e40646c0544805018790191a01512014060c40601912014140146e01806","0x11d0f4c50191d01512014060d806470054480546d1a0f4340191b015120151b","0x5014dc0191f01512014250141401915015120151e0143a0191e015120151c","0x545405330064880544805274050f00648405448052ec0505c064800544805","0x3a0180644805050051b80601912014060400648d224852047c140152301512","0x505c06498054480501405370064940544805094050500649005448050c405","0x12649414015290151201524014cc01928015120149d0143c0192701512014bb","0x7b01806448053fc051280601912014b50145e018064480501810019294a127","0x1120152b014390192b015120140619c064a8054480501831018064480505c05","0x1120152c4b43d314064b40544805018360192c015120152b4a83d0d0064ac05","0x54480501405370064bc054480541c05050064b80544805450050e80645005","0x140015120152e014cc0193f015120149d0143c0193e015120140e014170193d","0x505c051ec0601912014100144a018064480501810019404fd3e4f52f05005","0x644c054480544c050e40644c0544805018650194101512014060c40601912","0x65100544805509430f4c50194301512014060d806508054480544d410f434","0x17019470151201405014dc019460151201502014140194501512015440143a","0x14605005528054480551405330065240544805274050f006520054480507405","0x641c170f552050100f5120f4050183d2740601912014060f4065294952147","0x102014b501902015120140e014b20180e015120149d01420018064480501810","0x11201420014b50182001512014062ec06019120141d01425018ff0743d44805","0x5448052d4050a00609405448053fc050a00601912014b201425018b52c83d","0x64483d2ec250f42a018100151201410014140182501512014250142c018bb","0x50e4060b00544805018c20182801512014060c40601912014060400601953","0x2d0f4c50182d01512014060d8060a805448050b0280f4340182c015120142c","0x1401417018c20151201410014140183101512014c00143a018c0015120142a","0x340e4c2040050d805448050c405330060d005448050f4050f0060e40544805","0x9d34806314054480531405338063140544805018cd01806448050181001836","0xce015120140610406019120140604006334cc0f5540f03a0f5120f4c505010","0x460184301512014410144501841015120140634c0634805448053380510c06","0x1701806448051140535406118450f512014d301448018d301512014433483d","0x9d1f40608c0544805118051380614005448050f4050f00613c05448050f005","0x54015120f44e014da0183a015120143a014140184e3544827512014231404f","0x6388054480515005088061580544805018310180644805018100184901555","0xe7018e901512014e7014390180644805390051b80639ce40f512014e20146c","0xe8018064480517005178061705a0f5120145e3a43d36006178054480515805","0x5184063840544805180053840601912014e801460018603a03d4480516805","0x480141701865015120143a01414018e30151201461014e30186101512014e1","0x671286504005370054480538c053300619c0544805354050f0061280544805","0x17018da015120143a014140186901512014490143a018064480501810018dc","0xda040051b805448051a405330061b00544805354050f006088054480512005","0x39018d70151201406194063600544805018310180644805018100186e1b022","0x3d314061c80544805018360187001512014d73603d0d00635c054480535c05","0x505c06324054480533005050063440544805350050e80635005448051c072","0x7632410014c401512014d1014cc018c6015120143d0143c0187601512014cd","0x6194061e405448050183101806448052740512806019120140604006310c6","0x501836018c1015120147b1e43d0d0061ec05448051ec050e4061ec0544805","0x505c05050062f405448051fc050e8061fc05448053047d0f4c50187d01512","0x112014bd014cc01882015120143d0143c018bf015120150701417018bc01512","0x156050100f5120f4050183d2740601912014060f4062e8822fcbc040052e805","0xe0f5120141d014700181d015120149d015070180644805018100190705c3d","0x11201406040060800555cff015120f502014720181001512014100141401902","0x250f512014b5014b5018b501512014b2014b2018b2015120140e0142001806","0x60a82c0f51201428014b50182801512014062ec06019120142501425018bb","0x50b00630005448050a8050a0060b405448052ec050a006019120142c01425","0xff0146e01806448050181001806560064483d3002d0f42a0182d015120142d","0xc201512014c201439018c20151201406308060c40544805018310180644805","0x3601512014390d03d314060d00544805018360183901512014c20c43d0d006","0x60f005448050500505c060e80544805040050500631405448050d8050e806","0x501810018cd3303c0e810014cd01512014c5014cc018cc015120143d0143c","0x1120f4ce05010274d2018ce01512014ce014ce018ce01512014063340601912","0x51140510c06114054480501841018064480501810018d310c3d564413483d","0x112014d51183d11806354054480512005114061200544805018d30184601512","0x544805138051380612405448050f4050f00615005448051040505c0613805","0x50500608c5013c9d4480538856124540407f018e201512014ff0143901856","0x52f00601912014060400639c05568e4015120f423014bd018d201512014d2","0x517005180063a45c0f5120145a014e80185a01512014060c40601912014e4","0x5448053a00538c063a00544805178051840617805448053a4053840601912","0xe301512014500143c01861015120144f01417018e101512014d20141401860","0x539c050e806019120140604006194e3184e10400519405448051800533006","0x112014500143c018dc015120144f014170186701512014d2014140184a01512","0x51b806019120140604006368693706704005368054480512805330061a405","0x5448051b0050e4061b00544805018650182201512014060c40601912014ff","0x5448051b8d80f4c5018d801512014060d8061b805448051b0220f4340186c","0xd401512014d301417018720151201443014140187001512014d70143a018d7","0x604006324d1350720400532405448051c0053300634405448050f4050f006","0x61d80544805018310180644805038051280601912014200145e0180644805","0x36018c401512014c61d83d0d0063180544805318050e406318054480501867","0x50500630405448051ec050e8061ec0544805310790f4c5018790151201406","0xc1014cc018bd015120143d0143c0187f0151201414014170187d0151201410","0x31018064480527405128060191201406040062f0bd1fc7d040052f00544805","0x822fc3d0d0062080544805208050e406208054480501865018bf0151201406","0x522c050e80622c05448052e8b90f4c5018b901512014060d8062e80544805","0x1120143d0143c01888015120150701417018b60151201417014140188501512","0x3d2740601912014060f4062c0b4220b6040052c0054480521405330062d005","0xe015120149d014200180644805018100190705c3d56c140403d4483d01406","0x6019120141d01425018ff0743d44805408052d4064080544805038052c806","0x50a00601912014b201425018b52c83d44805080052d4060800544805018bb","0x10014140182501512014250142c018bb01512014b5014280182501512014ff","0x112014060c4060191201406040060195c019120f4bb0943d0a8060400544805","0x5448050b0280f4340182c015120142c014390182c0151201406308060a005","0x3101512014c00143a018c0015120142a0b43d314060b40544805018360182a","0x60d005448050f4050f0060e405448050500505c0630805448050400505006","0x544805018cd018064480501810018360d03930810014360151201431014cc","0x6334cc0f55d0f03a0f5120f4c505010274d2018c501512014c5014ce018c5","0x1120140634c0634805448053380510c06338054480501841018064480501810","0x112014d301448018d301512014433483d1180610c0544805104051140610405","0x5448050f4050f00613c05448050f00505c060191201445014d5018461143d","0x3a014140184e3544827512014231404f274bf0182301512014460144e01850","0x501831018064480501810018490155e150054483d13805368060e80544805","0x5390051b80639ce40f512014e20146c018e20151201454014220185601512","0x1120145e3a43d3600617805448051580539c063a4054480539c050e40601912","0x112014e801460018603a03d44805168053a006019120145c0145e0185c1683d","0xe30151201461014e30186101512014e101461018e10151201460014e101806","0x619c0544805354050f00612805448051200505c0619405448050e80505006","0x112014490143a018064480501810018dc19c4a19410014dc01512014e3014cc","0x544805354050f00608805448051200505c0636805448050e805050061a405","0x5018310180644805018100186e1b022368100146e0151201469014cc0186c","0x112014d73603d0d00635c054480535c050e40635c054480501865018d801512","0x544805350050e80635005448051c0720f4c50187201512014060d8061c005","0xc6015120143d0143c0187601512014cd01417018c901512014cc01414018d1","0x52740512806019120140604006310c61d8c90400531005448053440533006","0x61ec05448051ec050e4061ec0544805018650187901512014060c40601912","0x61fc05448053047d0f4c50187d01512014060d80630405448051ec790f434","0x3c018bf015120150701417018bc015120141701414018bd015120147f0143a","0x112014060f4062e8822fcbc040052e805448052f4053300620805448050f405","0x9d015070180644805018100190705c3d57c140403d4483d014060f49d01806","0x1020147201810015120141001414019020383d44805074051c0060740544805","0xb2014b2018b2015120140e0142001806448050181001820015603fc054483d","0x112014062ec06019120142501425018bb0943d448052d4052d4062d40544805","0x5448052ec050a006019120142c014250182a0b03d448050a0052d4060a005","0x64483d3002d0f42a0182d015120142d0142c018c0015120142a014280182d","0x6308060c405448050183101806448053fc051b80601912014060400601961","0x5018360183901512014c20c43d0d0063080544805308050e4063080544805","0x5040050500631405448050d8050e8060d805448050e4340f4c50183401512","0x112014c5014cc018cc015120143d0143c0183c0151201414014170183a01512","0xce014ce018ce015120140633406019120140604006334cc0f03a0400533405","0x64480501810018d310c3d588413483d4483d338140409d348063380544805","0x5114061200544805018d30184601512014450144301845015120140610406","0x50f00615005448051040505c061380544805354460f446018d50151201448","0x5404082018e201512014ff0143901856015120144e0144e01849015120143d","0xe4015120f423014bd018d201512014d201414018231404f27512014e215849","0xe80185a01512014060c40601912014e4014bc018064480501810018e701563","0x51840617805448053a40538406019120145c01460018e91703d4480516805","0x4f01417018e101512014d2014140186001512014e8014e3018e8015120145e","0xe3184e1040051940544805180053300638c0544805140050f0061840544805","0x170186701512014d2014140184a01512014e70143a01806448050181001865","0x6704005368054480512805330061a40544805140050f006370054480513c05","0x650182201512014060c40601912014ff0146e018064480501810018da1a4dc","0x60d8061b805448051b0220f4340186c015120146c014390186c0151201406","0x43014140187001512014d70143a018d7015120146e3603d314063600544805","0x51c0053300634405448050f4050f006350054480534c0505c061c80544805","0x51280601912014200145e018064480501810018c9344d41c810014c901512","0x544805318050e4063180544805018670187601512014060c406019120140e","0x544805310790f4c50187901512014060d8063100544805318760f434018c6","0x7f0151201414014170187d015120141001414018c1015120147b0143a0187b","0x6040062f0bd1fc7d040052f0054480530405330062f405448050f4050f006","0x6208054480501865018bf01512014060c406019120149d0144a0180644805","0xc5018b901512014060d8062e80544805208bf0f43401882015120148201439","0x17018b601512014170141401885015120148b0143a0188b01512014ba2e43d","0xb6040052c0054480521405330062d005448050f4050f006220054480541c05","0x100180e41c3d590170503d4483d0f4060f49d01806448050183d018b02d088","0x14014140181d4083d448053fc051c0063fc05448050400541c060191201406","0x10201420018064480501810018b201565080054483d074051c8060500544805","0xbb01425018282ec3d44805094052d40609405448052d4052c8062d40544805","0x1120142a014250182d0a83d448050b0052d4060b00544805018bb0180644805","0xc001512014c00142c01831015120142d01428018c001512014280142801806","0x310180644805080051b80601912014060400601966019120f4313003d0a806","0x393083d0d0060e405448050e4050e4060e40544805018c2018c20151201406","0x5314050e80631405448050d0360f4c50183601512014060d8060d00544805","0x1120141701417018cc0151201405014dc0183c0151201414014140183a01512","0xd2338cd3303c0500534805448050e805330063380544805274050f00633405","0x14274d2018410151201441014ce01841015120140633406019120140604006","0x6120054480501841018064480501810018461143d59cd310c3d4483d10417","0x3d1180613c054480513805114061380544805018d3018d5015120144801443","0x5050060191201423014d50185408c3d448051400512006140054480513cd5","0x9d0143c018e901512014d3014170185c0151201405014dc0185a0151201443","0x5c168172e8061800544805080050e4063a0054480515005138061780544805","0x100186101568384054483d39c053680639ce4388561241444805180e8178e9","0x112014650146c0186501512014e101422018e301512014060c4060191201406","0x54480538c0539c06368054480519c050e406019120144a0146e018671283d","0x3d44805370053a00601912014690145e018693703d44805088da0f4d801822","0xd701512014d801461018d8015120146e014e101806448051b005180061b86c","0x6350054480515805370061c8054480512405050061c0054480535c0538c06","0x14014760151201470014cc018c901512014e40143c018d101512014e201417","0x1120144901414018c601512014610143a01806448050181001876324d135072","0x544805390050f0061ec05448053880505c061e40544805158053700631005","0x51b8060191201406040061f4c11ec79310140147d01512014c6014cc018c1","0x5448052f4050e4062f40544805018650187f01512014060c4060191201420","0x5448052f0bf0f4c5018bf01512014060d8062f005448052f47f0f434018bd","0x8b0151201405014dc018b9015120144501414018ba01512014820143a01882","0x522005448052e805330062d80544805274050f00621405448051180505c06","0x112015020144a01806448052c80517806019120140604006220b62148b2e414","0x34018b001512014b001439018b0015120140619c062d005448050183101806","0x3a0188e01512014ae28c3d3140628c054480501836018ae01512014b02d03d","0x505c0626c0544805014053700627c05448050500505006240054480523805","0x9b27c14015160151201490014cc01800015120149d0143c0189a0151201417","0x650191701512014060c40601912014100144a018064480501810019160009a","0x60d8064640544805461170f43401918015120151801439019180151201406","0x107014140191c015120151b0143a0191b01512015194683d314064680544805","0x5274050f00645405448050380505c06478054480501405370064740544805","0x601912014060f4064811f4551e4741401520015120151c014cc0191f01512","0x11201410015070180644805018100180e41c3d5a4170503d4483d0f4060f49d","0x1120f41d01472018140151201414014140181d4083d448053fc051c0063fc05","0x112014bb01470018bb015120150201507018064480501810018b20156a08005","0x52d40541c060191201406040060b0055ac28015120f42501472018252d43d","0x10018c20156c0c4054483d0b4051c8060b42a0f512014c001470018c001512","0x50d0052d4060d005448050e4052c8060e405448050a805080060191201406","0x3d448050e8052d4060e80544805018bb01806448050d80509406314360f512","0xce01512014cc01428018cd01512014c50142801806448050f005094063303c","0x60191201406040060196d019120f4ce3343d0a8063340544805334050b006","0x112014060c40601912014200146e01806448050a0051b80601912014310146e","0x544805104d20f434018410151201441014390184101512014063080634805","0x4601512014450143a01845015120144334c3d3140634c05448050183601843","0x6138054480505c0505c063540544805014053700612005448050500505006","0x6040061404f138d512014014500151201446014cc0184f015120149d0143c","0x3d08c170509d3480608c054480508c053380608c0544805018cd0180644805","0xe401443018e4015120140610406019120140604006388560f56e124540f512","0x5170e70f4460185c015120145a014450185a015120140634c0639c0544805","0x1120145401414018064480517805354063a05e0f512014e901448018e901512","0x544805274050f00637005448051240505c0619c0544805014053700612805","0x6c01512014280143901822015120142001439018da01512014e80144e01869","0x6138460051120146e1b02236869370671280e2e4061b805448050c4050e406","0x54480501831018064480501810018d70156f360054483d1940536806194e3","0x644805350051b806344d40f512014720146c0187201512014d80142201870","0xc90f512014c43183d3600631005448051c00539c063180544805344050e406","0x60191201479014600187b1e43d44805324053a00601912014760145e01876","0x140187f015120147d014e30187d01512014c101461018c1015120147b014e1","0x50f0062fc05448051840505c062f0054480538405370062f4054480518005","0x11201406040062e8822fcbc2f414014ba015120147f014cc0188201512014e3","0x8501512014e1014dc0188b015120146001414018b901512014d70143a01806","0x52d005448052e40533006220054480538c050f0062d805448051840505c06","0x112014280146e01806448050c4051b8060191201406040062d0882d88522c14","0x50e4062b8054480501865018b001512014060c40601912014200146e01806","0x8e0f4c50188e01512014060d80628c05448052b8b00f434018ae01512014ae","0x5014dc0189b0151201456014140189f01512014900143a0189001512014a3","0x527c05330064580544805274050f00600005448053880505c062680544805","0x4a0180644805308051780601912014060400645d160009a26c140151701512","0x544805018310180644805080051b80601912014280146e01806448050a805","0x11a01512015194603d0d0064640544805464050e40646405448050188b01918","0x64740544805470050e80647005448054691b0f4c50191b01512014060d806","0x3c0191f015120141701417019150151201405014dc0191e015120141401414","0x501810019214811f4551e0500548405448054740533006480054480527405","0x3101806448052d4051280601912014200146e01806448050b0051780601912","0x1234883d0d00648c054480548c050e40648c054480501879019220151201406","0x5498050e8064980544805491250f4c50192501512014060d8064900544805","0x1120141701417019290151201405014dc019280151201414014140192701512","0x12c4ad2a4a528050054b0054480549c05330064ac0544805274050f0064a805","0x112014060c40601912015020144a01806448052c80517806019120140604006","0x5448054512d0f4340191401512015140143901914015120140619c064b405","0x13e015120153d0143a0193d015120152e4bc3d314064bc0544805018360192e","0x6504054480505c0505c06500054480501405370064fc05448050500505006","0x60400650913505404fc1401542015120153e014cc01913015120149d0143c","0x65100544805018650194301512014060c40601912014100144a0180644805","0xc50194601512014060d8065140544805511430f43401944015120154401439","0xdc019490151201507014140194801512015470143a0194701512015455183d","0x5330065c40544805274050f0065c005448050380505c06528054480501405","0x1120f43d0143d2740601912014060f4065c9715c14a52414015720151201548","0xff01470018ff0151201410015070180644805018100180e41c3d5cc170503d","0x62c8055d020015120f41d01472018140151201414014140181d4083d44805","0x25014b50182501512014b5014b2018b5015120150201420018064480501810","0x1120142c014b50182c01512014062ec0601912014bb01425018282ec3d44805","0x5448050b4050a00630005448050a0050a006019120142a014250182d0a83d","0x64480501810018065d4064483d0c4c00f42a018c001512014c00142c01831","0x3901439018390151201406308063080544805018310180644805080051b806","0x340d83d314060d80544805018360183401512014393083d0d0060e40544805","0x505005050060f0054480501805214060e80544805314050e8063140544805","0x1120143a014cc018ce015120149d0143c018cd015120141701417018cc01512","0x5338061040544805018cd018064480501810018d2338cd3303c0500534805","0x1120140604006118450f57634c430f5120f44105c14274d2018410151201441","0x450184e015120140634c0635405448051200510c0612005448050184101806","0x6150230f512014500144801850015120144f3543d1180613c054480513805","0x521406170054480534c0505c06168054480510c05050060191201423014d5","0x2001439018e801512014540144e0185e015120149d0143c018e90151201406","0xe701488018e7390e21584905112014603a05e3a45c168172d8061800544805","0x5384052d00638c0544805018310180644805018100186101577384054483d","0x11201467014a30180644805128052b80619c4a0f51201465014b00186501512","0x51a405178061a4dc0f512014223683d23806088054480538c0539c0636805","0x5448051b80538406019120146c014600186e1b03d44805370053a00601912","0x7201512014e2014850187001512014d7014e3018d701512014d801461018d8","0x63240544805390050f00634405448051580505c0635005448051240505006","0x5184050e8060191201406040061d8c9344d41c814014760151201470014cc","0x112014560141701879015120144901414018c401512014e201485018c601512","0x7d3047b1e4c4050051f4054480531805330063040544805390050f0061ec05","0x11201406194061fc0544805018310180644805080051b806019120140604006","0x54480501836018bc01512014bd1fc3d0d0062f405448052f4050e4062f405","0x54480501805214062e80544805208050e80620805448052f0bf0f4c5018bf","0xb6015120149d0143c018850151201446014170188b015120144501414018b9","0xb20145e018064480501810018882d88522cb90500522005448052e80533006","0x62c0054480501867018b401512014060c40601912015020144a0180644805","0xc5018a301512014060d8062b805448052c0b40f434018b001512014b001439","0x140189f01512014060148501890015120148e0143a0188e01512014ae28c3d","0x5330060000544805274050f006268054480505c0505c0626c054480505005","0x6448050400512806019120140604006458002689b27c14015160151201490","0x3d0d0064600544805460050e4064600544805018650191701512014060c406","0x50e80646c05448054651a0f4c50191a01512014060d806464054480546117","0xe014170191e0151201507014140191d0151201406014850191c015120151b","0x1154791d050054800544805470053300647c0544805274050f0064540544805","0x604006039070f57805c140f5120f43d0143d2740601912014060f4064811f","0x50500505006075020f512014ff01470018ff0151201410015070180644805","0x540805080060191201406040062c8055e420015120f41d014720181401512","0x52ec05094060a0bb0f51201425014b50182501512014b5014b2018b501512","0x6448050a805094060b42a0f5120142c014b50182c01512014062ec0601912","0x63000544805300050b0060c405448050b4050a00630005448050a0050a006","0x60c40601912014200146e018064480501810018065e8064483d0c4c00f42a","0x50e4c20f43401839015120143901439018390151201406308063080544805","0x112014c50143a018c501512014340d83d314060d80544805018360183401512","0x54480505c0505c06330054480505005050060f0054480501805214060e805","0x6348ce334cc0f014014d2015120143a014cc018ce015120149d0143c018cd","0x170509d34806104054480510405338061040544805018cd018064480501810","0x4301848015120140610406019120140604006118450f57b34c430f5120f441","0xd50f4460184f015120144e014450184e015120140634c06354054480512005","0x601485018e701512014d301417018e401512014430141401850015120144f","0x5080050e4063a4054480514005138061700544805274050f0061680544805","0x3d388052f406388561245408c1444805178e91705a39ce405c900185e01512","0x5448050183101806448053a0052f006019120140604006180055f0e801512","0x6501512014e3014e10180644805184051800638c610f512014e1014e8018e1","0x63700544805124052140619c05448051280538c0612805448051940518406","0xcc0182201512014560143c018da01512014540141701869015120142301414","0x112014600143a0180644805018100186c088da1a4dc050051b0054480519c05","0x5448051500505c0635c054480508c0505006360054480512405214061b805","0x6350721c0d736014014d4015120146e014cc0187201512014560143c01870","0x54480501865018d101512014060c40601912014200146e018064480501810","0xc601512014060d8061d80544805324d10f434018c901512014c901439018c9","0x7b0151201406014850187901512014c40143a018c401512014763183d31406","0x61fc0544805274050f0061f405448051180505c0630405448051140505006","0x52c805178060191201406040062f47f1f4c11ec14014bd0151201479014cc","0x39018bf015120140619c062f00544805018310180644805408051280601912","0x3d314062e80544805018360188201512014bf2f03d0d0062fc05448052fc05","0x5050062140544805018052140622c05448052e4050e8062e40544805208ba","0x8b014cc018b4015120149d0143c01888015120141701417018b60151201414","0x601912014100144a018064480501810018b02d0882d885050052c00544805","0xae0f434018a301512014a301439018a30151201406194062b8054480501831","0x9f0143a0189f015120148e2403d314062400544805018360188e01512014a3","0x50380505c06000054480541c05050062680544805018052140626c0544805","0x117458002681401518015120149b014cc01917015120149d0143c0191601512","0x17d050100f5120f49d0149b0189d015120143d0142001806448050189f01918","0x60380544805040050000641c0544805050052680601912014060400605c05","0x54480501918018064480501810018065f8050191701902015120150701516","0x10201512014ff015160180e015120141701400018ff015120141d015190181d","0x17f2c8054483d408054680608005448050800541c0608005448050380538406","0x11d018bb01512014064700609405448052c80546c060191201406040062d405","0x541c060c405448050140505c06300054480501805050060a0054480509405","0xc00511e018340151201428014390183901512014bb0144f018c20151201420","0x501810018c5015800d8054483d0b405408060b42a0b09d448050d03930831","0x53300547c0633005448050f03a0f5150183c0e83d448050d8050740601912","0x112014cd01520018d2015120142a01417018ce015120142c01414018cd01512","0x2c014140184301512014c50152101806448050181001841348ce2740510405","0x46114d327405118054480510c054800611405448050a80505c0634c0544805","0x5120054880612005448050191801806448052d40517806019120140604006","0x5018050500613c05448051380547c061380544805354200f515018d501512","0x6150231409d01454015120144f01520018230151201405014170185001512","0x6014140181401512014170152301817015120149d0144e01806448050189f","0x505005490062c805448050f4050f00608005448050140505c063fc0544805","0x1020390704112014252d4b2080ff051250182501512014100144f018b501512","0x5448052ec05124060191201406040060a005604bb015120f41d014540181d","0xc00151201507014140182d015120142a015270182a015120142c015260182c","0x50e405448050b4054a0063080544805408050f0060c405448050380505c06","0x112015070141401834015120142801529018064480501810018393083130010","0x5448050d0054a0060e80544805408050f00631405448050380505c060d805","0x54ac060503d0f5120143d0152a01806448050189f0183c0e8c50d8100143c","0x10701428018064480505c050940641c170f51201410014b5018100151201414","0x1022743d0d0064080544805408050e4064080544805038054b0060380544805","0x50140505c06094054480501805050063fc05448050f4054b4060740544805","0x282ec250412e0182c015120141d014e70182801512014ff01514018bb01512","0x60191201406040060b4056082a015120f4b50145c018b52c820275120142c","0x3d4bc0630805448050191801806448050c405178060c4c00f5120142a014e9","0x505c060d8054480508005050060d005448050e4054f4060e40544805308c0","0x60191201406040060e8c50d89d0143a01512014340153e018c501512014b2","0x13e018cd01512014b201417018cc0151201420014140183c015120142d0153f","0x54480504005138060191201414014c0018ce334cc2740533805448050f005","0xb50151201405014dc018b20151201406014140181701512015070152301907","0x60a0054480505c05490062ec0544805274050f00609405448050f40505c06","0x560c2c015120f420014da018203fc1d4080e05112014282ec252d4b205140","0x113018c0015120142d015410182d015120142c014220180644805018100182a","0x505c060e405448054080537006308054480503805050060c4054480530005","0x3930814014c50151201431015420183601512014ff0143c01834015120141d","0x3c015120140e014140183a015120142a01543018064480501810018c50d834","0x633805448053fc050f00633405448050740505c0633005448054080537006","0x3d0d0060f405448050180547406348ce334cc0f014014d2015120143a01542","0x100154401814015120149d014e70181001512014064600627405448050f405","0x9d0f43d4483d0140526c060140544805018050800605c140f40505c0544805","0x17015120143d0140001814015120149d0149a0180644805018100181001584","0x1120140646006019120140604006019850140645c0641c05448050500545806","0x544805408054580605c054480504005000064080544805038054640603805","0xff015120f5070151a0181d015120141d015070181d0151201417014e101907","0xb501512014b20151d018b201512014ff0151b0180644805018100182001586","0x50a0054480509405518062ec05448050740541c0609405448052d40551406","0x1470182c01512014064600601912014200145e018064480501810018282ec3d","0x2d0f40530005448050a805518060b405448050740541c060a805448050b005","0x187050100f5120f49d0149b0189d015120143d0142001806448050189f018c0","0x60380544805040050000641c0544805050052680601912014060400605c05","0x5448050191801806448050181001806620050191701902015120150701516","0x10201512014ff015160180e015120141701400018ff015120141d015190181d","0x1892c8054483d408054680608005448050800541c0608005448050380538406","0x11d018bb01512014060c40609405448052c80546c060191201406040062d405","0x541c060c405448050140505c06300054480501805050060a0054480509405","0xc005148018340151201428014390183901512014bb014e7018c20151201420","0x501810018c50158a0d8054483d0b405324060b42a0b09d448050d03930831","0x5330055280633005448050f03a0f5490183c0e83d448050d8051d80601912","0x112014cd01570018d2015120142a01417018ce015120142c01414018cd01512","0x2c014140184301512014c50157101806448050181001841348ce2740510405","0x46114d327405118054480510c055c00611405448050a80505c0634c0544805","0x5120055c80612005448050191801806448052d40517806019120140604006","0x5018050500613c054480513805528061380544805354200f549018d501512","0x6150231409d01454015120144f01570018230151201405014170185001512","0xdc018b501512014060141401907015120140e015230180e01512014100144e","0x5490060a00544805274050f0062ec05448050f40505c06094054480501405","0xb541d8b0182d0151201417014e70182a0151201414014390182c0151201507","0x310158c300054483d2c805368062c8203fc1d40814448050b42a0b0282ec25","0x544c060e40544805308055040630805448053000508806019120140604006","0xff01417018c5015120141d014dc01836015120150201414018340151201439","0x3a314360500533005448050d005508060f00544805080050f0060e80544805","0x63380544805408050500633405448050c40550c060191201406040063303c","0x1420184301512014200143c0184101512014ff01417018d2015120141d014dc","0xe015230180e01512014100144e018d310c41348ce0500534c054480533405","0x50f40505c06094054480501405370062d40544805018050500641c0544805","0x11201414014390182c01512015070152401828015120149d0143c018bb01512","0x1d40814448050b42a0b0282ec252d50762c060b4054480505c0539c060a805","0x530005088060191201406040060c405634c0015120f4b2014da018b2080ff","0x1120150201414018340151201439015130183901512014c201541018c201512","0x544805080050f0060e805448053fc0505c06314054480507405370060d805","0x550c060191201406040063303c0e8c50d814014cc0151201434015420183c","0xff01417018d2015120141d014dc018ce015120150201414018cd0151201431","0x41348ce0500534c0544805334055080610c0544805080050f0061040544805","0x5448050180505c0627405448050400548c0604005448050f4051380634c43","0x1120141d4080e2758e0181d015120149d015240190201512014050143c0180e","0xff01422018064480501810018200158f3fc054483d41c053680641c170509d","0x50500505c0609405448052d40544c062d405448052c805504062c80544805","0x60b0282ec9d0142c0151201425015420182801512014170143c018bb01512","0x170143c0182d0151201414014170182a015120142001543018064480501810","0x6040054480501841018313002d274050c405448050a805508063000544805","0x1240181d01512014050143c0190201512014060141701814015120141001443","0x1727512014203fc1d40810640060800544805274050e4063fc054480505005","0x112014b201593018064480501810018b5015922c8054483d038056440603907","0x11201428015960182801512014bb0f43d65406019120142501594018bb0943d","0x5448050b00565c060b4054480541c050f0060a8054480505c0505c060b005","0x112014b50159801806448050f405354060191201406040063002d0a89d014c0","0x5448050c40565c060e4054480541c050f006308054480505c0505c060c405","0x505c0627405448050400548c0604005448050f405138060d0393089d01434","0xe275990181d015120149d015240190201512014050143c0180e0151201406","0x64480501810018200159a3fc054483d41c053680641c170509d4480507502","0x609405448052d40544c062d405448052c805504062c805448053fc0508806","0x9d0142c0151201425015420182801512014170143c018bb015120141401417","0x2d0151201414014170182a0151201420015430180644805018100182c0a0bb","0x501841018313002d274050c405448050a80550806300054480505c050f006","0x112014050143c01902015120140601417018140151201410014430181001512","0x203fc1d4081066c060800544805274050e4063fc0544805050054900607405","0x193018064480501810018b50159c2c8054483d03805644060390705c9d44805","0x1960182801512014bb0f43d65406019120142501594018bb0943d448052c805","0x565c060b4054480541c050f0060a8054480505c0505c060b005448050a005","0x19801806448050f405354060191201406040063002d0a89d014c0015120142c","0x565c060e4054480541c050f006308054480505c0505c060c405448052d405","0x10701512014100144e0180644805050051b8060d0393089d014340151201431","0x62d4054480501405370062c80544805018050500605c054480541c0548c06","0x14001828015120141701524018bb015120149d0143c01825015120143d01417","0x2a0159d0b0054483d0800536806080ff0750203814448050a0bb094b52c814","0x544c0630005448050b405504060b405448050b00508806019120140604006","0x1d01417018390151201502014dc018c2015120140e014140183101512014c0","0x340e4c20500531405448050c405508060d805448053fc050f0060d00544805","0x60f0054480503805050060e805448050a80550c0601912014060400631436","0x142018ce01512014ff0143c018cd015120141d01417018cc0151201502014dc","0x505c051b80601912014140146e018d2338cd3303c0500534805448050e805","0xe0151201502015230190201512014100144e018064480541c051b80601912","0x60a005448050f40505c062ec0544805014053700609405448050180505006","0x1120142a0b0282ec25051400182a015120140e015240182c015120149d0143c","0x22018064480501810018c00159e0b4054483d2d405368062d4b2080ff07414","0x5050060e405448053080544c0630805448050c405504060c405448050b405","0xb20143c018c50151201420014170183601512014ff014dc01834015120141d","0x644805018100183c0e8c50d834050050f005448050e405508060e80544805","0x633805448053fc05370063340544805074050500633005448053000550c06","0x140144301512014cc015420184101512014b20143c018d2015120142001417","0x6014140181701512015070159f0190701512014100144e01843104d2338cd","0x5274050f00609405448050f405214062d405448050140505c062c80544805","0x252d4b205da10182c015120141401439018280151201417015a0018bb01512","0x6040060b4056882a015120f42001488018203fc1d4080e051120142c0a0bb","0x11201431015a40183101512014c0015a3018c0015120142a014b40180644805","0x54480507405214060d005448054080505c060e40544805038050500630805","0x60e8c50d8340e4140143a01512014c2015a5018c501512014ff0143c01836","0x10201417018cc015120140e014140183c015120142d015a6018064480501810","0x50f0056940634805448053fc050f006338054480507405214063340544805","0x54483d0f4056a0060f405448050180569c06104d2338cd330140144101512","0x60500544805019aa01806448052740517806019120140604006040056a49d","0x112014100145e018064480501810018066ac050191701817015120141401439","0x1020383d4480505c051b00605c054480541c050e40641c0544805019ac01806","0xd8018b20151201405014e70182001512015020151d0180644805038051b806","0x539c062d405448050191801806448053fc05178063fc1d0f512014b20803d","0x170f51201410015ad018bb0943d014bb01512014b50154401825015120141d","0x25015120143d01485018b5015120140501417018b201512014060141401907","0x60b00544805050050e4060a0054480505c05490062ec0544805274050f006","0x1af0a8054483d0800564406080ff0750203814448050b0282ec252d4b205dae","0x601912014310145e018313003d448050a80564c060191201406040060b405","0x60d00544805308390f5950183901512015073003d11806308054480501918","0x850183a015120150201417018c5015120140e0141401836015120143401596","0xc50500533405448050d80565c0633005448053fc050f0060f0054480507405","0xce015120142d01598018064480541c056c006019120140604006334cc0f03a","0x610c0544805074052140610405448054080505c0634805448050380505006","0x627c06114d310c41348140144501512014ce01597018d301512014ff0143c","0x3d050050189d34806050054480505005338060500544805018cd0180644805","0x140181d0403d44805040056c8060191201406040064080e0f5b141c170f512","0x51b8060191201406040063fc056d0064483d074056cc0605c054480505c05","0xb20151f018b201512014200f43d454060800544805274056d4060191201410","0x52d405480062ec054480541c0505c06094054480505c05050062d40544805","0x170141401806448053fc056d8060191201406040060a0bb0949d0142801512","0x313009d6dc0630805448050f40541c060c4054480541c0505c063000544805","0x60191201406040060d0056e439015120f42d015b80182d0a82c27512014c2","0x644805018100183c015bc0e8054483d314056ec06314360f51201439015ba","0xce01512014cd0403d6f8063340544805019ac018cc015120143a2743d6f406","0x611805448050d80541c0611405448050a80505c0634c05448050b00505006","0x112014d512046114d30511e018d501512014ce014390184801512014cc0144f","0x4e0141d0180644805018100184f015bf138054483d10c054080610c413489d","0x50500612405448051500547c06150054480508c500f515018231403d44805","0xe21589d014e4015120144901520018e20151201441014170185601512014d2","0x170185a01512014d201414018e7015120144f01521018064480501810018e4","0x64480501810018e91705a274053a4054480539c0548006170054480510405","0x3d4540617805448050f00548806019120149d014c00180644805040051b806","0x505c0638405448050b0050500618005448053a00547c063a0054480517836","0x601912014060400638c613849d014e301512014600152001861015120142a","0x2c01414018650151201434015210180644805274053000601912014100146e","0xdc19c4a274053700544805194054800619c05448050a80505c061280544805","0x50f40512806019120149d014c00180644805040051b806019120140604006","0x63680544805368050e4063680544805018650186901512014060c40601912","0x61b805448050886c0f4c50186c01512014060d8060880544805368690f434","0x12001870015120150201417018d7015120140e01414018d8015120146e01521","0x50f4056c0060f4050f51201406015ad018721c0d7274051c8054480536005","0x1120149d0159401806448050189f0189d014052740544805014054900601912","0x9d448054080e0f5c001902015120143d0143c0180e01512014050141701806","0x50740570c060191201406040063fc057081d015120f507015c10190705c14","0x52d4051b806094b50f512014b20146c018b20151201420015c40182001512","0x6448050a0051b8060b0280f512014bb0146c018bb01512014066a80601912","0xc0015120142d0a83d6f8060b405448050b005474060a805448050940547406","0x60191201406040060c405714064483d300056cc063000544805300050e406","0x393089d44805314360f533018c501512014170143c01836015120141401417","0x5448050e805720060191201406040060f00571c3a015120f434015c601834","0x1cb01846114d310c41348ce41d12014cd015ca018cd01512014cc015c9018cc","0x112014d30146e018064480510c05128060191201441015cc018064480534805","0x6354480f512014ce0146c0180644805118051b80601912014450146e01806","0x547406019120144f0146e0185013c3d44805138051b0061380544805019ac","0x500151d0180644805150051b806124540f512014230146c0182301512014d5","0x5124054740601912014e20146e018e43883d44805158051b0061580544805","0x5168e70f5be018e701512014e7014390185a01512014e40151d018e701512","0x480151201448014390185c015120145c014390180644805019cd0185c01512","0x1170180644805120051b8060191201406040063a405738064483d170056cc06","0x5e0f512014480146c01806448053a4056d806019120140604006019cf01406","0x6184e10f512014600146c01860015120140674006019120145e0146e018e8","0x3d6f8061940544805184054740638c05448053a0054740601912014e10146e","0x619c05744064483d128056cc061280544805128050e4061280544805194e3","0x112014c2014170186c01512014060141401806448050189f018064480501810","0xd73606e1b0107480635c05448050400513c0636005448050e4050f0061b805","0x60191201406040061c80574c70015120f4220145401822368693701044805","0x14018c901512014d101527018d101512014d401526018d4015120147001449","0x54a0063100544805368050f00631805448051a40505c061d8054480537005","0x7b01512014720152901806448050181001879310c61d8100147901512014c9","0x61fc0544805368050f0061f405448051a40505c0630405448053700505006","0x6448050189f018064480501810018bd1fc7d30410014bd015120147b01528","0x5019d4018bc01512014060c4060191201410014c0018064480519c056d806","0x112014060d80620805448052fcbc0f434018bf01512014bf01439018bf01512","0x11201406014140188b01512014b901529018b901512014822e83d314062e805","0x54480522c054a00622005448050e4050f0062d805448053080505c0621405","0x50f0054a4060191201410014c0018064480501810018b4220b621410014b4","0x112014390143c018a301512014c201417018ae015120140601414018b001512","0x56d8060191201406040062408e28cae0400524005448052c0054a00623805","0x9b01512014067540627c054480501831018064480504005300060191201431","0x60000544805018360189a015120149b27c3d0d00626c054480526c050e406","0x64600544805018050500645c0544805458054a4064580544805268000f4c5","0x100151b0151201517015280191a01512014170143c01919015120141401417","0x11c01512014ff015290180644805040053000601912014060400646d1a46518","0x6454054480505c050f00647805448050500505c0647405448050180505006","0x11201406014060500544805019d60191f4551e474100151f015120151c01528","0x9d3480605c054480505c053380605c0544805018cd01806448050189f01806","0x5448050f40576006019120140604006075020f5d7039070f5120f41701406","0x1da2c8200f5120f4ff015d9019070151201507014140180644805019cd018ff","0x60400544805080053900609405448052c80576c060191201406040062d405","0x54480501918018064480501810018067740501917018bb0151201425015dc","0xbb015120142c015dc0181001512014b5014e40182c0151201428015de01828","0x11201406040060b4057842a015120f4bb015e00181001512014100503d77c06","0x1701834015120150701414018c0015120142a015e201806448050189f01806","0x1078c060e805448052740539c0631405448053000541c060d8054480503805","0x501810018cc015e40f0054483d0e405170060e4c20c49d448050e8c50d834","0x112014d20145e018d23383d448050f0053a4063340544805040054b40601912","0x4801512014cd015140184601512014c2014170184501512014310141401806","0xd30145c018d310c4127512014d512046114104b80635405448053380539c06","0x51780608c500f5120144e014e90180644805018100184f015e5138054483d","0x51400539c06124054480510c0505c06150054480510405050060191201423","0x14018e2015120144f0153f0180644805018100180679805019170185601512","0xe4274051680544805388054f80639c054480510c0505c06390054480510405","0x140185c01512014cc0153f01806448050400579c06019120140604006168e7","0xe9274053a00544805170054f80617805448053080505c063a405448050c405","0x10015e701806448050b40517806019120140627c060191201406040063a05e","0x1120149d014e701849015120140e01417018540151201507014140180644805","0x544805384054f4063840544805180560f52f0186001512014064600615805","0x4a01512014610153e01865015120144901417018e301512014540141401861","0x64480527405180060191201414015e80180644805018100184a194e327405","0xdc01439018dc01512014061940619c05448050183101806448050f4057a406","0x693683d314063680544805018360186901512014dc19c3d0d0063700544805","0x50740505c061b8054480540805050061b00544805088054fc060880544805","0x603805448050f40505c0635cd81b89d014d7015120146c0153e018d801512","0x54483d41c057180641c170509d448054080e0f53301902015120149d0143c","0x5448050800572406080054480507405720060191201406040063fc057a81d","0x572c0601912014b50146e0182d0a82c0a0bb094b541d12014b2015ca018b2","0x6448050b4051b806019120142a0146e01806448052ec05730060191201425","0x60e805448050500505c06314054480501405370060d805448050180505006","0x107018cd015120142c01439018cc0151201410015240183c01512014170143c","0x60d039308313001444805338cd3303c0e8c50d9077ac0633805448050a005","0x610c0544805348052d006019120140604006104057b0d2015120f43401488","0x31018064480534c0517806019120140604006114057b4d3015120f443015a8","0x481183d0d0061200544805120050e4061200544805019ee018460151201406","0x513c0550c0613c05448053544e0f4c50184e01512014060d8063540544805","0x112014c201417018540151201431014dc0182301512014c0014140185001512","0xe21584915023050053880544805140055080615805448050e4050f00612405","0x539005504063900544805019ef01806448051140517806019120140604006","0x11201431014dc0185c01512014c0014140185a01512014e701513018e701512","0x54480516805508063a005448050e4050f00617805448053080505c063a405","0x50500638405448051040550c06019120140604006180e8178e91701401460","0x390143c0186501512014c201417018e30151201431014dc0186101512014c0","0x64480501810018671286538c610500519c054480538405508061280544805","0xdc01869015120140601414018dc01512014ff0154301806448050400565006","0x5508061b0054480505c050f00608805448050500505c06368054480501405","0x14015120140633406019120140627c061b86c088da1a4140146e01512014dc","0x10019020383d7c10705c3d4483d050050189d3480605005448050500533806","0x1d015b3018170151201417014140181d0403d44805040056c8060191201406","0x1120149d015f20180644805040051b8060191201406040063fc057c4064483d","0x1120141701414018b501512014b20154a018b201512014200f43d5240608005","0x10018282ec25274050a005448052d4055c0062ec054480541c0505c0609405","0x1120142d014700182d015120143d0150701806448053fc056d8060191201406","0xc02743d0d0060191201406040060c4057ccc0015120f42a014720182a0b03d","0x505c05050060d005448050e4100f5be0183901512014066b0063080544805","0x112014c2014e7018cd015120142c01507018cc0151201507014170183c01512","0x60e8c50d89d44805348ce334cc0f0145200634805448050d0050e40633805","0x4534c3d44805104051d80601912014060400610c057d041015120f43a014c9","0xd50151201436014140184801512014460154a01846015120144534c3d52406","0x5018100184f138d52740513c0544805120055c00613805448053140505c06","0x5448053140505c0608c05448050d80505006140054480510c055c40601912","0x5040051b8060191201406040061245408c9d0144901512014500157001854","0x5448051582c0f549018560151201431015720180644805274051800601912","0x5a015120150701417018e7015120141701414018e401512014e20154a018e2","0x112014100146e0180644805018100185c168e7274051700544805390055c006","0x6194063a405448050183101806448050f40512806019120149d0146001806","0x501836018e8015120145e3a43d0d0061780544805178050e4061780544805","0x503805050061840544805384055c40638405448053a0600f4c50186001512","0x61286538c9d0144a01512014610157001865015120150201417018e301512","0x1401902015120140e014e1018064480541c0518006039070f51201417014e8","0x50f0060a005448050f40505c062ec05448050140537006094054480501805","0x102015070182d0151201414014390182a0151201410015240182c015120149d","0x5220062d4b2080ff07414448053002d0a82c0a0bb095077ac063000544805","0x56a0060e405448050c4052d006019120140604006308057d431015120f4b5","0x5019aa01806448050d005178060191201406040060d8057d834015120f439","0x5e018064480501810018067dc05019170183a01512014c501439018c501512","0x50e805504060e805448050f0050e4060f00544805019ef01806448050d805","0x112014ff014dc018ce015120141d01414018cd01512014cc01513018cc01512","0x544805334055080610c05448052c8050f00610405448050800505c0634805","0x50500611405448053080550c0601912014060400634c43104d233814014d3","0xb20143c018d50151201420014170184801512014ff014dc01846015120141d","0x1120143d015f80184f138d5120460500513c054480511405508061380544805","0x544805274057e4060380544805014050f00641c05448050180505c0627405","0x63fc057ec1d015120f417014da0181705010275120150203907275fa01902","0xb201513018b201512014200154101820015120141d01422018064480501810","0x52d405508062ec0544805050050f00609405448050400505c062d40544805","0x505c060b005448053fc0550c060191201406040060a0bb0949d0142801512","0x2d0a89d014c0015120142c015420182d01512014140143c0182a0151201410","0x544805014050f00640805448050180505c06050100f5120143d015fc018c0","0xe015fe0180e41c1727512014ff07502275fd018ff0151201414015240181d","0x5040057e006019120142001600018064480501810018b2015ff080054483d","0x541c050f0060b4054480505c0505c062ec250f512014b501601018b501512","0xda0182a0b02827512014313002d275fa0183101512014bb015f9018c001512","0x2030183401512014c2014220180644805018100183901602308054483d0a805","0x50f00633405448050a00505c0631405448050940510c060d805448050d005","0xcd0420501841015120143601604018d201512014c501524018ce015120142c","0x112014060400634c0581843015120f4cc01591018cc0f03a2751201441348ce","0x4f015120143a0141701806448051180517806118450f512014430159301806","0x61500544805274050e40608c0544805114054900614005448050f0050f006","0x100185601607124054483d1380564406138d51209d44805150231404f04135","0x112014064600601912014e40145e018e43883d448051240564c060191201406","0x11201448014170185c015120145a016090185a01512014e73883d8200639c05","0x10018e8178e9274053a0054480517005828061780544805354050f0063a405","0x5354050f00638405448051200505c0618005448051580582c060191201406","0x51b80601912014060400638c613849d014e301512014600160a0186101512","0x50f0050f00612805448050e80505c06194054480534c0582c06019120149d","0x51b806019120140604006370671289d014dc01512014650160a0186701512","0x11201428014170186901512014390160b01806448050940583006019120149d","0x100186c088da274051b005448051a4058280608805448050b0050f00636805","0x5448052c80582c060191201410015940180644805274051b8060191201406","0x70015120146e0160a018d701512015070143c018d80151201417014170186e","0x50143c019070151201406014170189d015120143d015f80187035cd827405","0x605c140409d448054080e41c9d7e8064080544805274057e4060380544805","0x6080054480507405088060191201406040063fc058341d015120f417014da","0x3c01825015120141001417018b501512014b201513018b2015120142001541","0x64480501810018282ec25274050a005448052d405508062ec054480505005","0x60b40544805050050f0060a805448050400505c060b005448053fc0550c06","0x5014050f00641c05448050180505c063002d0a89d014c0015120142c01542","0x10203907041900181d015120149d0143901902015120143d015240180e01512","0x601912014060400608005838ff015120f417015910181705010275120141d","0x3d8200609405448050191801806448052d405178062d4b20f512014ff01593","0x50f0060b005448050400505c060a005448052ec05824062ec0544805094b2","0x60191201406040060b42a0b09d0142d01512014280160a0182a0151201414","0x20a018c201512014140143c01831015120141001417018c001512014200160b","0x501405650060f4050f51201406015ad0183930831274050e4054480530005","0x5050056c80605c054480501a0f0189d0140527405448050f4056800601912","0x107015b3019070151201507014390190701512014170383d6f806038140f512","0x11201410015b00180644805050051b80601912014060400640805840064483d","0x608005448053fc0568c063fc0544805074058440607405448050191801806","0x8501825015120140501417018b5015120140601414018b20151201420015a4","0xb5050050b005448052c805694060a00544805274050f0062ec05448050f405","0x2a0151201410015340180644805408056d8060191201406040060b0282ec25","0x631405448050f405214060d805448050140505c060d005448050180505006","0x213018cc0151201414014390183c015120142a016120183a015120149d0143c","0x5850cd015120f4390148801839308313002d05112014cc0f03a314360d017","0x1a40184101512014d2015a3018d201512014cd014b4018064480501810018ce","0x52140611405448053000505c0634c05448050b4050500610c054480510405","0x4534c14014d50151201443015a50184801512014c20143c018460151201431","0x4f015120142d014140184e01512014ce015a6018064480501810018d512046","0x61500544805308050f00608c05448050c4052140614005448053000505c06","0x170144501817015120140634c061245408c5013c1401449015120144e015a5","0x1120140501417018b50151201406014140180e01512014068540641c0544805","0x54480541c05680060a00544805274050f0062ec05448050f4052140609405","0x203fc1d40814448050a82c0a0bb094b505e160182a015120140e014390182c","0x6448050b40586406019120140604006300058602d015120f4b201617018b2","0x6314054480504005490060d80544805080050f0060d005448050740505c06","0x3d0e405644060e4c20c49d448050e8c50d834041350183a015120141401439","0xce0145e018ce3343d448050f00564c06019120140604006330058683c01512","0x11201441016090184101512014d23343d820063480544805019180180644805","0x5448053fc052140611405448050c40505c0634c0544805408050500610c05","0x6354481184534c14014d501512014430160a0184801512014c20143c01846","0x31014170184f0151201502014140184e01512014cc0160b018064480501810","0x513805828061500544805308050f00608c05448053fc05214061400544805","0x1940180644805050051b8060191201406040061245408c5013c140144901512","0x1d01417018e20151201502014140185601512014c00160b018064480504005","0x515805828061680544805080050f00639c05448053fc05214063900544805","0x605c054480501a1b01810015120140635c061705a39ce4388140145c01512","0x1120143d015070181d01512014060141401806448050189f018064480501805","0x60800587814015120f5020161d019020390727512014ff0743d870063fc05","0x3d87c062d4b20f512014250147001825015120140e01507018064480501810","0x14018064480501810018bb01620274054483d2d4051c806050054480505017","0x3d350060c405448052c80541c0630005448050140505c060b4054480541c05","0x54483d0a805324060a82c0a09d448050c4c00b49d34406274054480527410","0x1120f436014c6018360d03d44805308051d8060191201406040060e405884c2","0x3c016240183c01512014c527414276230180644805018100183a0162231405","0x2801414018ce01512014cd01626018cd01512014cc0d03d894063300544805","0x43104d22740510c0544805338054c80610405448050b00505c063480544805","0x50e80589c06019120149d0146e01806448050500572c06019120140604006","0x50a0050500611805448051140589806114054480534c340f625018d301512","0x6138d51209d0144e015120144601532018d5015120142c014170184801512","0x112014390162801806448050500572c06019120149d0146e018064480501810","0x54480513c054c80608c05448050b00505c0614005448050a0050500613c05","0x112014100147b01806448050500572c06019120140604006150231409d01454","0x54480515805898061580544805124b20f6250184901512014bb0162701806","0x5a01512014e201532018e7015120140501417018e4015120150701414018e2","0x64480505c058a40601912014100147b0180644805018100185a39ce427405","0x5e01512014e901626018e9015120145c0383d8940617005448050800589c06","0x53840544805178054c80618005448050140505c063a0054480541c0505006","0x170503d8a80605c0544805014050f00605005448050180505c06384603a09d","0x22d0180644805018100180e0162c41c054483d040058ac060409d0f49d44805","0xb52c8203fc1444805074058bc060740544805408058b806408054480541c05","0x51b80601912014b5015cb0180644805080058c40601912014ff0163001825","0x50f40505c060a005448052ec058cc062ec05448052c8058c8060191201425","0x60b42a0b09d0142d0151201428016340182a015120149d0143c0182c01512","0x9d0143c01831015120143d01417018c0015120140e01635018064480501810","0x140151201406014170183930831274050e40544805300058d0063080544805","0x1120f4100162b018102743d27512014170503d8a80605c0544805014050f006","0x112015020162e0190201512015070162d0180644805018100180e0163641c05","0xb2015cb01806448053fc058c006094b52c8203fc1444805074058bc0607405","0xbb0151201420016370180644805094051b80601912014b5015cb0180644805","0x60a80544805274050f0060b005448050f40505c060a005448052ec054c406","0x544805038058e4060191201406040060b42a0b09d0142d015120142801638","0x3901512014c001638018c2015120149d0143c01831015120143d01417018c0","0x5448050180505006040054480501a3a01806448050189f018393083127405","0x20015120149d0144f018ff015120143d0143c0181d01512014050141701902","0x23d0180e41c1705010448052c8203fc1d408148f0062c80544805040058ec06","0x2c0a0bb27512014b50163f018064480501810018250163e2d4054483d03805","0x549c060a805448050a00549806019120142c0145e01806448052ec0530006","0x1070143c01831015120141701417018c00151201414014140182d015120142a","0x60191201406040060e4c20c4c0040050e405448050b4054a0063080544805","0x3c018c50151201417014170183601512014140141401834015120142501529","0x1120140627c060f03a31436040050f005448050d0054a0060e8054480541c05","0x5448050500508006050054480504005900060403d0f5120143d0153001806","0x64480503805094064080e0f51201507014b5019070151201417014b201817","0x63fc05448053fc050e4063fc0544805074054b0060740544805408050a006","0x60a0054480501805050062c805448050f4059000608005448053fc9d0f434","0x2410182d0151201420014e70182a01512014b2015070182c015120140501417","0x6040060c405908c0015120f4bb0145c018bb094b5275120142d0a82c0a010","0x340153d0183401512014393083d4bc060e4c20f512014c0014e90180644805","0x50d8054f8060e805448050940505c0631405448052d405050060d80544805","0x50500633005448050c4054fc060191201406040060f03a3149d0143c01512","0xce3349d014d201512014cc0153e018ce015120142501417018cd01512014b5","0x544805038052c806038054480541c050800641c170f5120141701530018d2","0x6080054480501a43018064480507405094063fc1d0f51201502014b501902","0x280182501512014ff0142801806448052c805094062d4b20f51201420014b5","0x601a44019120f4bb0943d0a8060940544805094050b0062ec05448052d405","0x11201410015940180644805050051b80601912014170144a018064480501810","0x60a8054480501805050060b005448050a005914060a005448050191801806","0xa301831015120149d0143c018c0015120143d014170182d0151201405014dc","0x544805040057e00601912014060400601a460140645c0630805448050b005","0xcc0151201439015f90183c015120149d0143c0183a015120143d0141701839","0x10018ce01647334054483d3140536806314360d09d448053303c0e89d7e806","0x51040508006104170f5120141701530018d201512014062ec060191201406","0x112014d20142c01848015120144301400018460151201406014140184301512","0x613c059284e015120f445016490184534c3d44805354481189d9200635405","0x501a4c0182301512014500151b01850015120144e0164b018064480501810","0x1120144901400018e401512014d301414018490151201417014200185401512","0x2301439018e21583d44805168e73909d920061680544805150050b00639c05","0x5c0164b018064480501810018e90164d170054483d388059240608c0544805","0x508c0547406180054480533405088063a005448051780546c061780544805","0x11201405014dc018670151201456014140186101512014e80151d018e101512","0x544805384050e4063680544805180050e4061a40544805050050e40637005","0x61286538c9d448051b022368693706705e4e0186c01512014610143901822","0x3c018c00151201434014170182d0151201465014dc0182a01512014e301414","0x5690061b805448053080568c0630805448051280528c060c405448050d805","0xc00141701870015120142d014dc018d7015120142a01414018d8015120146e","0x721c0d7050053440544805360056940635005448050c4050f0061c80544805","0x51b80601912014230146e01806448053340593c06019120140604006344d4","0x501405370061d80544805158050500632405448053a405698060191201414","0x112014c9015a50187901512014360143c018c4015120143401417018c601512","0x51b80601912014cd0164f0180644805018100187b1e4c431876050051ec05","0x112014d301414018c1015120144f015a6018064480505c05128060191201414","0x5448050d8050f0062f405448050d00505c061fc054480501405370061f405","0x5128060191201406040062fcbc2f47f1f414014bf01512014c1015a5018bc","0x11201406014140188201512014ce015a60180644805050051b8060191201417","0x5448050d8050f00622c05448050d00505c062e4054480501405370062e805","0x25001806448050f405830062d88522cb92e814014b60151201482015a501885","0x5050050b0060500544805018bb01810015120149d016510189d0151201406","0x2540390705c9d4483d040140140604253018100151201410016520181401512","0x54480505c0505c06080054480503805954060191201406040063fc1d4089d","0x100180695c050191701825015120142001656018b501512015070143c018b2","0x5074050f0062c805448054080505c062ec05448053fc05960060191201406","0x1120142c0165a0182c0151201425016590182501512014bb01656018b501512","0x1120142a014220180644805018100182d0165b0a8054483d0a005368060a005","0x5448052c80505c0630805448050c40544c060c40544805300055040630005","0x6040060d8340e49d0143601512014c2015420183401512014b50143c01839","0x112014b50143c0183a01512014b201417018c5015120142d015430180644805","0x505c06019120143d01594018cc0f03a27405330054480531405508060f005","0x6050102749d4480541c170f5c00190701512014050143c018170151201406","0x62c805448052740505c06019120140604006408059700e015120f414015c1","0x54483d0800570406080ff0749d448052d4b20f65d018b501512014100143c","0x3d448050a00597c060a005448050940570c060191201406040062ec0597825","0xc0015120142d015c40182d015120142a0166001806448050b00572c060a82c","0x601912014c2015cb018393083d448050c40597c060c405448050380570c06","0x60e8c50f512014c00146c018360151201434015c401834015120143901660","0x547406019120143c0146e018cc0f03d448050d8051b00601912014c50146e","0x50e4063480544805338cd0f5be018ce01512014cc0151d018cd015120143a","0x5019180180644805018100184101661019120f4d2015b3018d201512014d2","0x1120141d014170184501512014d301663018d30151201443016620184301512","0x10018d512046274053540544805114059900612005448053fc050f00611805","0x4f0151201406994061380544805018310180644805104056d8060191201406","0x608c05448050183601850015120144f1383d0d00613c054480513c050e406","0x615805448050740505c06124054480515005998061500544805140230f4c5","0x1120140604006390e21589d014e4015120144901664018e201512014ff0143c","0x616805448050740505c0639c05448052ec0599806019120140e0166701806","0x11201406040063a45c1689d014e901512014e7016640185c01512014ff0143c","0x6001512014100143c018e8015120149d014170185e01512015020166601806","0x140166801814015120149d01604018e1180e82740538405448051780599006","0x544805018d301907015120141701443018170151201406104060400544805","0x544805040059a4060740544805409070f44601902015120140e014450180e","0x28015120141d0144e018bb01512014050143c01825015120140601417018ff","0xb5014bd018b52c820275120142c0a0bb094109ac060b005448053fc059a806","0x1120140646006019120142a014bc0180644805018100182d0166c0a8054483d","0x1120142001417018c20151201431016090183101512014c00f43d8200630005","0x10018360d039274050d8054480530805828060d005448052c8050f0060e405","0x1120142001417018c5015120142d0160b01806448050f405650060191201406","0x1f8018cc0f03a27405330054480531405828060f005448052c8050f0060e805","0x57e4064080544805014050f00603805448050180505c0604005448050f405","0x109b4063fc05448053fc050e4063fc9d0f5120149d015b20181d0151201410","0x501810018b20166f080054483d41c059b80641c170509d448053fc1d4080e","0x544805274059c40601912014250145e018252d43d44805080059c00601912","0x3101512014170143c018c00151201414014170182801512014b501443018bb","0x1120143930831300109cc060e405448052ec059c80630805448050a00549006","0x340159301806448050181001836016740d0054483d0b405644060b42a0b09d","0x50f0c50f6080183c015120140646006019120143a0145e0183a3143d44805","0x1120142a0143c018ce015120142c01417018cd01512014cc01609018cc01512","0x360160b01806448050181001841348ce274051040544805334058280634805","0x510c058280611405448050a8050f00634c05448050b00505c0610c0544805","0xb20160b0180644805274051b8060191201406040061184534c9d0144601512","0x51200582806138054480505c050f00635405448050500505c061200544805","0x607405448050f405214064080544805018050500613c4e3549d0144f01512","0x9d44805080ff075020427501820015120141401439018ff015120141001612","0x544805274050f0060a005448050140505c062c80544805018bb0180e41c17","0x50b42a0b028042770182d015120140e016760182a01512014b20142c0182c","0xc001488018c00151201431016790183101512014bb01678018bb094b527512","0x34015a30183401512014c2014b4018064480501810018390167a308054483d","0x52d40505c060e8054480505c050500631405448050d805690060d80544805","0x112014c5015a5018cd01512014250143c018cc0151201507014850183c01512","0x14018d20151201439015a6018064480501810018ce334cc0f03a0500533805","0x50f00634c054480541c052140610c05448052d40505c06104054480505c05","0x11201406460061184534c43104140144601512014d2015a5018450151201425","0x54480501805050060380544805040054d00641c054480505c058440605c05","0x28015120149d0143c018bb015120143d0148501825015120140501417018b5","0x60b4054480541c0528c060a80544805050050e4060b005448050380584806","0xc0015120f4b20167c018b2080ff07502051120142d0a82c0a0bb094b541e7b","0x6448050e405178060e4c20f512014c00167e018064480501810018310167d","0x631405448050d0360f67f0183601512014c20144501834015120140646006","0x85018cc015120141d014170183c0151201502014140183a01512014c501680","0x3c0500534805448050e805a04063380544805080050f00633405448053fc05","0x544805408050500610405448050c405a0806019120140604006348ce334cc","0x4601512014200143c0184501512014ff01485018d3015120141d0141701843","0x7001810015120140501507018481184534c4305005120054480510405a0406","0x601912014060400605c05a0c14015120f49d014720189d0f43d4480504005","0x54480503805a180601912014060400640805a140e41c3d4483d050060f684","0xb2015120141d0168701820015120143d01507018ff0151201507014140181d","0x5448052d405a20062d4054480501918018064480501810018b2080ff27405","0x2c01512014250168701828015120143d01507018bb01512015020141401825","0x11201406014140182a0151201417016880180644805018100182c0a0bb27405","0x289018313002d274050c405448050a805a1c0630005448050f40541c060b405","0x504005a2c0601912014060400641c170509da28102743d275120f4050183d","0x1120140e0168c0181d015120149d0143c01902015120143d014170180e01512","0x505c06080054480541c05a380601912014060400601a8d0140645c063fc05","0xff0168f018ff01512014200168c0181d01512014170143c019020151201414","0x10018bb01691094054483d2c8058ac062c805448052d405a40062d40544805","0x50b0054e8060b005448050a005a48060a00544805094058b4060191201406","0x1120142a01693018c0015120141d0143c0182d0151201502014170182a01512","0x10201417018c201512014bb01694018064480501810018313002d274050c405","0x360d039274050d8054480530805a4c060d00544805074050f0060e40544805","0x6274d2018140151201414014ce01814015120140633406019120140627c06","0x140180644805019cd018064480501810019020383da550705c3d4483d05005","0x601912014060400608005a5cff0743d4483d27405a580605c054480505c05","0x29901825015120141d0144f018b501512014b201624018b201512014ff01698","0x2801512014064600601912014060400601a9a0140645c062ec05448052d405","0x62ec05448050b005a640609405448050800513c060b005448050a00589c06","0x60e4054480541c0505c060191201406040060b405a6c2a015120f4bb015bb","0xc027512014360d0392769d01836015120142a0169c01834015120143d0143c","0x6448050189f0180644805018100183a0169f314054483d30805a780630831","0x43015120141701414018cc015120143c0403da84060f0054480531405a8006","0x611805448050940513c0611405448050c4050f00634c05448053000505c06","0x58f406104d2338cd04112014481184534c430523c0184801512014cc0163b","0x608c5013c9d44805354058fc0601912014060400613805a88d5015120f441","0x5601512014cd01414018490151201454016a40185401512014231404f276a3","0x539c054480512405a94063900544805348050f00638805448053380505c06","0x112014cd014140185a015120144e016a6018064480501810018e7390e215810","0x54480516805a94061780544805348050f0063a405448053380505c0617005","0x11201425014c001806448050189f018064480501810018e8178e917010014e8","0x6384054480505c050500618005448050e805a98060191201410014e201806","0x10014650151201460016a5018e301512014310143c0186101512014c001417","0x11801806448050b40517806019120140627c06019120140604006194e3184e1","0x14018dc0151201467016a401867015120144a04025276a30184a0151201406","0x5a940608805448050f4050f006368054480541c0505c061a4054480505c05","0x6019120149d014c00180644805018100186c088da1a4100146c01512014dc","0x5360050e4063600544805018650186e01512014060c4060191201410014e2","0x535c700f4c50187001512014060d80635c05448053606e0f434018d801512","0x1120150201417018d1015120140e01414018d40151201472016a60187201512","0x631876324d104005318054480535005a94061d805448050f4050f00632405","0x50189d34806040054480504005338060400544805018cd01806448050189f","0x640805448050f40508006019120140604006039070f6a705c140f5120f410","0x20016a83fc1d0f5120f5020149b018140151201414014140180644805019cd","0x5458062d4054480507405000062c805448053fc0526806019120140604006","0x62ec05448050191801806448050181001806aa405019170182501512014b2","0x11a01825015120142801516018b50151201420014000182801512014bb01519","0x2c0151b01806448050189f0180644805018100182a016aa0b0054483d09405","0x393083d360060e405448052740539c0630805448050b4050e4060b40544805","0x505005050060d005448052d4053840601912014310145e018313003d44805","0x112014c0014e7018cd015120143401507018cc0151201417014170183c01512","0x5aacd2015120f43a0145c0183a3143627512014ce334cc0f0109040633805","0x14018064480534c051780634c430f512014d2014e901806448050181001841","0x645c06120054480510c0539c0611805448053140505c0611405448050d805","0x4e015120143601414018d501512014410153f01806448050181001806ab005","0x5018100185013c4e274051400544805354054f80613c05448053140505c06","0x50500601912014b5016ad01806448050a80517806019120140627c0601912","0x50191801848015120149d014e701846015120141701417018450151201414","0x511405050061240544805150054f406150054480508c480f52f0182301512","0x6390e21589d014e401512014490153e018e20151201446014170185601512","0x5448050183101806448050f40512806019120149d01460018064480501810","0x5c015120145a39c3d0d0061680544805168050e406168054480501865018e7","0x63a00544805178054fc061780544805170e90f4c5018e901512014060d806","0x9d0146101512014e80153e018e1015120140e0141701860015120150701414","0x2b001806448050181001814016af0409d0f5120f43d01406276ae0186138460","0x5ac8060380544805274050500641c054480505c05ac40605c054480504005","0x6acc06074054480501831018064480501810019020383d015020151201507","0x5018360182001512014ff0743d0d0063fc05448053fc050e4063fc0544805","0x5050050500609405448052d405ad0062d40544805080b20f4c5018b201512","0x605c140f51201414015b2018282ec3d014280151201425016b2018bb01512","0x51b80601912014140146e01806448050181001907016b5019120f417015b3","0xe015120140646006019120149d0146e0180644805040051b806019120143d","0x63fc054480501405370060740544805018050500640805448050380591406","0x64480541c056d806019120140604006080ff0749d014200151201502014a3","0xb501512014b20943d6f806094140f51201414015b2018b20151201406ad806","0x60191201406040062ec05adc064483d2d4056cc062d405448052d4050e406","0x5274051b80601912014100146e01806448050f4051b80601912014140146e","0x2a0151201406014140182c0151201428016450182801512014064600601912","0x501810018c00b42a2740530005448050b00528c060b405448050140537006","0x390403d44805040056c8060c4054480501ab601806448052ec056d80601912","0x2b8019120f4c2015b3018c201512014c201439018c201512014310e43d6f806","0x51b806019120143d0146e0180644805050051b8060191201406040060d005","0x5448050d805914060d80544805019180180644805274051b8060191201410","0xcc01512014c5014a30183c0151201405014dc0183a015120140601414018c5","0x1120f49d0183dae4060191201434015b6018064480501810018cc0f03a27405","0x533805af006338054480533805aec0601912014060400634805ae8ce3343d","0x46016bd114d30f5120f4433343dae40610c100f51201410015b20184101512","0x6af806120054480511405af006114054480511405aec06019120140604006","0x1120144e01439018d501512014d5014390184e0151201406afc063540544805","0x50181001806b044f015120f44e3543db000634c054480534c050500613805","0x5448050140537006140054480513c05af00613c054480513c05aec0601912","0x112014e215849276c3018e2015120141401439018560151201448016c201849","0x11201441016c6018064480501810018e4016c5019120f454016c40185408c3d","0x6460060191201450016c601806448050f4051b80601912014100146e01806","0x508c0537006170054480534c0505006168054480539c059140639c0544805","0x5b1c06019120140604006178e91709d0145e015120145a014a3018e901512","0x50016c2018e30151201423014dc0180644805180051b806180e80f512014e4","0xdc018613843d448051286538c9db0c0612805448050f4050e4061940544805","0x9db0c060880544805040050e406368054480510405b08061a4054480538405","0x6e015120146e016c20186e1843d4480518405b2006370670f5120142236869","0x5448053606e0f6c9018d801512014d8016c2018d83703d4480537005b2006","0x1001806b2c0501917018064480501810018d7016ca019120f46c016c40186c","0x53a0056c80601912014720146e018721c03d4480535c05b1c060191201406","0xd4015b3018d401512014d401439018d401512014d11c03d6f806344e80f512","0x112014dc016c601806448053a0051b80601912014060400632405b30064483d","0x14018c6015120147601611018760151201406460060191201461016c601806","0xc4274051ec05448053180528c061e4054480519c0537006310054480534c05","0x2c20187d0151201461016c20180644805324056d8060191201406040061ec79","0xbd016ce019120f4c1016c4018c1015120147f1f43db34061fc054480537005","0x6448050181001806b3c050191701806448053a0051b806019120140604006","0x8201512014e82f03d6f80601912014bf0146e018bf2f03d448052f405b1c06","0x60191201406040062e805b40064483d208056cc062080544805208050e406","0x537006214054480534c050500622c05448052e405844062e4054480501918","0x6019120140604006220b62149d01488015120148b014a3018b60151201467","0xd301414018b001512014b401645018b401512014064600601912014ba015b6","0x8e28cae2740523805448052c00528c0628c054480519c05370062b80544805","0x50f4051b80601912014100146e018064480510405b1806019120140604006","0x245018900151201406460060191201448016c60180644805050051b80601912","0x528c062680544805014053700626c054480534c050500627c054480524005","0x2c60180644805050051b8060191201406040060009a26c9d01400015120149f","0x5448050191801806448050f4051b80601912014100146e018064480510405","0x1190151201405014dc019180151201446014140191701512015160164501916","0x112014140146e0180644805018100191a4651827405468054480545c0528c06","0x59140646c0544805019180180644805040051b806019120143d0146e01806","0x11c014a30191e0151201405014dc0191d01512014d2014140191c015120151b","0x11201406040060f405b4805015120f406016d1019154791d274054540544805","0x1401512014100154201810015120149d015130189d01512014050154101806","0x107015120143d05c3d3140605c0544805018360180644805018100181401405","0x1120140601417019020140540805448050380550806038054480541c0550c06","0x100162b018102743d27512014170503d8a80605c0544805014050f00605005","0x1020162e0190201512015070162d0180644805018100180e016d341c054483d","0x23101806448053fc058c006094b52c8203fc1444805074058bc060740544805","0x112014b5016320180644805094051b80601912014b2015cb018064480508005","0x544805274050f0060b005448050f40505c060a005448052ec058cc062ec05","0x5038058d4060191201406040060b42a0b09d0142d0151201428016340182a","0x112014c001634018c2015120149d0143c01831015120143d01417018c001512","0x50143d0151201405016d5018050151201406016d40183930831274050e405","0x605c054480501831018100151201414016d601814015120149d0166a0183d","0x59a806019120140e016d7019020383d44805040054f00641c054480501831","0xb2276d8018250151201507014e7018b50151201417014e7018b20151201502","0x60a0bb0f5120141d014e801806448050800517806080ff0749d44805094b5","0x600182d0a83d448053fc053a0060b005448050a0053840601912014bb01460","0xc0015070182c015120142c01507018c0015120142d014e101806448050a805","0x501810018360d039276da308310f5120f4c00b00501810b64063000544805","0x3c0151201431014170183a01512014c5016db018c501512014064600601912","0x60400601add0140645c0633405448050e805b70063300544805308050f006","0x112014340143c0183c015120143901417018ce0151201436016de0180644805","0x544805104054ec06104054480533405b7c06334054480533805b700633005","0x54480510c05b840601912014060400634c05b8043015120f4d2015fe018d2","0x5448050f00505c061200544805118056580611805448051143d0f59501845","0x60400613c4e3549d0144f0151201448015970184e01512014cc0143c018d5","0x5448050f00505c06140054480534c0566006019120143d014d50180644805","0x6940061245408c9d014490151201450015970185401512014cc0143c01823","0x1120143d016010181701512014062ec06050054480504005944060400544805","0x544805050059480605c054480505c050b006019120140e0160c0180e41c3d","0x64480501810018b2080ff276e3075020f5120f49d0501701406052e201814","0x3c018bb0151201502014170182501512014b5016db018b5015120140646006","0x112014060400601ae40140645c060b0054480509405b70060a0054480507405","0x2801512014200143c018bb01512014ff014170182a01512014b2016de01806","0x60b40544805300054ec0630005448050b005b7c060b005448050a805b7006","0x60e405448050c405b840601912014060400630805b9431015120f42d015fe","0x631405448052ec0505c060d805448050d005b9c060d005448050e5070f6e6","0x11201406040060f03a3149d0143c0151201436016e80183a01512014280143c","0x633405448052ec0505c06330054480530805ba40601912015070160c01806","0x5274059c806348ce3349d014d201512014cc016e8018ce01512014280143c","0x54480505c0510c0605c054480501841018100151201414016ea0181401512","0x1d015120150241c3d11806408054480503805114060380544805018d301907","0x62ec0544805014050f00609405448050180505c063fc0544805040059a406","0x9d448050b0282ec250426b0182c01512014ff0166a01828015120141d0144e","0x50a8052f0060191201406040060b405bac2a015120f4b5014bd018b52c820","0x5448050c405824060c405448053003d0f608018c001512014064600601912","0x3601512014c20160a0183401512014b20143c01839015120142001417018c2","0x5448050b40582c06019120143d01594018064480501810018360d03927405","0xcc01512014c50160a0183c01512014b20143c0183a015120142001417018c5","0x11201410016ee018100151201406bb406019120143d016ec018cc0f03a27405","0x5274170149dbc00605c054480505c050e40605c054480505005bbc0605005","0x5074050e406074054480540805bbc06408054480503805bb806039070f512","0x10701485018b201512014ff01414018203fc3d44805074060f6f10181d01512","0x10015120149d01651018252d4b2274050940544805080059d8062d40544805","0x6019120140604006075020389dbc90705c14275120f4100f4050181094c06","0x51b0062c80544805019aa01806448053fc051b806080ff0f512015070146c","0xbb0146c018bb01512014200151d01806448052d4051b806094b50f512014b2","0x50a8051b0060a80544805094054740601912014280146e0182c0a03d44805","0x112014c00151d01831015120142c0151d01806448050b4051b8063002d0f512","0x11201439014390183901512014c20c43d6f8060c405448050c4050e40630805","0x64483d0e4056cc0605c054480505c050f00605005448050500505c060e405","0x631405448050d805844060d805448050191801806448050181001834016f3","0x11201434015b601806448050181001806bd005019170183a01512014c5014a3","0x60e805448053300528c0633005448050f005914060f005448050191801806","0x3c018d2015120141401417018ce01512014cd016f6018cd015120143a016f5","0x6448050181001843104d22740510c0544805338054e406104054480505c05","0x61180544805408050f00611405448050380505c0634c054480507405bdc06","0x100183d016f9014054483d01805be006120461149d0144801512014d301539","0x504005694060400544805274056900627405448050140568c060191201406","0x50f4170f4c50181701512014060d806019120140604006050050141401512","0x5be8064080501502015120140e015a50180e0151201507015a60190701512","0x5848062c805448050f4052140608005448050180505006039070f51201410","0x1d4089d44805094b52c8200427501825015120141401439018b5015120140e","0x644805018100182c016fb0a0054483d05c056a0062ec0544805018bb018ff","0x645c060b405448050a8050e4060a80544805019aa01806448050a00517806","0x39018c001512014066b006019120142c0145e01806448050181001806bf005","0x14b88062ec05448052ec050b0060c405448053fc05944060b4054480530005","0x501918018064480501810018c50d834276fd0e4c20f5120f42d0c4bb27405","0x112014390143c018cc01512014c2014170183c015120143a016db0183a01512","0x5b780601912014060400601afe0140645c0633805448050f005b700633405","0xd2016dc018cd01512014360143c018cc015120143401417018d201512014c5","0x3d104057f806104054480510c054ec0610c054480533805b7c063380544805","0x4641c3dc0006118054480534c05b840601912014060400611405bfcd301512","0x53300505c0613805448054080505006354054480512005c04061200544805","0x112014d5017020182301512014cd0143c01850015120141d014850184f01512","0x5c0c060191201507016ec0180644805018100185408c5013c4e0500515005","0x1d01485018e201512014cc0141701856015120150201414018490151201445","0xe43885605005168054480512405c080639c0544805334050f0063900544805","0x11201405016920180644805018100183d01705014054483d01805c1006168e7","0x5018100181401405050054480504005a4c060400544805274054e80627405","0x54480541c05a500641c05448050f4170f4c50181701512014060d80601912","0x53a006050102749d448050f405c18064080501502015120140e016930180e","0xe015070180e0151201507014e1018064480505c051800641c170f51201414","0x10018b52c820277083fc1d4089d4483d038102740501814c1c060380544805","0x5074050f0062ec05448054080505c0609405448053fc05c24060191201406","0x30c01806448050181001806c2c05019170182c01512014250170a0182801512","0x5c28060a005448052c8050f0062ec05448050800505c060a805448052d405","0x2d0169e0182d01512014c00170e018c0015120142c0170d0182c015120142a","0x3901461018390151201431016a0018064480501810018c20170f0c4054483d","0x50a0050f00631405448052ec0505c060d805448050d00538c060d00544805","0x50e8060191201406040060f03a3149d0143c0151201436014cc0183a01512","0xcc014cc018ce01512014280143c018cd01512014bb01417018cc01512014c2","0x64483d27405b1006274050f51201405016c8018d2338cd274053480544805","0x605005448050180537006019120143d0146e0180644805018100181001710","0x11201405016c601806448050181001806c440501917018170151201405016c2","0x540805c4c064080e0f512014100f507018104e00641c054480501b1201806","0x50181001806c541d015120f502017140180e015120140e014dc0190201512","0x601b160140645c0608005448053fc05b08063fc054480507405af00601912","0x5038053700608005448052c805b08062c8054480501b17018064480501810","0x1120141701719018b5015120141401718018170151201420016c20181401512","0x9d0171a019120f43d016c40183d0183d4480501805b2006094b50f40509405","0x604005014100151201405016c2018064480501805b1806019120140604006","0x9d0171c018064480501810018140171b019120f405016c4018064480501810","0x501805b180601912014060400605c05014170151201406016c20180644805","0x54480503805c4c060380544805275070f71d019070151201406c480601912","0x54483d40805c5006408054480540805c4c0640805448050500e0f71d0180e","0x2001512014ff016c2018ff015120141d016bc01806448050181001806c781d","0x112014b2016c2018b20151201406c5c0601912014060400601b1f0140645c06","0x5b10060f4050f51201405016c8018b5014052d4054480508005c640608005","0x501805b08060191201405016c60180644805018100189d01720019120f43d","0x1120140501721018064480527405c7006019120140604006040050141001512","0x1120140e41c3db2406038054480505005b080641c054480501805b080605005","0x6014050140501512014060166a0190201405408054480505c05c640605c05","0x6038054480527405b540601912014060400604005c889d015120f40601537","0x14275120141d4080e277230181d015120143d014e7019020151201405014e7","0x200151201417014e7018ff0151201414014e7018064480541c051780641c17","0x50140539c062ec054480504005c940601912014060400601b240140645c06","0x5e018252d4b2275120142c0a0bb277260182c015120143d014e70182801512","0x5019180182001512014b5014e7018ff01512014b2014e7018064480509405","0x1120142a01544018c00151201420017270182d01512014ff017270182a01512","0x60191201406040060f405ca405015120f40601728018313002d274050c405","0x50141401512014100166401810015120149d016630189d015120140501662","0x26601907015120143d05c3d3140605c05448050183601806448050181001814","0x501512014060172a019020140540805448050380599006038054480541c05","0x54480501805c2806014054480501b2b0183d014050f4054480501405b5406","0x54483d0f405a78060f405448050409d0f72c018100151201405014390189d","0x54480541c051840641c054480505005a800601912014060400605c05cb414","0x1120140604006074050141d0151201502014cc01902015120140e014e30180e","0x3d01805cb806080050142001512014ff014cc018ff01512014170143a01806","0x1120141401439018140151201406cc00601912014060400604005cbc9d01512","0x11201417014e70181d015120149d016720181701512014140143d0d00605005","0x5178064080e41c9d44805080ff0749dcc40608005448050f40539c063fc05","0x3320140645c062d405448050380539c062c8054480541c0539c060191201502","0x3d0d0060940544805094050e406094054480501b3301806448050181001806","0x539c0630005448052ec0539c060b4054480504005810062ec054480509405","0x6019120142a0145e0182a0b02827512014313002d2773401831015120143d","0x5c9c06308054480501918018b5015120142c014e7018b20151201428014e7","0x340e49d0143601512014c2015440183401512014b5017270183901512014b2","0x3d01805cd806018060173501806448050f4051800601912014050146001836","0x1120143d014610180644805014051b80601912014060400627405cdc3d01512","0x501810018170140505c0544805050053300605005448050400538c0604005","0xe015120140541c3d0d00641c0544805018310180644805274051800601912","0x63fc0544805074050e8060740544805039020f4c50190201512014060d806","0x544805274050e406274054480501805ce006080050142001512014ff014cc","0x112014140145e018140403d4480541c170f4d801907015120143d014e701817","0x607405448050400539c0640805448050140539c0603805448050191801806","0x5274050e4062740544805018054d8063fc1d4089d014ff015120140e01544","0x140145e018140403d4480541c170f4d801907015120143d014e70181701512","0x5448050400539c0640805448050140539c060380544805019180180644805","0xae0189b2681005c0626c9a040823fc1d4089d014ff015120140e015440181d","0x9a051900409d0f405018ae0189b2e49a050170189b2e49a050062743d01406","0xb92681405c0626cb926814954102743d014062b80626cb92681405c0626cb9","0x10ce89d0f405018ae0189b2681005c0626c9a043390409d0f405018ae0189b","0x62b80626c9a040170189b26810cec9d0f405018ae0189b2681005c0626c9a","0x170189b2e49a0533d2743d014062b80626c9a040170189b26810cf09d0f405","0x62b80626cb92681405c0626cb926814cf8102743d014062b80626cb926814","0xc4053400409d0f405018ae0189b268c4050170189b268c40533f0409d0f405","0x627c9b2689d05c9b2689dd04102743d014062b80626c9a3101405c0626c9a","0x101849b26810d0c102743d014062d00626c9a040451e40626c9a053420f405","0x3d014062e80626cb926814114790189b2e49a05f442743d014062d89b2689d","0x9d05c9b2689dd1c062f0170f4170174601406074100f4100383dd14140409d","0x9d0f405018ba0189b2e49a05010038790189b2e49a41f480f405018bd26c9a","0x17050102743d014062e80626cb9268140400e1e40626cb926907d241705010","0x3d014063040626c9d038790189b0434b0f405018ba0189b274790189b2774a","0x5018c10189b2740e1e40626c10d343d014062e80626c9d1e40626c9dd309d","0x9a03b4f050102743d014062e80626cb926814038790189b2e49a05f4e2743d","0x9b26817d410705c140409d0f405018ba0189b2e49a0500e0380e1e40626cb9","0x50181d0403d040310f751050102743d01406318063109b2681403879018c4","0x1726c9a05353050102743d01406304063109b2681403879018c426c9a05f52","0x10114700189b26814d54061c0051e405d50102743d0140627c9b2689d03845","0x14d5c9d0f405018b626c9a274103449b26810d58102743d014062d00626c9a","0x9a2740e0401726c9a053580409d0f405018ba0189b2e49a050700189b2e49a","0x3d014062e80626cb9268140400e1c00626cb926907d64102743d014062f49b","0x626c9d038700189b0435b0f405018ba0189b274700189b2775a05c140409d","0x9b2740e1c00626c10d743d014062e80626c9d1c00626c9dd709d0f405018d4","0x63109b268140385a018c426c9a05f5f0185a014790175e2743d0140635006","0x9d0f405018d4018c426c9a0500e1c0063109b26817d80140409d0f405018c6","0x363014063680626c9d0189b0f7620f405018d826c9a2741726c9a2776105010","0x3652743d014062d00626c9a040450189b26810d9005018dc0189b2740626c3d","0xb92681405c0e1c00626cb926907d989d0f405018b626c9a2741005c9b26810","0x9b277680f405018ba0189b274340189b2776705c140409d0f405018c60189b","0x10da89d0f405018d40189b2743a1c00626c10da43d014063a00626c9d1c006","0x63109b2681403828018c426c9a05f6b2743d014063500626c9d038700189b","0x9d0f405018e9018c426c9a0500e168063109b26817db0140409d0f405018c6","0x9a0536f014063880626c9d0189b0f76e01406390172689d05c9a0f76d05010","0x62d89b2689d0401726c9a043700409d0f405018d50189b26810118450189b","0xb92689d0380e0380e2e49a05f720f405018d32683d28c142689ddc49d0f405","0x5dd405018da0189b2740626c3ddd0062e80533405dcc140409d0f40501831","0x9d038340189b043772743d014063040626c9d330790189b043760183c0143a","0xc426810de49d0f405018d40189b274391c00626c10de09d0f405018c50189b","0x37b2743d014063080626c9d348a30189b0437a2743d01406348c42689d03828","0x102743d01406300063109b268140c40e0a0063109b26907df0063180530805","0xe080b92777f0f405018ae0189b274220189b2777e018e2014bb0177d05c14","0xcc017820140608005080200f7810140608005080200f7800f405018202e43d","0x50e405e14063a0053fc05e103d01406074100409d040103309de0c0633005","0x100403d277880f4050181d04010274100403c27787018ae01507017860183c","0x6074100409d040100e49de2805018ae0140e41c3de243d01406074100409d","0x38c0f4050181d04010274100403a2778b0f405"],"sierra_program_debug_info":{"type_names":[[0,"System"],[1,"Uninitialized"],[2,"openzeppelin::introspection::src5::SRC5Component::Event"],[3,"EcState"],[4,"Array"],[5,"Snapshot>"],[6,"core::array::Span::"],[7,"core::result::Result::, core::array::Array::>"],[8,"felt252"],[9,"core::pedersen::HashState"],[10,"Unit"],[11,"core::result::Result::<(), core::array::Array::>"],[12,"EcPoint"],[13,"NonZero"],[14,"Box"],[15,"Box"],[16,"core::result::Result::, core::array::Array::>"],[17,"openzeppelin::introspection::src5::SRC5Component::SRC5_supported_interfaces::ComponentMemberState"],[18,"Tuple"],[19,"core::panics::Panic"],[20,"Tuple>"],[21,"core::panics::PanicResult::<(openzeppelin::introspection::src5::SRC5Component::SRC5_supported_interfaces::ComponentMemberState, ())>"],[22,"core::bool"],[23,"core::result::Result::>"],[24,"openzeppelin::account::account::AccountComponent::OwnerAdded"],[25,"openzeppelin::account::account::AccountComponent::Account_public_key::ComponentMemberState"],[26,"Tuple"],[27,"core::panics::PanicResult::<(openzeppelin::account::account::AccountComponent::Account_public_key::ComponentMemberState, ())>"],[28,"openzeppelin::account::account::AccountComponent::OwnerRemoved"],[29,"openzeppelin::account::account::AccountComponent::Event"],[30,"openzeppelin::presets::account::Account::Event"],[31,"core::result::Result::>"],[32,"StorageAddress"],[33,"StorageBaseAddress"],[34,"Box"],[35,"Tuple>"],[36,"core::panics::PanicResult::<(core::box::Box::<@core::felt252>,)>"],[37,"Array"],[38,"Array>"],[39,"Tuple, Array>, Unit>"],[40,"core::panics::PanicResult::<(core::array::Array::, core::array::Array::>, ())>"],[41,"Box"],[42,"Box"],[43,"ContractAddress"],[44,"core::starknet::info::ExecutionInfo"],[45,"u64"],[46,"core::starknet::info::BlockInfo"],[47,"Tuple>"],[48,"core::panics::PanicResult::<(core::box::Box::,)>"],[49,"core::option::Option::"],[50,"Uninitialized"],[51,"openzeppelin::introspection::src5::SRC5Component::ComponentState::"],[52,"Tuple, Unit>"],[53,"core::panics::PanicResult::<(openzeppelin::introspection::src5::SRC5Component::ComponentState::, ())>"],[54,"Tuple"],[55,"core::panics::PanicResult::<((),)>"],[56,"Box>"],[57,"core::option::Option::>>"],[58,"Snapshot>>"],[59,"Uninitialized>>>"],[60,"u128"],[61,"core::starknet::info::TxInfo"],[62,"Tuple>"],[63,"core::panics::PanicResult::<(core::box::Box::,)>"],[64,"Tuple"],[65,"core::panics::PanicResult::<(core::starknet::contract_address::ContractAddress,)>"],[66,"core::starknet::account::Call"],[67,"core::option::Option::"],[68,"Tuple, core::option::Option::>"],[69,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::)>"],[70,"NonZero"],[71,"openzeppelin::account::account::AccountComponent::ComponentState::"],[72,"Tuple, Unit>"],[73,"core::panics::PanicResult::<(openzeppelin::account::account::AccountComponent::ComponentState::, ())>"],[74,"core::array::Span::>"],[75,"core::option::Option::>"],[76,"Tuple"],[77,"core::panics::PanicResult::<(core::bool,)>"],[78,"Pedersen"],[79,"openzeppelin::presets::account::Account::ContractState"],[80,"Tuple"],[81,"core::panics::PanicResult::<(openzeppelin::presets::account::Account::ContractState, ())>"],[82,"core::option::Option::>"],[83,"Tuple, core::option::Option::>>"],[84,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[85,"core::option::Option::"],[86,"Uninitialized"],[87,"Tuple"],[88,"core::panics::PanicResult::<(core::felt252,)>"],[89,"EcOp"],[90,"Tuple>"],[91,"Tuple, Unit>"],[92,"core::panics::PanicResult::<(core::array::Array::, ())>"],[93,"Tuple>>"],[94,"core::panics::PanicResult::<(core::array::Array::>,)>"],[95,"BuiltinCosts"],[96,"core::panics::PanicResult::<(core::array::Span::,)>"],[97,"u32"],[98,"core::option::Option::>"],[99,"Tuple, core::option::Option::>>"],[100,"core::panics::PanicResult::<(core::array::Span::, core::option::Option::>)>"],[101,"GasBuiltin"],[102,"RangeCheck"]],"libfunc_names":[[0,"alloc_local"],[1,"finalize_locals"],[2,"revoke_ap_tracking"],[3,"withdraw_gas"],[4,"branch_align"],[5,"store_temp"],[6,"store_temp"],[7,"store_temp>"],[8,"function_call::deserialize>"],[9,"enum_match, core::option::Option::>)>>"],[10,"struct_deconstruct, core::option::Option::>>>"],[11,"enum_match>>"],[12,"struct_deconstruct>"],[13,"array_len"],[14,"snapshot_take"],[15,"drop"],[16,"u32_const<0>"],[17,"rename"],[18,"store_temp"],[19,"u32_eq"],[20,"drop>"],[21,"drop>"],[22,"array_new"],[23,"felt252_const<7733229381460288120802334208475838166080759535023995805565484692595>"],[24,"store_temp"],[25,"array_append"],[26,"struct_construct"],[27,"struct_construct>>"],[28,"enum_init,)>, 1>"],[29,"store_temp"],[30,"store_temp,)>>"],[31,"get_builtin_costs"],[32,"store_temp"],[33,"withdraw_gas_all"],[34,"struct_construct"],[35,"struct_construct>"],[36,"struct_construct"],[37,"struct_construct>"],[38,"struct_construct"],[39,"snapshot_take"],[40,"drop"],[41,"store_temp"],[42,"store_temp>"],[43,"function_call::__execute__>"],[44,"store_local"],[45,"enum_match>,)>>"],[46,"struct_deconstruct>>>"],[47,"snapshot_take>>"],[48,"drop>>"],[49,"store_temp>>>"],[50,"store_temp>"],[51,"function_call, core::array::SpanSerde::, core::array::SpanDrop::>::serialize>"],[52,"enum_match, ())>>"],[53,"struct_deconstruct, Unit>>"],[54,"drop"],[55,"snapshot_take>"],[56,"drop>"],[57,"struct_construct>"],[58,"struct_construct>>"],[59,"enum_init,)>, 0>"],[60,"felt252_const<375233589013918064796019>"],[61,"drop>"],[62,"felt252_const<485748461484230571791265682659113160264223489397539653310998840191492913>"],[63,"store_temp"],[64,"function_call::__validate__>"],[65,"enum_match>"],[66,"struct_deconstruct>"],[67,"snapshot_take"],[68,"drop"],[69,"function_call"],[70,"alloc_local"],[71,"function_call"],[72,"enum_match>"],[73,"store_local"],[74,"function_call::deserialize>"],[75,"enum_match, core::option::Option::>)>>"],[76,"struct_deconstruct, core::option::Option::>>>"],[77,"enum_match>>"],[78,"function_call::is_valid_signature>"],[79,"felt252_const<485748461484230571791265682659113160264223489397539653310998840191492914>"],[80,"drop>"],[81,"function_call::isValidSignature>"],[82,"function_call::get_public_key>"],[83,"function_call::set_public_key>"],[84,"enum_match>"],[85,"drop>"],[86,"function_call::getPublicKey>"],[87,"function_call::setPublicKey>"],[88,"function_call::__validate_declare__>"],[89,"function_call::__validate_deploy__>"],[90,"felt252_const<485748461484230571791265682659113160264223489397539653310998840191492915>"],[91,"store_temp"],[92,"function_call::supports_interface>"],[93,"enum_match>"],[94,"struct_deconstruct>"],[95,"snapshot_take"],[96,"drop"],[97,"store_temp"],[98,"function_call"],[99,"function_call"],[100,"disable_ap_tracking"],[101,"array_snapshot_pop_front"],[102,"enum_init>, 0>"],[103,"store_temp>>"],[104,"store_temp>>"],[105,"jump"],[106,"struct_construct"],[107,"enum_init>, 1>"],[108,"enum_match>>"],[109,"unbox"],[110,"array_new"],[111,"rename"],[112,"function_call>"],[113,"struct_construct, core::option::Option::>>>"],[114,"enum_init, core::option::Option::>)>, 0>"],[115,"store_temp, core::option::Option::>)>>"],[116,"enum_init, core::option::Option::>)>, 1>"],[117,"enum_init>, 1>"],[118,"function_call"],[119,"store_temp>"],[120,"function_call::__execute__>"],[121,"struct_construct>>>"],[122,"enum_init>,)>, 0>"],[123,"store_temp>,)>>"],[124,"enum_init>,)>, 1>"],[125,"dup>>>"],[126,"array_len>"],[127,"u32_to_felt252"],[128,"struct_construct>>"],[129,"store_temp>>"],[130,"function_call, core::array::SpanSerde::, core::array::SpanDrop::>>"],[131,"struct_construct, Unit>>"],[132,"enum_init, ())>, 0>"],[133,"store_temp, ())>>"],[134,"enum_init, ())>, 1>"],[135,"function_call::validate_transaction>"],[136,"struct_construct>"],[137,"enum_init, 0>"],[138,"store_temp>"],[139,"enum_init, 1>"],[140,"store_temp"],[141,"enum_init, 0>"],[142,"store_temp>"],[143,"enum_init, 1>"],[144,"function_call>"],[145,"struct_construct, core::option::Option::>>>"],[146,"enum_init, core::option::Option::>)>, 0>"],[147,"store_temp, core::option::Option::>)>>"],[148,"enum_init, core::option::Option::>)>, 1>"],[149,"enum_init>, 1>"],[150,"function_call::is_valid_signature>"],[151,"function_call::get_public_key>"],[152,"function_call::set_public_key>"],[153,"enum_match, ())>>"],[154,"struct_deconstruct, Unit>>"],[155,"drop>"],[156,"struct_construct>"],[157,"enum_init, 0>"],[158,"store_temp>"],[159,"enum_init, 1>"],[160,"function_call::getPublicKey>"],[161,"function_call::setPublicKey>"],[162,"function_call"],[163,"store_temp>"],[164,"function_call::supports_interface>"],[165,"struct_construct>"],[166,"enum_init, 0>"],[167,"store_temp>"],[168,"enum_init, 1>"],[169,"rename"],[170,"enum_match"],[171,"felt252_const<0>"],[172,"felt252_const<1>"],[173,"struct_deconstruct"],[174,"function_call::initializer>"],[175,"drop>"],[176,"dup"],[177,"felt252_is_zero"],[178,"enum_init>, 0>"],[179,"drop>"],[180,"function_call"],[181,"enum_match, core::option::Option::)>>"],[182,"struct_deconstruct, core::option::Option::>>"],[183,"enum_match>"],[184,"array_append"],[185,"felt252_sub"],[186,"function_call"],[187,"enum_match>"],[188,"struct_deconstruct>"],[189,"contract_address_to_felt252"],[190,"function_call"],[191,"enum_match,)>>"],[192,"struct_deconstruct>>"],[193,"unbox"],[194,"struct_deconstruct"],[195,"drop"],[196,"drop"],[197,"enable_ap_tracking"],[198,"felt252_const<340282366920938463463374607431768211457>"],[199,"function_call"],[200,"felt252_const<26899160088882821476234389471510102233170292334138446031203430254>"],[201,"felt252_const<6262948757243068301173483364169975331325598907448976754>"],[202,"alloc_local>>>"],[203,"struct_deconstruct>>"],[204,"array_snapshot_pop_front>"],[205,"enum_init>>, 0>"],[206,"store_temp>>>"],[207,"enum_init>>, 1>"],[208,"store_local>>>"],[209,"enum_match>>>"],[210,"unbox>"],[211,"function_call::serialize>"],[212,"drop>>>"],[213,"drop>>>>"],[214,"drop>>"],[215,"function_call::_is_valid_signature>"],[216,"felt252_const<105074844097198521391540583873086336848321434922596230638170725>"],[217,"felt252_const<370462705988>"],[218,"enum_init>, 0>"],[219,"struct_deconstruct>"],[220,"store_temp"],[221,"function_call::read>"],[222,"snapshot_take>"],[223,"function_call::assert_only_self>"],[224,"enum_match>"],[225,"drop>"],[226,"snapshot_take"],[227,"struct_construct"],[228,"store_temp"],[229,"function_call>"],[230,"function_call::_set_public_key>"],[231,"struct_construct, Unit>>"],[232,"enum_init, ())>, 0>"],[233,"store_temp, ())>>"],[234,"enum_init, ())>, 1>"],[235,"drop"],[236,"felt252_const<1797054754729183305928171726271749999318198861813713898581160688510183841877>"],[237,"enum_init"],[238,"struct_deconstruct>"],[239,"store_temp"],[240,"function_call>>::read>"],[241,"felt252_const<1270010605630597976495846281167968799381097569185364931397797212080166453709>"],[242,"function_call::register_interface>"],[243,"enum_match, ())>>"],[244,"drop, Unit>>"],[245,"alloc_local"],[246,"function_call"],[247,"enum_match>"],[248,"store_local"],[249,"struct_construct"],[250,"enum_init, 0>"],[251,"struct_construct, core::option::Option::>>"],[252,"enum_init, core::option::Option::)>, 0>"],[253,"store_temp, core::option::Option::)>>"],[254,"enum_init, 1>"],[255,"enum_init, core::option::Option::)>, 1>"],[256,"drop>"],[257,"function_call"],[258,"enum_match,)>>"],[259,"struct_deconstruct>>"],[260,"unbox"],[261,"struct_deconstruct"],[262,"drop>"],[263,"drop>"],[264,"struct_construct>"],[265,"enum_init, 0>"],[266,"store_temp>"],[267,"enum_init, 1>"],[268,"struct_construct>>"],[269,"enum_init,)>, 0>"],[270,"store_temp,)>>"],[271,"enum_init,)>, 1>"],[272,"array_new>"],[273,"store_temp>>"],[274,"function_call"],[275,"enum_match, core::array::Array::>, ())>>"],[276,"struct_deconstruct, Array>, Unit>>"],[277,"dup>"],[278,"rename>"],[279,"function_call>"],[280,"u32_const<2>"],[281,"enum_init"],[282,"function_call>"],[283,"enum_match,)>>"],[284,"struct_deconstruct>>"],[285,"u32_const<1>"],[286,"function_call"],[287,"drop>"],[288,"storage_base_address_const<550557492744938365112574611882025123252567779123164597803728068558738016655>"],[289,"storage_address_from_base"],[290,"store_temp"],[291,"storage_read_syscall"],[292,"enum_init>, 0>"],[293,"store_temp>>"],[294,"enum_init>, 1>"],[295,"rename>>"],[296,"function_call::unwrap_syscall>"],[297,"function_call"],[298,"snapshot_take"],[299,"rename"],[300,"struct_construct>"],[301,"enum_init, 0>"],[302,"store_temp>"],[303,"felt252_const<95565013996018498247890117593540195050286445389156>"],[304,"enum_init, 1>"],[305,"drop>"],[306,"function_call"],[307,"enum_init"],[308,"store_temp"],[309,"function_call>>"],[310,"function_call::write>"],[311,"enum_match>"],[312,"struct_deconstruct>"],[313,"struct_construct"],[314,"store_temp"],[315,"function_call>"],[316,"function_call"],[317,"store_temp"],[318,"function_call"],[319,"rename>>"],[320,"function_call::unwrap_syscall>"],[321,"function_call>>::write>"],[322,"enum_match>"],[323,"struct_deconstruct>"],[324,"struct_construct, Unit>>"],[325,"enum_init, ())>, 0>"],[326,"store_temp, ())>>"],[327,"enum_init, ())>, 1>"],[328,"contract_address_try_from_felt252"],[329,"enum_init, 0>"],[330,"store_temp>"],[331,"enum_init, 1>"],[332,"get_execution_info_syscall"],[333,"enum_init, core::array::Array::>, 0>"],[334,"store_temp, core::array::Array::>>"],[335,"enum_init, core::array::Array::>, 1>"],[336,"rename, core::array::Array::>>"],[337,"function_call>::unwrap_syscall>"],[338,"struct_construct>>"],[339,"enum_init,)>, 0>"],[340,"store_temp,)>>"],[341,"enum_init,)>, 1>"],[342,"array_pop_front"],[343,"unbox"],[344,"store_temp>"],[345,"store_temp"],[346,"function_call"],[347,"enum_match,)>>"],[348,"struct_deconstruct>>"],[349,"array_append>"],[350,"struct_construct, Array>, Unit>>"],[351,"enum_init, core::array::Array::>, ())>, 0>"],[352,"store_temp, core::array::Array::>, ())>>"],[353,"enum_init, core::array::Array::>, ())>, 1>"],[354,"drop>>"],[355,"array_get"],[356,"struct_construct>>"],[357,"enum_init,)>, 0>"],[358,"store_temp,)>>"],[359,"felt252_const<1637570914057682275393755530660268060279989363>"],[360,"enum_init,)>, 1>"],[361,"felt252_const<3618502788666131213697322783095070105526743751716087489154079457884512865583>"],[362,"ec_point_from_x_nz"],[363,"store_temp>"],[364,"unwrap_non_zero"],[365,"felt252_const<874739451078007766457464989774322083649278607533249481151382481072868806602>"],[366,"felt252_const<152666792071518830868575557812948353041420400780739481342941381225525861407>"],[367,"ec_point_try_new_nz"],[368,"store_temp"],[369,"function_call"],[370,"ec_point_is_zero"],[371,"drop"],[372,"ec_point_unwrap"],[373,"dup"],[374,"function_call"],[375,"function_call"],[376,"enum_match>>"],[377,"enum_init"],[378,"store_temp"],[379,"function_call::into>"],[380,"snapshot_take"],[381,"drop"],[382,"function_call"],[383,"emit_event_syscall"],[384,"enum_init>, 0>"],[385,"store_temp>>"],[386,"enum_init>, 1>"],[387,"rename>>"],[388,"function_call::unwrap_syscall>"],[389,"struct_deconstruct>"],[390,"storage_write_syscall"],[391,"struct_construct>"],[392,"enum_init, 0>"],[393,"store_temp>"],[394,"enum_init, 1>"],[395,"function_call"],[396,"drop"],[397,"felt252_const<29856869448526851354677579421814598404948672607251612773571742675033995705>"],[398,"struct_construct"],[399,"struct_deconstruct"],[400,"pedersen"],[401,"storage_base_address_from_felt252"],[402,"bool_not_impl"],[403,"enum_init>, 0>"],[404,"store_temp>>"],[405,"enum_init>, 1>"],[406,"enum_match>>"],[407,"snapshot_take"],[408,"struct_construct>"],[409,"enum_init, 0>"],[410,"store_temp>"],[411,"enum_init, 1>"],[412,"enum_match, core::array::Array::>>"],[413,"struct_deconstruct"],[414,"call_contract_syscall"],[415,"enum_init, core::array::Array::>, 0>"],[416,"store_temp, core::array::Array::>>"],[417,"enum_init, core::array::Array::>, 1>"],[418,"rename, core::array::Array::>>"],[419,"function_call, core::array::Array::>::unwrap::>>"],[420,"ec_state_init"],[421,"ec_state_add_mul"],[422,"store_temp"],[423,"ec_state_try_finalize_nz"],[424,"ec_point_zero"],[425,"rename"],[426,"rename"],[427,"drop>"],[428,"ec_state_add"],[429,"ec_neg"],[430,"enum_match"],[431,"function_call"],[432,"store_temp"],[433,"function_call"],[434,"rename>"],[435,"enum_match>>"],[436,"enum_init"],[437,"felt252_const<30828113188794245257250221355944970489240709081949230>"],[438,"function_call, core::array::Array::>::expect::>>"],[439,"enum_match"],[440,"felt252_const<1610331728778078893946407512609881658931720321973668761376942902098853979009>"],[441,"function_call"],[442,"felt252_const<22344655548567333405387866802074085172395779041116519548464544628677498541>"],[443,"function_call"],[444,"enum_match"],[445,"enum_match, core::array::Array::>>"],[446,"struct_deconstruct"],[447,"struct_deconstruct"]],"user_func_names":[[0,"openzeppelin::account::account::AccountComponent::__wrapper__SRC6Impl____execute__::"],[1,"openzeppelin::account::account::AccountComponent::__wrapper__SRC6Impl____validate__::"],[2,"openzeppelin::account::account::AccountComponent::__wrapper__SRC6Impl__is_valid_signature::"],[3,"openzeppelin::account::account::AccountComponent::__wrapper__SRC6CamelOnlyImpl__isValidSignature::"],[4,"openzeppelin::account::account::AccountComponent::__wrapper__PublicKeyImpl__get_public_key::"],[5,"openzeppelin::account::account::AccountComponent::__wrapper__PublicKeyImpl__set_public_key::"],[6,"openzeppelin::account::account::AccountComponent::__wrapper__PublicKeyCamelImpl__getPublicKey::"],[7,"openzeppelin::account::account::AccountComponent::__wrapper__PublicKeyCamelImpl__setPublicKey::"],[8,"openzeppelin::account::account::AccountComponent::__wrapper__DeclarerImpl____validate_declare__::"],[9,"openzeppelin::account::account::AccountComponent::__wrapper__DeployableImpl____validate_deploy__::"],[10,"openzeppelin::introspection::src5::SRC5Component::__wrapper__SRC5Impl__supports_interface::"],[11,"openzeppelin::presets::account::Account::__wrapper__constructor"],[12,"core::array::ArraySerde::::deserialize"],[13,"openzeppelin::account::account::AccountComponent::SRC6Impl::::__execute__"],[14,"core::array::ArraySerde::, core::array::SpanSerde::, core::array::SpanDrop::>::serialize"],[15,"openzeppelin::account::account::AccountComponent::SRC6Impl::::__validate__"],[16,"core::Felt252Serde::serialize"],[17,"core::Felt252Serde::deserialize"],[18,"core::array::ArraySerde::::deserialize"],[19,"openzeppelin::account::account::AccountComponent::SRC6Impl::::is_valid_signature"],[20,"openzeppelin::account::account::AccountComponent::SRC6CamelOnlyImpl::::isValidSignature"],[21,"openzeppelin::account::account::AccountComponent::PublicKeyImpl::::get_public_key"],[22,"openzeppelin::account::account::AccountComponent::PublicKeyImpl::::set_public_key"],[23,"openzeppelin::account::account::AccountComponent::PublicKeyCamelImpl::::getPublicKey"],[24,"openzeppelin::account::account::AccountComponent::PublicKeyCamelImpl::::setPublicKey"],[25,"openzeppelin::account::account::AccountComponent::DeclarerImpl::::__validate_declare__"],[26,"openzeppelin::account::account::AccountComponent::DeployableImpl::::__validate_deploy__"],[27,"openzeppelin::introspection::src5::SRC5Component::SRC5Impl::::supports_interface"],[28,"core::BoolSerde::serialize"],[29,"openzeppelin::presets::account::Account::constructor"],[30,"core::array::deserialize_array_helper::"],[31,"openzeppelin::presets::account::Account::HasComponentImpl_AccountComponent::get_component"],[32,"openzeppelin::account::account::AccountComponent::SRC6::::__execute__"],[33,"core::array::serialize_array_helper::, core::array::SpanSerde::, core::array::SpanDrop::>"],[34,"openzeppelin::account::account::AccountComponent::InternalImpl::::validate_transaction"],[35,"core::array::deserialize_array_helper::"],[36,"openzeppelin::account::account::AccountComponent::SRC6::::is_valid_signature"],[37,"openzeppelin::account::account::AccountComponent::PublicKey::::get_public_key"],[38,"openzeppelin::account::account::AccountComponent::PublicKey::::set_public_key"],[39,"openzeppelin::account::account::AccountComponent::PublicKeyCamel::::getPublicKey"],[40,"openzeppelin::account::account::AccountComponent::PublicKeyCamel::::setPublicKey"],[41,"openzeppelin::presets::account::Account::HasComponentImpl_SRC5Component::get_component"],[42,"openzeppelin::introspection::src5::SRC5Component::SRC5::::supports_interface"],[43,"openzeppelin::account::account::AccountComponent::InternalImpl::::initializer"],[44,"core::starknet::account::CallSerde::deserialize"],[45,"core::starknet::info::get_caller_address"],[46,"core::starknet::info::get_tx_info"],[47,"openzeppelin::account::account::AccountComponent::_execute_calls"],[48,"core::array::SpanSerde::::serialize"],[49,"openzeppelin::account::account::AccountComponent::InternalImpl::::_is_valid_signature"],[50,"core::starknet::storage::StorageMemberAccessImpl::::read"],[51,"openzeppelin::account::account::AccountComponent::InternalImpl::::assert_only_self"],[52,"openzeppelin::presets::account::Account::HasComponentImpl_AccountComponent::emit::"],[53,"openzeppelin::account::account::AccountComponent::InternalImpl::::_set_public_key"],[54,"core::starknet::storage::StorageMapMemberAccessImpl::>>::read"],[55,"openzeppelin::introspection::src5::SRC5Component::InternalImpl::::register_interface"],[56,"core::starknet::contract_address::ContractAddressSerde::deserialize"],[57,"core::starknet::info::get_execution_info"],[58,"openzeppelin::account::account::AccountComponent::_execute_calls[expr12]"],[59,"core::array::serialize_array_helper::"],[60,"core::array::array_at::"],[61,"core::ecdsa::check_ecdsa_signature"],[62,"core::starknet::SyscallResultTraitImpl::::unwrap_syscall"],[63,"core::starknet::info::get_contract_address"],[64,"openzeppelin::account::account::AccountComponent::EventOwnerRemovedIntoEvent::into"],[65,"openzeppelin::presets::account::Account::ContractStateEventEmitter::emit::>"],[66,"core::starknet::storage::StorageMemberAccessImpl::::write"],[67,"openzeppelin::presets::account::Account::HasComponentImpl_AccountComponent::emit::"],[68,"openzeppelin::introspection::src5::SRC5Component::SRC5_supported_interfaces::StorageMapComponentMemberStateImpl::address"],[69,"core::starknet::storage_access::StoreBool::read"],[70,"core::starknet::SyscallResultTraitImpl::::unwrap_syscall"],[71,"core::starknet::storage::StorageMapMemberAccessImpl::>>::write"],[72,"core::starknet::SyscallResultTraitImpl::>::unwrap_syscall"],[73,"openzeppelin::account::account::AccountComponent::_execute_single_call"],[74,"core::ec::EcPointImpl::mul"],[75,"core::ec::EcPointAdd::add"],[76,"core::ec::EcPointSub::sub"],[77,"core::traits::TIntoT::::into"],[78,"openzeppelin::presets::account::Account::EventIsEvent::append_keys_and_data"],[79,"core::starknet::SyscallResultTraitImpl::<()>::unwrap_syscall"],[80,"openzeppelin::account::account::AccountComponent::EventOwnerAddedIntoEvent::into"],[81,"core::result::ResultTraitImpl::, core::array::Array::>::unwrap::>"],[82,"openzeppelin::account::account::AccountComponent::EventIsEvent::append_keys_and_data"],[83,"openzeppelin::introspection::src5::SRC5Component::EventIsEvent::append_keys_and_data"],[84,"core::result::ResultTraitImpl::, core::array::Array::>::expect::>"],[85,"openzeppelin::account::account::AccountComponent::OwnerAddedIsEvent::append_keys_and_data"],[86,"openzeppelin::account::account::AccountComponent::OwnerRemovedIsEvent::append_keys_and_data"]]},"contract_class_version":"0.1.0","entry_points_by_type":{"EXTERNAL":[{"selector":"0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9","function_idx":7},{"selector":"0xfe80f537b66d12a00b6d3c072b44afbb716e78dde5c3f0ef116ee93d3e3283","function_idx":10},{"selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad","function_idx":0},{"selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775","function_idx":1},{"selector":"0x1a35984e05126dbecb7c3bb9929e7dd9106d460c59b1633739a5c733a5fb13b","function_idx":4},{"selector":"0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079","function_idx":6},{"selector":"0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e","function_idx":3},{"selector":"0x28420862938116cb3bbdbedee07451ccc54d4e9412dbef71142ad1980a30941","function_idx":2},{"selector":"0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3","function_idx":8},{"selector":"0x2e3e21ff5952b2531241e37999d9c4c8b3034cccc89a202a6bf019bdf5294f9","function_idx":5},{"selector":"0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895","function_idx":9}],"L1_HANDLER":[],"CONSTRUCTOR":[{"selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194","function_idx":11}]},"abi":[{"type":"impl","name":"SRC6Impl","interface_name":"openzeppelin::account::interface::ISRC6"},{"type":"struct","name":"core::starknet::account::Call","members":[{"name":"to","type":"core::starknet::contract_address::ContractAddress"},{"name":"selector","type":"core::felt252"},{"name":"calldata","type":"core::array::Array::"}]},{"type":"struct","name":"core::array::Span::","members":[{"name":"snapshot","type":"@core::array::Array::"}]},{"type":"interface","name":"openzeppelin::account::interface::ISRC6","items":[{"type":"function","name":"__execute__","inputs":[{"name":"calls","type":"core::array::Array::"}],"outputs":[{"type":"core::array::Array::>"}],"state_mutability":"view"},{"type":"function","name":"__validate__","inputs":[{"name":"calls","type":"core::array::Array::"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"is_valid_signature","inputs":[{"name":"hash","type":"core::felt252"},{"name":"signature","type":"core::array::Array::"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"}]},{"type":"impl","name":"SRC6CamelOnlyImpl","interface_name":"openzeppelin::account::interface::ISRC6CamelOnly"},{"type":"interface","name":"openzeppelin::account::interface::ISRC6CamelOnly","items":[{"type":"function","name":"isValidSignature","inputs":[{"name":"hash","type":"core::felt252"},{"name":"signature","type":"core::array::Array::"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"}]},{"type":"impl","name":"PublicKeyImpl","interface_name":"openzeppelin::account::interface::IPublicKey"},{"type":"interface","name":"openzeppelin::account::interface::IPublicKey","items":[{"type":"function","name":"get_public_key","inputs":[],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"set_public_key","inputs":[{"name":"new_public_key","type":"core::felt252"}],"outputs":[],"state_mutability":"external"}]},{"type":"impl","name":"PublicKeyCamelImpl","interface_name":"openzeppelin::account::interface::IPublicKeyCamel"},{"type":"interface","name":"openzeppelin::account::interface::IPublicKeyCamel","items":[{"type":"function","name":"getPublicKey","inputs":[],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"},{"type":"function","name":"setPublicKey","inputs":[{"name":"newPublicKey","type":"core::felt252"}],"outputs":[],"state_mutability":"external"}]},{"type":"impl","name":"DeclarerImpl","interface_name":"openzeppelin::account::interface::IDeclarer"},{"type":"interface","name":"openzeppelin::account::interface::IDeclarer","items":[{"type":"function","name":"__validate_declare__","inputs":[{"name":"class_hash","type":"core::felt252"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"}]},{"type":"impl","name":"DeployableImpl","interface_name":"openzeppelin::account::interface::IDeployable"},{"type":"interface","name":"openzeppelin::account::interface::IDeployable","items":[{"type":"function","name":"__validate_deploy__","inputs":[{"name":"class_hash","type":"core::felt252"},{"name":"contract_address_salt","type":"core::felt252"},{"name":"public_key","type":"core::felt252"}],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"}]},{"type":"impl","name":"SRC5Impl","interface_name":"openzeppelin::introspection::interface::ISRC5"},{"type":"enum","name":"core::bool","variants":[{"name":"False","type":"()"},{"name":"True","type":"()"}]},{"type":"interface","name":"openzeppelin::introspection::interface::ISRC5","items":[{"type":"function","name":"supports_interface","inputs":[{"name":"interface_id","type":"core::felt252"}],"outputs":[{"type":"core::bool"}],"state_mutability":"view"}]},{"type":"constructor","name":"constructor","inputs":[{"name":"public_key","type":"core::felt252"}]},{"type":"event","name":"openzeppelin::account::account::AccountComponent::OwnerAdded","kind":"struct","members":[{"name":"new_owner_guid","type":"core::felt252","kind":"data"}]},{"type":"event","name":"openzeppelin::account::account::AccountComponent::OwnerRemoved","kind":"struct","members":[{"name":"removed_owner_guid","type":"core::felt252","kind":"data"}]},{"type":"event","name":"openzeppelin::account::account::AccountComponent::Event","kind":"enum","variants":[{"name":"OwnerAdded","type":"openzeppelin::account::account::AccountComponent::OwnerAdded","kind":"nested"},{"name":"OwnerRemoved","type":"openzeppelin::account::account::AccountComponent::OwnerRemoved","kind":"nested"}]},{"type":"event","name":"openzeppelin::introspection::src5::SRC5Component::Event","kind":"enum","variants":[]},{"type":"event","name":"openzeppelin::presets::account::Account::Event","kind":"enum","variants":[{"name":"AccountEvent","type":"openzeppelin::account::account::AccountComponent::Event","kind":"flat"},{"name":"SRC5Event","type":"openzeppelin::introspection::src5::SRC5Component::Event","kind":"flat"}]}]} \ No newline at end of file diff --git a/crates/katana/core/contracts/messaging/cairo/Makefile b/crates/katana/core/contracts/messaging/cairo/Makefile index 42ba9b392e..48d76a402b 100644 --- a/crates/katana/core/contracts/messaging/cairo/Makefile +++ b/crates/katana/core/contracts/messaging/cairo/Makefile @@ -1,5 +1,5 @@ ACCOUNT_L2=./account_l2.json -ACCOUNT_L2_ADDR=0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973 +ACCOUNT_L2_ADDR=0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624 L2_PRIVATE_KEY=0x1800000000300000180000000000030000000000003006001800006600 # Build files helpers. diff --git a/crates/katana/core/contracts/messaging/cairo/account_l2.json b/crates/katana/core/contracts/messaging/cairo/account_l2.json index f879c33766..32f05e685d 100644 --- a/crates/katana/core/contracts/messaging/cairo/account_l2.json +++ b/crates/katana/core/contracts/messaging/cairo/account_l2.json @@ -8,6 +8,6 @@ "deployment": { "status": "deployed", "class_hash": "0x4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f", - "address": "0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973" + "address": "0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624" } } diff --git a/crates/katana/core/contracts/messaging/solidity/Makefile b/crates/katana/core/contracts/messaging/solidity/Makefile index 1198b4d527..4baa800e98 100644 --- a/crates/katana/core/contracts/messaging/solidity/Makefile +++ b/crates/katana/core/contracts/messaging/solidity/Makefile @@ -9,8 +9,8 @@ export $(shell sed 's/=.*//' .env) # Addresses fixed here for easy testing. C_MSG_L2_ADDR=0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512 -L2_ACCOUNT=0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973 -L2_CONTRACT_ADDR=0x04231f608ea4a233136f6cdfcd10eaad2e46362bbc4e5d5aa88d0d574ea120d8 +L2_ACCOUNT=0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624 +L2_CONTRACT_ADDR=0x0429a64d97c1422a37a09fc7406f35c264be59b744aaff5a79d59393eb1bc7e1 deploy_messaging_contracts: forge script --broadcast --rpc-url ${ETH_RPC_URL} script/LocalTesting.s.sol:LocalSetup diff --git a/crates/katana/core/src/accounts.rs b/crates/katana/core/src/accounts.rs index 439afb85ff..25ff933c12 100644 --- a/crates/katana/core/src/accounts.rs +++ b/crates/katana/core/src/accounts.rs @@ -15,7 +15,7 @@ use starknet::core::utils::{get_contract_address, get_storage_var_address}; use starknet::signers::SigningKey; use crate::constants::{ - FEE_TOKEN_ADDRESS, OZ_V0_ACCOUNT_CONTRACT, OZ_V0_ACCOUNT_CONTRACT_CLASS_HASH, + FEE_TOKEN_ADDRESS, OZ_V1_ACCOUNT_CONTRACT_COMPILED, OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH, }; #[serde_as] @@ -114,8 +114,8 @@ impl DevAccountGenerator { total, seed: [0u8; 32], balance: FieldElement::ZERO, - class_hash: (*OZ_V0_ACCOUNT_CONTRACT_CLASS_HASH), - contract_class: Arc::new((*OZ_V0_ACCOUNT_CONTRACT).clone()), + class_hash: (*OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH), + contract_class: Arc::new((*OZ_V1_ACCOUNT_CONTRACT_COMPILED).clone()), } } diff --git a/crates/katana/core/src/backend/config.rs b/crates/katana/core/src/backend/config.rs index 54f1d4ba49..c466056286 100644 --- a/crates/katana/core/src/backend/config.rs +++ b/crates/katana/core/src/backend/config.rs @@ -17,6 +17,7 @@ pub struct StarknetConfig { pub env: Environment, pub fork_rpc_url: Option, pub fork_block_number: Option, + pub disable_validate: bool, } impl StarknetConfig { @@ -59,6 +60,7 @@ impl Default for StarknetConfig { fork_rpc_url: None, fork_block_number: None, env: Environment::default(), + disable_validate: false, } } } diff --git a/crates/katana/core/src/constants.rs b/crates/katana/core/src/constants.rs index b25be447dd..c983920202 100644 --- a/crates/katana/core/src/constants.rs +++ b/crates/katana/core/src/constants.rs @@ -1,5 +1,7 @@ -use katana_primitives::contract::{CompiledContractClass, ContractAddress, StorageKey}; -use katana_primitives::utils::class::parse_compiled_class; +use katana_primitives::contract::{ + CompiledContractClass, ContractAddress, SierraClass, StorageKey, +}; +use katana_primitives::utils::class::{parse_compiled_class, parse_sierra_class}; use katana_primitives::FieldElement; use lazy_static::lazy_static; use starknet::macros::felt; @@ -19,11 +21,11 @@ lazy_static! { // Predefined class hashes - pub static ref OZ_V0_ACCOUNT_CONTRACT_CLASS_HASH: FieldElement = felt!("0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f"); + pub static ref OZ_V1_ACCOUNT_CONTRACT_CLASS_HASH: FieldElement = felt!("0x05400e90f7e0ae78bd02c77cd75527280470e2fe19c54970dd79dc37a9d3645c"); pub static ref ERC20_CONTRACT_CLASS_HASH: FieldElement = felt!("0x02a8846878b6ad1f54f6ba46f5f40e11cee755c677f130b2c4b60566c9003f1f"); pub static ref UDC_CLASS_HASH: FieldElement = felt!("0x07b3e05f48f0c69e4a65ce5e076a66271a527aff2c34ce1083ec6e1526997a69"); - pub static ref OZ_V0_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH: FieldElement = felt!("0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f"); + pub static ref OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH: FieldElement = felt!("0x016c6081eb34ad1e0c5513234ed0c025b3c7f305902d291bad534cd6474c85bc"); pub static ref ERC20_CONTRACT_COMPILED_CLASS_HASH: FieldElement = felt!("0x02a8846878b6ad1f54f6ba46f5f40e11cee755c677f130b2c4b60566c9003f1f"); pub static ref UDC_COMPILED_CLASS_HASH: FieldElement = felt!("0x07b3e05f48f0c69e4a65ce5e076a66271a527aff2c34ce1083ec6e1526997a69"); @@ -31,7 +33,8 @@ lazy_static! { pub static ref ERC20_CONTRACT: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/erc20.json")).unwrap(); pub static ref UDC_CONTRACT: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/universal_deployer.json")).unwrap(); - pub static ref OZ_V0_ACCOUNT_CONTRACT: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/account.json")).unwrap(); + pub static ref OZ_V1_ACCOUNT_CONTRACT: SierraClass = parse_sierra_class(include_str!("../contracts/compiled/oz_account_080.json")).unwrap(); + pub static ref OZ_V1_ACCOUNT_CONTRACT_COMPILED: CompiledContractClass = parse_compiled_class(include_str!("../contracts/compiled/oz_account_080.json")).unwrap(); pub static ref DEFAULT_PREFUNDED_ACCOUNT_BALANCE: FieldElement = felt!("0x3635c9adc5dea00000"); // 10^21 diff --git a/crates/katana/core/src/sequencer.rs b/crates/katana/core/src/sequencer.rs index 73d7ffdab8..4a3e7a5610 100644 --- a/crates/katana/core/src/sequencer.rs +++ b/crates/katana/core/src/sequencer.rs @@ -154,6 +154,7 @@ impl KatanaSequencer { transactions.into_iter(), block_context, state, + !self.backend.config.read().disable_validate, ) .map_err(SequencerError::TransactionExecution) } diff --git a/crates/katana/core/src/service/block_producer.rs b/crates/katana/core/src/service/block_producer.rs index c87f8a0ff6..0cef6a3085 100644 --- a/crates/katana/core/src/service/block_producer.rs +++ b/crates/katana/core/src/service/block_producer.rs @@ -220,6 +220,7 @@ impl IntervalBlockProducer { &self.state.state, &self.backend.env.read().block, !self.backend.config.read().disable_fee, + !self.backend.config.read().disable_validate, transactions.clone().into_iter(), ) .with_error_log() @@ -330,6 +331,7 @@ impl InstantBlockProducer { &state, &block_context, !backend.config.read().disable_fee, + !backend.config.read().disable_validate, transactions.clone().into_iter(), ) .with_error_log() diff --git a/crates/katana/core/src/service/messaging/starknet.rs b/crates/katana/core/src/service/messaging/starknet.rs index 41b6b08313..2b7d2d3d8e 100644 --- a/crates/katana/core/src/service/messaging/starknet.rs +++ b/crates/katana/core/src/service/messaging/starknet.rs @@ -111,7 +111,7 @@ impl StarknetMessaging { signer, self.sender_account_address, self.chain_id, - ExecutionEncoding::Legacy, + ExecutionEncoding::New, ); account.set_block_id(BlockId::Tag(BlockTag::Latest)); diff --git a/crates/katana/core/src/utils/mod.rs b/crates/katana/core/src/utils/mod.rs index 820f5adfc7..26bae491be 100644 --- a/crates/katana/core/src/utils/mod.rs +++ b/crates/katana/core/src/utils/mod.rs @@ -6,9 +6,9 @@ use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; use crate::constants::{ ERC20_CONTRACT, ERC20_CONTRACT_CLASS_HASH, ERC20_CONTRACT_COMPILED_CLASS_HASH, ERC20_DECIMALS_STORAGE_SLOT, ERC20_NAME_STORAGE_SLOT, ERC20_SYMBOL_STORAGE_SLOT, - FEE_TOKEN_ADDRESS, OZ_V0_ACCOUNT_CONTRACT, OZ_V0_ACCOUNT_CONTRACT_CLASS_HASH, - OZ_V0_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH, UDC_ADDRESS, UDC_CLASS_HASH, - UDC_COMPILED_CLASS_HASH, UDC_CONTRACT, + FEE_TOKEN_ADDRESS, OZ_V1_ACCOUNT_CONTRACT, OZ_V1_ACCOUNT_CONTRACT_CLASS_HASH, + OZ_V1_ACCOUNT_CONTRACT_COMPILED, OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH, UDC_ADDRESS, + UDC_CLASS_HASH, UDC_COMPILED_CLASS_HASH, UDC_CONTRACT, }; pub(super) fn get_current_timestamp() -> std::time::Duration { @@ -38,15 +38,18 @@ pub(super) fn get_genesis_states_for_testing() -> StateUpdatesWithDeclaredClasse let declared_classes = HashMap::from([ (*UDC_CLASS_HASH, *UDC_COMPILED_CLASS_HASH), (*ERC20_CONTRACT_CLASS_HASH, *ERC20_CONTRACT_COMPILED_CLASS_HASH), - (*OZ_V0_ACCOUNT_CONTRACT_CLASS_HASH, *OZ_V0_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH), + (*OZ_V1_ACCOUNT_CONTRACT_CLASS_HASH, *OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH), ]); - let declared_sierra_classes = HashMap::from([]); + let declared_sierra_classes = HashMap::from([( + *OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH, + OZ_V1_ACCOUNT_CONTRACT.clone().flatten().unwrap(), + )]); let declared_compiled_classes = HashMap::from([ (*UDC_COMPILED_CLASS_HASH, (*UDC_CONTRACT).clone()), (*ERC20_CONTRACT_COMPILED_CLASS_HASH, (*ERC20_CONTRACT).clone()), - (*OZ_V0_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH, (*OZ_V0_ACCOUNT_CONTRACT).clone()), + (*OZ_V1_ACCOUNT_CONTRACT_COMPILED_CLASS_HASH, (*OZ_V1_ACCOUNT_CONTRACT_COMPILED).clone()), ]); StateUpdatesWithDeclaredClasses { diff --git a/crates/katana/executor/src/blockifier/mod.rs b/crates/katana/executor/src/blockifier/mod.rs index 16089d132c..e62e12728f 100644 --- a/crates/katana/executor/src/blockifier/mod.rs +++ b/crates/katana/executor/src/blockifier/mod.rs @@ -42,6 +42,8 @@ pub struct TransactionExecutor<'a, S: StateReader, T> { transactions: T, /// The state the transactions will be executed on. state: &'a CachedStateWrapper, + /// A flag to enable/disable transaction validation. + validate: bool, // logs flags error_log: bool, @@ -58,6 +60,7 @@ where state: &'a CachedStateWrapper, block_context: &'a BlockContext, charge_fee: bool, + validate: bool, transactions: T, ) -> Self { Self { @@ -65,6 +68,7 @@ where charge_fee, transactions, block_context, + validate, error_log: false, events_log: false, resources_log: false, @@ -97,10 +101,9 @@ where type Item = TxExecutionResult; fn next(&mut self) -> Option { - let res = self - .transactions - .next() - .map(|tx| execute_tx(tx, self.state, self.block_context, self.charge_fee))?; + let res = self.transactions.next().map(|tx| { + execute_tx(tx, self.state, self.block_context, self.charge_fee, self.validate) + })?; match res { Ok(ref info) => { @@ -142,10 +145,8 @@ fn execute_tx( state: &CachedStateWrapper, block_context: &BlockContext, charge_fee: bool, + validate: bool, ) -> TxExecutionResult { - // TODO: check how this value must be controlled. - let validate = true; - let sierra = if let ExecutableTx::Declare(DeclareTxWithClass { transaction, sierra_class: Some(sierra_class), diff --git a/crates/katana/executor/src/blockifier/state.rs b/crates/katana/executor/src/blockifier/state.rs index c2bda79e09..12c6456764 100644 --- a/crates/katana/executor/src/blockifier/state.rs +++ b/crates/katana/executor/src/blockifier/state.rs @@ -3,7 +3,7 @@ use std::collections::HashMap; use blockifier::state::cached_state::{CachedState, GlobalContractCache}; use blockifier::state::errors::StateError; use blockifier::state::state_api::StateReader; -use katana_primitives::contract::SierraClass; +use katana_primitives::contract::FlattenedSierraClass; use katana_primitives::FieldElement; use katana_provider::traits::contract::ContractClassProvider; use katana_provider::traits::state::StateProvider; @@ -94,7 +94,7 @@ impl StateReader for StateRefDb { pub struct CachedStateWrapper { inner: Mutex>, - sierra_class: RwLock>, + sierra_class: RwLock>, } impl CachedStateWrapper { @@ -118,7 +118,7 @@ impl CachedStateWrapper { &self, ) -> parking_lot::RwLockReadGuard< '_, - HashMap, + HashMap, > { self.sierra_class.read() } @@ -127,7 +127,7 @@ impl CachedStateWrapper { &self, ) -> parking_lot::RwLockWriteGuard< '_, - HashMap, + HashMap, > { self.sierra_class.write() } @@ -160,7 +160,7 @@ where fn sierra_class( &self, hash: katana_primitives::contract::ClassHash, - ) -> anyhow::Result> { + ) -> anyhow::Result> { let class @ Some(_) = self.sierra_class().get(&hash).cloned() else { return Ok(None); }; diff --git a/crates/katana/executor/src/blockifier/utils.rs b/crates/katana/executor/src/blockifier/utils.rs index fd6f994f19..85e000cec4 100644 --- a/crates/katana/executor/src/blockifier/utils.rs +++ b/crates/katana/executor/src/blockifier/utils.rs @@ -60,9 +60,10 @@ pub fn estimate_fee( transactions: impl Iterator, block_context: BlockContext, state: Box, + validate: bool, ) -> Result, TransactionExecutionError> { let state = CachedStateWrapper::new(StateRefDb::from(state)); - let results = TransactionExecutor::new(&state, &block_context, false, transactions) + let results = TransactionExecutor::new(&state, &block_context, false, validate, transactions) .with_error_log() .execute(); diff --git a/crates/katana/primitives/src/contract.rs b/crates/katana/primitives/src/contract.rs index d9d778bad8..eae4df0ab7 100644 --- a/crates/katana/primitives/src/contract.rs +++ b/crates/katana/primitives/src/contract.rs @@ -18,7 +18,8 @@ pub type CompiledClassHash = FieldElement; /// Represents the type for a contract nonce. pub type Nonce = FieldElement; -pub type SierraClass = starknet::core::types::FlattenedSierraClass; +pub type SierraClass = starknet::core::types::contract::SierraClass; +pub type FlattenedSierraClass = starknet::core::types::FlattenedSierraClass; /// Represents a contract address. #[derive(Default, Clone, Copy, Eq, PartialEq, PartialOrd, Ord, Hash, Debug, Deref)] diff --git a/crates/katana/primitives/src/conversion/rpc.rs b/crates/katana/primitives/src/conversion/rpc.rs index 728d07378a..653a30412c 100644 --- a/crates/katana/primitives/src/conversion/rpc.rs +++ b/crates/katana/primitives/src/conversion/rpc.rs @@ -14,7 +14,8 @@ use starknet::core::types::{ use starknet_api::deprecated_contract_class::{EntryPoint, EntryPointType}; use crate::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, CompiledContractClassV0, SierraClass, + ClassHash, CompiledClassHash, CompiledContractClass, CompiledContractClassV0, + FlattenedSierraClass, }; use crate::FieldElement; @@ -70,10 +71,10 @@ pub fn legacy_inner_to_rpc_class( })) } -/// Convert the given [`SierraClass`] into the inner compiled class type [`CompiledContractClass`] -/// along with its class hashes. -pub fn sierra_to_compiled_class( - contract_class: &SierraClass, +/// Convert the given [`FlattenedSierraClass`] into the inner compiled class type +/// [`CompiledContractClass`] along with its class hashes. +pub fn flattened_sierra_to_compiled_class( + contract_class: &FlattenedSierraClass, ) -> Result<(ClassHash, CompiledClassHash, CompiledContractClass)> { let class_hash = contract_class.class_hash(); @@ -91,9 +92,9 @@ pub fn sierra_to_compiled_class( )) } -/// Compute the compiled class hash from the given [`SierraClass`]. +/// Compute the compiled class hash from the given [`FlattenedSierraClass`]. pub fn compiled_class_hash_from_flattened_sierra_class( - contract_class: &SierraClass, + contract_class: &FlattenedSierraClass, ) -> Result { let contract_class = rpc_to_cairo_contract_class(contract_class)?; let casm = CasmContractClass::from_contract_class(contract_class, true)?; @@ -122,10 +123,10 @@ pub fn legacy_rpc_to_inner_compiled_class( Ok((class_hash, CompiledContractClass::V0(contract_class))) } -/// Converts `starknet-rs` RPC [SierraClass] type to Cairo's +/// Converts `starknet-rs` RPC [FlattenedSierraClass] type to Cairo's /// [ContractClass](cairo_lang_starknet::contract_class::ContractClass) type. fn rpc_to_cairo_contract_class( - contract_class: &SierraClass, + contract_class: &FlattenedSierraClass, ) -> Result { let value = serde_json::to_value(contract_class)?; diff --git a/crates/katana/primitives/src/state.rs b/crates/katana/primitives/src/state.rs index 65cfa8341a..2c67c062b9 100644 --- a/crates/katana/primitives/src/state.rs +++ b/crates/katana/primitives/src/state.rs @@ -1,8 +1,8 @@ use std::collections::HashMap; use crate::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, Nonce, SierraClass, - StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + Nonce, StorageKey, StorageValue, }; /// State updates. @@ -27,7 +27,7 @@ pub struct StateUpdatesWithDeclaredClasses { /// State updates. pub state_updates: StateUpdates, /// A mapping of class hashes to their sierra classes definition. - pub declared_sierra_classes: HashMap, + pub declared_sierra_classes: HashMap, /// A mapping of class hashes to their compiled classes definition. pub declared_compiled_classes: HashMap, } diff --git a/crates/katana/primitives/src/transaction.rs b/crates/katana/primitives/src/transaction.rs index 9664105776..ab5665d844 100644 --- a/crates/katana/primitives/src/transaction.rs +++ b/crates/katana/primitives/src/transaction.rs @@ -2,7 +2,8 @@ use derive_more::{AsRef, Deref}; use ethers::types::H256; use crate::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, Nonce, SierraClass, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + Nonce, }; use crate::utils::transaction::{ compute_declare_v1_tx_hash, compute_declare_v2_tx_hash, compute_deploy_account_v1_tx_hash, @@ -97,7 +98,7 @@ impl ExecutableTxWithHash { #[derive(Debug, Clone, AsRef, Deref)] pub struct DeclareTxWithClass { /// The Sierra class, if any. - pub sierra_class: Option, + pub sierra_class: Option, /// The compiled contract class. pub compiled_class: CompiledContractClass, /// The raw transaction. @@ -109,7 +110,7 @@ pub struct DeclareTxWithClass { impl DeclareTxWithClass { pub fn new_with_classes( transaction: DeclareTx, - sierra_class: SierraClass, + sierra_class: FlattenedSierraClass, compiled_class: CompiledContractClass, ) -> Self { Self { sierra_class: Some(sierra_class), compiled_class, transaction } diff --git a/crates/katana/primitives/src/utils/class.rs b/crates/katana/primitives/src/utils/class.rs index 3f02812c5f..cfd3aa6c8d 100644 --- a/crates/katana/primitives/src/utils/class.rs +++ b/crates/katana/primitives/src/utils/class.rs @@ -2,7 +2,9 @@ use anyhow::Result; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use cairo_lang_starknet::contract_class::ContractClass; -use crate::contract::{CompiledContractClass, CompiledContractClassV0, CompiledContractClassV1}; +use crate::contract::{ + CompiledContractClass, CompiledContractClassV0, CompiledContractClassV1, SierraClass, +}; /// Parse a [`str`] into a [`CompiledContractClass`]. pub fn parse_compiled_class(class: &str) -> Result { @@ -24,3 +26,8 @@ pub fn parse_compiled_class_v1(class: &str) -> Result { pub fn parse_compiled_class_v0(class: &str) -> Result { Ok(serde_json::from_str(class)?) } + +/// Parse a [`str`] into a [`SierraClass`]. +pub fn parse_sierra_class(class: &str) -> Result { + Ok(serde_json::from_str(class)?) +} diff --git a/crates/katana/rpc/rpc-types/src/transaction.rs b/crates/katana/rpc/rpc-types/src/transaction.rs index dfea42172f..69f4f1740c 100644 --- a/crates/katana/rpc/rpc-types/src/transaction.rs +++ b/crates/katana/rpc/rpc-types/src/transaction.rs @@ -4,8 +4,8 @@ use anyhow::Result; use derive_more::Deref; use katana_primitives::contract::{ClassHash, ContractAddress}; use katana_primitives::conversion::rpc::{ - compiled_class_hash_from_flattened_sierra_class, legacy_rpc_to_inner_compiled_class, - sierra_to_compiled_class, + compiled_class_hash_from_flattened_sierra_class, flattened_sierra_to_compiled_class, + legacy_rpc_to_inner_compiled_class, }; use katana_primitives::transaction::{ DeclareTx, DeclareTxV1, DeclareTxV2, DeclareTxWithClass, DeployAccountTx, InvokeTx, TxHash, @@ -79,7 +79,8 @@ impl BroadcastedDeclareTx { BroadcastedDeclareTransaction::V2(tx) => { // TODO: avoid computing the class hash again - let (class_hash, _, compiled_class) = sierra_to_compiled_class(&tx.contract_class)?; + let (class_hash, _, compiled_class) = + flattened_sierra_to_compiled_class(&tx.contract_class)?; Ok(DeclareTxWithClass { compiled_class, diff --git a/crates/katana/rpc/tests/starknet.rs b/crates/katana/rpc/tests/starknet.rs index a0ece05aa2..08d29ca2a7 100644 --- a/crates/katana/rpc/tests/starknet.rs +++ b/crates/katana/rpc/tests/starknet.rs @@ -18,6 +18,8 @@ use starknet::core::types::{ use starknet::core::utils::{get_contract_address, get_selector_from_name}; use starknet::providers::Provider; +const WAIT_TX_DELAY_MILLIS: u64 = 1000; + #[tokio::test(flavor = "multi_thread")] async fn test_send_declare_and_deploy_contract() { let sequencer = @@ -31,7 +33,7 @@ async fn test_send_declare_and_deploy_contract() { let res = account.declare(Arc::new(contract), compiled_class_hash).send().await.unwrap(); // wait for the tx to be mined - tokio::time::sleep(Duration::from_millis(250)).await; + tokio::time::sleep(Duration::from_millis(WAIT_TX_DELAY_MILLIS)).await; let receipt = account.provider().get_transaction_receipt(res.transaction_hash).await.unwrap(); @@ -81,7 +83,7 @@ async fn test_send_declare_and_deploy_contract() { .unwrap(); // wait for the tx to be mined - tokio::time::sleep(Duration::from_millis(250)).await; + tokio::time::sleep(Duration::from_millis(WAIT_TX_DELAY_MILLIS)).await; assert_eq!( account @@ -110,7 +112,7 @@ async fn test_send_declare_and_deploy_legacy_contract() { let class_hash = contract_class.class_hash().unwrap(); let res = account.declare_legacy(contract_class).send().await.unwrap(); // wait for the tx to be mined - tokio::time::sleep(Duration::from_millis(250)).await; + tokio::time::sleep(Duration::from_millis(WAIT_TX_DELAY_MILLIS)).await; let receipt = account.provider().get_transaction_receipt(res.transaction_hash).await.unwrap(); @@ -160,7 +162,7 @@ async fn test_send_declare_and_deploy_legacy_contract() { .unwrap(); // wait for the tx to be mined - tokio::time::sleep(Duration::from_millis(250)).await; + tokio::time::sleep(Duration::from_millis(WAIT_TX_DELAY_MILLIS)).await; assert_eq!( account diff --git a/crates/katana/src/args.rs b/crates/katana/src/args.rs index d4e155deab..9d23d947e3 100644 --- a/crates/katana/src/args.rs +++ b/crates/katana/src/args.rs @@ -135,9 +135,13 @@ pub struct StarknetOptions { pub total_accounts: u8, #[arg(long)] - #[arg(help = "Disable charging fee for transactions.")] + #[arg(help = "Disable charging fee when executing transactions.")] pub disable_fee: bool, + #[arg(long)] + #[arg(help = "Disable validation when executing transactions.")] + pub disable_validate: bool, + #[command(flatten)] #[command(next_help_heading = "Environment options")] pub environment: EnvironmentOptions, @@ -211,6 +215,7 @@ impl KatanaArgs { total_accounts: self.starknet.total_accounts, seed: parse_seed(&self.starknet.seed), disable_fee: self.starknet.disable_fee, + disable_validate: self.starknet.disable_validate, fork_rpc_url: self.rpc_url.clone(), fork_block_number: self.fork_block_number, env: Environment { diff --git a/crates/katana/storage/db/src/codecs/mod.rs b/crates/katana/storage/db/src/codecs/mod.rs index 346659e76b..622e96921b 100644 --- a/crates/katana/storage/db/src/codecs/mod.rs +++ b/crates/katana/storage/db/src/codecs/mod.rs @@ -2,7 +2,7 @@ pub mod postcard; use katana_primitives::block::FinalityStatus; -use katana_primitives::contract::{ContractAddress, SierraClass}; +use katana_primitives::contract::{ContractAddress, FlattenedSierraClass}; use katana_primitives::FieldElement; use crate::error::CodecError; @@ -72,14 +72,14 @@ macro_rules! impl_encode_and_decode_for_felts { impl_encode_and_decode_for_uints!(u64); impl_encode_and_decode_for_felts!(FieldElement, ContractAddress); -impl Compress for SierraClass { +impl Compress for FlattenedSierraClass { type Compressed = Vec; fn compress(self) -> Self::Compressed { serde_json::to_vec(&self).unwrap() } } -impl Decompress for SierraClass { +impl Decompress for FlattenedSierraClass { fn decompress>(bytes: B) -> Result { serde_json::from_slice(bytes.as_ref()).map_err(|e| CodecError::Decode(e.to_string())) } diff --git a/crates/katana/storage/db/src/tables.rs b/crates/katana/storage/db/src/tables.rs index df6facb002..4af836df20 100644 --- a/crates/katana/storage/db/src/tables.rs +++ b/crates/katana/storage/db/src/tables.rs @@ -1,6 +1,7 @@ use katana_primitives::block::{BlockHash, BlockNumber, FinalityStatus, Header}; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, ContractAddress, GenericContractInfo, SierraClass, StorageKey, + ClassHash, CompiledClassHash, ContractAddress, FlattenedSierraClass, GenericContractInfo, + StorageKey, }; use katana_primitives::receipt::Receipt; use katana_primitives::transaction::{Tx, TxHash, TxNumber}; @@ -198,7 +199,7 @@ tables! { /// Store compiled contract classes according to its compiled class hash CompiledContractClasses: (ClassHash) => StoredContractClass, /// Store Sierra classes according to its class hash - SierraClasses: (ClassHash) => SierraClass, + SierraClasses: (ClassHash) => FlattenedSierraClass, /// Store contract information according to its contract address ContractInfo: (ContractAddress) => GenericContractInfo, /// Store contract storage diff --git a/crates/katana/storage/provider/src/lib.rs b/crates/katana/storage/provider/src/lib.rs index ce11642b2d..351cdbd2d4 100644 --- a/crates/katana/storage/provider/src/lib.rs +++ b/crates/katana/storage/provider/src/lib.rs @@ -7,8 +7,8 @@ use katana_primitives::block::{ SealedBlockWithStatus, }; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - SierraClass, StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, StorageKey, StorageValue, }; use katana_primitives::receipt::Receipt; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; @@ -228,7 +228,7 @@ where self.provider.class(hash) } - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { self.provider.sierra_class(hash) } } @@ -289,7 +289,7 @@ where self.provider.set_compiled_class_hash_of_class_hash(hash, compiled_hash) } - fn set_sierra_class(&self, hash: ClassHash, sierra: SierraClass) -> Result<()> { + fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) -> Result<()> { self.provider.set_sierra_class(hash, sierra) } } diff --git a/crates/katana/storage/provider/src/providers/db/state.rs b/crates/katana/storage/provider/src/providers/db/state.rs index 88ecb50144..e302a58c91 100644 --- a/crates/katana/storage/provider/src/providers/db/state.rs +++ b/crates/katana/storage/provider/src/providers/db/state.rs @@ -13,8 +13,8 @@ use katana_db::tables::{ }; use katana_primitives::block::BlockNumber; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - Nonce, SierraClass, StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, Nonce, StorageKey, StorageValue, }; use super::DbProvider; @@ -92,7 +92,7 @@ impl ContractClassWriter for DbProvider { })? } - fn set_sierra_class(&self, hash: ClassHash, sierra: SierraClass) -> Result<()> { + fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) -> Result<()> { self.0.update(move |db_tx| -> Result<()> { db_tx.put::(hash, sierra)?; Ok(()) @@ -123,7 +123,7 @@ impl ContractClassProvider for LatestStateProvider { Ok(hash) } - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { let class = self.0.get::(hash)?; Ok(class) } @@ -228,7 +228,7 @@ impl ContractClassProvider for HistoricalStateProvider { } } - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { if self.compiled_class_hash_of_class_hash(hash)?.is_some() { self.tx.get::(hash).map_err(|e| e.into()) } else { diff --git a/crates/katana/storage/provider/src/providers/fork/backend.rs b/crates/katana/storage/provider/src/providers/fork/backend.rs index 885974482f..d8c143ff65 100644 --- a/crates/katana/storage/provider/src/providers/fork/backend.rs +++ b/crates/katana/storage/provider/src/providers/fork/backend.rs @@ -12,12 +12,12 @@ use futures::stream::Stream; use futures::{Future, FutureExt}; use katana_primitives::block::BlockHashOrNumber; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - Nonce, SierraClass, StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, Nonce, StorageKey, StorageValue, }; use katana_primitives::conversion::rpc::{ - compiled_class_hash_from_flattened_sierra_class, legacy_rpc_to_inner_compiled_class, - sierra_to_compiled_class, + compiled_class_hash_from_flattened_sierra_class, flattened_sierra_to_compiled_class, + legacy_rpc_to_inner_compiled_class, }; use katana_primitives::FieldElement; use parking_lot::Mutex; @@ -389,7 +389,7 @@ impl StateProvider for SharedStateProvider { } impl ContractClassProvider for SharedStateProvider { - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { if let class @ Some(_) = self.0.shared_contract_classes.sierra_classes.read().get(&hash) { return Ok(class.cloned()); } @@ -463,7 +463,7 @@ impl ContractClassProvider for SharedStateProvider { } ContractClass::Sierra(sierra_class) => { - let (_, compiled_class_hash, compiled_class) = sierra_to_compiled_class(&sierra_class).map_err(|e|{ + let (_, compiled_class_hash, compiled_class) = flattened_sierra_to_compiled_class(&sierra_class).map_err(|e|{ error!(target: "forked_backend", "error while parsing sierra class {hash:#x}: {e}"); e })?; diff --git a/crates/katana/storage/provider/src/providers/fork/mod.rs b/crates/katana/storage/provider/src/providers/fork/mod.rs index 04e9a59c6e..a995c1513d 100644 --- a/crates/katana/storage/provider/src/providers/fork/mod.rs +++ b/crates/katana/storage/provider/src/providers/fork/mod.rs @@ -11,7 +11,7 @@ use katana_primitives::block::{ SealedBlockWithStatus, }; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, SierraClass, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, }; use katana_primitives::receipt::Receipt; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; @@ -446,7 +446,7 @@ impl ContractClassWriter for ForkedProvider { Ok(()) } - fn set_sierra_class(&self, hash: ClassHash, sierra: SierraClass) -> Result<()> { + fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) -> Result<()> { self.state.shared_contract_classes.sierra_classes.write().insert(hash, sierra); Ok(()) } diff --git a/crates/katana/storage/provider/src/providers/fork/state.rs b/crates/katana/storage/provider/src/providers/fork/state.rs index bee548a930..5f9b5482f6 100644 --- a/crates/katana/storage/provider/src/providers/fork/state.rs +++ b/crates/katana/storage/provider/src/providers/fork/state.rs @@ -2,8 +2,8 @@ use std::sync::Arc; use anyhow::Result; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - Nonce, SierraClass, StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, Nonce, StorageKey, StorageValue, }; use super::backend::SharedStateProvider; @@ -63,7 +63,7 @@ impl StateProvider for ForkedStateDb { } impl ContractClassProvider for CacheStateDb { - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { if let class @ Some(_) = self.shared_contract_classes.sierra_classes.read().get(&hash) { return Ok(class.cloned()); } @@ -115,7 +115,7 @@ impl StateProvider for LatestStateProvider { } impl ContractClassProvider for LatestStateProvider { - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { ContractClassProvider::sierra_class(&self.0, hash) } @@ -172,7 +172,7 @@ impl StateProvider for ForkedSnapshot { } impl ContractClassProvider for ForkedSnapshot { - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { if self.inner.compiled_class_hashes.get(&hash).is_some() { Ok(self.classes.sierra_classes.read().get(&hash).cloned()) } else { diff --git a/crates/katana/storage/provider/src/providers/in_memory/cache.rs b/crates/katana/storage/provider/src/providers/in_memory/cache.rs index 960d5307be..43ad2a33e8 100644 --- a/crates/katana/storage/provider/src/providers/in_memory/cache.rs +++ b/crates/katana/storage/provider/src/providers/in_memory/cache.rs @@ -4,8 +4,8 @@ use std::sync::Arc; use katana_db::models::block::StoredBlockBodyIndices; use katana_primitives::block::{BlockHash, BlockNumber, FinalityStatus, Header}; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - SierraClass, StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, StorageKey, StorageValue, }; use katana_primitives::receipt::Receipt; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; @@ -15,7 +15,7 @@ use parking_lot::RwLock; type ContractStorageMap = HashMap>; type ContractStateMap = HashMap; -type SierraClassesMap = HashMap; +type SierraClassesMap = HashMap; type CompiledClassesMap = HashMap; type CompiledClassHashesMap = HashMap; diff --git a/crates/katana/storage/provider/src/providers/in_memory/mod.rs b/crates/katana/storage/provider/src/providers/in_memory/mod.rs index 7cb6e77cc1..a0f0026086 100644 --- a/crates/katana/storage/provider/src/providers/in_memory/mod.rs +++ b/crates/katana/storage/provider/src/providers/in_memory/mod.rs @@ -11,7 +11,7 @@ use katana_primitives::block::{ SealedBlockWithStatus, }; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, SierraClass, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, }; use katana_primitives::receipt::Receipt; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; @@ -443,7 +443,7 @@ impl ContractClassWriter for InMemoryProvider { Ok(()) } - fn set_sierra_class(&self, hash: ClassHash, sierra: SierraClass) -> Result<()> { + fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) -> Result<()> { self.state.shared_contract_classes.sierra_classes.write().insert(hash, sierra); Ok(()) } diff --git a/crates/katana/storage/provider/src/providers/in_memory/state.rs b/crates/katana/storage/provider/src/providers/in_memory/state.rs index dcce6de21a..c12c3bdfec 100644 --- a/crates/katana/storage/provider/src/providers/in_memory/state.rs +++ b/crates/katana/storage/provider/src/providers/in_memory/state.rs @@ -3,8 +3,8 @@ use std::sync::Arc; use katana_primitives::block::BlockNumber; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - Nonce, SierraClass, StorageKey, StorageValue, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, Nonce, StorageKey, StorageValue, }; use super::cache::{CacheSnapshotWithoutClasses, CacheStateDb, SharedContractClasses}; @@ -146,7 +146,7 @@ impl StateProvider for InMemorySnapshot { } impl ContractClassProvider for InMemorySnapshot { - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { if self.compiled_class_hash_of_class_hash(hash)?.is_some() { Ok(self.classes.sierra_classes.read().get(&hash).cloned()) } else { @@ -202,7 +202,7 @@ impl StateProvider for LatestStateProvider { } impl ContractClassProvider for LatestStateProvider { - fn sierra_class(&self, hash: ClassHash) -> Result> { + fn sierra_class(&self, hash: ClassHash) -> Result> { let class = self.0.shared_contract_classes.sierra_classes.read().get(&hash).cloned(); Ok(class) } diff --git a/crates/katana/storage/provider/src/traits/contract.rs b/crates/katana/storage/provider/src/traits/contract.rs index 4645913ccb..deb172b627 100644 --- a/crates/katana/storage/provider/src/traits/contract.rs +++ b/crates/katana/storage/provider/src/traits/contract.rs @@ -1,7 +1,7 @@ use anyhow::Result; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, GenericContractInfo, - SierraClass, + ClassHash, CompiledClassHash, CompiledContractClass, ContractAddress, FlattenedSierraClass, + GenericContractInfo, }; #[auto_impl::auto_impl(&, Box, Arc)] @@ -23,7 +23,7 @@ pub trait ContractClassProvider: Send + Sync { fn class(&self, hash: ClassHash) -> Result>; /// Retrieves the Sierra class definition of a contract class given its class hash. - fn sierra_class(&self, hash: ClassHash) -> Result>; + fn sierra_class(&self, hash: ClassHash) -> Result>; } // TEMP: added mainly for compatibility reason. might be removed in the future. @@ -40,5 +40,5 @@ pub trait ContractClassWriter: Send + Sync { fn set_class(&self, hash: ClassHash, class: CompiledContractClass) -> Result<()>; /// Retrieves the Sierra class definition of a contract class given its class hash. - fn set_sierra_class(&self, hash: ClassHash, sierra: SierraClass) -> Result<()>; + fn set_sierra_class(&self, hash: ClassHash, sierra: FlattenedSierraClass) -> Result<()>; } diff --git a/crates/katana/storage/provider/tests/class.rs b/crates/katana/storage/provider/tests/class.rs index 2fb15a3cea..8ab6cbaf4a 100644 --- a/crates/katana/storage/provider/tests/class.rs +++ b/crates/katana/storage/provider/tests/class.rs @@ -8,7 +8,7 @@ use fixtures::{ use katana_core::constants::{ERC20_CONTRACT, UDC_CONTRACT}; use katana_primitives::block::{BlockHashOrNumber, BlockNumber}; use katana_primitives::contract::{ - ClassHash, CompiledClassHash, CompiledContractClass, SierraClass, + ClassHash, CompiledClassHash, CompiledContractClass, FlattenedSierraClass, }; use katana_provider::providers::fork::ForkedProvider; use katana_provider::providers::in_memory::InMemoryProvider; @@ -17,8 +17,12 @@ use katana_provider::BlockchainProvider; use rstest_reuse::{self, *}; use starknet::macros::felt; -type ClassHashAndClasses = - (ClassHash, Option, Option, Option); +type ClassHashAndClasses = ( + ClassHash, + Option, + Option, + Option, +); fn assert_state_provider_class( state_provider: Box, diff --git a/crates/katana/storage/provider/tests/fixtures.rs b/crates/katana/storage/provider/tests/fixtures.rs index 3dacb8735d..3c5c6af25a 100644 --- a/crates/katana/storage/provider/tests/fixtures.rs +++ b/crates/katana/storage/provider/tests/fixtures.rs @@ -6,7 +6,9 @@ use katana_db::mdbx; use katana_primitives::block::{ BlockHashOrNumber, FinalityStatus, Header, SealedBlock, SealedBlockWithStatus, SealedHeader, }; -use katana_primitives::contract::{CompiledContractClass, ContractAddress, SierraClass}; +use katana_primitives::contract::{ + CompiledContractClass, ContractAddress, FlattenedSierraClass, SierraClass, +}; use katana_primitives::state::{StateUpdates, StateUpdatesWithDeclaredClasses}; use katana_primitives::utils::class::parse_compiled_class; use katana_provider::providers::db::DbProvider; @@ -30,8 +32,8 @@ lazy_static! { pub static ref DOJO_WORLD_COMPILED_CLASS: CompiledContractClass = parse_compiled_class(include_str!("../../db/benches/artifacts/dojo_world_240.json")) .unwrap(); - pub static ref DOJO_WORLD_SIERRA_CLASS: SierraClass = { - let sierra_class: starknet::core::types::contract::SierraClass = + pub static ref DOJO_WORLD_SIERRA_CLASS: FlattenedSierraClass = { + let sierra_class: SierraClass = serde_json::from_str(include_str!("../../db/benches/artifacts/dojo_world_240.json")) .unwrap(); sierra_class.flatten().unwrap() diff --git a/crates/sozo/src/commands/options/account.rs b/crates/sozo/src/commands/options/account.rs index 7aa027a7bc..ad91c21ce8 100644 --- a/crates/sozo/src/commands/options/account.rs +++ b/crates/sozo/src/commands/options/account.rs @@ -55,11 +55,7 @@ impl AccountOptions { signer, account_address, chain_id, - // This is made under the assumption that the accounts used with `sozo` commands would - // be one of the `katana` dev accounts. The dev accounts deployed on `katana` are - // legacy accounts (Cairo 0). - // TODO: Make this configurable - ExecutionEncoding::Legacy, + ExecutionEncoding::New, )) } diff --git a/crates/sozo/src/ops/migration/migration_test.rs b/crates/sozo/src/ops/migration/migration_test.rs index 02742afd16..14e8a8b658 100644 --- a/crates/sozo/src/ops/migration/migration_test.rs +++ b/crates/sozo/src/ops/migration/migration_test.rs @@ -80,7 +80,7 @@ async fn migrate_with_small_fee_multiplier_will_fail() { )), sequencer.raw_account().account_address, chain_id::TESTNET, - ExecutionEncoding::Legacy, + ExecutionEncoding::New, ); assert!( @@ -125,7 +125,7 @@ async fn migration_from_remote() { )), sequencer.raw_account().account_address, chain_id::TESTNET, - ExecutionEncoding::Legacy, + ExecutionEncoding::New, ); let manifest = Manifest::load_from_path(target_dir.join("manifest.json")).unwrap(); diff --git a/crates/torii/types-test/Scarb.lock b/crates/torii/types-test/Scarb.lock index 49eb278bdc..554df2c397 100644 --- a/crates/torii/types-test/Scarb.lock +++ b/crates/torii/types-test/Scarb.lock @@ -15,7 +15,7 @@ source = "git+https://github.com/dojoengine/dojo?tag=v0.3.11#1e651b5d4d3b79b14a7 [[package]] name = "types_test" -version = "0.4.1" +version = "0.4.4" dependencies = [ "dojo", ] diff --git a/crates/torii/types-test/Scarb.toml b/crates/torii/types-test/Scarb.toml index c1c2085b08..261261212c 100644 --- a/crates/torii/types-test/Scarb.toml +++ b/crates/torii/types-test/Scarb.toml @@ -10,7 +10,7 @@ sierra-replace-ids = true dojo = { path = "../../dojo-core" } [[target.dojo]] -build-external-contracts = [] +build-external-contracts = [ ] #[tool.dojo.world] #name = "types-test" @@ -21,6 +21,6 @@ build-external-contracts = [] # socials.x = "https://twitter.com/dojostarknet" [tool.dojo.env] -rpc_url = "http://localhost:5050/" -account_address = "0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973" +account_address = "0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624" private_key = "0x1800000000300000180000000000030000000000003006001800006600" +rpc_url = "http://localhost:5050/" diff --git a/examples/rpc/starknet/starknet_getClass.hurl b/examples/rpc/starknet/starknet_getClass.hurl index a52b0b27c6..1d76919b52 100644 --- a/examples/rpc/starknet/starknet_getClass.hurl +++ b/examples/rpc/starknet/starknet_getClass.hurl @@ -5,7 +5,7 @@ Content-Type: application/json "method": "starknet_getClass", "params": [ "latest", - "0x02a8846878b6ad1f54f6ba46f5f40e11cee755c677f130b2c4b60566c9003f1f" + "0x016c6081eb34ad1e0c5513234ed0c025b3c7f305902d291bad534cd6474c85bc" ], "id":1 } diff --git a/examples/rpc/starknet/starknet_getClassAt.hurl b/examples/rpc/starknet/starknet_getClassAt.hurl index c7ac14c1c0..fe0a0a4ff0 100644 --- a/examples/rpc/starknet/starknet_getClassAt.hurl +++ b/examples/rpc/starknet/starknet_getClassAt.hurl @@ -5,7 +5,7 @@ Content-Type: application/json "method": "starknet_getClassAt", "params": [ "latest", - "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7" + "0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624" ], "id":1 } diff --git a/examples/rpc/starknet/starknet_getClassHashAt.hurl b/examples/rpc/starknet/starknet_getClassHashAt.hurl index ecbfc0251f..83238f1469 100644 --- a/examples/rpc/starknet/starknet_getClassHashAt.hurl +++ b/examples/rpc/starknet/starknet_getClassHashAt.hurl @@ -5,7 +5,7 @@ Content-Type: application/json "method": "starknet_getClassHashAt", "params": [ "pending", - "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7" + "0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624" ], "id": 1 } diff --git a/examples/rpc/starknet/starknet_getNonce.hurl b/examples/rpc/starknet/starknet_getNonce.hurl index f95bee24e2..57a08672e8 100644 --- a/examples/rpc/starknet/starknet_getNonce.hurl +++ b/examples/rpc/starknet/starknet_getNonce.hurl @@ -5,7 +5,7 @@ Content-Type: application/json "method": "starknet_getNonce", "params": [ "latest", - "0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973" + "0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624" ], "id":1 } diff --git a/examples/spawn-and-move/Scarb.lock b/examples/spawn-and-move/Scarb.lock index e2260b3142..ca51af1a48 100644 --- a/examples/spawn-and-move/Scarb.lock +++ b/examples/spawn-and-move/Scarb.lock @@ -10,7 +10,7 @@ dependencies = [ [[package]] name = "dojo_examples" -version = "0.4.2" +version = "0.4.4" dependencies = [ "dojo", ] diff --git a/examples/spawn-and-move/Scarb.toml b/examples/spawn-and-move/Scarb.toml index 7b95bad166..7662632bfb 100644 --- a/examples/spawn-and-move/Scarb.toml +++ b/examples/spawn-and-move/Scarb.toml @@ -23,6 +23,6 @@ name = "example" rpc_url = "http://localhost:5050/" # Default account for katana with seed = 0 -account_address = "0x517ececd29116499f4a1b64b094da79ba08dfd54a3edaa316134c41f8160973" +account_address = "0x9238c8ca6b3c6ab45a793593b13d98797ccd3bda179d313553e51fee114624" private_key = "0x1800000000300000180000000000030000000000003006001800006600" world_address = "0x5010c31f127114c6198df8a5239e2b7a5151e1156fb43791e37e7385faa8138" From 37f41d585f549013a73ca189034b0471f1e81731 Mon Sep 17 00:00:00 2001 From: glihm Date: Thu, 4 Jan 2024 10:08:56 -0600 Subject: [PATCH 16/16] fix: use module instead of file path for abigen (#1339) * fix: use module instead of file path for abigen * add binding gen during compilation * display error message * move the binding generation to a dedicated tool * add README info for binding generation * add autogenerated warning * fix pretty print json for generated rust module * Update crates/dojo-world/abigen/Cargo.toml Co-authored-by: Ammar Arif --------- Co-authored-by: Ammar Arif --- .github/workflows/ci.yml | 9 ++ Cargo.lock | 20 ++- Cargo.toml | 1 + crates/dojo-lang/src/scarb_internal/mod.rs | 4 +- crates/dojo-world/Cargo.toml | 2 +- crates/dojo-world/abigen/Cargo.toml | 14 ++ crates/dojo-world/abigen/src/main.rs | 133 ++++++++++++++++++ crates/dojo-world/src/contracts/abi/README.md | 15 +- .../abi/{executor.json => executor.rs} | 11 +- crates/dojo-world/src/contracts/abi/mod.rs | 2 + .../contracts/abi/{world.json => world.rs} | 11 +- crates/dojo-world/src/contracts/mod.rs | 2 + crates/dojo-world/src/contracts/world.rs | 20 +-- 13 files changed, 206 insertions(+), 38 deletions(-) create mode 100644 crates/dojo-world/abigen/Cargo.toml create mode 100644 crates/dojo-world/abigen/src/main.rs rename crates/dojo-world/src/contracts/abi/{executor.json => executor.rs} (84%) create mode 100644 crates/dojo-world/src/contracts/abi/mod.rs rename crates/dojo-world/src/contracts/abi/{world.json => world.rs} (98%) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index abd5c036bd..b5042e6ebd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -76,6 +76,15 @@ jobs: - uses: Swatinem/rust-cache@v2 - run: cargo run --bin sozo -- --manifest-path examples/spawn-and-move/Scarb.toml test + dojo-world-bindings-check: + runs-on: ubuntu-latest + container: + image: ghcr.io/dojoengine/dojo-dev:448ffda + steps: + - uses: actions/checkout@v3 + - uses: Swatinem/rust-cache@v2 + - run: cargo run --bin dojo-world-abigen -- --check + clippy: runs-on: ubuntu-latest container: diff --git a/Cargo.lock b/Cargo.lock index c2ce01f4e4..9403e074b1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1111,7 +1111,7 @@ checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663" [[package]] name = "cainome" version = "0.1.5" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.7#2d4b52b2e79796f76fba9e3a1b1027e8e63292b8" +source = "git+https://github.com/cartridge-gg/cainome?rev=950e487#950e4871b735a1b4a7ba7e7561b9a15f5a43dbed" dependencies = [ "cainome-cairo-serde", "cainome-parser", @@ -1121,7 +1121,7 @@ dependencies = [ [[package]] name = "cainome-cairo-serde" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.7#2d4b52b2e79796f76fba9e3a1b1027e8e63292b8" +source = "git+https://github.com/cartridge-gg/cainome?rev=950e487#950e4871b735a1b4a7ba7e7561b9a15f5a43dbed" dependencies = [ "starknet", "thiserror", @@ -1130,7 +1130,7 @@ dependencies = [ [[package]] name = "cainome-parser" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.7#2d4b52b2e79796f76fba9e3a1b1027e8e63292b8" +source = "git+https://github.com/cartridge-gg/cainome?rev=950e487#950e4871b735a1b4a7ba7e7561b9a15f5a43dbed" dependencies = [ "quote", "serde_json", @@ -1142,7 +1142,7 @@ dependencies = [ [[package]] name = "cainome-rs" version = "0.1.0" -source = "git+https://github.com/cartridge-gg/cainome?tag=v0.1.7#2d4b52b2e79796f76fba9e3a1b1027e8e63292b8" +source = "git+https://github.com/cartridge-gg/cainome?rev=950e487#950e4871b735a1b4a7ba7e7561b9a15f5a43dbed" dependencies = [ "anyhow", "cainome-cairo-serde", @@ -2825,6 +2825,18 @@ dependencies = [ "url", ] +[[package]] +name = "dojo-world-abigen" +version = "0.1.0" +dependencies = [ + "cairo-lang-starknet", + "camino", + "scarb", + "scarb-ui", + "serde", + "serde_json", +] + [[package]] name = "dotenvy" version = "0.15.7" diff --git a/Cargo.toml b/Cargo.toml index e8d490c2d3..e298885dc1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,6 +10,7 @@ members = [ "crates/dojo-test-utils", "crates/dojo-types", "crates/dojo-world", + "crates/dojo-world/abigen", "crates/katana", "crates/katana/core", "crates/katana/executor", diff --git a/crates/dojo-lang/src/scarb_internal/mod.rs b/crates/dojo-lang/src/scarb_internal/mod.rs index bf104e7457..ec8cd9857a 100644 --- a/crates/dojo-lang/src/scarb_internal/mod.rs +++ b/crates/dojo-lang/src/scarb_internal/mod.rs @@ -35,13 +35,13 @@ pub fn crates_config_for_compilation_unit(unit: &CompilationUnit) -> AllCratesCo AllCratesConfig { override_map: crates_config, ..Default::default() } } -// TODO(mkaput): ScarbDatabase? +/// Builds the scarb root database injecting the dojo plugin suite, additionaly to the +/// default Starknet and Test suites. pub fn build_scarb_root_database(unit: &CompilationUnit) -> Result { let mut b = RootDatabase::builder(); b.with_project_config(build_project_config(unit)?); b.with_cfg(unit.cfg_set.clone()); - // TODO: Is it fair to consider only those plugins at the moment? b.with_plugin_suite(test_plugin_suite()); b.with_plugin_suite(dojo_plugin_suite()); b.with_plugin_suite(starknet_plugin_suite()); diff --git a/crates/dojo-world/Cargo.toml b/crates/dojo-world/Cargo.toml index cbedf2fa5e..5f7a534c4e 100644 --- a/crates/dojo-world/Cargo.toml +++ b/crates/dojo-world/Cargo.toml @@ -24,7 +24,7 @@ starknet.workspace = true thiserror.workspace = true tracing.workspace = true -cainome = { git = "https://github.com/cartridge-gg/cainome", tag = "v0.1.7", features = ["abigen-rs"] } +cainome = { git = "https://github.com/cartridge-gg/cainome", rev = "950e487", features = ["abigen-rs"] } dojo-types = { path = "../dojo-types", optional = true } http = { version = "0.2.9", optional = true } ipfs-api-backend-hyper = { git = "https://github.com/ferristseng/rust-ipfs-api", rev = "af2c17f7b19ef5b9898f458d97a90055c3605633", features = [ "with-hyper-rustls" ], optional = true } diff --git a/crates/dojo-world/abigen/Cargo.toml b/crates/dojo-world/abigen/Cargo.toml new file mode 100644 index 0000000000..267f9fd16c --- /dev/null +++ b/crates/dojo-world/abigen/Cargo.toml @@ -0,0 +1,14 @@ +[package] +name = "dojo-world-abigen" +version.workspace = true +edition.workspace = true + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +camino.workspace = true +scarb-ui.workspace = true +scarb.workspace = true +serde.workspace = true +serde_json.workspace = true +cairo-lang-starknet.workspace = true diff --git a/crates/dojo-world/abigen/src/main.rs b/crates/dojo-world/abigen/src/main.rs new file mode 100644 index 0000000000..f7d00521cc --- /dev/null +++ b/crates/dojo-world/abigen/src/main.rs @@ -0,0 +1,133 @@ +/// Script that generates the bindings for World and Executor contracts. +use std::fs::{self, File}; +use std::io::Write; +use std::path::Path; + +use cairo_lang_starknet::contract_class::ContractClass; +use camino::Utf8PathBuf; +use scarb::core::{Config, TargetKind}; +use scarb::ops::CompileOpts; + +const SCARB_MANIFEST: &str = "crates/dojo-core/Scarb.toml"; +const SCARB_MANIFEST_BACKUP: &str = "crates/dojo-core/bak.Scarb.toml"; +const SCARB_LOCK: &str = "crates/dojo-core/Scarb.lock"; +const SCARB_LOCK_BACKUP: &str = "crates/dojo-core/bak.Scarb.lock"; +const WORLD_ARTIFACT: &str = "crates/dojo-core/target/dev/dojo_world.contract_class.json"; +const EXECUTOR_ARTIFACT: &str = "crates/dojo-core/target/dev/dojo_executor.contract_class.json"; +const OUT_DIR: &str = "crates/dojo-world/src/contracts/abi"; + +fn define_check_only() -> bool { + let args: Vec<_> = std::env::args().collect(); + + args.len() > 1 && args[1] == "--check" +} + +fn main() { + let is_check_only = define_check_only(); + + compile_dojo_core(); + + generate_bindings("WorldContract", WORLD_ARTIFACT, "world.rs", is_check_only); + generate_bindings("ExecutorContract", EXECUTOR_ARTIFACT, "executor.rs", is_check_only); +} + +/// Generates the bindings for the given contracts, or verifies +/// if the bindings are up to date. +fn generate_bindings( + contract_name: &str, + contract_artifact_path: &str, + bindings_filename: &str, + is_check_only: bool, +) { + let contract = + serde_json::from_reader::<_, ContractClass>(File::open(contract_artifact_path).unwrap()) + .expect("Could not read World Contract Class file"); + + let bindings = get_bindings_file_content(contract_name, contract); + let out_path = format!("{OUT_DIR}/{bindings_filename}"); + + if is_check_only { + if Path::new(&out_path).exists() { + let existing_bindings = fs::read_to_string(out_path).expect("Could not read file"); + + // Trim to remove the last empty line of the file. + if existing_bindings.trim() != bindings { + panic!( + "{contract_name} ABI bindings are not up to date. Consider generating them \ + running `cargo run -p dojo-world-abigen`" + ); + } + } else { + println!("No bindings found for {contract_name}, check skipped"); + } + } else { + write_file(&out_path, &bindings); + } +} + +fn rename_file(old_path: &str, new_path: &str) { + let o = Path::new(old_path); + let n = Path::new(new_path); + fs::rename(o, n) + .unwrap_or_else(|e| panic!("Could not rename file {old_path} into {new_path}: {e}")); +} + +fn write_file(file_path: &str, content: &str) { + let mut file = File::create(file_path).expect("Could not create file"); + writeln!(file, "{}", content).expect("Could not write Scarb.toml file"); +} + +/// Writes a binding file using cainome inlined ABI for the given contract. +fn get_bindings_file_content(contract_name: &str, contract_class: ContractClass) -> String { + format!( + "// AUTOGENERATED FILE, DO NOT EDIT.\n// To generate the bindings, please run `cargo run \ + --bin dojo-world-abigen` instead.\nuse cainome::rs::abigen;\n\nabigen!(\n {},\n \ + r#\"{}\"#\n);", + contract_name, + serde_json::to_string_pretty(&contract_class.abi).unwrap() + ) +} + +/// Compiles dojo-core contracts targetting starknet contract without using dojo-plugin. +fn compile_dojo_core() { + rename_file(SCARB_MANIFEST, SCARB_MANIFEST_BACKUP); + + if Path::new(SCARB_LOCK).exists() { + rename_file(SCARB_LOCK, SCARB_LOCK_BACKUP); + } + + // Write new Scarb.toml file with starknet contract target. + let mut file = File::create(SCARB_MANIFEST).expect("Could not create file"); + writeln!( + file, + r#" +[package] +cairo-version = "2.4.0" +name = "dojo" +version = "0.4.4" + +[dependencies] +starknet = "2.4.0" + +[[target.starknet-contract]] +sierra = true +"#, + ) + .expect("Could not write Scarb.toml file"); + + let path = Utf8PathBuf::from(SCARB_MANIFEST); + let config = Config::builder(path.canonicalize_utf8().unwrap()).build().unwrap(); + let ws = scarb::ops::read_workspace(config.manifest_path(), &config) + .expect("Could not read Scarb workspace"); + let packages = ws.members().map(|p| p.id).collect(); + + scarb::ops::compile( + packages, + CompileOpts { include_targets: vec![], exclude_targets: vec![TargetKind::TEST] }, + &ws, + ) + .expect("Could not run Scarb compile"); + + rename_file(SCARB_MANIFEST_BACKUP, SCARB_MANIFEST); + rename_file(SCARB_LOCK_BACKUP, SCARB_LOCK); +} diff --git a/crates/dojo-world/src/contracts/abi/README.md b/crates/dojo-world/src/contracts/abi/README.md index 3985ecc602..e218c37e56 100644 --- a/crates/dojo-world/src/contracts/abi/README.md +++ b/crates/dojo-world/src/contracts/abi/README.md @@ -1,13 +1,10 @@ # Embedded ABI for contracts -Currently, the ABIs for `world` and `executor` are embedded in the repo. -To build them, consider the following: +To ease the re-use of `dojo-world` crate on other projects that are not aware of the whole dojo stack, the ABI used for binding generation are decoupled from the compilation process. -1. Change directory into `examples/spawn-and-move` at the root of the workspace. -2. Build the example with `sozo`. -3. Extract the ABI key only for `world` and `executor`: -``` -sozo build -jq .abi ./target/dev/dojo\:\:world\:\:world.json > ../../crates/dojo-world/src/contracts/abi/world.json -jq .abi ./target/dev/dojo\:\:executor\:\:executor.json > ../../crates/dojo-world/src/contracts/abi/executor.json +To generate the ABI in `world.rs` or `executor.rs`, please consider to run: +```bash +cargo run --bin dojo-world-abigen ``` + +The CI runs the same command with the `--check` argument, to ensure that the ABI that are inside the rust modules are still consistent with the latest version of `dojo-core` contracts. diff --git a/crates/dojo-world/src/contracts/abi/executor.json b/crates/dojo-world/src/contracts/abi/executor.rs similarity index 84% rename from crates/dojo-world/src/contracts/abi/executor.json rename to crates/dojo-world/src/contracts/abi/executor.rs index ad21e66317..653243644c 100644 --- a/crates/dojo-world/src/contracts/abi/executor.json +++ b/crates/dojo-world/src/contracts/abi/executor.rs @@ -1,4 +1,10 @@ -[ +// AUTOGENERATED FILE, DO NOT EDIT. +// To generate the bindings, please run `cargo run --bin dojo-world-abigen` instead. +use cainome::rs::abigen; + +abigen!( + ExecutorContract, + r#"[ { "type": "impl", "name": "Executor", @@ -50,4 +56,5 @@ "kind": "enum", "variants": [] } -] +]"# +); diff --git a/crates/dojo-world/src/contracts/abi/mod.rs b/crates/dojo-world/src/contracts/abi/mod.rs new file mode 100644 index 0000000000..2890b5d8e2 --- /dev/null +++ b/crates/dojo-world/src/contracts/abi/mod.rs @@ -0,0 +1,2 @@ +pub mod executor; +pub mod world; diff --git a/crates/dojo-world/src/contracts/abi/world.json b/crates/dojo-world/src/contracts/abi/world.rs similarity index 98% rename from crates/dojo-world/src/contracts/abi/world.json rename to crates/dojo-world/src/contracts/abi/world.rs index f1f0fa062b..de66ca66b0 100644 --- a/crates/dojo-world/src/contracts/abi/world.json +++ b/crates/dojo-world/src/contracts/abi/world.rs @@ -1,4 +1,10 @@ -[ +// AUTOGENERATED FILE, DO NOT EDIT. +// To generate the bindings, please run `cargo run --bin dojo-world-abigen` instead. +use cainome::rs::abigen; + +abigen!( + WorldContract, + r#"[ { "type": "impl", "name": "World", @@ -772,4 +778,5 @@ } ] } -] +]"# +); diff --git a/crates/dojo-world/src/contracts/mod.rs b/crates/dojo-world/src/contracts/mod.rs index 3c09618fc4..8200eb17a6 100644 --- a/crates/dojo-world/src/contracts/mod.rs +++ b/crates/dojo-world/src/contracts/mod.rs @@ -1,3 +1,5 @@ +mod abi; + pub mod cairo_utils; pub mod model; pub mod world; diff --git a/crates/dojo-world/src/contracts/world.rs b/crates/dojo-world/src/contracts/world.rs index b8bcfe9d2d..6f601c2236 100644 --- a/crates/dojo-world/src/contracts/world.rs +++ b/crates/dojo-world/src/contracts/world.rs @@ -11,29 +11,13 @@ use super::model::{ModelError, ModelRPCReader}; #[path = "world_test.rs"] pub(crate) mod test; -#[cfg(not(doctest))] pub mod abigen { pub mod world { - use cainome::rs::abigen; - abigen!(WorldContract, "crates/dojo-world/src/contracts/abi/world.json"); + pub use crate::contracts::abi::world::*; } pub mod executor { - use cainome::rs::abigen; - abigen!(ExecutorContract, "crates/dojo-world/src/contracts/abi/executor.json"); - } -} - -#[cfg(doctest)] -pub mod abigen { - pub mod world { - use cainome::rs::abigen; - abigen!(WorldContract, "src/contracts/abi/world.json"); - } - - pub mod executor { - use cainome::rs::abigen; - abigen!(ExecutorContract, "src/contracts/abi/executor.json"); + pub use crate::contracts::abi::executor::*; } }