From 0e0922477f0428ba7452f232f283128280cd1892 Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Wed, 23 Oct 2024 11:25:08 -0400 Subject: [PATCH 1/2] init --- Cargo.lock | 32 +++++++++-- crates/katana/cairo/Cargo.toml | 7 ++- crates/katana/contracts/Makefile | 23 ++++++++ crates/katana/contracts/Scarb.lock | 7 +++ crates/katana/contracts/Scarb.toml | 2 +- .../contracts/compiled/test_get_chain_id.json | 1 + .../contracts/test-contracts/Scarb.toml | 13 +++++ .../contracts/test-contracts/src/lib.cairo | 22 ++++++++ crates/katana/executor/Cargo.toml | 13 ++--- .../src/implementation/blockifier/utils.rs | 28 +--------- crates/katana/executor/tests/chain_id.rs | 56 +++++++++++++++++++ .../test-data/get_chain_id.contract.json | 1 + .../katana/primitives/src/genesis/constant.rs | 3 +- 13 files changed, 167 insertions(+), 41 deletions(-) create mode 100644 crates/katana/contracts/Makefile create mode 100644 crates/katana/contracts/compiled/test_get_chain_id.json create mode 100644 crates/katana/contracts/test-contracts/Scarb.toml create mode 100644 crates/katana/contracts/test-contracts/src/lib.cairo create mode 100644 crates/katana/executor/tests/chain_id.rs create mode 120000 crates/katana/executor/tests/test-data/get_chain_id.contract.json diff --git a/Cargo.lock b/Cargo.lock index 9e3018b297..31090e13e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -960,6 +960,15 @@ version = "1.0.89" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" +dependencies = [ + "derive_arbitrary", +] + [[package]] name = "arc-swap" version = "1.7.1" @@ -2001,7 +2010,7 @@ dependencies = [ [[package]] name = "blockifier" version = "0.8.0-rc.3" -source = "git+https://github.com/dojoengine/sequencer?tag=v0.8.0-rc3.1#dd69217cdec340f9b5267b781be38eef972ac401" +source = "git+https://github.com/dojoengine/sequencer?tag=v0.8.0-rc3.3#07f473f9385f1bce4cbd7d0d64b5396f6784bbf1" dependencies = [ "anyhow", "ark-ec", @@ -3104,6 +3113,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "58363ad8065ed891e3b14a8191b707677c7c7cb5b9d10030822506786d8d8108" dependencies = [ "anyhow", + "arbitrary", "bincode 2.0.0-rc.3", "bitvec", "generic-array", @@ -4321,6 +4331,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "derive_arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.77", +] + [[package]] name = "derive_builder" version = "0.20.1" @@ -8100,7 +8121,9 @@ dependencies = [ "alloy-primitives", "anyhow", "blockifier", + "cainome 0.2.3 (git+https://github.com/cartridge-gg/cainome?tag=v0.4.1)", "criterion", + "dojo-test-utils", "katana-cairo", "katana-primitives", "katana-provider", @@ -8539,7 +8562,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4979f22fdb869068da03c9f7528f8297c6fd2606bc3a4affe42e6a823fdb8da4" dependencies = [ "cfg-if", - "windows-targets 0.52.6", + "windows-targets 0.48.5", ] [[package]] @@ -13897,6 +13920,7 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9b889ee5734db8b3c8a6551135c16764bf4ce1ab4955fffbb2ac5b6706542b64" dependencies = [ + "arbitrary", "lambdaworks-crypto", "lambdaworks-math", "lazy_static", @@ -13909,7 +13933,7 @@ dependencies = [ [[package]] name = "starknet_api" version = "0.13.0-rc.1" -source = "git+https://github.com/dojoengine/sequencer?tag=v0.8.0-rc3.1#dd69217cdec340f9b5267b781be38eef972ac401" +source = "git+https://github.com/dojoengine/sequencer?tag=v0.8.0-rc3.3#07f473f9385f1bce4cbd7d0d64b5396f6784bbf1" dependencies = [ "bitvec", "cairo-lang-starknet-classes", @@ -16205,7 +16229,7 @@ version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.48.0", ] [[package]] diff --git a/crates/katana/cairo/Cargo.toml b/crates/katana/cairo/Cargo.toml index 09faeab388..163c3754f0 100644 --- a/crates/katana/cairo/Cargo.toml +++ b/crates/katana/cairo/Cargo.toml @@ -18,4 +18,9 @@ cairo-lang-starknet = "2.7.0" cairo-lang-starknet-classes = "2.7.0" cairo-lang-utils = "2.7.0" cairo-vm = "1.0.1" -starknet_api = { git = "https://github.com/dojoengine/sequencer", tag = "v0.8.0-rc3.1" } +starknet_api = { git = "https://github.com/dojoengine/sequencer", tag = "v0.8.0-rc3.3" } + +[features] +# Some types that we used from cairo-vm implements the `Arbitrary` trait, +# only under the `test_utils` feature. So we expose through this feature. +cairo-vm-test-utils = [ "cairo-vm/test_utils" ] diff --git a/crates/katana/contracts/Makefile b/crates/katana/contracts/Makefile new file mode 100644 index 0000000000..a823eff8b7 --- /dev/null +++ b/crates/katana/contracts/Makefile @@ -0,0 +1,23 @@ +CONTRACT_CLASS_SUFFIX := .contract_class.json +COMPILED_CLASS_SUFFIX := .compiled_contract_class.json +# Directory where the compiled classes will be stored +BUILD_DIR := ./build + +## ---- Default Pre-deployed Account + +ORIGINAL_CLASS_NAME := katana_account_Account$(CONTRACT_CLASS_SUFFIX) +CLASS_NAME := default_account.json + +$(BUILD_DIR): ./account/src/* + scarb build -p katana_account + mv target/dev/$(ORIGINAL_CLASS_NAME) $(BUILD_DIR)/$(CLASS_NAME) + +## ---- Test Contracts + +# I only care about the casm class for this one, hence this +ORIGINAL_CLASS_NAME := katana_test_contracts_GetChainId$(CONTRACT_CLASS_SUFFIX) +CLASS_NAME := test_get_chain_id.json + +$(BUILD_DIR): ./test-contracts/src/* + scarb build -p katana_test_contracts + mv target/dev/$(ORIGINAL_CLASS_NAME) $(BUILD_DIR)/$(CLASS_NAME) diff --git a/crates/katana/contracts/Scarb.lock b/crates/katana/contracts/Scarb.lock index ccff40fa32..43238616a5 100644 --- a/crates/katana/contracts/Scarb.lock +++ b/crates/katana/contracts/Scarb.lock @@ -12,6 +12,13 @@ dependencies = [ name = "katana_messaging" version = "0.1.0" +[[package]] +name = "katana_test_contracts" +version = "0.1.0" +dependencies = [ + "openzeppelin", +] + [[package]] name = "openzeppelin" version = "0.17.0" diff --git a/crates/katana/contracts/Scarb.toml b/crates/katana/contracts/Scarb.toml index e90bdfe502..7c617ba4f1 100644 --- a/crates/katana/contracts/Scarb.toml +++ b/crates/katana/contracts/Scarb.toml @@ -1,5 +1,5 @@ [workspace] -members = [ "account", "messaging/cairo" ] +members = [ "account", "messaging/cairo", "test-contracts"] [workspace.package] version = "0.1.0" diff --git a/crates/katana/contracts/compiled/test_get_chain_id.json b/crates/katana/contracts/compiled/test_get_chain_id.json new file mode 100644 index 0000000000..83285f6291 --- /dev/null +++ b/crates/katana/contracts/compiled/test_get_chain_id.json @@ -0,0 +1 @@ +{"sierra_program":["0x1","0x6","0x0","0x2","0x8","0x2","0x81","0x7f","0x1d","0x52616e6765436865636b","0x800000000000000100000000000000000000000000000000","0x436f6e7374","0x800000000000000000000000000000000000000000000002","0x1","0xb","0x2","0x4f7574206f6620676173","0x4172726179","0x800000000000000300000000000000000000000000000001","0x536e617073686f74","0x800000000000000700000000000000000000000000000001","0x537472756374","0x800000000000000700000000000000000000000000000002","0x0","0x1baeba72e79e9db2587cf44fedb2f3700b2075a5e8e39a562584862c4b71f62","0x3","0x2ee1e2b1b89f8c495f200e4956278a4d47395fe262f27b52e5865c9524c08c3","0x4","0x753332","0x800000000000000700000000000000000000000000000000","0xd","0x7","0x1597b831feeb60c71f259624b79cf66995ea4f7e383403583674ab9c33b9cec","0x8","0x75313238","0x66656c74323532","0x753634","0x800000000000000700000000000000000000000000000004","0x3342418ef16b3e2799b906b1e4e89dbb9b111332dd44f72458ce44f9895b508","0xc","0xa","0x436f6e747261637441646472657373","0x80000000000000070000000000000000000000000000000e","0x348a62b7a38c0673e61e888d83a3ac1bf334ee7361a8514593d3d9532ed8b39","0xe","0x9","0x6","0x426f78","0xf","0x12","0x3808c701a5d13e100ab11b6c02f91f752ecae7e420d21b56c90ec0a475cc7e5","0x800000000000000700000000000000000000000000000006","0x7d4d99e9ed8d285b5c61b493cedb63976bc3d9da867933d829f49ce838b5e7","0x11","0x10","0x13","0x4275696c74696e436f737473","0x53797374656d","0x800000000000000f00000000000000000000000000000001","0x16a4c8d7c05909052238a862d8cc3e7975bf05a07b3a69c6b28951083a6d672","0x800000000000000300000000000000000000000000000003","0x17","0x456e756d","0x9931c641b913035ae674b400b61a51476d506bbe8bba2ff8a6272790aba9e6","0x5","0x18","0x496e70757420746f6f206c6f6e6720666f7220617267756d656e7473","0x4761734275696c74696e","0x29","0x7265766f6b655f61705f747261636b696e67","0x77697468647261775f676173","0x6272616e63685f616c69676e","0x7374727563745f6465636f6e737472756374","0x73746f72655f74656d70","0x61727261795f736e617073686f745f706f705f66726f6e74","0x64726f70","0x1b","0x61727261795f6e6577","0x636f6e73745f61735f696d6d656469617465","0x1a","0x61727261795f617070656e64","0x7374727563745f636f6e737472756374","0x656e756d5f696e6974","0x19","0x1c","0x16","0x6765745f6275696c74696e5f636f737473","0x15","0x77697468647261775f6761735f616c6c","0x6765745f657865637574696f6e5f696e666f5f76325f73797363616c6c","0x14","0x756e626f78","0x736e617073686f745f74616b65","0x65","0xffffffffffffffff","0x57","0x4a","0x41","0x1e","0x1f","0x20","0x21","0x22","0x23","0x24","0x25","0x26","0x27","0x28","0x2a","0x2b","0x2c","0x2d","0x2e","0x2f","0x30","0x31","0x32","0x33","0x34","0x35","0x36","0x37","0x38","0x39","0x3a","0x3b","0x3c","0x3d","0x3e","0x3f","0x40","0x42","0x43","0x44","0x45","0x46","0x470","0x15141305120f0e0d1105100f0e0d07050c0b06050a09080706050403020100","0x2120051f0506051e0f1d0d151c151b151a1905180f0e0d17050c0b16050a09","0x1305260526051305200525050605060506051305200524050605230f220d15","0x5240524052e052d052c0f2b0d24051f051f052a0f1d0d29050c2728050c27","0x40339053805370f343607053505120f340d330f320d023115302f050c2706","0x543060505420f050541130505400f3f0f3e0f3d3c023b06050c273a070605","0x4a390505493505054906050548060505414705054606050545440505431105","0x520505410f510f504f0505410f4e4b0505414d0505414c05054105074b0507","0x50540280505532e05054106050543240505432d0505432f0505402f050553","0x5491305054907050543070505542605054325050543130505432005054328","0x7573813075607050f07050f0f56050f0f0f55050505460f074b05074a3805","0x756071905380f130556051305130f190556051105110f0f56050f070f1726","0x556050f190f0f56052005170f0f56052505260f0f56050f070f06054f2025","0x556050f1f0f24055605161f07060f160556051605200f160556050f250f1f","0x53805280f130556051305130f2d0556052e05240f2e055605242807160f28","0xf56050f070f2d07381313052d0556052d052d0f0705560507052e0f380556","0x7560729381311520f2905560529052f0f290556050f290f0f56050605260f","0x4b39351156070752074f0f2f0556052f05130f0f56050f070f4d4f0758522f","0x5390f000556054b05350f4b0556054b054d0f0f56050f070f4c44471159","0x440f0f56055d05470f0f56055c05470f0f56055a054b0f5e5d5c5b5a385605","0x55a0f600556050f190f5f0556055b05000f5b0556055b054c0f0f56055e05","0xf56056205470f0f56056105440f6c6b6a69686766653c646362611656055f","0x55d0f0f56056605440f0f56053c05440f0f560564055c0f0f560563055b0f","0x56056b055e0f0f56056a055e0f0f560569055c0f0f560568055b0f0f560567","0x56056d055f0f6d055605656007060f650556056505200f0f56056c055c0f0f","0x57105630f710556057005620f700556056f05610f0f56056e05600f6f6e07","0x72052d0f3905560539052e0f350556053505280f2f0556052f05130f720556","0x556054c7307160f730556050f1f0f0f56050f070f7239352f130572055605","0x560544052e0f470556054705280f2f0556052f05130f750556057405240f74","0x640f760556050f190f0f56050f070f7544472f13057505560575052d0f4405","0x160f790556050f1f0f78055605777607060f770556057705200f770556050f","0x4d0556054d05280f4f0556054f05130f7b0556057a05240f7a055605787907","0x55c0f0f56050f070f7b074d4f13057b0556057b052d0f0705560507052e0f","0x7c5907060f7c0556057c05200f7c0556050f640f590556050f190f0f560511","0x5130f800556057f05240f7f0556057d7e07160f7e0556050f1f0f7d055605","0x13058005560580052d0f0705560507052e0f170556051705280f2605560526","0xf1107050f4b4d4c0f13134d4c0f130580071726"],"sierra_program_debug_info":{"type_names":[[0,"RangeCheck"],[1,"Const"],[2,"Array"],[3,"Snapshot>"],[4,"core::array::Span::"],[5,"Tuple>"],[6,"u32"],[7,"Array"],[8,"Snapshot>"],[9,"core::array::Span::"],[10,"u128"],[11,"felt252"],[12,"u64"],[13,"core::starknet::info::v2::ResourceBounds"],[14,"ContractAddress"],[15,"core::starknet::info::v2::TxInfo"],[16,"Box"],[17,"Box"],[18,"core::starknet::info::BlockInfo"],[19,"core::starknet::info::v2::ExecutionInfo"],[20,"Box"],[21,"BuiltinCosts"],[22,"System"],[23,"core::panics::Panic"],[24,"Tuple>"],[25,"core::panics::PanicResult::<(core::array::Span::,)>"],[26,"Const"],[27,"Box"],[28,"GasBuiltin"]],"libfunc_names":[[0,"revoke_ap_tracking"],[1,"withdraw_gas"],[2,"branch_align"],[3,"struct_deconstruct>"],[4,"store_temp"],[5,"array_snapshot_pop_front"],[6,"drop>>"],[7,"drop>"],[8,"array_new"],[9,"const_as_immediate>"],[10,"store_temp"],[11,"array_append"],[12,"struct_construct"],[13,"struct_construct>>"],[14,"enum_init,)>, 1>"],[15,"store_temp"],[16,"store_temp"],[17,"store_temp,)>>"],[18,"get_builtin_costs"],[19,"store_temp"],[20,"withdraw_gas_all"],[21,"get_execution_info_v2_syscall"],[22,"store_temp>"],[23,"unbox"],[24,"struct_deconstruct"],[25,"drop>"],[26,"drop"],[27,"drop"],[28,"store_temp>"],[29,"unbox"],[30,"struct_deconstruct"],[31,"drop"],[32,"drop>"],[33,"drop>"],[34,"drop"],[35,"snapshot_take>"],[36,"drop>"],[37,"struct_construct>"],[38,"struct_construct>>"],[39,"enum_init,)>, 0>"],[40,"const_as_immediate>"]],"user_func_names":[[0,"katana_test_contracts::GetChainId::__wrapper__GetChainId__get"]]},"contract_class_version":"0.1.0","entry_points_by_type":{"EXTERNAL":[{"selector":"0x17c00f03de8b5bd58d2016b59d251c13056b989171c5852949903bc043bc27","function_idx":0}],"L1_HANDLER":[],"CONSTRUCTOR":[]},"abi":[{"type":"impl","name":"GetChainId","interface_name":"katana_test_contracts::IGetChainId"},{"type":"interface","name":"katana_test_contracts::IGetChainId","items":[{"type":"function","name":"get","inputs":[],"outputs":[{"type":"core::felt252"}],"state_mutability":"view"}]},{"type":"event","name":"katana_test_contracts::GetChainId::Event","kind":"enum","variants":[]}]} \ No newline at end of file diff --git a/crates/katana/contracts/test-contracts/Scarb.toml b/crates/katana/contracts/test-contracts/Scarb.toml new file mode 100644 index 0000000000..3b7de689ae --- /dev/null +++ b/crates/katana/contracts/test-contracts/Scarb.toml @@ -0,0 +1,13 @@ +[package] +name = "katana_test_contracts" +version.workspace = true +edition.workspace = true + +# See more keys and their definitions at https://docs.swmansion.com/scarb/docs/reference/manifest.html + +[dependencies] +starknet.workspace = true +openzeppelin.workspace = true + +[[target.starknet-contract]] +sierra = true diff --git a/crates/katana/contracts/test-contracts/src/lib.cairo b/crates/katana/contracts/test-contracts/src/lib.cairo new file mode 100644 index 0000000000..1be4eeab9f --- /dev/null +++ b/crates/katana/contracts/test-contracts/src/lib.cairo @@ -0,0 +1,22 @@ +#[starknet::interface] +trait IGetChainId { + fn get(self: @TContractState) -> felt252; +} + +#[starknet::contract] +pub mod GetChainId { + use starknet::{SyscallResultTrait, syscalls::get_execution_info_v2_syscall}; + + #[storage] + struct Storage { } + + #[abi(embed_v0)] + pub impl GetChainId of super::IGetChainId { + fn get(self: @ContractState) -> felt252 { + let execution_info = get_execution_info_v2_syscall().unwrap_syscall(); + let tx_info = execution_info.tx_info.unbox(); + let chain_id = tx_info.chain_id; + chain_id + } + } +} diff --git a/crates/katana/executor/Cargo.toml b/crates/katana/executor/Cargo.toml index 677e044024..f55f199665 100644 --- a/crates/katana/executor/Cargo.toml +++ b/crates/katana/executor/Cargo.toml @@ -11,16 +11,17 @@ katana-primitives.workspace = true katana-provider.workspace = true parking_lot = { workspace = true, optional = true } -starknet = { workspace = true, optional = true } thiserror.workspace = true tracing.workspace = true -blockifier = { git = "https://github.com/dojoengine/sequencer", tag = "v0.8.0-rc3.1", features = [ "testing" ], optional = true } +blockifier = { git = "https://github.com/dojoengine/sequencer", tag = "v0.8.0-rc3.3", features = [ "testing" ], optional = true } katana-cairo = { workspace = true, optional = true } [dev-dependencies] alloy-primitives.workspace = true anyhow.workspace = true +cainome.workspace = true +dojo-test-utils.workspace = true katana-cairo.workspace = true katana-provider = { workspace = true, features = [ "test-utils" ] } katana-rpc-types.workspace = true @@ -29,6 +30,7 @@ rstest.workspace = true rstest_reuse.workspace = true serde_json.workspace = true similar-asserts.workspace = true +starknet.workspace = true tokio.workspace = true criterion.workspace = true @@ -37,12 +39,7 @@ pprof = { version = "0.13.0", features = [ "criterion", "flamegraph" ] } rayon.workspace = true [features] -blockifier = [ - "dep:blockifier", - "dep:katana-cairo", - "dep:parking_lot", - "dep:starknet", -] +blockifier = [ "dep:blockifier", "dep:katana-cairo", "dep:parking_lot" ] default = [ "blockifier" ] [[bench]] diff --git a/crates/katana/executor/src/implementation/blockifier/utils.rs b/crates/katana/executor/src/implementation/blockifier/utils.rs index 544b14c0f8..a7d9e44735 100644 --- a/crates/katana/executor/src/implementation/blockifier/utils.rs +++ b/crates/katana/executor/src/implementation/blockifier/utils.rs @@ -51,10 +51,9 @@ use katana_primitives::trace::{L1Gas, TxExecInfo, TxResources}; use katana_primitives::transaction::{ DeclareTx, DeployAccountTx, ExecutableTx, ExecutableTxWithHash, InvokeTx, TxType, }; -use katana_primitives::{class, event, message, trace, Felt}; +use katana_primitives::{Felt, class, event, message, trace}; use katana_provider::traits::contract::ContractClassProvider; use starknet::core::types::PriceUnit; -use starknet::core::utils::parse_cairo_short_string; use super::state::{CachedState, StateDb}; use crate::abstraction::{EntryPointCall, SimulationFlag}; @@ -525,10 +524,7 @@ pub fn to_blk_chain_id(chain_id: katana_primitives::chain::ChainId) -> ChainId { katana_primitives::chain::ChainId::Named(NamedChainId::Mainnet) => ChainId::Mainnet, katana_primitives::chain::ChainId::Named(NamedChainId::Sepolia) => ChainId::Sepolia, katana_primitives::chain::ChainId::Named(named) => ChainId::Other(named.to_string()), - katana_primitives::chain::ChainId::Id(id) => { - let id = parse_cairo_short_string(&id).expect("valid cairo string"); - ChainId::Other(id) - } + katana_primitives::chain::ChainId::Id(id) => ChainId::Id(id), } } @@ -684,26 +680,6 @@ mod tests { assert_eq!(blockifier_id.as_hex(), katana_id.to_string()); } - /// Test to ensure that when Blockifier pass the chain id to the contract ( thru a syscall eg, - /// get_tx_inbox().unbox().chain_id ), the value is exactly the same as Katana chain id. - /// - /// Issue: - #[test] - fn blockifier_chain_id_invariant() { - let id = felt!("0x1337"); - - let katana_id = katana_primitives::chain::ChainId::Id(id); - let blockifier_id = to_blk_chain_id(katana_id); - - // Mimic how blockifier convert from ChainId to FieldElement. - // - // This is how blockifier pass the chain id to the contract through a syscall. - // https://github.com/dojoengine/blockifier/blob/f2246ce2862d043e4efe2ecf149a4cb7bee689cd/crates/blockifier/src/execution/syscalls/hint_processor.rs#L600-L602 - let actual_id = Felt::from_hex(blockifier_id.as_hex().as_str()).unwrap(); - - assert_eq!(actual_id, id) - } - fn create_blockifier_call_info() -> CallInfo { let top_events = vec![OrderedEvent { order: 0, diff --git a/crates/katana/executor/tests/chain_id.rs b/crates/katana/executor/tests/chain_id.rs new file mode 100644 index 0000000000..120b16b764 --- /dev/null +++ b/crates/katana/executor/tests/chain_id.rs @@ -0,0 +1,56 @@ +mod fixtures; + +// 0x151341532499876 +use std::sync::Arc; + +use cainome::rs::abigen; +use dojo_test_utils::sequencer::{get_default_test_config, SequencingConfig, TestSequencer}; +use katana_primitives::chain::ChainId; +use katana_primitives::contract::ContractAddress; +use katana_primitives::genesis::allocation::{GenesisAllocation, GenesisContractAlloc}; +use katana_primitives::genesis::constant::read_compiled_class_artifact; +use katana_primitives::genesis::GenesisClass; +use katana_primitives::{address, felt}; + +abigen!(GetChainId, "crates/katana/executor/tests/test-data/get_chain_id.contract.json"); + +/// Test to ensure that when Blockifier pass the chain id to the contract ( thru a syscall eg, +/// get_tx_inbox().unbox().chain_id ), the value is exactly the same as Katana chain id. +/// +/// Issue: +#[tokio::test] +#[rstest::rstest] +#[case::mainnet(ChainId::MAINNET)] +#[case::goerli(ChainId::GOERLI)] +#[case::sepolia(ChainId::SEPOLIA)] +#[case::custom_1(ChainId::Id(felt!("0x4b4154414e41")))] +#[case::custom_2(ChainId::Id(felt!("0xc72dd9d5e883e")))] +async fn test_chain_id(#[case] chain_id: ChainId) { + // prepare test contract + let json = include_str!("test-data/get_chain_id.contract.json"); + let test_class = read_compiled_class_artifact(json); + let class_hash = felt!("0x222"); + let address = address!("0x420"); + + let mut config = get_default_test_config(SequencingConfig::default()); + config.chain.id = chain_id; + // declare class + config.chain.genesis.classes.insert( + class_hash, + GenesisClass { sierra: None, casm: Arc::new(test_class), compiled_class_hash: class_hash }, + ); + + // deploy the contract + let contract = GenesisAllocation::Contract(GenesisContractAlloc { + class_hash: Some(class_hash), + ..Default::default() + }); + config.chain.genesis.extend_allocations([(address, contract)]); + + let sequencer = TestSequencer::start(config).await; + let contract = GetChainIdReader::new(address.into(), sequencer.provider()); + let result = contract.get().call().await.unwrap(); + + // Make sure the chain id felt value is the same as the one we start the node with. + assert_eq!(chain_id.id(), result); +} diff --git a/crates/katana/executor/tests/test-data/get_chain_id.contract.json b/crates/katana/executor/tests/test-data/get_chain_id.contract.json new file mode 120000 index 0000000000..e839d9ce14 --- /dev/null +++ b/crates/katana/executor/tests/test-data/get_chain_id.contract.json @@ -0,0 +1 @@ +../../../contracts/build/test_get_chain_id.json \ No newline at end of file diff --git a/crates/katana/primitives/src/genesis/constant.rs b/crates/katana/primitives/src/genesis/constant.rs index 87da9783d0..4644065e8a 100644 --- a/crates/katana/primitives/src/genesis/constant.rs +++ b/crates/katana/primitives/src/genesis/constant.rs @@ -110,7 +110,8 @@ pub(super) fn get_fee_token_balance_base_storage_address(address: ContractAddres get_storage_var_address("ERC20_balances", &[address.into()]).unwrap() } -fn read_compiled_class_artifact(artifact: &str) -> CompiledClass { +/// Get the compiled class from the sierra contract +pub fn read_compiled_class_artifact(artifact: &str) -> CompiledClass { let value = serde_json::from_str(artifact).unwrap(); parse_compiled_class(value).unwrap() } From 3bb799eb5f033500a11d9b5813fba9d15ff44c9a Mon Sep 17 00:00:00 2001 From: Ammar Arif Date: Wed, 23 Oct 2024 11:28:45 -0400 Subject: [PATCH 2/2] fix rebased to alpha.16 --- Cargo.lock | 1 + crates/katana/executor/Cargo.toml | 10 ++++++++-- crates/katana/executor/tests/chain_id.rs | 3 ++- .../tests/test-data/get_chain_id.contract.json | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31090e13e3..e9f91424e9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8125,6 +8125,7 @@ dependencies = [ "criterion", "dojo-test-utils", "katana-cairo", + "katana-node", "katana-primitives", "katana-provider", "katana-rpc-types", diff --git a/crates/katana/executor/Cargo.toml b/crates/katana/executor/Cargo.toml index f55f199665..e359e0787a 100644 --- a/crates/katana/executor/Cargo.toml +++ b/crates/katana/executor/Cargo.toml @@ -11,6 +11,7 @@ katana-primitives.workspace = true katana-provider.workspace = true parking_lot = { workspace = true, optional = true } +starknet = { workspace = true, optional = true } thiserror.workspace = true tracing.workspace = true @@ -23,6 +24,7 @@ anyhow.workspace = true cainome.workspace = true dojo-test-utils.workspace = true katana-cairo.workspace = true +katana-node.workspace = true katana-provider = { workspace = true, features = [ "test-utils" ] } katana-rpc-types.workspace = true num-traits.workspace = true @@ -30,7 +32,6 @@ rstest.workspace = true rstest_reuse.workspace = true serde_json.workspace = true similar-asserts.workspace = true -starknet.workspace = true tokio.workspace = true criterion.workspace = true @@ -39,7 +40,12 @@ pprof = { version = "0.13.0", features = [ "criterion", "flamegraph" ] } rayon.workspace = true [features] -blockifier = [ "dep:blockifier", "dep:katana-cairo", "dep:parking_lot" ] +blockifier = [ + "dep:blockifier", + "dep:katana-cairo", + "dep:parking_lot", + "dep:starknet", +] default = [ "blockifier" ] [[bench]] diff --git a/crates/katana/executor/tests/chain_id.rs b/crates/katana/executor/tests/chain_id.rs index 120b16b764..4e144a0546 100644 --- a/crates/katana/executor/tests/chain_id.rs +++ b/crates/katana/executor/tests/chain_id.rs @@ -4,7 +4,8 @@ mod fixtures; use std::sync::Arc; use cainome::rs::abigen; -use dojo_test_utils::sequencer::{get_default_test_config, SequencingConfig, TestSequencer}; +use dojo_test_utils::sequencer::{get_default_test_config, TestSequencer}; +use katana_node::config::SequencingConfig; use katana_primitives::chain::ChainId; use katana_primitives::contract::ContractAddress; use katana_primitives::genesis::allocation::{GenesisAllocation, GenesisContractAlloc}; diff --git a/crates/katana/executor/tests/test-data/get_chain_id.contract.json b/crates/katana/executor/tests/test-data/get_chain_id.contract.json index e839d9ce14..9b077a31d2 120000 --- a/crates/katana/executor/tests/test-data/get_chain_id.contract.json +++ b/crates/katana/executor/tests/test-data/get_chain_id.contract.json @@ -1 +1 @@ -../../../contracts/build/test_get_chain_id.json \ No newline at end of file +../../../contracts/compiled/test_get_chain_id.json \ No newline at end of file