From 21de1fa322b88e5ab76338eb88c9a8828dbf2ce6 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Thu, 23 Jan 2025 12:38:17 +0100 Subject: [PATCH 01/41] Update dependencies and Rust (1.83) [skip ci] --- .circleci/config.yml | 4 +- Cargo.lock | 762 ++++++++++++++++++++++++++----------------- Cargo.toml | 32 +- docker/Dockerfile | 2 +- rust-toolchain.toml | 2 +- 5 files changed, 486 insertions(+), 316 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 2a16d8d77..c32372acb 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -104,7 +104,7 @@ jobs: name: Install Rust command: | curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | - sh -s -- -y --default-toolchain=1.76.0 + sh -s -- -y --default-toolchain=1.83.0 - run: name: Compile binary command: ./scripts/compile_binary.sh << parameters.target_triplet >> @@ -142,7 +142,7 @@ jobs: publish: docker: - - image: cimg/rust:1.76.0-node + - image: cimg/rust:1.83.0-node resource_class: xlarge steps: - checkout diff --git a/Cargo.lock b/Cargo.lock index 639a855af..2afd5f1e6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "Inflector" @@ -152,9 +152,9 @@ dependencies = [ [[package]] name = "anyhow" -version = "1.0.88" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356" +checksum = "34ac096ce696dc2fcabef30516bb13c0a68a11d30131d3df6f04711467681b04" [[package]] name = "ark-ec" @@ -555,9 +555,9 @@ dependencies = [ [[package]] name = "blockifier" -version = "0.8.0" +version = "0.14.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "481ee091c604037e5e81cf0debf1eca9f69d4f61636b27d7732c7cf14efbb508" +checksum = "3dc6fa8aeb9d7768bea41cef5f444666c1559e8ced770c4fcf7f090b19e1c4ad" dependencies = [ "anyhow", "ark-ec", @@ -565,32 +565,35 @@ dependencies = [ "ark-secp256k1", "ark-secp256r1", "cached", - "cairo-lang-casm 2.7.0", + "cairo-lang-casm 2.10.0-rc.1", "cairo-lang-runner", "cairo-lang-starknet-classes", - "cairo-lang-utils 2.7.0", "cairo-vm", "derive_more", "indexmap 2.7.1", - "itertools 0.10.5", + "itertools 0.12.1", "keccak", "log", "num-bigint", "num-integer", "num-rational", "num-traits 0.2.19", - "once_cell", + "papyrus_config", "paste", "phf", + "semver", "serde", "serde_json", "sha2", - "sha3", "starknet-types-core", "starknet_api", + "starknet_infra_utils", + "starknet_sierra_multicompile", "strum 0.25.0", "strum_macros 0.25.3", + "tempfile", "thiserror", + "toml 0.8.19", ] [[package]] @@ -747,11 +750,11 @@ dependencies = [ [[package]] name = "cairo-lang-casm" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a43421bf72645b3a562d264747166d6f093e960a69dfa38b67bb3209e370366" +checksum = "151375fd72f8765eb3ca78b4aa8f71269179169d4a8d3d03f4d8a80ff062d1e5" dependencies = [ - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "indoc", "num-bigint", "num-traits 0.2.19", @@ -787,24 +790,26 @@ dependencies = [ [[package]] name = "cairo-lang-compiler" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24242af537265add372896d9ab0678c86a68d3484281fbeb6d8a9d4d5bacf7c8" +checksum = "b013e303a3b2c67599cbb020d1ae3b96ceef19ed522625b32a1f4f8904bdc2d0" dependencies = [ "anyhow", - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-lowering 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-project 2.7.0", - "cairo-lang-semantic 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-generator 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-lowering 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-project 2.10.0-rc.1", + "cairo-lang-semantic 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-generator 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "indoc", - "salsa", + "rayon", + "rust-analyzer-salsa", + "semver", "smol_str", "thiserror", ] @@ -817,11 +822,11 @@ checksum = "c99d41a14f98521c617c0673a0faa41fd00029d32106a4643e1291a1813340a7" [[package]] name = "cairo-lang-debug" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d28f38e1c62fed15a4de9f3c95741d6b24ef2a9e67a2b88a047eb6ea7de992e" +checksum = "33e397d9e5f085d04f9251c3e8c6bba2c0aeb39cb41de532977f08bc8dd0dffa" dependencies = [ - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", ] [[package]] @@ -844,18 +849,18 @@ dependencies = [ [[package]] name = "cairo-lang-defs" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712206b7be3fb1a33e50e1c30aa8502b4a461155fd93ad26213d0d8b242cb08d" +checksum = "e293692f3db2fdc2ab72ced7c1a31de9c7ba6f7202dfa67c4596a42fca5255e5" dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "itertools 0.12.1", - "salsa", + "rust-analyzer-salsa", "smol_str", ] @@ -873,13 +878,13 @@ dependencies = [ [[package]] name = "cairo-lang-diagnostics" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3c8dc2bff2411fbf602d80a83b719e6e3955c1c5d767ec18b295fc92e8616a" +checksum = "af2fad7dcf507f01810038b3879310514e238c92c9e86cf66ed898e53dadc273" dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "itertools 0.12.1", ] @@ -897,11 +902,11 @@ dependencies = [ [[package]] name = "cairo-lang-eq-solver" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eaa8ac24c97770739f5a78d630b8515273c8b9f4aff34e1f88b988fac50340de" +checksum = "62bbbd955110dc35770c77f5f4e420ea963a175a70199c8d95777b1e53da40a8" dependencies = [ - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "good_lp", ] @@ -921,36 +926,37 @@ dependencies = [ [[package]] name = "cairo-lang-filesystem" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4596331565fe61d10a0a6a03ace2b9d0ba93f03ee12a8450fe9252a6fee770f3" +checksum = "ff86b7145e376eb7787da47d214583482944f8b40335947804466211e1b5f3a0" dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "path-clean 1.0.1", - "salsa", + "rust-analyzer-salsa", + "semver", "serde", "smol_str", + "toml 0.8.19", ] [[package]] name = "cairo-lang-formatter" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69b8eb08e511d6e6df51370cdc7d85f0de9a38c8b14a15762665c60c2df6d32d" +checksum = "b1b8abd7b170b48b9eadb758b4fdab7e9f03bad8b2cbe23ad8b6e38232311da0" dependencies = [ "anyhow", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "diffy", "ignore", "itertools 0.12.1", - "salsa", + "rust-analyzer-salsa", "serde", - "smol_str", "thiserror", ] @@ -981,26 +987,26 @@ dependencies = [ [[package]] name = "cairo-lang-lowering" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d535dc591513875b39b799270df21db10540033fd7710917760c22fc063a4ae" -dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-proc-macros 2.7.0", - "cairo-lang-semantic 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", +version = "2.10.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d907f52244a34208ee2e5232602aa213ae190c8c015a9ab0e378b695ca9cc1b0" +dependencies = [ + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-proc-macros 2.10.0-rc.1", + "cairo-lang-semantic 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "id-arena", "itertools 0.12.1", "log", "num-bigint", + "num-integer", "num-traits 0.2.19", - "once_cell", - "salsa", + "rust-analyzer-salsa", "smol_str", ] @@ -1027,20 +1033,20 @@ dependencies = [ [[package]] name = "cairo-lang-parser" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73019d5873715964f428ff10467efb607d6dc007ae164a21547bf20d9b5dcc72" +checksum = "ad5c844ec8e284ed1e423d40bd5d4baf98d6415986c3d4065d2c1ff8a09b5934" dependencies = [ - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-syntax-codegen 2.7.1", - "cairo-lang-utils 2.7.0", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-syntax-codegen 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "colored", "itertools 0.12.1", "num-bigint", "num-traits 0.2.19", - "salsa", + "rust-analyzer-salsa", "smol_str", "unescaper", ] @@ -1066,23 +1072,29 @@ dependencies = [ [[package]] name = "cairo-lang-plugins" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96e52fca18bc696011a47a4ded0dc00e2e0ac7c81a8052eddd4ad546c46b818e" +checksum = "478c84c57c6291f1e072fedd12eb0458eb40a3ea16a17d02e8ccf895924b9ea1" dependencies = [ - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "indent", "indoc", "itertools 0.12.1", - "salsa", + "rust-analyzer-salsa", "smol_str", ] +[[package]] +name = "cairo-lang-primitive-token" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "123ac0ecadf31bacae77436d72b88fa9caef2b8e92c89ce63a125ae911a12fae" + [[package]] name = "cairo-lang-proc-macros" version = "1.1.1" @@ -1096,11 +1108,11 @@ dependencies = [ [[package]] name = "cairo-lang-proc-macros" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d55dcf98a6e1a03e0b36129fad4253f9e6666a1746ab9c075d212ba68a4e9c1" +checksum = "5d7afa5c9bb8be0c3654792caec70ca51587667665e667c2250b4fa79df901d3" dependencies = [ - "cairo-lang-debug 2.7.0", + "cairo-lang-debug 2.10.0-rc.1", "quote", "syn 2.0.90", ] @@ -1120,36 +1132,52 @@ dependencies = [ [[package]] name = "cairo-lang-project" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3ddb432e5199a65e37bab97ef6322afabd60e0e638ada31178d9c23d237219d" +checksum = "0e557bbf5fc153203622f4fd66d8de23c35c39fe92672ba90c0a3b33766f016f" dependencies = [ - "cairo-lang-filesystem 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "serde", - "smol_str", "thiserror", "toml 0.8.19", ] +[[package]] +name = "cairo-lang-runnable-utils" +version = "2.10.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cb5aea4258a0fcc52a8ac3848c4916a81f2601ebebdd462b4a7c6123cc20589" +dependencies = [ + "cairo-lang-casm 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-ap-change 2.10.0-rc.1", + "cairo-lang-sierra-gas 2.10.0-rc.1", + "cairo-lang-sierra-to-casm 2.10.0-rc.1", + "cairo-lang-sierra-type-size", + "cairo-lang-utils 2.10.0-rc.1", + "cairo-vm", + "itertools 0.12.1", + "thiserror", +] + [[package]] name = "cairo-lang-runner" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef5bbbabd509ce88abc67436973d3377e099269dbd14578fa84fce884a74fa23" +checksum = "c3b0e437bbaa58d41c1215451ef50aa914a49780a0af886e55862576aff6c19f" dependencies = [ "ark-ff", "ark-secp256k1", "ark-secp256r1", - "cairo-lang-casm 2.7.0", - "cairo-lang-lowering 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-ap-change 2.7.0", - "cairo-lang-sierra-generator 2.7.0", - "cairo-lang-sierra-to-casm 2.7.0", - "cairo-lang-sierra-type-size", - "cairo-lang-starknet 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-casm 2.10.0-rc.1", + "cairo-lang-lowering 2.10.0-rc.1", + "cairo-lang-runnable-utils", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-generator 2.10.0-rc.1", + "cairo-lang-sierra-to-casm 2.10.0-rc.1", + "cairo-lang-starknet 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "cairo-vm", "itertools 0.12.1", "keccak", @@ -1188,27 +1216,27 @@ dependencies = [ [[package]] name = "cairo-lang-semantic" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "393325820207491a7475269e98163e0db7e85e4b215f4d801ca537ce1cd6daa7" -dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-plugins 2.7.0", - "cairo-lang-proc-macros 2.7.0", - "cairo-lang-syntax 2.7.0", +version = "2.10.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c82e765f784f4175232f51be0bd81551c48fcf64d8e9ae2e88f15c7130ca549" +dependencies = [ + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-plugins 2.10.0-rc.1", + "cairo-lang-proc-macros 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", "cairo-lang-test-utils", - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "id-arena", "indoc", "itertools 0.12.1", "num-bigint", "num-traits 0.2.19", - "once_cell", - "salsa", + "rust-analyzer-salsa", + "sha3", "smol_str", "toml 0.8.19", ] @@ -1238,12 +1266,12 @@ dependencies = [ [[package]] name = "cairo-lang-sierra" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "918fb0611203fb8cdd1fcdb434f395a59e0ebb0db64b11a0e15bfbfb03552821" +checksum = "0eda99022545ec4ec1b255f05c40d498d7040e3c60ecc942009368462448686b" dependencies = [ "anyhow", - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "const-fnv1a-hash", "convert_case 0.6.0", "derivative", @@ -1253,9 +1281,8 @@ dependencies = [ "num-bigint", "num-integer", "num-traits 0.2.19", - "once_cell", "regex", - "salsa", + "rust-analyzer-salsa", "serde", "serde_json", "sha3", @@ -1279,14 +1306,14 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-ap-change" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa1834ec729e89fcbd00df03f2a64a18515fcf07eb18dfef39afe020a10955d" +checksum = "f13db868ea56fc7c109a21260355ef5380e8d4426ce9781a00cc7d2d18a0aada" dependencies = [ - "cairo-lang-eq-solver 2.7.0", - "cairo-lang-sierra 2.7.0", + "cairo-lang-eq-solver 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", "cairo-lang-sierra-type-size", - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "itertools 0.12.1", "num-bigint", "num-traits 0.2.19", @@ -1308,14 +1335,14 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-gas" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b00927d39f910dd5ae1047cef9b46b2ee11617d33d290f875bc00dfc7e3d992" +checksum = "d4e26fbde40815352ff18f2e341a9792c651be0597bfb8e63deb0f4dd484782d" dependencies = [ - "cairo-lang-eq-solver 2.7.0", - "cairo-lang-sierra 2.7.0", + "cairo-lang-eq-solver 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", "cairo-lang-sierra-type-size", - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "itertools 0.12.1", "num-bigint", "num-traits 0.2.19", @@ -1350,24 +1377,23 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-generator" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7620a6a7becf5997093a83d289a5e3b3162bc8fd031ad75df82a5bc04f8cc954" -dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-lowering 2.7.0", - "cairo-lang-parser 2.7.0", - "cairo-lang-semantic 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", +version = "2.10.0-rc.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2a09730000a75c143d940e0e4906cf35dd0b607b0902223dc73ff5786abb7b" +dependencies = [ + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-lowering 2.10.0-rc.1", + "cairo-lang-parser 2.10.0-rc.1", + "cairo-lang-semantic 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "itertools 0.12.1", "num-traits 0.2.19", - "once_cell", - "salsa", + "rust-analyzer-salsa", "serde", "serde_json", "smol_str", @@ -1398,17 +1424,17 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-to-casm" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67bd155770abf91d4290a31b0c0a1fb393ecee85eb0af40c16893b4601eff4d6" +checksum = "07b3af3dee351045e063fea341f242c6eab9c0f5eca90ee8b960ddcefa799142" dependencies = [ "assert_matches", - "cairo-lang-casm 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-ap-change 2.7.0", - "cairo-lang-sierra-gas 2.7.0", + "cairo-lang-casm 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-ap-change 2.10.0-rc.1", + "cairo-lang-sierra-gas 2.10.0-rc.1", "cairo-lang-sierra-type-size", - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "indoc", "itertools 0.12.1", "num-bigint", @@ -1419,12 +1445,12 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-type-size" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbae9458999da692c272501678b6cfec358a6bcadb54921bf35d21afdcd91251" +checksum = "5ed52ed8acd957e71139e3dde782aad04946bd1e4d979a2a0b46bd09dd200348" dependencies = [ - "cairo-lang-sierra 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", ] [[package]] @@ -1470,28 +1496,27 @@ dependencies = [ [[package]] name = "cairo-lang-starknet" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f242d889180386d35935597f9d1cac07d4f3d60bd0f10558660ae4a77da701b6" +checksum = "9d156a22ebdca8041506c0ae2be765a7bc81907003e588ee643f7e64c7788fbf" dependencies = [ "anyhow", - "cairo-lang-compiler 2.7.0", - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-lowering 2.7.0", - "cairo-lang-plugins 2.7.0", - "cairo-lang-semantic 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-generator 2.7.0", + "cairo-lang-compiler 2.10.0-rc.1", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-lowering 2.10.0-rc.1", + "cairo-lang-plugins 2.10.0-rc.1", + "cairo-lang-semantic 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-generator 2.10.0-rc.1", "cairo-lang-starknet-classes", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "const_format", "indent", "indoc", "itertools 0.12.1", - "once_cell", "serde", "serde_json", "smol_str", @@ -1501,20 +1526,19 @@ dependencies = [ [[package]] name = "cairo-lang-starknet-classes" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa17b313f46fcf7ff4de32b86c250eaf584d1e2c8e37ed16db155b221721e735" +checksum = "a5a5b4adb80238064a7294c43d8edcc18d908c0872848063682b5c0a458a77af" dependencies = [ - "cairo-lang-casm 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-to-casm 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-casm 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-to-casm 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "convert_case 0.6.0", "itertools 0.12.1", "num-bigint", "num-integer", "num-traits 0.2.19", - "once_cell", "serde", "serde_json", "sha3", @@ -1542,16 +1566,17 @@ dependencies = [ [[package]] name = "cairo-lang-syntax" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d0ca518ed7c3674d9b62470f7482f4b07553eb3a02d83e0ae61bd6b5ecb4ec8" +checksum = "621c6dbf1cbda7d40f4dc78ea2363d3b565e4c7e9edfdcb08e2be61bfbbaf819" dependencies = [ - "cairo-lang-debug 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-debug 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-primitive-token", + "cairo-lang-utils 2.10.0-rc.1", "num-bigint", "num-traits 0.2.19", - "salsa", + "rust-analyzer-salsa", "smol_str", "unescaper", ] @@ -1570,9 +1595,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax-codegen" -version = "2.7.1" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01f276bc28f6302fc63032046a12b60d18498906e65f646acb963244eed97f7c" +checksum = "cd79262096fbbd618c52d01964f5ed36e693f9dc1113a0d217e1b3825bd85822" dependencies = [ "genco", "xshell", @@ -1580,12 +1605,12 @@ dependencies = [ [[package]] name = "cairo-lang-test-utils" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6a2365bd502a657437f9d0d665e32e017054d0effdbecb1dda776bfcc11235d" +checksum = "3d7df411c00d122de3941dc8cb78d216e2414b2bbb713c006613b98113c35861" dependencies = [ "cairo-lang-formatter", - "cairo-lang-utils 2.7.0", + "cairo-lang-utils 2.10.0-rc.1", "colored", "log", "pretty_assertions", @@ -1610,9 +1635,9 @@ dependencies = [ [[package]] name = "cairo-lang-utils" -version = "2.7.0" +version = "2.10.0-rc.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bd5c8c127b9362a12ffb9dede38e792c81b4ded5a98b448baec157b745f47d1" +checksum = "33d72369877bade85ecfef9bc13cbd0c66fdaa3e8cd9686833f0db65eacaa833" dependencies = [ "hashbrown 0.14.5", "indexmap 2.7.1", @@ -1729,9 +1754,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.17" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e5a21b8495e732f1b3c364c9949b201ca7bae518c502c80256c96ad79eaf6ac" +checksum = "769b0145982b4b48713e01ec42d61614425f27b7058bda7180a3a41f30104796" dependencies = [ "clap_builder", "clap_derive", @@ -1739,9 +1764,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.5.17" +version = "4.5.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cf2dd12af7a047ad9d6da2b6b249759a22a7abc0f474c1dae1777afa4b21a73" +checksum = "1b26884eb4b57140e4d2d93652abfa49498b938b3c9179f9fc487b0acc3edad7" dependencies = [ "anstream", "anstyle", @@ -1751,9 +1776,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.5.13" +version = "4.5.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "501d359d5f3dcaf6ecdeee48833ae73ec6e42723a1e52419c79abf9507eec0a0" +checksum = "54b755194d6389280185988721fffba69495eed5ee9feeee9a599b53db80318c" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -1763,9 +1788,9 @@ dependencies = [ [[package]] name = "clap_lex" -version = "0.7.2" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" +checksum = "f46ad14479a25103f283c0f10005961cf086d8dc42205bb44c46ac563475dca6" [[package]] name = "coins-bip32" @@ -1837,15 +1862,15 @@ dependencies = [ [[package]] name = "console" -version = "0.15.8" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +checksum = "ea3c6ecd8059b57859df5c69830340ed3c41d30e3da0c1cbed90a96ac853041b" dependencies = [ "encode_unicode", - "lazy_static", "libc", + "once_cell", "unicode-width", - "windows-sys 0.52.0", + "windows-sys 0.59.0", ] [[package]] @@ -2261,9 +2286,9 @@ dependencies = [ [[package]] name = "encode_unicode" -version = "0.3.6" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" +checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" @@ -3360,6 +3385,17 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" +[[package]] +name = "idna" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" +dependencies = [ + "matches", + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "idna" version = "0.5.0" @@ -3370,6 +3406,12 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "if_chain" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed" + [[package]] name = "ignore" version = "0.4.23" @@ -3797,6 +3839,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matchit" version = "0.7.3" @@ -4199,6 +4247,23 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "papyrus_config" +version = "0.14.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07fd4794f072c755d1e9a261090efdb6584cf60f247b25040e704397c20df81e" +dependencies = [ + "clap", + "itertools 0.12.1", + "serde", + "serde_json", + "starknet_infra_utils", + "strum_macros 0.25.3", + "thiserror", + "tracing", + "validator", +] + [[package]] name = "parity-scale-codec" version = "3.6.12" @@ -4534,6 +4599,30 @@ dependencies = [ "toml_edit", ] +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + [[package]] name = "proc-macro2" version = "1.0.92" @@ -4872,6 +4961,15 @@ dependencies = [ "digest", ] +[[package]] +name = "rlimit" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7043b63bd0cd1aaa628e476b80e6d4023a3b50eb32789f2728908107bd0c793a" +dependencies = [ + "libc", +] + [[package]] name = "rlp" version = "0.5.2" @@ -4894,6 +4992,35 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "rust-analyzer-salsa" +version = "0.17.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719825638c59fd26a55412a24561c7c5bcf54364c88b9a7a04ba08a6eafaba8d" +dependencies = [ + "indexmap 2.7.1", + "lock_api", + "oorandom", + "parking_lot 0.12.3", + "rust-analyzer-salsa-macros", + "rustc-hash", + "smallvec", + "tracing", + "triomphe", +] + +[[package]] +name = "rust-analyzer-salsa-macros" +version = "0.17.0-pre.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d96498e9684848c6676c399032ebc37c52da95ecbefa83d71ccc53b9f8a4a8e" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "rust_decimal" version = "1.36.0" @@ -5235,18 +5362,18 @@ checksum = "cd0b0ec5f1c1ca621c432a25813d8d60c88abe6d3e08a3eb9cf37d97a0fe3d73" [[package]] name = "serde" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8e3592472072e6e22e0a54d5904d9febf8508f65fb8552499a1abc7d1078c3a" +checksum = "02fc4265df13d6fa1d00ecff087228cc0a2b5f3c0e87e258d8b94a156e984c70" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.210" +version = "1.0.217" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" +checksum = "5a9bf7cf98d04a2b28aead066b7496853d4779c9cc183c440dbac457641e19a0" dependencies = [ "proc-macro2", "quote", @@ -5266,9 +5393,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.128" +version = "1.0.137" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8" +checksum = "930cfb6e6abf99298aaad7d29abbef7a9999a9a8806a40088f55f0dcec03146b" dependencies = [ "indexmap 2.7.1", "itoa", @@ -5552,6 +5679,12 @@ dependencies = [ "num-traits 0.1.43", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + [[package]] name = "starknet-accounts" version = "0.12.0" @@ -5616,26 +5749,6 @@ dependencies = [ "syn 2.0.90", ] -[[package]] -name = "starknet-crypto" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3f2175b0b3fc24ff2ec6dc07f5a720498994effca7e78b11a6e1c1bd02cad52" -dependencies = [ - "crypto-bigint", - "hex", - "hmac", - "num-bigint", - "num-integer", - "num-traits 0.2.19", - "rfc6979", - "sha2", - "starknet-crypto-codegen", - "starknet-curve 0.3.0", - "starknet-ff", - "zeroize", -] - [[package]] name = "starknet-crypto" version = "0.6.2" @@ -5686,15 +5799,6 @@ dependencies = [ "syn 2.0.90", ] -[[package]] -name = "starknet-curve" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "252610baff59e4c4332ce3569f7469c5d3f9b415a2240d698fb238b2b4fc0942" -dependencies = [ - "starknet-ff", -] - [[package]] name = "starknet-curve" version = "0.4.2" @@ -5798,19 +5902,19 @@ dependencies = [ "base64 0.22.1", "bigdecimal", "blockifier", - "cairo-lang-casm 2.7.0", - "cairo-lang-compiler 2.7.0", - "cairo-lang-defs 2.7.0", - "cairo-lang-diagnostics 2.7.0", - "cairo-lang-filesystem 2.7.0", - "cairo-lang-lowering 2.7.0", - "cairo-lang-semantic 2.7.0", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-generator 2.7.0", - "cairo-lang-sierra-to-casm 2.7.0", + "cairo-lang-casm 2.10.0-rc.1", + "cairo-lang-compiler 2.10.0-rc.1", + "cairo-lang-defs 2.10.0-rc.1", + "cairo-lang-diagnostics 2.10.0-rc.1", + "cairo-lang-filesystem 2.10.0-rc.1", + "cairo-lang-lowering 2.10.0-rc.1", + "cairo-lang-semantic 2.10.0-rc.1", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-generator 2.10.0-rc.1", + "cairo-lang-sierra-to-casm 2.10.0-rc.1", "cairo-lang-starknet-classes", - "cairo-lang-syntax 2.7.0", - "cairo-lang-utils 2.7.0", + "cairo-lang-syntax 2.10.0-rc.1", + "cairo-lang-utils 2.10.0-rc.1", "cairo-vm", "flate2", "num-bigint", @@ -5893,28 +5997,64 @@ dependencies = [ [[package]] name = "starknet_api" -version = "0.13.0-rc.1" +version = "0.14.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b505c9c076d9fce854304bd743c93ea540ebea6b16ec96819b07343a3aa2c7c" +checksum = "37c6513984adf66a29ff3b96871bd259f084e29cbce6ddf7cf5283fc8c5dfd67" dependencies = [ "bitvec", + "cairo-lang-runner", "cairo-lang-starknet-classes", "derive_more", "hex", "indexmap 2.7.1", "itertools 0.12.1", - "once_cell", + "num-bigint", + "num-traits 0.2.19", + "pretty_assertions", "primitive-types", + "semver", "serde", "serde_json", "sha3", - "starknet-crypto 0.5.2", + "starknet-crypto 0.7.4", "starknet-types-core", - "strum 0.24.1", - "strum_macros 0.24.3", + "starknet_infra_utils", + "strum 0.25.0", + "strum_macros 0.25.3", "thiserror", ] +[[package]] +name = "starknet_infra_utils" +version = "0.14.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a3bd57e3ec2ac2012518184517df3df270177a5bba21a8f540fb5027c6fc76" +dependencies = [ + "tokio", + "tracing", +] + +[[package]] +name = "starknet_sierra_multicompile" +version = "0.14.0-rc.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66baf37d2eda9dc85c2f672c0b32544ceac513c6c6f90bbcb22cb5ed77c61357" +dependencies = [ + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-starknet-classes", + "cairo-lang-utils 2.10.0-rc.1", + "papyrus_config", + "rlimit", + "serde", + "serde_json", + "starknet-types-core", + "starknet_api", + "starknet_infra_utils", + "tempfile", + "thiserror", + "validator", +] + [[package]] name = "static_assertions" version = "1.1.0" @@ -5946,12 +6086,6 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" -[[package]] -name = "strum" -version = "0.24.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" - [[package]] name = "strum" version = "0.25.0" @@ -5967,19 +6101,6 @@ dependencies = [ "strum_macros 0.26.4", ] -[[package]] -name = "strum_macros" -version = "0.24.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "rustversion", - "syn 1.0.109", -] - [[package]] name = "strum_macros" version = "0.25.3" @@ -6519,6 +6640,16 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "triomphe" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8f7726da4807b58ea5c96fdc122f80702030edc33b35aff9190a51148ccc85" +dependencies = [ + "serde", + "stable_deref_trait", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -6616,9 +6747,9 @@ checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-width" -version = "0.1.13" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" +checksum = "1fc81956842c57dac11422a97c3b8195a1ff727f06e85c84ed2e8aa277c9a0fd" [[package]] name = "unicode-xid" @@ -6628,13 +6759,13 @@ checksum = "229730647fbc343e3a80e463c1db7f78f3855d3f3739bee0dda773c9a037c90a" [[package]] name = "universal-sierra-compiler" -version = "2.2.0" +version = "2.4.0-rc.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0ab0193fb9cc11e4717f67736e9358035ff9a3bf99d6fc7f53ccaec9b6e1c9a" +checksum = "001cb1b9958f58373f0c11e469b0a92d6f1128083c2ff883dfcfdcf40887e5a0" dependencies = [ "anyhow", - "cairo-lang-sierra 2.7.0", - "cairo-lang-sierra-to-casm 2.7.0", + "cairo-lang-sierra 2.10.0-rc.1", + "cairo-lang-sierra-to-casm 2.10.0-rc.1", "cairo-lang-starknet 1.0.0-rc0", "cairo-lang-starknet-classes", "clap", @@ -6687,7 +6818,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c" dependencies = [ "form_urlencoded", - "idna", + "idna 0.5.0", "percent-encoding", ] @@ -6722,6 +6853,45 @@ dependencies = [ "getrandom", ] +[[package]] +name = "validator" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "841d6937c33ec6039d8071bcf72933146b5bbe378d645d8fa59bdadabfc2a249" +dependencies = [ + "idna 0.2.3", + "lazy_static", + "regex", + "serde", + "serde_derive", + "serde_json", + "url", + "validator_derive", + "validator_types", +] + +[[package]] +name = "validator_derive" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286b4497f270f59276a89ae0ad109d5f8f18c69b613e3fb22b61201aadb0c4d" +dependencies = [ + "if_chain", + "lazy_static", + "proc-macro-error", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "validator_types", +] + +[[package]] +name = "validator_types" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a" + [[package]] name = "valuable" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index ece035a56..c424a2368 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,15 +71,15 @@ rand_mt = "4.2.2" regex_generate = "0.2.3" reqwest = { version = "0.12", features = ["blocking", "json"] } url = "2.4" -usc = { version = "2.2.0", package = "universal-sierra-compiler" } +usc = { version = "2.4.0-rc.0", package = "universal-sierra-compiler" } num-bigint = { version = "0.4" } bigdecimal = { version = "0.4.5" } enum-helper-macros = "0.0.1" # Starknet dependencies starknet-types-core = "0.1.5" -starknet_api = { version = "0.13.0-rc.0", features = ["testing"] } -blockifier = { version = "0.8.0" } +starknet_api = { version = "0.14.0-rc.0", features = ["testing"] } +blockifier = { version = "0.14.0-rc.0" } starknet-rs-signers = { version = "0.10.1", package = "starknet-signers" } starknet-rs-core = { version = "0.12.1", package = "starknet-core" } starknet-rs-providers = { version = "0.12.1", package = "starknet-providers" } @@ -89,19 +89,19 @@ starknet-rs-crypto = { version = "0.7.4", package = "starknet-crypto" } cairo-vm = "=1.0.1" # Cairo-lang dependencies -cairo-lang-starknet-classes = "=2.7.0" -cairo-lang-compiler = "=2.7.0" -cairo-lang-casm = "=2.7.0" -cairo-lang-defs = "=2.7.0" -cairo-lang-diagnostics = "=2.7.0" -cairo-lang-filesystem = "=2.7.0" -cairo-lang-lowering = "=2.7.0" -cairo-lang-semantic = "=2.7.0" -cairo-lang-sierra = "=2.7.0" -cairo-lang-sierra-generator = "=2.7.0" -cairo-lang-sierra-to-casm = "=2.7.0" -cairo-lang-syntax = "=2.7.0" -cairo-lang-utils = "=2.7.0" +cairo-lang-starknet-classes = "=2.10.0-rc.1" +cairo-lang-compiler = "=2.10.0-rc.1" +cairo-lang-casm = "=2.10.0-rc.1" +cairo-lang-defs = "=2.10.0-rc.1" +cairo-lang-diagnostics = "=2.10.0-rc.1" +cairo-lang-filesystem = "=2.10.0-rc.1" +cairo-lang-lowering = "=2.10.0-rc.1" +cairo-lang-semantic = "=2.10.0-rc.1" +cairo-lang-sierra = "=2.10.0-rc.1" +cairo-lang-sierra-generator = "=2.10.0-rc.1" +cairo-lang-sierra-to-casm = "=2.10.0-rc.1" +cairo-lang-syntax = "=2.10.0-rc.1" +cairo-lang-utils = "=2.10.0-rc.1" # Inner dependencies starknet-types = { version = "0.2.4", path = "crates/starknet-devnet-types", package = "starknet-devnet-types" } diff --git a/docker/Dockerfile b/docker/Dockerfile index 04e91b53f..11305083a 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM rust:1.76.0-slim-buster as builder +FROM rust:1.83.0-slim-buster as builder COPY . . diff --git a/rust-toolchain.toml b/rust-toolchain.toml index 0f8d17df0..0dd3a7630 100644 --- a/rust-toolchain.toml +++ b/rust-toolchain.toml @@ -1,5 +1,5 @@ [toolchain] -channel = "1.76.0" +channel = "1.83.0" components = ["rustfmt", "clippy"] targets = ["wasm32-unknown-unknown"] profile = "minimal" From c4a48c25e30d069d47b587469b77fbc793fe840a Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 24 Jan 2025 15:08:51 +0100 Subject: [PATCH 02/41] Partial adaptation [WIP] [skip ci] --- .../src/starknet/defaulter.rs | 7 +- .../src/rpc/contract_class.rs | 67 +++++---- .../deprecated/json_contract_class.rs | 7 +- .../src/rpc/contract_class/deprecated/mod.rs | 2 +- .../src/rpc/estimate_message_fee.rs | 6 +- .../src/rpc/transaction_receipt.rs | 51 ++----- .../src/rpc/transactions.rs | 140 +++++++++++------- .../broadcasted_declare_transaction_v1.rs | 8 +- .../broadcasted_declare_transaction_v2.rs | 6 +- .../broadcasted_declare_transaction_v3.rs | 4 +- ...oadcasted_deploy_account_transaction_v1.rs | 4 +- ...oadcasted_deploy_account_transaction_v3.rs | 8 +- .../broadcasted_invoke_transaction_v1.rs | 4 +- .../broadcasted_invoke_transaction_v3.rs | 4 +- .../transactions/declare_transaction_v0v1.rs | 2 +- .../transactions/declare_transaction_v2.rs | 2 +- .../transactions/declare_transaction_v3.rs | 2 +- .../deploy_account_transaction_v1.rs | 2 +- .../deploy_account_transaction_v3.rs | 2 +- .../rpc/transactions/invoke_transaction_v1.rs | 2 +- .../rpc/transactions/invoke_transaction_v3.rs | 2 +- .../transactions/l1_handler_transaction.rs | 6 +- crates/starknet-devnet-types/src/utils.rs | 18 ++- 23 files changed, 186 insertions(+), 170 deletions(-) diff --git a/crates/starknet-devnet-core/src/starknet/defaulter.rs b/crates/starknet-devnet-core/src/starknet/defaulter.rs index 88f20ff9d..680c5ae0a 100644 --- a/crates/starknet-devnet-core/src/starknet/defaulter.rs +++ b/crates/starknet-devnet-core/src/starknet/defaulter.rs @@ -1,12 +1,12 @@ use std::io::Read; -use blockifier::execution::contract_class::ContractClass; use blockifier::state::errors::StateError; use blockifier::state::state_api::StateResult; +use starknet_api::contract_class::ContractClass; use starknet_api::core::{ClassHash, ContractAddress, Nonce, PatriciaKey}; use starknet_api::state::StorageKey; use starknet_rs_core::types::Felt; -use starknet_types::contract_class::convert_codegen_to_blockifier_compiled_class; +use starknet_types::contract_class::convert_codegen_to_starknet_api_compiled_class; use tracing::debug; use super::starknet_config::ForkConfig; @@ -227,7 +227,8 @@ impl BlockingOriginReader { let contract_class: starknet_rs_core::types::ContractClass = serde_json::from_value(value) .map_err(|e| StateError::StateReadError(e.to_string()))?; - convert_codegen_to_blockifier_compiled_class(contract_class) + + convert_codegen_to_starknet_api_compiled_class(contract_class) .map_err(|e| StateError::StateReadError(e.to_string())) } } diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index c003bc0f4..c5ad3b55c 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -1,10 +1,11 @@ use core::fmt::Debug; +use std::str::FromStr; -use blockifier::execution::contract_class::ClassInfo; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use serde::de::IntoDeserializer; use serde::{Serialize, Serializer}; +use starknet_api::contract_class::{ClassInfo, SierraVersion}; use starknet_rs_core::types::contract::{SierraClass, SierraClassDebugInfo}; use starknet_rs_core::types::{ ContractClass as CodegenContractClass, FlattenedSierraClass as CodegenSierraContractClass, @@ -16,9 +17,9 @@ use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::de use crate::traits::HashProducer; pub mod deprecated; +pub use deprecated::Cairo0ContractClass; pub use deprecated::json_contract_class::Cairo0Json; pub use deprecated::rpc_contract_class::DeprecatedContractClass; -pub use deprecated::Cairo0ContractClass; #[derive(Debug, Clone)] #[cfg_attr(feature = "testing", derive(Eq, PartialEq))] @@ -102,17 +103,17 @@ impl TryFrom for Cairo0Json { } } -impl TryFrom for blockifier::execution::contract_class::ContractClass { +impl TryFrom for starknet_api::contract_class::ContractClass { type Error = Error; fn try_from(value: ContractClass) -> Result { match value { ContractClass::Cairo0(deprecated_contract_class) => { - Ok(blockifier::execution::contract_class::ContractClass::V0( + Ok(starknet_api::contract_class::ContractClass::V0( deprecated_contract_class.try_into()?, )) } - ContractClass::Cairo1(sierra_contract_class) => { + ContractClass::Cairo1(ref sierra_contract_class) => { let casm_json = usc::compile_contract(serde_json::to_value(sierra_contract_class).map_err( |err| Error::JsonError(JsonError::Custom { msg: err.to_string() }), @@ -122,18 +123,16 @@ impl TryFrom for blockifier::execution::contract_class::ContractC let casm = serde_json::from_value::(casm_json) .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; - let blockifier_contract_class: blockifier::execution::contract_class::ContractClassV1 = - casm.try_into().map_err(|_| Error::ProgramError)?; - - Ok(blockifier::execution::contract_class::ContractClass::V1( - blockifier_contract_class, - )) + Ok(starknet_api::contract_class::ContractClass::V1(( + casm, + SierraVersion::from_str(&sierra_contract_class.contract_class_version)?, + ))) } } } } -impl TryFrom for blockifier::execution::contract_class::ClassInfo { +impl TryFrom for ClassInfo { type Error = Error; fn try_from(value: ContractClass) -> Result { @@ -142,12 +141,13 @@ impl TryFrom for blockifier::execution::contract_class::ClassInfo // Set abi_length to 0 as per this conversation // https://spaceshard.slack.com/archives/C03HL8DH52N/p1708512271256699?thread_ts=1707845482.455099&cid=C03HL8DH52N let abi_length = 0; - blockifier::execution::contract_class::ClassInfo::new( - &blockifier::execution::contract_class::ContractClass::V0( + ClassInfo::new( + &starknet_api::contract_class::ContractClass::V0( deprecated_contract_class.try_into()?, ), 0, abi_length, + SierraVersion::DEPRECATED, ) .map_err(|err| { Error::ConversionError(ConversionError::InvalidInternalStructure( @@ -155,7 +155,7 @@ impl TryFrom for blockifier::execution::contract_class::ClassInfo )) }) } - ContractClass::Cairo1(ref sierra_contract_class) => { + ContractClass::Cairo1(sierra_contract_class) => { let sierra_program_length = sierra_contract_class.sierra_program.len(); // Calculated as the length of the stringified abi // https://spaceshard.slack.com/archives/C03HL8DH52N/p1708512271256699?thread_ts=1707845482.455099&cid=C03HL8DH52N @@ -167,14 +167,17 @@ impl TryFrom for blockifier::execution::contract_class::ClassInfo 0 }; - let blockifier_contract_class: blockifier::execution::contract_class::ContractClass = value.try_into()?; - - ClassInfo::new(&blockifier_contract_class, sierra_program_length, abi_length) - .map_err(|err| { - Error::ConversionError(ConversionError::InvalidInternalStructure( - err.to_string(), - )) - }) + ClassInfo::new( + &sierra_contract_class.into(), + sierra_program_length, + abi_length, + SierraVersion::from_str(&sierra_contract_class.contract_class_version)?, + ) + .map_err(|err| { + Error::ConversionError(ConversionError::InvalidInternalStructure( + err.to_string(), + )) + }) } } } @@ -249,11 +252,11 @@ fn convert_sierra_to_codegen( }) } -pub fn convert_codegen_to_blockifier_compiled_class( +pub fn convert_codegen_to_starknet_api_compiled_class( class: CodegenContractClass, -) -> Result { +) -> Result { Ok(match class { - CodegenContractClass::Sierra(_) => { + CodegenContractClass::Sierra(sierra) => { let json_value = serde_json::to_value(class).map_err(JsonError::SerdeJsonError)?; let casm_json = usc::compile_contract(json_value) .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; @@ -261,16 +264,16 @@ pub fn convert_codegen_to_blockifier_compiled_class( let casm = serde_json::from_value::(casm_json) .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; - let blockifier_contract_class: blockifier::execution::contract_class::ContractClassV1 = - casm.try_into().map_err(|_| Error::ProgramError)?; - - blockifier::execution::contract_class::ContractClass::V1(blockifier_contract_class) + starknet_api::contract_class::ContractClass::V1(( + casm, + SierraVersion::from_str(&sierra.contract_class_version)?, + )) } CodegenContractClass::Legacy(_) => { let class_jsonified = serde_json::to_string(&class).map_err(JsonError::SerdeJsonError)?; let class = DeprecatedContractClass::rpc_from_json_str(&class_jsonified)?; - blockifier::execution::contract_class::ContractClass::V0(class.try_into()?) + starknet_api::contract_class::ContractClass::V0(class.try_into().unwrap()) } }) } @@ -308,7 +311,7 @@ mod tests { use crate::contract_class::deprecated::rpc_contract_class::ContractClassAbiEntryWithType; use crate::contract_class::{ - convert_sierra_to_codegen, Cairo0Json, ContractClass, DeprecatedContractClass, + Cairo0Json, ContractClass, DeprecatedContractClass, convert_sierra_to_codegen, }; use crate::felt::felt_from_prefixed_hex; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs index 673389995..189bacf37 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs @@ -5,7 +5,8 @@ use flate2::write::GzEncoder; use flate2::Compression; use serde::{Deserialize, Serialize}; use serde_json::{json, Serializer as JsonSerializer, Value}; -use starknet_api::deprecated_contract_class::{EntryPoint, EntryPointType}; +use starknet_api::contract_class::EntryPointType; +use starknet_api::deprecated_contract_class::EntryPointV0; use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; use starknet_types_core::hash::{Pedersen, StarkHash}; @@ -93,7 +94,7 @@ impl Cairo0Json { fn compute_cairo_0_contract_class_hash(json_class: &Value) -> crate::error::DevnetResult { let mut hashes = vec![Felt::ZERO]; - let entry_points_by_type: HashMap> = + let entry_points_by_type: HashMap> = serde_json::from_value( json_class .get("entry_points_by_type") @@ -232,7 +233,7 @@ impl TryFrom for Cairo0Json { } } -impl TryFrom for blockifier::execution::contract_class::ContractClassV0 { +impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { type Error = Error; fn try_from(value: Cairo0Json) -> Result { diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index 8a9e40d5d..c3f628a04 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -70,7 +70,7 @@ impl TryInto for Cairo0ContractClass { } } -impl TryFrom for blockifier::execution::contract_class::ContractClassV0 { +impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { type Error = Error; fn try_from(value: Cairo0ContractClass) -> Result { match value { diff --git a/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs b/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs index 4f4c2890e..bb8a00191 100644 --- a/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs +++ b/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs @@ -1,9 +1,9 @@ use std::sync::Arc; -use blockifier::transaction::transactions::L1HandlerTransaction; +use starknet_api::executable_transaction::L1HandlerTransaction; use serde::Serialize; use starknet_api::core::EntryPointSelector; -use starknet_api::transaction::Calldata; +use starknet_api::transaction::fields::Calldata; use starknet_rs_core::types::requests::EstimateMessageFeeRequest; use starknet_rs_core::types::{ BlockId as SrBlockId, Felt, MsgFromL1 as SrMsgFromL1, MsgFromL1, PriceUnit, @@ -71,7 +71,7 @@ impl EstimateMessageFeeRequestWrapper { calldata: Calldata(Arc::new(calldata)), ..Default::default() }, - paid_fee_on_l1: starknet_api::transaction::Fee(1), + paid_fee_on_l1: starknet_api::transaction::fields::Fee(1), tx_hash: Default::default(), }; diff --git a/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs b/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs index 3ff5a7327..09eecd0b7 100644 --- a/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs +++ b/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs @@ -1,7 +1,8 @@ +use blockifier::transaction::objects::ExecutionResourcesTraits; use cairo_vm::types::builtin_name::BuiltinName; -use serde::{Deserialize, Deserializer, Serialize}; +use serde::{Deserialize, Serialize}; use starknet_api::block::BlockNumber; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::{ExecutionResult, Hash256, TransactionFinalityStatus}; use crate::contract_address::ContractAddress; @@ -68,39 +69,11 @@ pub struct ExecutionResources { pub data_availability: DataAvailability, } -#[derive(Debug, Clone, Serialize)] +#[derive(Debug, Clone, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct DataAvailability { - pub l1_gas: u128, - pub l1_data_gas: u128, -} - -/// custom implementation, because serde_json doesn't support deserializing to u128 -/// if the struct is being used as a field in another struct that have #[serde(flatten)] or -/// #[serde(untagged)] -impl<'de> Deserialize<'de> for DataAvailability { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let json_obj = - serde_json::Value::deserialize(deserializer).map_err(serde::de::Error::custom)?; - - #[derive(Deserialize)] - #[serde(deny_unknown_fields)] - struct InnerDataAvailability { - l1_gas: u128, - l1_data_gas: u128, - } - - let data_availability: InnerDataAvailability = - serde_json::from_value(json_obj).map_err(serde::de::Error::custom)?; - - Ok(DataAvailability { - l1_gas: data_availability.l1_gas, - l1_data_gas: data_availability.l1_data_gas, - }) - } + pub l1_gas: u64, + pub l1_data_gas: u64, } #[derive(Debug, Clone, Serialize)] @@ -174,10 +147,10 @@ impl From<&blockifier::execution::call_info::CallInfo> for ComputationResources impl From<&blockifier::transaction::objects::TransactionExecutionInfo> for ExecutionResources { fn from(execution_info: &blockifier::transaction::objects::TransactionExecutionInfo) -> Self { - let memory_holes = execution_info.transaction_receipt.resources.vm_resources.n_memory_holes; + let memory_holes = execution_info.receipt.resources.computation.vm_resources.n_memory_holes; let computation_resources = ComputationResources { - steps: execution_info.transaction_receipt.resources.total_charged_steps(), + steps: execution_info.receipt.resources.computation.vm_resources.total_n_steps(), memory_holes: if memory_holes == 0 { None } else { Some(memory_holes) }, range_check_builtin_applications: ComputationResources::get_resource_from_execution_info( @@ -217,8 +190,8 @@ impl From<&blockifier::transaction::objects::TransactionExecutionInfo> for Execu Self { computation_resources, data_availability: DataAvailability { - l1_gas: execution_info.transaction_receipt.da_gas.l1_gas, - l1_data_gas: execution_info.transaction_receipt.da_gas.l1_data_gas, + l1_gas: execution_info.receipt.da_gas.l1_gas.0.into(), + l1_data_gas: execution_info.receipt.da_gas.l1_data_gas.0.into(), }, } } @@ -230,9 +203,9 @@ impl ComputationResources { resource_name: &BuiltinName, ) -> Option { execution_info - .transaction_receipt + .receipt .resources - .vm_resources + .computation.vm_resources .builtin_instance_counter .get(resource_name) .cloned() diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index 12527e83b..caa3ba945 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -1,9 +1,6 @@ -use std::collections::BTreeMap; use std::sync::Arc; -use blockifier::execution::contract_class::ClassInfo; use blockifier::state::state_api::StateReader; -use blockifier::transaction::account_transaction::AccountTransaction; use blockifier::transaction::objects::TransactionExecutionInfo; use broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; @@ -13,10 +10,13 @@ use deploy_transaction::DeployTransaction; use invoke_transaction_v1::InvokeTransactionV1; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use starknet_api::block::BlockNumber; +use starknet_api::block::GasPrice; +use starknet_api::contract_class::ClassInfo; +use starknet_api::contract_class::EntryPointType; use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::deprecated_contract_class::EntryPointType; -use starknet_api::transaction::{Fee, Resource, Tip}; +use starknet_api::executable_transaction::AccountTransaction; +use starknet_api::transaction::fields::{Fee, Resource, Tip}; use starknet_rs_core::crypto::compute_hash_on_elements; use starknet_rs_core::types::{ BlockId, ExecutionResult, Felt, ResourceBounds, ResourceBoundsMapping, @@ -44,7 +44,7 @@ use crate::constants::{ PREFIX_DECLARE, PREFIX_DEPLOY_ACCOUNT, PREFIX_INVOKE, QUERY_VERSION_OFFSET, }; use crate::contract_address::ContractAddress; -use crate::contract_class::{compute_sierra_class_hash, ContractClass}; +use crate::contract_class::{ContractClass, compute_sierra_class_hash}; use crate::emitted_event::{Event, OrderedEvent}; use crate::error::{ConversionError, DevnetResult, Error, JsonError}; use crate::felt::{ @@ -322,27 +322,47 @@ impl ResourceBoundsWrapper { } } -impl From<&ResourceBoundsWrapper> for starknet_api::transaction::ResourceBoundsMapping { +fn convert_resource_bounds_from_starknet_rs_to_starknet_api( + bounds: ResourceBounds, +) -> starknet_api::transaction::fields::ResourceBounds { + starknet_api::transaction::fields::ResourceBounds { + max_amount: starknet_api::execution_resources::GasAmount(bounds.max_amount), + max_price_per_unit: GasPrice(bounds.max_price_per_unit), + } +} + +impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ValidResourceBounds { fn from(value: &ResourceBoundsWrapper) -> Self { - starknet_api::transaction::ResourceBoundsMapping(BTreeMap::from([ - ( - Resource::L1Gas, - starknet_api::transaction::ResourceBounds { - max_amount: value.inner.l1_gas.max_amount, - max_price_per_unit: value.inner.l1_gas.max_price_per_unit, - }, - ), - ( - Resource::L2Gas, - starknet_api::transaction::ResourceBounds { - max_amount: value.inner.l2_gas.max_amount, - max_price_per_unit: value.inner.l2_gas.max_price_per_unit, - }, - ), - ])) + starknet_api::transaction::fields::ValidResourceBounds::AllResources( + starknet_api::transaction::fields::AllResourceBounds { + l1_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( + value.inner.l1_gas, + ), + l2_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( + value.inner.l2_gas, + ), + l1_data_gas: todo!(), + }, + ) } } +// impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ResourceBounds { +// fn from(value: &ResourceBoundsWrapper) -> Self { + +// starknet_api::transaction::fields::ResourceBounds::from(BTreeMap::from([ +// (Resource::L1Gas, starknet_api::transaction::fields::ResourceBounds { +// max_amount: GasAmount(value.inner.l1_gas.max_amount), +// max_price_per_unit: GasPrice(value.inner.l1_gas.max_price_per_unit), +// }), +// (Resource::L2Gas, starknet_api::transaction::fields::ResourceBounds { +// max_amount: GasAmount(value.inner.l2_gas.max_amount), +// max_price_per_unit: GasPrice(value.inner.l2_gas.max_price_per_unit), +// }), +// ])) +// } +// } + impl BroadcastedTransactionCommonV3 { /// Checks if total accumulated fee of resource_bounds for l1 is equal to 0 or for l2 is not /// zero @@ -465,7 +485,7 @@ impl BroadcastedTransaction { &self, chain_id: &Felt, only_query: bool, - ) -> DevnetResult { + ) -> DevnetResult { let blockifier_transaction = match self { BroadcastedTransaction::Invoke(invoke_txn) => AccountTransaction::Invoke( invoke_txn.create_blockifier_invoke_transaction(chain_id, only_query)?, @@ -539,7 +559,7 @@ impl BroadcastedDeclareTransaction { &self, chain_id: &Felt, only_query: bool, - ) -> DevnetResult { + ) -> DevnetResult { let (transaction_hash, sn_api_transaction, class_info) = match self { BroadcastedDeclareTransaction::V1(v1) => { let class_hash = v1.generate_class_hash()?; @@ -551,7 +571,7 @@ impl BroadcastedDeclareTransaction { sender_address: v1.sender_address.try_into()?, nonce: starknet_api::core::Nonce(v1.common.nonce), max_fee: v1.common.max_fee, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v1.common.signature.clone(), ), }, @@ -568,7 +588,7 @@ impl BroadcastedDeclareTransaction { let sn_api_declare = starknet_api::transaction::DeclareTransaction::V2( starknet_api::transaction::DeclareTransactionV2 { max_fee: v2.common.max_fee, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v2.common.signature.clone(), ), nonce: starknet_api::core::Nonce(v2.common.nonce), @@ -606,7 +626,7 @@ impl BroadcastedDeclareTransaction { starknet_api::transaction::DeclareTransactionV3 { resource_bounds: (&v3.common.resource_bounds).into(), tip: v3.common.tip, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v3.common.signature.clone(), ), nonce: starknet_api::core::Nonce(v3.common.nonce), @@ -617,12 +637,13 @@ impl BroadcastedDeclareTransaction { sender_address: v3.sender_address.try_into()?, nonce_data_availability_mode: v3.common.nonce_data_availability_mode, fee_data_availability_mode: v3.common.fee_data_availability_mode, - paymaster_data: starknet_api::transaction::PaymasterData( + paymaster_data: starknet_api::transaction::fields::PaymasterData( v3.common.paymaster_data.clone(), ), - account_deployment_data: starknet_api::transaction::AccountDeploymentData( - v3.account_deployment_data.clone(), - ), + account_deployment_data: + starknet_api::transaction::fields::AccountDeploymentData( + v3.account_deployment_data.clone(), + ), }, ); @@ -634,13 +655,13 @@ impl BroadcastedDeclareTransaction { }; if only_query { - Ok(blockifier::transaction::transactions::DeclareTransaction::new_for_query( + Ok(starknet_api::executable_transaction::DeclareTransaction::new_for_query( sn_api_transaction, starknet_api::transaction::TransactionHash(transaction_hash), class_info, )?) } else { - Ok(blockifier::transaction::transactions::DeclareTransaction::new( + Ok(starknet_api::executable_transaction::DeclareTransaction::create( sn_api_transaction, starknet_api::transaction::TransactionHash(transaction_hash), class_info, @@ -681,13 +702,17 @@ impl BroadcastedDeployAccountTransaction { &self, chain_id: &Felt, only_query: bool, - ) -> DevnetResult { + ) -> DevnetResult { let (transaction_hash, sn_api_transaction, contract_address) = match self { BroadcastedDeployAccountTransaction::V1(v1) => { let contract_address = calculate_contract_address( - starknet_api::transaction::ContractAddressSalt(v1.contract_address_salt), + starknet_api::transaction::fields::ContractAddressSalt( + v1.contract_address_salt, + ), starknet_api::core::ClassHash(v1.class_hash), - &starknet_api::transaction::Calldata(Arc::new(v1.constructor_calldata.clone())), + &starknet_api::transaction::fields::Calldata(Arc::new( + v1.constructor_calldata.clone(), + )), starknet_api::core::ContractAddress::from(0u8), )?; @@ -707,15 +732,15 @@ impl BroadcastedDeployAccountTransaction { let sn_api_transaction = starknet_api::transaction::DeployAccountTransactionV1 { max_fee: v1.common.max_fee, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v1.common.signature.clone(), ), nonce: starknet_api::core::Nonce(v1.common.nonce), class_hash: starknet_api::core::ClassHash(v1.class_hash), - contract_address_salt: starknet_api::transaction::ContractAddressSalt( + contract_address_salt: starknet_api::transaction::fields::ContractAddressSalt( v1.contract_address_salt, ), - constructor_calldata: starknet_api::transaction::Calldata(Arc::new( + constructor_calldata: starknet_api::transaction::fields::Calldata(Arc::new( v1.constructor_calldata.clone(), )), }; @@ -739,20 +764,20 @@ impl BroadcastedDeployAccountTransaction { let sn_api_transaction = starknet_api::transaction::DeployAccountTransactionV3 { resource_bounds: (&v3.common.resource_bounds).into(), tip: v3.common.tip, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v3.common.signature.clone(), ), nonce: starknet_api::core::Nonce(v3.common.nonce), class_hash: starknet_api::core::ClassHash(v3.class_hash), nonce_data_availability_mode: v3.common.nonce_data_availability_mode, fee_data_availability_mode: v3.common.fee_data_availability_mode, - paymaster_data: starknet_api::transaction::PaymasterData( + paymaster_data: starknet_api::transaction::fields::PaymasterData( v3.common.paymaster_data.clone(), ), - contract_address_salt: starknet_api::transaction::ContractAddressSalt( + contract_address_salt: starknet_api::transaction::fields::ContractAddressSalt( v3.contract_address_salt, ), - constructor_calldata: starknet_api::transaction::Calldata(Arc::new( + constructor_calldata: starknet_api::transaction::fields::Calldata(Arc::new( v3.constructor_calldata.clone(), )), }; @@ -765,7 +790,7 @@ impl BroadcastedDeployAccountTransaction { } }; - Ok(blockifier::transaction::transactions::DeployAccountTransaction { + Ok(starknet_api::executable_transaction::DeployAccountTransaction { tx: sn_api_transaction, tx_hash: starknet_api::transaction::TransactionHash(transaction_hash), contract_address, @@ -804,7 +829,7 @@ impl BroadcastedInvokeTransaction { &self, chain_id: &Felt, only_query: bool, - ) -> DevnetResult { + ) -> DevnetResult { let (transaction_hash, sn_api_transaction) = match self { BroadcastedInvokeTransaction::V1(v1) => { let txn_hash = compute_hash_on_elements(&[ @@ -820,12 +845,14 @@ impl BroadcastedInvokeTransaction { let sn_api_transaction = starknet_api::transaction::InvokeTransactionV1 { max_fee: v1.common.max_fee, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v1.common.signature.clone(), ), nonce: starknet_api::core::Nonce(v1.common.nonce), sender_address: v1.sender_address.try_into()?, - calldata: starknet_api::transaction::Calldata(Arc::new(v1.calldata.clone())), + calldata: starknet_api::transaction::fields::Calldata(Arc::new( + v1.calldata.clone(), + )), }; (txn_hash, starknet_api::transaction::InvokeTransaction::V1(sn_api_transaction)) @@ -836,27 +863,30 @@ impl BroadcastedInvokeTransaction { let sn_api_transaction = starknet_api::transaction::InvokeTransactionV3 { resource_bounds: (&v3.common.resource_bounds).into(), tip: v3.common.tip, - signature: starknet_api::transaction::TransactionSignature( + signature: starknet_api::transaction::fields::TransactionSignature( v3.common.signature.clone(), ), nonce: starknet_api::core::Nonce(v3.common.nonce), sender_address: v3.sender_address.try_into()?, - calldata: starknet_api::transaction::Calldata(Arc::new(v3.calldata.clone())), + calldata: starknet_api::transaction::fields::Calldata(Arc::new( + v3.calldata.clone(), + )), nonce_data_availability_mode: v3.common.nonce_data_availability_mode, fee_data_availability_mode: v3.common.fee_data_availability_mode, - paymaster_data: starknet_api::transaction::PaymasterData( + paymaster_data: starknet_api::transaction::fields::PaymasterData( v3.common.paymaster_data.clone(), ), - account_deployment_data: starknet_api::transaction::AccountDeploymentData( - v3.account_deployment_data.clone(), - ), + account_deployment_data: + starknet_api::transaction::fields::AccountDeploymentData( + v3.account_deployment_data.clone(), + ), }; (txn_hash, starknet_api::transaction::InvokeTransaction::V3(sn_api_transaction)) } }; - Ok(blockifier::transaction::transactions::InvokeTransaction { + Ok(starknet_api::executable_transaction::InvokeTransaction { tx: sn_api_transaction, tx_hash: starknet_api::transaction::TransactionHash(transaction_hash), only_query, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index d47bc0f93..0278cac02 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use starknet_rs_core::crypto::compute_hash_on_elements; use starknet_rs_core::types::Felt; @@ -66,15 +66,15 @@ impl BroadcastedDeclareTransactionV1 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::Felt; use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; use crate::contract_class::Cairo0Json; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use crate::rpc::transactions::BroadcastedDeclareTransaction; + use crate::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use crate::traits::HashProducer; #[derive(Deserialize)] @@ -121,7 +121,7 @@ mod tests { assert_eq!( feeder_gateway_transaction.transaction_hash, - blockifier_declare_transaction.tx_hash().0 + *blockifier_declare_transaction.tx_hash ); assert_eq!( feeder_gateway_transaction.class_hash, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs index 780167aae..94ac425be 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs @@ -1,6 +1,6 @@ use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use serde::Deserialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use crate::contract_address::ContractAddress; use crate::felt::{CompiledClassHash, Nonce, TransactionSignature, TransactionVersion}; @@ -45,7 +45,7 @@ impl BroadcastedDeclareTransactionV2 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::Felt; use crate::chain_id::ChainId; @@ -108,7 +108,7 @@ mod tests { ); assert_eq!( feeder_gateway_transaction.transaction_hash, - blockifier_declare_transaction.tx_hash().0 + *blockifier_declare_transaction.tx_hash ); } } diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs index 74c7178a4..fcb1d8454 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs @@ -60,7 +60,7 @@ impl BroadcastedDeclareTransactionV3 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::{ResourceBoundsMapping, Tip}; + use starknet_api::transaction::fields::{ResourceBounds, Tip}; use starknet_types_core::felt::Felt; use crate::chain_id::ChainId; @@ -82,7 +82,7 @@ mod tests { version: Felt, nonce_data_availability_mode: u8, fee_data_availability_mode: u8, - resource_bounds: ResourceBoundsMapping, + resource_bounds: ResourceBounds, tip: Tip, paymaster_data: Vec, account_deployment_data: Vec, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs index 24c831513..ae2e07e75 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use crate::felt::{ Calldata, ClassHash, ContractAddressSalt, Nonce, TransactionSignature, TransactionVersion, @@ -43,7 +43,7 @@ impl BroadcastedDeployAccountTransactionV1 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::Felt; use crate::chain_id::ChainId; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs index 11bc9990e..b65cc8801 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs @@ -54,9 +54,9 @@ impl BroadcastedDeployAccountTransactionV3 { constructor_calldata: &Calldata, ) -> DevnetResult { let contract_address = calculate_contract_address( - starknet_api::transaction::ContractAddressSalt(*contract_address_salt), + starknet_api::transaction::fields::ContractAddressSalt(*contract_address_salt), starknet_api::core::ClassHash(*class_hash), - &starknet_api::transaction::Calldata(Arc::new(constructor_calldata.clone())), + &starknet_api::transaction::fields::Calldata(Arc::new(constructor_calldata.clone())), starknet_api::core::ContractAddress::from(0u8), )?; @@ -67,7 +67,7 @@ impl BroadcastedDeployAccountTransactionV3 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::{ResourceBoundsMapping, Tip}; + use starknet_api::transaction::fields::{ResourceBounds, Tip}; use starknet_rs_core::types::Felt; use crate::chain_id::ChainId; @@ -85,7 +85,7 @@ mod tests { version: Felt, nonce_data_availability_mode: u8, fee_data_availability_mode: u8, - resource_bounds: ResourceBoundsMapping, + resource_bounds: ResourceBounds, tip: Tip, paymaster_data: Vec, // specific diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs index f801d01ae..86243b0e4 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs @@ -1,5 +1,5 @@ use serde::Deserialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use crate::contract_address::ContractAddress; use crate::felt::{Calldata, Nonce, TransactionSignature, TransactionVersion}; @@ -39,7 +39,7 @@ impl BroadcastedInvokeTransactionV1 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::Felt; use crate::chain_id::ChainId; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs index 03d7d1a78..b20dac260 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs @@ -47,7 +47,7 @@ impl BroadcastedInvokeTransactionV3 { #[cfg(test)] mod tests { use serde::Deserialize; - use starknet_api::transaction::{ResourceBoundsMapping, Tip}; + use starknet_api::transaction::fields::{ResourceBounds, Tip}; use starknet_rs_core::types::Felt; use crate::chain_id::ChainId; @@ -66,7 +66,7 @@ mod tests { version: Felt, nonce_data_availability_mode: u8, fee_data_availability_mode: u8, - resource_bounds: ResourceBoundsMapping, + resource_bounds: ResourceBounds, tip: Tip, paymaster_data: Vec, account_deployment_data: Vec, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v0v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v0v1.rs index 98cfc1b90..3e3a60732 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v0v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v0v1.rs @@ -1,5 +1,5 @@ use serde::Serialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use super::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use crate::contract_address::ContractAddress; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v2.rs b/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v2.rs index 87d9cd98e..e84f8d97a 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v2.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v2.rs @@ -1,5 +1,5 @@ use serde::Serialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use super::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; use crate::contract_address::ContractAddress; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v3.rs index 79da4c04e..1f4ea3209 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/declare_transaction_v3.rs @@ -1,6 +1,6 @@ use serde::Serialize; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::transaction::Tip; +use starknet_api::transaction::fields::Tip; use starknet_types_core::felt::Felt; use super::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v1.rs index c3c9c10ac..11ae825c5 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v1.rs @@ -1,5 +1,5 @@ use serde::Serialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use super::broadcasted_deploy_account_transaction_v1::BroadcastedDeployAccountTransactionV1; use crate::contract_address::ContractAddress; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v3.rs index 39efdb407..3879b4446 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/deploy_account_transaction_v3.rs @@ -1,6 +1,6 @@ use serde::Serialize; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::transaction::Tip; +use starknet_api::transaction::fields::Tip; use starknet_types_core::felt::Felt; use super::broadcasted_deploy_account_transaction_v3::BroadcastedDeployAccountTransactionV3; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v1.rs index 0dc8dd418..54d32be3a 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v1.rs @@ -1,5 +1,5 @@ use serde::Serialize; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use super::broadcasted_invoke_transaction_v1::BroadcastedInvokeTransactionV1; use crate::contract_address::ContractAddress; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v3.rs index ae5c8024a..c33dba067 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/invoke_transaction_v3.rs @@ -1,6 +1,6 @@ use serde::Serialize; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::transaction::Tip; +use starknet_api::transaction::fields::Tip; use starknet_types_core::felt::Felt; use super::broadcasted_invoke_transaction_v3::BroadcastedInvokeTransactionV3; diff --git a/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs b/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs index 8726a9074..f23906d1d 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs @@ -1,14 +1,14 @@ use std::sync::Arc; -use blockifier::transaction::transactions::L1HandlerTransaction as BlockifierL1HandlerTransaction; use serde::Serialize; use starknet_api::core::{ ContractAddress as ApiContractAddress, EntryPointSelector as ApiEntryPointSelector, Nonce as ApiNonce, }; +use starknet_api::executable_transaction::L1HandlerTransaction as ApiL1HandlerTransaction; use starknet_api::transaction::{ - Calldata as ApiCalldata, Fee as ApiFee, L1HandlerTransaction as ApiL1HandlerTransaction, TransactionHash as ApiTransactionHash, TransactionVersion as ApiTransactionVersion, + fields::{Calldata as ApiCalldata, Fee as ApiFee}, }; use starknet_rs_core::crypto::compute_hash_on_elements; use starknet_rs_core::types::Felt; @@ -17,7 +17,7 @@ use super::serialize_paid_fee_on_l1; use crate::constants::PREFIX_L1_HANDLER; use crate::contract_address::ContractAddress; use crate::error::{ConversionError, DevnetResult, Error}; -use crate::felt::{try_felt_to_num, Calldata, EntryPointSelector, Nonce, TransactionVersion}; +use crate::felt::{Calldata, EntryPointSelector, Nonce, TransactionVersion, try_felt_to_num}; use crate::rpc::messaging::MessageToL2; #[derive(Debug, Clone, Default, Serialize, Eq, PartialEq)] diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index eab4eba12..35fec5f95 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -85,8 +85,10 @@ impl Formatter for StarknetFormatter { #[cfg(test)] pub(crate) mod test_utils { + use starknet_api::block::GasPrice; use starknet_api::data_availability::DataAvailabilityMode; - use starknet_api::transaction::{ResourceBounds, ResourceBoundsMapping}; + use starknet_api::execution_resources::GasAmount; + use starknet_api::transaction::fields::ResourceBounds; use crate::rpc::transactions::ResourceBoundsWrapper; @@ -124,15 +126,21 @@ pub(crate) mod test_utils { ) -> ResourceBoundsWrapper { let l1_resource_bounds = resource_bounds .0 - .get(&starknet_api::transaction::Resource::L1Gas) + .get(&starknet_api::transaction::fields::Resource::L1Gas) .cloned() - .unwrap_or(ResourceBounds { max_amount: 0, max_price_per_unit: 0 }); + .unwrap_or(ResourceBounds { + max_amount: GasAmount(0), + max_price_per_unit: GasPrice(0), + }); let l2_resource_bounds = resource_bounds .0 - .get(&starknet_api::transaction::Resource::L2Gas) + .get(&starknet_api::transaction::fields::Resource::L2Gas) .cloned() - .unwrap_or(ResourceBounds { max_amount: 0, max_price_per_unit: 0 }); + .unwrap_or(ResourceBounds { + max_amount: GasAmount(0), + max_price_per_unit: GasPrice(0), + }); ResourceBoundsWrapper::new( l1_resource_bounds.max_amount, From 6c666755ffd2c4240ebd8aadfb513e5d7b5830f2 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Thu, 30 Jan 2025 17:15:42 +0100 Subject: [PATCH 03/41] Mostly gas remaining [skip ci] [WIP] --- contracts/test_artifacts/cairo0/account.json | 1 - crates/starknet-devnet-core/src/account.rs | 34 +-- crates/starknet-devnet-core/src/blocks/mod.rs | 94 ++++--- .../src/contract_class_choice.rs | 5 +- crates/starknet-devnet-core/src/error.rs | 10 +- .../starknet-devnet-core/src/messaging/mod.rs | 2 +- .../src/starknet/add_declare_transaction.rs | 34 ++- .../add_deploy_account_transaction.rs | 45 +-- .../src/starknet/add_invoke_transaction.rs | 39 +-- .../starknet/add_l1_handler_transaction.rs | 39 +-- .../src/starknet/defaulter.rs | 12 +- .../src/starknet/estimations.rs | 86 +++--- .../starknet-devnet-core/src/starknet/mod.rs | 194 +++++++------ .../src/starknet/starknet_config.rs | 8 +- .../src/starknet/state_update.rs | 2 +- .../src/starknet/transaction_trace.rs | 10 +- crates/starknet-devnet-core/src/state/mod.rs | 31 +- .../src/state/state_diff.rs | 35 ++- .../src/state/state_readers.rs | 10 +- .../src/system_contract.rs | 4 +- .../starknet-devnet-core/src/transactions.rs | 7 +- crates/starknet-devnet-core/src/utils.rs | 46 +-- .../src/rpc/contract_class.rs | 217 +++++--------- .../contract_class/deprecated/abi_entry.rs | 130 --------- .../deprecated/json_contract_class.rs | 265 ------------------ .../src/rpc/contract_class/deprecated/mod.rs | 48 +--- .../deprecated/rpc_contract_class.rs | 115 -------- .../src/rpc/transactions.rs | 109 ++++--- .../broadcasted_declare_transaction_v1.rs | 6 +- .../broadcasted_declare_transaction_v2.rs | 4 +- .../broadcasted_declare_transaction_v3.rs | 4 +- ...oadcasted_deploy_account_transaction_v1.rs | 4 +- ...oadcasted_deploy_account_transaction_v3.rs | 4 +- .../broadcasted_invoke_transaction_v1.rs | 9 +- .../broadcasted_invoke_transaction_v3.rs | 6 +- .../transactions/l1_handler_transaction.rs | 8 +- crates/starknet-devnet-types/src/utils.rs | 193 +------------ 37 files changed, 554 insertions(+), 1316 deletions(-) delete mode 100644 contracts/test_artifacts/cairo0/account.json delete mode 100644 crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs delete mode 100644 crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs delete mode 100644 crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs diff --git a/contracts/test_artifacts/cairo0/account.json b/contracts/test_artifacts/cairo0/account.json deleted file mode 100644 index 7258b7637..000000000 --- a/contracts/test_artifacts/cairo0/account.json +++ /dev/null @@ -1 +0,0 @@ -{"abi":[{"members":[{"name":"to","offset":0,"type":"felt"},{"name":"selector","offset":1,"type":"felt"},{"name":"data_offset","offset":2,"type":"felt"},{"name":"data_len","offset":3,"type":"felt"}],"name":"AccountCallArray","size":4,"type":"struct"},{"inputs":[{"name":"publicKey","type":"felt"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[],"name":"getPublicKey","outputs":[{"name":"publicKey","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"interfaceId","type":"felt"}],"name":"supportsInterface","outputs":[{"name":"success","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"newPublicKey","type":"felt"}],"name":"setPublicKey","outputs":[],"type":"function"},{"inputs":[{"name":"hash","type":"felt"},{"name":"signature_len","type":"felt"},{"name":"signature","type":"felt*"}],"name":"isValidSignature","outputs":[{"name":"isValid","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__validate__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"}],"name":"__validate_declare__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"},{"name":"salt","type":"felt"},{"name":"publicKey","type":"felt"}],"name":"__validate_deploy__","outputs":[],"type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__execute__","outputs":[{"name":"response_len","type":"felt"},{"name":"response","type":"felt*"}],"type":"function"}],"entry_points_by_type":{"CONSTRUCTOR":[{"offset":"0x16e","selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}],"EXTERNAL":[{"offset":"0x1cd","selector":"0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9"},{"offset":"0x2bb","selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad"},{"offset":"0x224","selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"},{"offset":"0x191","selector":"0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079"},{"offset":"0x1f4","selector":"0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e"},{"offset":"0x25f","selector":"0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3"},{"offset":"0x1b2","selector":"0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd"},{"offset":"0x285","selector":"0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895"}],"L1_HANDLER":[]},"program":{"attributes":[{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.assert_only_self"],"end_pc":192,"flow_tracking_data":{"ap_tracking":{"group":16,"offset":12},"reference_ids":{}},"name":"error_message","start_pc":191,"value":"Account: caller is not this account"},{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.execute"],"end_pc":269,"flow_tracking_data":{"ap_tracking":{"group":21,"offset":9},"reference_ids":{}},"name":"error_message","start_pc":259,"value":"Account: deprecated tx version"},{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.execute"],"end_pc":274,"flow_tracking_data":{"ap_tracking":{"group":21,"offset":49},"reference_ids":{}},"name":"error_message","start_pc":272,"value":"Account: reentrant call"}],"builtins":["pedersen","range_check","ecdsa","bitwise"],"compiler_version":"0.10.2","data":["0x40780017fff7fff","0x1","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x3","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080007fff8000","0x400080007ffd7fff","0x482480017ffd8001","0x1","0x482480017ffd8001","0x1","0xa0680017fff7ffe","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x402a7ffc7ffd7fff","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x484480017fff8000","0x2aaaaaaaaaaaab05555555555555556","0x48307fff7ffd8000","0x480280027ffb8000","0x480280037ffb8000","0x484480017fff8000","0x4000000000000088000000000000001","0x48307fff7ffd8000","0xa0680017fff8000","0xe","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48287ffc80007fff","0x40307ffc7ff87fff","0x48297ffd80007ffc","0x482680017ffd8000","0x1","0x48507fff7ffe8000","0x40507ff97ff57fff","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0xa0680017fff8000","0xc","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48287ffd80007fff","0x48327fff7ffc8000","0x40307ffa7ff67fff","0x48527ffe7ffc8000","0x40507ff97ff57fff","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0x40317ffd7ff97ffd","0x48297ffc80007ffd","0x48527fff7ffc8000","0x40507ffb7ff77fff","0x40780017fff7fff","0x2","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0x48297ffd80007ffc","0x20680017fff7fff","0x4","0x402780017ffc7ffc","0x1","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc","0x208b7fff7fff7ffe","0x480680017fff8000","0x43616c6c436f6e7472616374","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x47657443616c6c657241646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x476574436f6e747261637441646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f7261676552656164","0x400280007ffc7fff","0x400380017ffc7ffd","0x482680017ffc8000","0x3","0x480280027ffc8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f726167655772697465","0x400280007ffb7fff","0x400380017ffb7ffc","0x400380027ffb7ffd","0x482680017ffb8000","0x3","0x208b7fff7fff7ffe","0x480680017fff8000","0x4765745478496e666f","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x400380017ff97ffa","0x400380007ff97ffb","0x482680017ff98000","0x2","0x208b7fff7fff7ffe","0xa0680017fff8000","0xc","0x40780017fff7fff","0x6","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa4","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a","0x40127fff7fff7ff9","0x48127ffe7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffff59942a8c","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbf","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffac","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x48127ffd7fff8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff87","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffd7fff8000","0x48127ff37fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x480a7ff57fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff74","0x480a7ff97fff8000","0x480680017fff8000","0x1","0x480080007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a","0x480680017fff8000","0x1","0x40127fff7fff7ffe","0x40137ffd7fff8000","0x48127fdc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49","0x400680017fff7fff","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef","0x40137fff7fff8001","0x48127ffb7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a80017fff8000","0x1104800180018000","0x35","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee5","0x40137fff7fff8002","0x48127ffc7fff8000","0x480a7ffa7fff8000","0x480a80017fff8000","0x480a80027fff8000","0x1104800180018000","0xa","0x48127ffe7fff8000","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a80007fff8000","0x48127ffa7fff8000","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x20780017fff7ffb","0x6","0x480a7ffa7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480280007ffc8000","0x480280017ffc8000","0x480280027ffc8000","0x480280037ffc8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11","0x40137ffe7fff8000","0x40137fff7fff8001","0x40137ffd7fff8002","0x480a7ffd7fff8000","0x480a80017fff8000","0x480a80007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2","0x480a80027fff8000","0x482680017ffb8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffc8000","0x4","0x482a80007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4","0x48127ffe7fff8000","0x482880007ffe8000","0x208b7fff7fff7ffe","0x20780017fff7ffa","0x4","0x480a7ff97fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x400280007ffd7fff","0x480280017ffb8000","0x400280017ffd7fff","0x480280037ffb8000","0x400280027ffd7fff","0x480280027ffb8000","0x48327fff7ffc8000","0x400280037ffd7fff","0x480a7ff97fff8000","0x482680017ffa8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffb8000","0x4","0x480a7ffc7fff8000","0x482680017ffd8000","0x4","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3e","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff19","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280017ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x482680017ffd8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffb7fff8000","0x48127ff27fff8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff67fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe61","0x48127ffe7fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecf","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff38000","0x482480017ff28000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd3","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe26","0x48127ffe7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe94","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe00","0x48127ffe7fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6e","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x3","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff57fff8000","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5a","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x4003800080007ffb","0x400380007ffd7ffb","0x402780017ffd8001","0x1","0x4826800180008000","0x1","0x40297ffb7fff8002","0x4826800180008000","0x1","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f","0x480a80017fff8000","0x4829800080008002","0x480a80007fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280047ffb8000","0x482480017ffb8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff28000","0x482480017ff18000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2","0x40137ff97fff8000","0x40137ffa7fff8001","0x40137ffb7fff8002","0x40137ffc7fff8003","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7","0x480a80007fff8000","0x480a80017fff8000","0x48127ffb7fff8000","0x480a80027fff8000","0x480a80037fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe"],"debug_info":[],"hints":{"0":[{"accessible_scopes":["starkware.cairo.common.alloc","starkware.cairo.common.alloc.alloc"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"6":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_enter_scope({'n': ids.len})","flow_tracking_data":{"ap_tracking":{"group":1,"offset":0},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.len":0}}}],"14":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"n -= 1\nids.continue_copying = 1 if n > 0 else 0","flow_tracking_data":{"ap_tracking":{"group":1,"offset":5},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.continue_copying":1}}}],"17":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_exit_scope()","flow_tracking_data":{"ap_tracking":{"group":1,"offset":6},"reference_ids":{}}}],"18":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))","flow_tracking_data":{"ap_tracking":{"group":2,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_le_felt.a":2,"starkware.cairo.common.math.assert_le_felt.b":3,"starkware.cairo.common.math.assert_le_felt.range_check_ptr":4}}}],"28":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"memory[ap] = 1 if excluded != 0 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":8},"reference_ids":{}}}],"42":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"memory[ap] = 1 if excluded != 1 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":9},"reference_ids":{}}}],"54":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"assert excluded == 2","flow_tracking_data":{"ap_tracking":{"group":2,"offset":10},"reference_ids":{}}}],"63":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_lt_felt"],"code":"from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'","flow_tracking_data":{"ap_tracking":{"group":3,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_lt_felt.a":5,"starkware.cairo.common.math.assert_lt_felt.b":6}}}],"81":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.call_contract"],"code":"syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":4,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.call_contract.syscall_ptr":7}}}],"89":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_caller_address"],"code":"syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":5,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":8}}}],"96":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_contract_address"],"code":"syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":6,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":9}}}],"104":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_read"],"code":"syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":7,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_read.syscall_ptr":10}}}],"113":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_write"],"code":"syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":8,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_write.syscall_ptr":11}}}],"119":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_tx_info"],"code":"syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":9,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":12}}}],"123":[{"accessible_scopes":["starkware.cairo.common.signature","starkware.cairo.common.signature.verify_ecdsa_signature"],"code":"ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))","flow_tracking_data":{"ap_tracking":{"group":10,"offset":0},"reference_ids":{"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":15,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":13,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":14}}}],"128":[{"accessible_scopes":["starkware.cairo.common.math_cmp","starkware.cairo.common.math_cmp.is_le_felt"],"code":"memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1","flow_tracking_data":{"ap_tracking":{"group":11,"offset":0},"reference_ids":{"starkware.cairo.common.math_cmp.is_le_felt.a":16,"starkware.cairo.common.math_cmp.is_le_felt.b":17}}}],"375":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.constructor"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":30,"offset":35},"reference_ids":{}}}],"392":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getPublicKey_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":32,"offset":0},"reference_ids":{}}}],"425":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.supportsInterface_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":36,"offset":0},"reference_ids":{}}}],"470":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.setPublicKey"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":40,"offset":50},"reference_ids":{}}}],"491":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.isValidSignature_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":42,"offset":0},"reference_ids":{}}}],"579":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":45,"offset":77},"reference_ids":{}}}],"617":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_declare__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":47,"offset":63},"reference_ids":{}}}],"657":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_deploy__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":49,"offset":65},"reference_ids":{}}}],"680":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__execute___encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":52,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.Account":{"destination":"openzeppelin.account.library.Account","type":"alias"},"__main__.AccountCallArray":{"destination":"openzeppelin.account.library.AccountCallArray","type":"alias"},"__main__.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"__main__.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"__main__.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"__main__.__execute__":{"decorators":["external"],"pc":668,"type":"function"},"__main__.__execute__.Args":{"full_name":"__main__.__execute__.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__execute__.ImplicitArgs":{"full_name":"__main__.__execute__.ImplicitArgs","members":{"bitwise_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin*","offset":3},"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":4},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":5,"type":"struct"},"__main__.__execute__.Return":{"cairo_type":"(response_len: felt, response: felt*)","type":"type_definition"},"__main__.__execute__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate__":{"decorators":["external"],"pc":531,"type":"function"},"__main__.__validate__.Args":{"full_name":"__main__.__validate__.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__validate__.ImplicitArgs":{"full_name":"__main__.__validate__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_declare__":{"decorators":["external"],"pc":590,"type":"function"},"__main__.__validate_declare__.Args":{"full_name":"__main__.__validate_declare__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.__validate_declare__.ImplicitArgs":{"full_name":"__main__.__validate_declare__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_declare__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_deploy__":{"decorators":["external"],"pc":628,"type":"function"},"__main__.__validate_deploy__.Args":{"full_name":"__main__.__validate_deploy__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0},"publicKey":{"cairo_type":"felt","offset":2},"salt":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.__validate_deploy__.ImplicitArgs":{"full_name":"__main__.__validate_deploy__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_deploy__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.constructor":{"decorators":["constructor"],"pc":359,"type":"function"},"__main__.constructor.Args":{"full_name":"__main__.constructor.Args","members":{"publicKey":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.constructor.ImplicitArgs":{"full_name":"__main__.constructor.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.constructor.Return":{"cairo_type":"()","type":"type_definition"},"__main__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getPublicKey":{"decorators":["view"],"pc":386,"type":"function"},"__main__.getPublicKey.Args":{"full_name":"__main__.getPublicKey.Args","members":{},"size":0,"type":"struct"},"__main__.getPublicKey.ImplicitArgs":{"full_name":"__main__.getPublicKey.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getPublicKey.Return":{"cairo_type":"(publicKey: felt)","type":"type_definition"},"__main__.getPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"__main__.isValidSignature":{"decorators":["view"],"pc":481,"type":"function"},"__main__.isValidSignature.Args":{"full_name":"__main__.isValidSignature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"signature":{"cairo_type":"felt*","offset":2},"signature_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.isValidSignature.ImplicitArgs":{"full_name":"__main__.isValidSignature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.isValidSignature.Return":{"cairo_type":"(isValid: felt)","type":"type_definition"},"__main__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.setPublicKey":{"decorators":["external"],"pc":454,"type":"function"},"__main__.setPublicKey.Args":{"full_name":"__main__.setPublicKey.Args","members":{"newPublicKey":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.setPublicKey.ImplicitArgs":{"full_name":"__main__.setPublicKey.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.setPublicKey.Return":{"cairo_type":"()","type":"type_definition"},"__main__.setPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.supportsInterface":{"decorators":["view"],"pc":418,"type":"function"},"__main__.supportsInterface.Args":{"full_name":"__main__.supportsInterface.Args","members":{"interfaceId":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.supportsInterface.ImplicitArgs":{"full_name":"__main__.supportsInterface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.supportsInterface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"__main__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__execute__":{"decorators":["external"],"pc":699,"type":"function"},"__wrappers__.__execute__.Args":{"full_name":"__wrappers__.__execute__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.ImplicitArgs":{"full_name":"__wrappers__.__execute__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: starkware.cairo.common.cairo_builtins.BitwiseBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__execute__.SIZEOF_LOCALS":{"type":"const","value":4},"__wrappers__.__execute__.__wrapped_func":{"destination":"__main__.__execute__","type":"alias"},"__wrappers__.__execute___encode_return":{"decorators":[],"pc":680,"type":"function"},"__wrappers__.__execute___encode_return.Args":{"full_name":"__wrappers__.__execute___encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":2},"ret_value":{"cairo_type":"(response_len: felt, response: felt*)","offset":0}},"size":3,"type":"struct"},"__wrappers__.__execute___encode_return.ImplicitArgs":{"full_name":"__wrappers__.__execute___encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute___encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.__execute___encode_return.SIZEOF_LOCALS":{"type":"const","value":3},"__wrappers__.__execute___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate__":{"decorators":["external"],"pc":548,"type":"function"},"__wrappers__.__validate__.Args":{"full_name":"__wrappers__.__validate__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.ImplicitArgs":{"full_name":"__wrappers__.__validate__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate__.__wrapped_func":{"destination":"__main__.__validate__","type":"alias"},"__wrappers__.__validate___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_declare__":{"decorators":["external"],"pc":607,"type":"function"},"__wrappers__.__validate_declare__.Args":{"full_name":"__wrappers__.__validate_declare__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.ImplicitArgs":{"full_name":"__wrappers__.__validate_declare__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_declare__.__wrapped_func":{"destination":"__main__.__validate_declare__","type":"alias"},"__wrappers__.__validate_declare___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_deploy__":{"decorators":["external"],"pc":645,"type":"function"},"__wrappers__.__validate_deploy__.Args":{"full_name":"__wrappers__.__validate_deploy__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.ImplicitArgs":{"full_name":"__wrappers__.__validate_deploy__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_deploy__.__wrapped_func":{"destination":"__main__.__validate_deploy__","type":"alias"},"__wrappers__.__validate_deploy___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.constructor":{"decorators":["constructor"],"pc":366,"type":"function"},"__wrappers__.constructor.Args":{"full_name":"__wrappers__.constructor.Args","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.ImplicitArgs":{"full_name":"__wrappers__.constructor.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.constructor.__wrapped_func":{"destination":"__main__.constructor","type":"alias"},"__wrappers__.constructor_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getPublicKey":{"decorators":["view"],"pc":401,"type":"function"},"__wrappers__.getPublicKey.Args":{"full_name":"__wrappers__.getPublicKey.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey.ImplicitArgs":{"full_name":"__wrappers__.getPublicKey.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getPublicKey.__wrapped_func":{"destination":"__main__.getPublicKey","type":"alias"},"__wrappers__.getPublicKey_encode_return":{"decorators":[],"pc":392,"type":"function"},"__wrappers__.getPublicKey_encode_return.Args":{"full_name":"__wrappers__.getPublicKey_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(publicKey: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getPublicKey_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getPublicKey_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getPublicKey_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getPublicKey_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.isValidSignature":{"decorators":["view"],"pc":500,"type":"function"},"__wrappers__.isValidSignature.Args":{"full_name":"__wrappers__.isValidSignature.Args","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.isValidSignature.__wrapped_func":{"destination":"__main__.isValidSignature","type":"alias"},"__wrappers__.isValidSignature_encode_return":{"decorators":[],"pc":491,"type":"function"},"__wrappers__.isValidSignature_encode_return.Args":{"full_name":"__wrappers__.isValidSignature_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(isValid: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.isValidSignature_encode_return.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.isValidSignature_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.setPublicKey":{"decorators":["external"],"pc":461,"type":"function"},"__wrappers__.setPublicKey.Args":{"full_name":"__wrappers__.setPublicKey.Args","members":{},"size":0,"type":"struct"},"__wrappers__.setPublicKey.ImplicitArgs":{"full_name":"__wrappers__.setPublicKey.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.setPublicKey.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.setPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.setPublicKey.__wrapped_func":{"destination":"__main__.setPublicKey","type":"alias"},"__wrappers__.setPublicKey_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.supportsInterface":{"decorators":["view"],"pc":434,"type":"function"},"__wrappers__.supportsInterface.Args":{"full_name":"__wrappers__.supportsInterface.Args","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.supportsInterface.__wrapped_func":{"destination":"__main__.supportsInterface","type":"alias"},"__wrappers__.supportsInterface_encode_return":{"decorators":[],"pc":425,"type":"function"},"__wrappers__.supportsInterface_encode_return.Args":{"full_name":"__wrappers__.supportsInterface_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(success: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.supportsInterface_encode_return.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.supportsInterface_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"openzeppelin.account.library.Account":{"type":"namespace"},"openzeppelin.account.library.Account.Args":{"full_name":"openzeppelin.account.library.Account.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.ImplicitArgs","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account._execute_list":{"decorators":[],"pc":301,"type":"function"},"openzeppelin.account.library.Account._execute_list.Args":{"full_name":"openzeppelin.account.library.Account._execute_list.Args","members":{"calls":{"cairo_type":"openzeppelin.account.library.Call*","offset":1},"calls_len":{"cairo_type":"felt","offset":0},"response":{"cairo_type":"felt*","offset":2}},"size":3,"type":"struct"},"openzeppelin.account.library.Account._execute_list.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account._execute_list.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account._execute_list.Return":{"cairo_type":"(response_len: felt)","type":"type_definition"},"openzeppelin.account.library.Account._execute_list.SIZEOF_LOCALS":{"type":"const","value":3},"openzeppelin.account.library.Account._from_call_array_to_call":{"decorators":[],"pc":335,"type":"function"},"openzeppelin.account.library.Account._from_call_array_to_call.Args":{"full_name":"openzeppelin.account.library.Account._from_call_array_to_call.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":2},"calls":{"cairo_type":"openzeppelin.account.library.Call*","offset":3}},"size":4,"type":"struct"},"openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account._from_call_array_to_call.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account._from_call_array_to_call.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.assert_only_self":{"decorators":[],"pc":185,"type":"function"},"openzeppelin.account.library.Account.assert_only_self.Args":{"full_name":"openzeppelin.account.library.Account.assert_only_self.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.assert_only_self.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.assert_only_self.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.assert_only_self.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.assert_only_self.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.execute":{"decorators":[],"pc":254,"type":"function"},"openzeppelin.account.library.Account.execute.Args":{"full_name":"openzeppelin.account.library.Account.execute.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"openzeppelin.account.library.Account.execute.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.execute.ImplicitArgs","members":{"bitwise_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin*","offset":3},"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":4},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":5,"type":"struct"},"openzeppelin.account.library.Account.execute.Return":{"cairo_type":"(response_len: felt, response: felt*)","type":"type_definition"},"openzeppelin.account.library.Account.execute.SIZEOF_LOCALS":{"type":"const","value":3},"openzeppelin.account.library.Account.get_public_key":{"decorators":[],"pc":194,"type":"function"},"openzeppelin.account.library.Account.get_public_key.Args":{"full_name":"openzeppelin.account.library.Account.get_public_key.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.get_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.get_public_key.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.get_public_key.Return":{"cairo_type":"(public_key: felt)","type":"type_definition"},"openzeppelin.account.library.Account.get_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.initializer":{"decorators":[],"pc":178,"type":"function"},"openzeppelin.account.library.Account.initializer.Args":{"full_name":"openzeppelin.account.library.Account.initializer.Args","members":{"_public_key":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.initializer.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.initializer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.initializer.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.initializer.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.is_valid_signature":{"decorators":[],"pc":235,"type":"function"},"openzeppelin.account.library.Account.is_valid_signature.Args":{"full_name":"openzeppelin.account.library.Account.is_valid_signature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"signature":{"cairo_type":"felt*","offset":2},"signature_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.Account.is_valid_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"openzeppelin.account.library.Account.is_valid_signature.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.set_public_key":{"decorators":[],"pc":226,"type":"function"},"openzeppelin.account.library.Account.set_public_key.Args":{"full_name":"openzeppelin.account.library.Account.set_public_key.Args","members":{"new_public_key":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.set_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.set_public_key.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.set_public_key.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.set_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.supports_interface":{"decorators":[],"pc":200,"type":"function"},"openzeppelin.account.library.Account.supports_interface.Args":{"full_name":"openzeppelin.account.library.Account.supports_interface.Args","members":{"interface_id":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.supports_interface.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.supports_interface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.supports_interface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"openzeppelin.account.library.Account.supports_interface.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.AccountCallArray":{"full_name":"openzeppelin.account.library.AccountCallArray","members":{"data_len":{"cairo_type":"felt","offset":3},"data_offset":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.Account_public_key":{"type":"namespace"},"openzeppelin.account.library.Account_public_key.Args":{"full_name":"openzeppelin.account.library.Account_public_key.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"openzeppelin.account.library.Account_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.ImplicitArgs","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.addr":{"decorators":[],"pc":148,"type":"function"},"openzeppelin.account.library.Account_public_key.addr.Args":{"full_name":"openzeppelin.account.library.Account_public_key.addr.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.addr.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"openzeppelin.account.library.Account_public_key.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"openzeppelin.account.library.Account_public_key.addr.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"openzeppelin.account.library.Account_public_key.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"openzeppelin.account.library.Account_public_key.read":{"decorators":[],"pc":153,"type":"function"},"openzeppelin.account.library.Account_public_key.read.Args":{"full_name":"openzeppelin.account.library.Account_public_key.read.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.read.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account_public_key.read.Return":{"cairo_type":"(public_key: felt)","type":"type_definition"},"openzeppelin.account.library.Account_public_key.read.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"openzeppelin.account.library.Account_public_key.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"openzeppelin.account.library.Account_public_key.write":{"decorators":[],"pc":166,"type":"function"},"openzeppelin.account.library.Account_public_key.write.Args":{"full_name":"openzeppelin.account.library.Account_public_key.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account_public_key.write.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account_public_key.write.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account_public_key.write.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"openzeppelin.account.library.Call":{"full_name":"openzeppelin.account.library.Call","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"openzeppelin.account.library.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"openzeppelin.account.library.IACCOUNT_ID":{"destination":"openzeppelin.utils.constants.library.IACCOUNT_ID","type":"alias"},"openzeppelin.account.library.IERC165_ID":{"destination":"openzeppelin.utils.constants.library.IERC165_ID","type":"alias"},"openzeppelin.account.library.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"openzeppelin.account.library.TRANSACTION_VERSION":{"destination":"openzeppelin.utils.constants.library.TRANSACTION_VERSION","type":"alias"},"openzeppelin.account.library.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"openzeppelin.account.library.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"openzeppelin.account.library.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"openzeppelin.account.library.call_contract":{"destination":"starkware.starknet.common.syscalls.call_contract","type":"alias"},"openzeppelin.account.library.get_caller_address":{"destination":"starkware.starknet.common.syscalls.get_caller_address","type":"alias"},"openzeppelin.account.library.get_contract_address":{"destination":"starkware.starknet.common.syscalls.get_contract_address","type":"alias"},"openzeppelin.account.library.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"openzeppelin.account.library.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"openzeppelin.account.library.is_le_felt":{"destination":"starkware.cairo.common.math_cmp.is_le_felt","type":"alias"},"openzeppelin.account.library.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"openzeppelin.account.library.split_felt":{"destination":"starkware.cairo.common.math.split_felt","type":"alias"},"openzeppelin.account.library.verify_ecdsa_signature":{"destination":"starkware.cairo.common.signature.verify_ecdsa_signature","type":"alias"},"openzeppelin.account.library.verify_eth_signature_uint256":{"destination":"starkware.cairo.common.cairo_secp.signature.verify_eth_signature_uint256","type":"alias"},"openzeppelin.utils.constants.library.DEFAULT_ADMIN_ROLE":{"type":"const","value":0},"openzeppelin.utils.constants.library.IACCESSCONTROL_ID":{"type":"const","value":2036718347},"openzeppelin.utils.constants.library.IACCOUNT_ID":{"type":"const","value":2792084853},"openzeppelin.utils.constants.library.IERC165_ID":{"type":"const","value":33540519},"openzeppelin.utils.constants.library.IERC721_ENUMERABLE_ID":{"type":"const","value":2014223715},"openzeppelin.utils.constants.library.IERC721_ID":{"type":"const","value":2158778573},"openzeppelin.utils.constants.library.IERC721_METADATA_ID":{"type":"const","value":1532892063},"openzeppelin.utils.constants.library.IERC721_RECEIVER_ID":{"type":"const","value":353073666},"openzeppelin.utils.constants.library.INVALID_ID":{"type":"const","value":4294967295},"openzeppelin.utils.constants.library.TRANSACTION_VERSION":{"type":"const","value":1},"openzeppelin.utils.constants.library.UINT8_MAX":{"type":"const","value":255},"starkware.cairo.common.alloc.alloc":{"decorators":[],"pc":0,"type":"function"},"starkware.cairo.common.alloc.alloc.Args":{"full_name":"starkware.cairo.common.alloc.alloc.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.ImplicitArgs":{"full_name":"starkware.cairo.common.alloc.alloc.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.Return":{"cairo_type":"(ptr: felt*)","type":"type_definition"},"starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.bitwise.ALL_ONES":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719234},"starkware.cairo.common.bitwise.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.bool.FALSE":{"type":"const","value":0},"starkware.cairo.common.bool.TRUE":{"type":"const","value":1},"starkware.cairo.common.cairo_builtins.BitwiseBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","members":{"x":{"cairo_type":"felt","offset":0},"x_and_y":{"cairo_type":"felt","offset":2},"x_or_y":{"cairo_type":"felt","offset":4},"x_xor_y":{"cairo_type":"felt","offset":3},"y":{"cairo_type":"felt","offset":1}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcOpBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","members":{"m":{"cairo_type":"felt","offset":4},"p":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":0},"q":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":2},"r":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":5}},"size":7,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.cairo_builtins.HashBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.HashBuiltin","members":{"result":{"cairo_type":"felt","offset":2},"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.KeccakBuiltin","members":{"input":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":0},"output":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":8}},"size":16,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltinState":{"destination":"starkware.cairo.common.keccak_state.KeccakBuiltinState","type":"alias"},"starkware.cairo.common.cairo_builtins.SignatureBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","members":{"message":{"cairo_type":"felt","offset":1},"pub_key":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.cairo_keccak.keccak.BLOCK_SIZE":{"destination":"starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.BYTES_IN_WORD":{"type":"const","value":8},"starkware.cairo.common.cairo_keccak.keccak.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_CAPACITY_IN_WORDS":{"type":"const","value":8},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_BYTES":{"type":"const","value":136},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_WORDS":{"type":"const","value":17},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_STATE_SIZE_FELTS":{"type":"const","value":25},"starkware.cairo.common.cairo_keccak.keccak.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_lt":{"destination":"starkware.cairo.common.math.assert_lt","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_and":{"destination":"starkware.cairo.common.bitwise.bitwise_and","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_or":{"destination":"starkware.cairo.common.bitwise.bitwise_or","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_xor":{"destination":"starkware.cairo.common.bitwise.bitwise_xor","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.memset":{"destination":"starkware.cairo.common.memset.memset","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.packed_keccak_func":{"destination":"starkware.cairo.common.cairo_keccak.packed_keccak.packed_keccak_func","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.pow":{"destination":"starkware.cairo.common.pow.pow","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.split_felt":{"destination":"starkware.cairo.common.math.split_felt","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.uint256_reverse_endian":{"destination":"starkware.cairo.common.uint256.uint256_reverse_endian","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.ALL_ONES":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719234},"starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE":{"type":"const","value":3},"starkware.cairo.common.cairo_keccak.packed_keccak.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.SHIFTS":{"type":"const","value":340282366920938463481821351505477763073},"starkware.cairo.common.cairo_keccak.packed_keccak.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.BASE":{"destination":"starkware.cairo.common.cairo_secp.constants.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.BigInt3":{"full_name":"starkware.cairo.common.cairo_secp.bigint.BigInt3","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.RC_BOUND":{"destination":"starkware.cairo.common.math_cmp.RC_BOUND","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3":{"full_name":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5":{"full_name":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2},"d3":{"cairo_type":"felt","offset":3},"d4":{"cairo_type":"felt","offset":4}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_secp.constants.BASE":{"type":"const","value":77371252455336267181195264},"starkware.cairo.common.cairo_secp.constants.BETA":{"type":"const","value":7},"starkware.cairo.common.cairo_secp.constants.N0":{"type":"const","value":10428087374290690730508609},"starkware.cairo.common.cairo_secp.constants.N1":{"type":"const","value":77371252455330678278691517},"starkware.cairo.common.cairo_secp.constants.N2":{"type":"const","value":19342813113834066795298815},"starkware.cairo.common.cairo_secp.constants.P0":{"type":"const","value":77371252455336262886226991},"starkware.cairo.common.cairo_secp.constants.P1":{"type":"const","value":77371252455336267181195263},"starkware.cairo.common.cairo_secp.constants.P2":{"type":"const","value":19342813113834066795298815},"starkware.cairo.common.cairo_secp.constants.SECP_REM":{"type":"const","value":4294968273},"starkware.cairo.common.cairo_secp.ec.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.EcPoint":{"full_name":"starkware.cairo.common.cairo_secp.ec.EcPoint","members":{"x":{"cairo_type":"starkware.cairo.common.cairo_secp.bigint.BigInt3","offset":0},"y":{"cairo_type":"starkware.cairo.common.cairo_secp.bigint.BigInt3","offset":3}},"size":6,"type":"struct"},"starkware.cairo.common.cairo_secp.ec.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.is_zero":{"destination":"starkware.cairo.common.cairo_secp.field.is_zero","type":"alias"},"starkware.cairo.common.cairo_secp.ec.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.unreduced_mul":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_mul","type":"alias"},"starkware.cairo.common.cairo_secp.ec.unreduced_sqr":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_sqr","type":"alias"},"starkware.cairo.common.cairo_secp.ec.verify_zero":{"destination":"starkware.cairo.common.cairo_secp.field.verify_zero","type":"alias"},"starkware.cairo.common.cairo_secp.field.BASE":{"destination":"starkware.cairo.common.cairo_secp.constants.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.field.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.field.P0":{"destination":"starkware.cairo.common.cairo_secp.constants.P0","type":"alias"},"starkware.cairo.common.cairo_secp.field.P1":{"destination":"starkware.cairo.common.cairo_secp.constants.P1","type":"alias"},"starkware.cairo.common.cairo_secp.field.P2":{"destination":"starkware.cairo.common.cairo_secp.constants.P2","type":"alias"},"starkware.cairo.common.cairo_secp.field.SECP_REM":{"destination":"starkware.cairo.common.cairo_secp.constants.SECP_REM","type":"alias"},"starkware.cairo.common.cairo_secp.field.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.field.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.field.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BASE":{"destination":"starkware.cairo.common.cairo_secp.bigint.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BETA":{"destination":"starkware.cairo.common.cairo_secp.constants.BETA","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_secp.signature.EcPoint":{"destination":"starkware.cairo.common.cairo_secp.ec.EcPoint","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N0":{"destination":"starkware.cairo.common.cairo_secp.constants.N0","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N1":{"destination":"starkware.cairo.common.cairo_secp.constants.N1","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N2":{"destination":"starkware.cairo.common.cairo_secp.constants.N2","type":"alias"},"starkware.cairo.common.cairo_secp.signature.RC_BOUND":{"destination":"starkware.cairo.common.math_cmp.RC_BOUND","type":"alias"},"starkware.cairo.common.cairo_secp.signature.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_secp.signature.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.cairo_secp.signature.bigint_mul":{"destination":"starkware.cairo.common.cairo_secp.bigint.bigint_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.bigint_to_uint256":{"destination":"starkware.cairo.common.cairo_secp.bigint.bigint_to_uint256","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_add":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_add","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_mul":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_negate":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_negate","type":"alias"},"starkware.cairo.common.cairo_secp.signature.finalize_keccak":{"destination":"starkware.cairo.common.cairo_keccak.keccak.finalize_keccak","type":"alias"},"starkware.cairo.common.cairo_secp.signature.keccak_uint256s_bigend":{"destination":"starkware.cairo.common.cairo_keccak.keccak.keccak_uint256s_bigend","type":"alias"},"starkware.cairo.common.cairo_secp.signature.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.reduce":{"destination":"starkware.cairo.common.cairo_secp.field.reduce","type":"alias"},"starkware.cairo.common.cairo_secp.signature.uint256_to_bigint":{"destination":"starkware.cairo.common.cairo_secp.bigint.uint256_to_bigint","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unreduced_mul":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unreduced_sqr":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_sqr","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_secp.signature.validate_reduced_field_element":{"destination":"starkware.cairo.common.cairo_secp.field.validate_reduced_field_element","type":"alias"},"starkware.cairo.common.cairo_secp.signature.verify_zero":{"destination":"starkware.cairo.common.cairo_secp.field.verify_zero","type":"alias"},"starkware.cairo.common.dict_access.DictAccess":{"full_name":"starkware.cairo.common.dict_access.DictAccess","members":{"key":{"cairo_type":"felt","offset":0},"new_value":{"cairo_type":"felt","offset":2},"prev_value":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.ec.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.ec.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.ec.StarkCurve":{"type":"namespace"},"starkware.cairo.common.ec.StarkCurve.ALPHA":{"type":"const","value":1},"starkware.cairo.common.ec.StarkCurve.Args":{"full_name":"starkware.cairo.common.ec.StarkCurve.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.BETA":{"type":"const","value":-476910135076337975234679399815567221425937815956490878998147463828055613816},"starkware.cairo.common.ec.StarkCurve.GEN_X":{"type":"const","value":874739451078007766457464989774322083649278607533249481151382481072868806602},"starkware.cairo.common.ec.StarkCurve.GEN_Y":{"type":"const","value":152666792071518830868575557812948353041420400780739481342941381225525861407},"starkware.cairo.common.ec.StarkCurve.ImplicitArgs":{"full_name":"starkware.cairo.common.ec.StarkCurve.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.ORDER":{"type":"const","value":-96363463615509210819012598251359154898},"starkware.cairo.common.ec.StarkCurve.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.ec.is_quad_residue":{"destination":"starkware.cairo.common.math.is_quad_residue","type":"alias"},"starkware.cairo.common.ec_point.EcPoint":{"full_name":"starkware.cairo.common.ec_point.EcPoint","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"starkware.cairo.common.keccak_state.KeccakBuiltinState":{"full_name":"starkware.cairo.common.keccak_state.KeccakBuiltinState","members":{"s0":{"cairo_type":"felt","offset":0},"s1":{"cairo_type":"felt","offset":1},"s2":{"cairo_type":"felt","offset":2},"s3":{"cairo_type":"felt","offset":3},"s4":{"cairo_type":"felt","offset":4},"s5":{"cairo_type":"felt","offset":5},"s6":{"cairo_type":"felt","offset":6},"s7":{"cairo_type":"felt","offset":7}},"size":8,"type":"struct"},"starkware.cairo.common.math.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.math.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.math.assert_le_felt":{"decorators":["known_ap_change"],"pc":18,"type":"function"},"starkware.cairo.common.math.assert_le_felt.Args":{"full_name":"starkware.cairo.common.math.assert_le_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_le_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_le_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH":{"type":"const","value":5316911983139663648412552867652567041},"starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH":{"type":"const","value":3544607988759775765608368578435044694},"starkware.cairo.common.math.assert_le_felt.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_le_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.a","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.b","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.range_check_ptr":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.range_check_ptr","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-5), felt*)]"},{"ap_tracking_data":{"group":2,"offset":8},"pc":28,"value":"cast([fp + (-5)] + 4, felt)"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.skip_exclude_a":{"pc":42,"type":"label"},"starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a":{"pc":54,"type":"label"},"starkware.cairo.common.math.assert_lt_felt":{"decorators":["known_ap_change"],"pc":63,"type":"function"},"starkware.cairo.common.math.assert_lt_felt.Args":{"full_name":"starkware.cairo.common.math.assert_lt_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_lt_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_lt_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_lt_felt.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_lt_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_lt_felt.a","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_lt_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_lt_felt.b","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.RC_BOUND":{"type":"const","value":340282366920938463463374607431768211456},"starkware.cairo.common.math_cmp.assert_le_felt":{"destination":"starkware.cairo.common.math.assert_le_felt","type":"alias"},"starkware.cairo.common.math_cmp.assert_lt_felt":{"destination":"starkware.cairo.common.math.assert_lt_felt","type":"alias"},"starkware.cairo.common.math_cmp.is_le_felt":{"decorators":["known_ap_change"],"pc":128,"type":"function"},"starkware.cairo.common.math_cmp.is_le_felt.Args":{"full_name":"starkware.cairo.common.math_cmp.is_le_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math_cmp.is_le_felt.Return":{"cairo_type":"felt","type":"type_definition"},"starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math_cmp.is_le_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math_cmp.is_le_felt.a","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.is_le_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math_cmp.is_le_felt.b","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.is_le_felt.not_le":{"pc":140,"type":"label"},"starkware.cairo.common.memcpy.memcpy":{"decorators":[],"pc":3,"type":"function"},"starkware.cairo.common.memcpy.memcpy.Args":{"full_name":"starkware.cairo.common.memcpy.memcpy.Args","members":{"dst":{"cairo_type":"felt*","offset":0},"len":{"cairo_type":"felt","offset":2},"src":{"cairo_type":"felt*","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.ImplicitArgs":{"full_name":"starkware.cairo.common.memcpy.memcpy.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.LoopFrame":{"full_name":"starkware.cairo.common.memcpy.memcpy.LoopFrame","members":{"dst":{"cairo_type":"felt*","offset":0},"src":{"cairo_type":"felt*","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.memcpy.memcpy.continue_copying":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.continue_copying","references":[{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.len":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.len","references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.loop":{"pc":8,"type":"label"},"starkware.cairo.common.pow.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"starkware.cairo.common.pow.get_ap":{"destination":"starkware.cairo.common.registers.get_ap","type":"alias"},"starkware.cairo.common.pow.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.registers.get_ap":{"destination":"starkware.cairo.lang.compiler.lib.registers.get_ap","type":"alias"},"starkware.cairo.common.registers.get_fp_and_pc":{"destination":"starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.signature.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.signature.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.signature.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.signature.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"starkware.cairo.common.signature.StarkCurve":{"destination":"starkware.cairo.common.ec.StarkCurve","type":"alias"},"starkware.cairo.common.signature.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.signature.ec_add":{"destination":"starkware.cairo.common.ec.ec_add","type":"alias"},"starkware.cairo.common.signature.ec_mul":{"destination":"starkware.cairo.common.ec.ec_mul","type":"alias"},"starkware.cairo.common.signature.ec_sub":{"destination":"starkware.cairo.common.ec.ec_sub","type":"alias"},"starkware.cairo.common.signature.is_x_on_curve":{"destination":"starkware.cairo.common.ec.is_x_on_curve","type":"alias"},"starkware.cairo.common.signature.recover_y":{"destination":"starkware.cairo.common.ec.recover_y","type":"alias"},"starkware.cairo.common.signature.verify_ecdsa_signature":{"decorators":[],"pc":123,"type":"function"},"starkware.cairo.common.signature.verify_ecdsa_signature.Args":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.Args","members":{"message":{"cairo_type":"felt","offset":0},"public_key":{"cairo_type":"felt","offset":1},"signature_r":{"cairo_type":"felt","offset":2},"signature_s":{"cairo_type":"felt","offset":3}},"size":4,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":125,"value":"cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.uint256.ALL_ONES":{"type":"const","value":340282366920938463463374607431768211455},"starkware.cairo.common.uint256.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.uint256.HALF_SHIFT":{"type":"const","value":18446744073709551616},"starkware.cairo.common.uint256.SHIFT":{"type":"const","value":340282366920938463463374607431768211456},"starkware.cairo.common.uint256.Uint256":{"full_name":"starkware.cairo.common.uint256.Uint256","members":{"high":{"cairo_type":"felt","offset":1},"low":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.uint256.assert_in_range":{"destination":"starkware.cairo.common.math.assert_in_range","type":"alias"},"starkware.cairo.common.uint256.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"starkware.cairo.common.uint256.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.uint256.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.uint256.bitwise_and":{"destination":"starkware.cairo.common.bitwise.bitwise_and","type":"alias"},"starkware.cairo.common.uint256.bitwise_or":{"destination":"starkware.cairo.common.bitwise.bitwise_or","type":"alias"},"starkware.cairo.common.uint256.bitwise_xor":{"destination":"starkware.cairo.common.bitwise.bitwise_xor","type":"alias"},"starkware.cairo.common.uint256.get_ap":{"destination":"starkware.cairo.common.registers.get_ap","type":"alias"},"starkware.cairo.common.uint256.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.uint256.is_le":{"destination":"starkware.cairo.common.math_cmp.is_le","type":"alias"},"starkware.cairo.common.uint256.pow":{"destination":"starkware.cairo.common.pow.pow","type":"alias"},"starkware.starknet.common.storage.ADDR_BOUND":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719489},"starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE":{"type":"const","value":256},"starkware.starknet.common.storage.assert_250_bit":{"destination":"starkware.cairo.common.math.assert_250_bit","type":"alias"},"starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR":{"type":"const","value":20853273475220472486191784820},"starkware.starknet.common.syscalls.CallContract":{"full_name":"starkware.starknet.common.syscalls.CallContract","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.CallContractRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.CallContractRequest":{"full_name":"starkware.starknet.common.syscalls.CallContractRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"contract_address":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.CallContractResponse":{"full_name":"starkware.starknet.common.syscalls.CallContractResponse","members":{"retdata":{"cairo_type":"felt*","offset":1},"retdata_size":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR":{"type":"const","value":21167594061783206823196716140},"starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR":{"type":"const","value":23274015802972845247556842986379118667122},"starkware.starknet.common.syscalls.DEPLOY_SELECTOR":{"type":"const","value":75202468540281},"starkware.starknet.common.syscalls.Deploy":{"full_name":"starkware.starknet.common.syscalls.Deploy","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.DeployRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.DeployResponse","offset":6}},"size":9,"type":"struct"},"starkware.starknet.common.syscalls.DeployRequest":{"full_name":"starkware.starknet.common.syscalls.DeployRequest","members":{"class_hash":{"cairo_type":"felt","offset":1},"constructor_calldata":{"cairo_type":"felt*","offset":4},"constructor_calldata_size":{"cairo_type":"felt","offset":3},"contract_address_salt":{"cairo_type":"felt","offset":2},"deploy_from_zero":{"cairo_type":"felt","offset":5},"selector":{"cairo_type":"felt","offset":0}},"size":6,"type":"struct"},"starkware.starknet.common.syscalls.DeployResponse":{"full_name":"starkware.starknet.common.syscalls.DeployResponse","members":{"constructor_retdata":{"cairo_type":"felt*","offset":2},"constructor_retdata_size":{"cairo_type":"felt","offset":1},"contract_address":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.DictAccess":{"destination":"starkware.cairo.common.dict_access.DictAccess","type":"alias"},"starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR":{"type":"const","value":1280709301550335749748},"starkware.starknet.common.syscalls.EmitEvent":{"full_name":"starkware.starknet.common.syscalls.EmitEvent","members":{"data":{"cairo_type":"felt*","offset":4},"data_len":{"cairo_type":"felt","offset":3},"keys":{"cairo_type":"felt*","offset":2},"keys_len":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR":{"type":"const","value":1448089106835523001438702345020786},"starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR":{"type":"const","value":24294903732626645868215235778792757751152},"starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR":{"type":"const","value":94901967781393078444254803017658102643},"starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR":{"type":"const","value":6219495360805491471215297013070624192820083},"starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR":{"type":"const","value":1592190833581991703053805829594610833820054387},"starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR":{"type":"const","value":1317029390204112103023},"starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR":{"type":"const","value":1448089128652340074717162277007973},"starkware.starknet.common.syscalls.GetBlockNumber":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumber","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberResponse","members":{"block_number":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestamp":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestamp","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","members":{"block_timestamp":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddress":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressResponse","members":{"caller_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddress":{"full_name":"starkware.starknet.common.syscalls.GetContractAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressResponse","members":{"contract_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddress":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","members":{"sequencer_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfo":{"full_name":"starkware.starknet.common.syscalls.GetTxInfo","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoResponse","members":{"tx_info":{"cairo_type":"starkware.starknet.common.syscalls.TxInfo*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignature":{"full_name":"starkware.starknet.common.syscalls.GetTxSignature","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureResponse","offset":1}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureResponse","members":{"signature":{"cairo_type":"felt*","offset":1},"signature_len":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR":{"type":"const","value":436233452754198157705746250789557519228244616562},"starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR":{"type":"const","value":92376026794327011772951660},"starkware.starknet.common.syscalls.LibraryCall":{"full_name":"starkware.starknet.common.syscalls.LibraryCall","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.LibraryCallRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.LibraryCallRequest":{"full_name":"starkware.starknet.common.syscalls.LibraryCallRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"class_hash":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR":{"type":"const","value":433017908768303439907196859243777073},"starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR":{"type":"const","value":100890693370601760042082660},"starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR":{"type":"const","value":25828017502874050592466629733},"starkware.starknet.common.syscalls.SendMessageToL1SysCall":{"full_name":"starkware.starknet.common.syscalls.SendMessageToL1SysCall","members":{"payload_ptr":{"cairo_type":"felt*","offset":3},"payload_size":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0},"to_address":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.StorageRead":{"full_name":"starkware.starknet.common.syscalls.StorageRead","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadResponse","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadRequest":{"full_name":"starkware.starknet.common.syscalls.StorageReadRequest","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadResponse":{"full_name":"starkware.starknet.common.syscalls.StorageReadResponse","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.StorageWrite":{"full_name":"starkware.starknet.common.syscalls.StorageWrite","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.TxInfo":{"full_name":"starkware.starknet.common.syscalls.TxInfo","members":{"account_contract_address":{"cairo_type":"felt","offset":1},"chain_id":{"cairo_type":"felt","offset":6},"max_fee":{"cairo_type":"felt","offset":2},"nonce":{"cairo_type":"felt","offset":7},"signature":{"cairo_type":"felt*","offset":4},"signature_len":{"cairo_type":"felt","offset":3},"transaction_hash":{"cairo_type":"felt","offset":5},"version":{"cairo_type":"felt","offset":0}},"size":8,"type":"struct"},"starkware.starknet.common.syscalls.call_contract":{"decorators":[],"pc":74,"type":"function"},"starkware.starknet.common.syscalls.call_contract.Args":{"full_name":"starkware.starknet.common.syscalls.call_contract.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"contract_address":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.call_contract.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.call_contract.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.call_contract.syscall_ptr","references":[{"ap_tracking_data":{"group":4,"offset":0},"pc":74,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":4,"offset":1},"pc":81,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_caller_address":{"decorators":[],"pc":86,"type":"function"},"starkware.starknet.common.syscalls.get_caller_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.Return":{"cairo_type":"(caller_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr","references":[{"ap_tracking_data":{"group":5,"offset":0},"pc":86,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":5,"offset":1},"pc":89,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_contract_address":{"decorators":[],"pc":93,"type":"function"},"starkware.starknet.common.syscalls.get_contract_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.Return":{"cairo_type":"(contract_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr","references":[{"ap_tracking_data":{"group":6,"offset":0},"pc":93,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":6,"offset":1},"pc":96,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_tx_info":{"decorators":[],"pc":116,"type":"function"},"starkware.starknet.common.syscalls.get_tx_info.Args":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.Return":{"cairo_type":"(tx_info: starkware.starknet.common.syscalls.TxInfo*)","type":"type_definition"},"starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr","references":[{"ap_tracking_data":{"group":9,"offset":0},"pc":116,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":9,"offset":1},"pc":119,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_read":{"decorators":[],"pc":100,"type":"function"},"starkware.starknet.common.syscalls.storage_read.Args":{"full_name":"starkware.starknet.common.syscalls.storage_read.Args","members":{"address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_read.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.Return":{"cairo_type":"(value: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_read.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_read.syscall_ptr","references":[{"ap_tracking_data":{"group":7,"offset":0},"pc":100,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":7,"offset":1},"pc":104,"value":"cast([fp + (-4)] + 3, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_write":{"decorators":[],"pc":108,"type":"function"},"starkware.starknet.common.syscalls.storage_write.Args":{"full_name":"starkware.starknet.common.syscalls.storage_write.Args","members":{"address":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_write.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_write.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_write.syscall_ptr","references":[{"ap_tracking_data":{"group":8,"offset":0},"pc":108,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":8,"offset":1},"pc":113,"value":"cast([fp + (-5)] + 3, felt*)"}],"type":"reference"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-5), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":4,"offset":0},"pc":74,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":5,"offset":0},"pc":86,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":6,"offset":0},"pc":93,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":7,"offset":0},"pc":100,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":8,"offset":0},"pc":108,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":9,"offset":0},"pc":116,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-3), felt*)]"}]}}} \ No newline at end of file diff --git a/crates/starknet-devnet-core/src/account.rs b/crates/starknet-devnet-core/src/account.rs index 11370427a..3865b4ae0 100644 --- a/crates/starknet-devnet-core/src/account.rs +++ b/crates/starknet-devnet-core/src/account.rs @@ -1,16 +1,15 @@ use std::sync::Arc; use std::u128; -use blockifier::abi::sierra_types::next_storage_key; use blockifier::state::state_api::StateReader; -use starknet_api::core::{calculate_contract_address, PatriciaKey}; -use starknet_api::transaction::{Calldata, ContractAddressSalt}; +use starknet_api::core::calculate_contract_address; +use starknet_api::transaction::fields::{Calldata, ContractAddressSalt}; use starknet_api::{felt, patricia_key}; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; -use starknet_types::contract_class::{Cairo0Json, ContractClass}; +use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::error::Error; -use starknet_types::felt::{felt_from_prefixed_hex, join_felts, split_biguint, ClassHash, Key}; +use starknet_types::felt::{ClassHash, Key, felt_from_prefixed_hex, join_felts, split_biguint}; use starknet_types::num_bigint::BigUint; use starknet_types::rpc::state::Balance; use starknet_types::traits::HashProducer; @@ -51,7 +50,7 @@ impl Account { eth_fee_token_address: ContractAddress, strk_fee_token_address: ContractAddress, ) -> DevnetResult { - let account_contract_class = Cairo0Json::raw_json_from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; + let account_contract_class = Cairo0ContractClass::from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; let class_hash = account_contract_class.generate_hash()?; // very big number @@ -111,10 +110,10 @@ impl Account { fn simulate_constructor(&self, state: &mut StarknetState) -> DevnetResult<()> { let core_address = self.account_address.try_into()?; - let interface_storage_var = get_storage_var_address( - "SRC5_supported_interfaces", - &[felt_from_prefixed_hex(ISRC6_ID_HEX)?], - )?; + let interface_storage_var = + get_storage_var_address("SRC5_supported_interfaces", &[felt_from_prefixed_hex( + ISRC6_ID_HEX, + )?])?; state.state.state.set_storage_at( core_address, interface_storage_var.try_into()?, @@ -153,14 +152,16 @@ impl Deployed for Account { impl Accounted for Account { fn set_initial_balance(&self, state: &mut DictState) -> DevnetResult<()> { - let storage_var_address_low = - get_storage_var_address("ERC20_balances", &[Felt::from(self.account_address)])?; - let storage_var_address_high = next_storage_key(&storage_var_address_low.try_into()?)?; + let storage_var_address_low: starknet_api::state::StorageKey = + get_storage_var_address("ERC20_balances", &[Felt::from(self.account_address)])? + .try_into()?; + + let storage_var_address_high = storage_var_address_low.next_storage_key()?; - let total_supply_storage_address_low = + let total_supply_storage_address_low: starknet_api::state::StorageKey = get_storage_var_address("ERC20_total_supply", &[])?.try_into()?; let total_supply_storage_address_high = - next_storage_key(&total_supply_storage_address_low)?; + total_supply_storage_address_low.next_storage_key()?; let (high, low) = split_biguint(self.initial_balance.clone()); @@ -178,8 +179,7 @@ impl Accounted for Account { let (new_total_supply_high, new_total_supply_low) = split_biguint(new_total_supply); // set balance in ERC20_balances - state.set_storage_at(token_address, storage_var_address_low.try_into()?, low)?; - + state.set_storage_at(token_address, storage_var_address_low, low)?; state.set_storage_at(token_address, storage_var_address_high, high)?; // set total supply in ERC20_total_supply diff --git a/crates/starknet-devnet-core/src/blocks/mod.rs b/crates/starknet-devnet-core/src/blocks/mod.rs index 06057a85e..2f645fa9f 100644 --- a/crates/starknet-devnet-core/src/blocks/mod.rs +++ b/crates/starknet-devnet-core/src/blocks/mod.rs @@ -1,7 +1,9 @@ use std::collections::HashMap; use indexmap::IndexMap; -use starknet_api::block::{BlockHeader, BlockNumber, BlockStatus, BlockTimestamp}; +use starknet_api::block::{ + BlockHeader, BlockHeaderWithoutHash, BlockNumber, BlockStatus, BlockTimestamp, +}; use starknet_api::data_availability::L1DataAvailabilityMode; use starknet_api::felt; use starknet_rs_core::types::{BlockId, BlockTag, Felt}; @@ -15,8 +17,8 @@ use starknet_types_core::hash::{Pedersen, StarkHash}; use crate::constants::{DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, STARKNET_VERSION}; use crate::error::{DevnetResult, Error}; -use crate::state::state_diff::StateDiff; use crate::state::StarknetState; +use crate::state::state_diff::StateDiff; use crate::traits::HashIdentified; pub(crate) struct StarknetBlocks { @@ -68,7 +70,7 @@ impl StarknetBlocks { /// hash pub fn insert(&mut self, mut block: StarknetBlock, state_diff: StateDiff) { if let Some(last_block_hash) = self.last_block_hash { - block.header.parent_hash = starknet_api::block::BlockHash(last_block_hash); + block.header.block_header_without_hash.parent_hash = starknet_api::block::BlockHash(last_block_hash); } let hash = block.block_hash(); @@ -181,14 +183,14 @@ impl From<&StarknetBlock> for TypesPendingBlockHeader { timestamp: value.timestamp(), starknet_version: STARKNET_VERSION.to_string(), l1_gas_price: ResourcePrice { - price_in_fri: value.header.l1_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.l1_gas_price.price_in_wei.0.into(), + price_in_fri: value.header.block_header_without_hash.l1_gas_price.price_in_fri.0.into(), + price_in_wei: value.header.block_header_without_hash.l1_gas_price.price_in_wei.0.into(), }, l1_data_gas_price: ResourcePrice { - price_in_fri: value.header.l1_data_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.l1_data_gas_price.price_in_wei.0.into(), + price_in_fri: value.header.block_header_without_hash.l1_data_gas_price.price_in_fri.0.into(), + price_in_wei: value.header.block_header_without_hash.l1_data_gas_price.price_in_wei.0.into(), }, - l1_da_mode: value.header.l1_da_mode, + l1_da_mode: value.header.block_header_without_hash.l1_da_mode, } } } @@ -204,14 +206,14 @@ impl From<&StarknetBlock> for TypesBlockHeader { timestamp: value.timestamp(), starknet_version: STARKNET_VERSION.to_string(), l1_gas_price: ResourcePrice { - price_in_fri: value.header.l1_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.l1_gas_price.price_in_wei.0.into(), + price_in_fri: value.header.block_header_without_hash.l1_gas_price.price_in_fri.0.into(), + price_in_wei: value.header.block_header_without_hash.l1_gas_price.price_in_wei.0.into(), }, l1_data_gas_price: ResourcePrice { - price_in_fri: value.header.l1_data_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.l1_data_gas_price.price_in_wei.0.into(), + price_in_fri: value.header.block_header_without_hash.l1_data_gas_price.price_in_fri.0.into(), + price_in_wei: value.header.block_header_without_hash.l1_data_gas_price.price_in_wei.0.into(), }, - l1_da_mode: value.header.l1_da_mode, + l1_da_mode: value.header.block_header_without_hash.l1_da_mode, } } } @@ -234,19 +236,19 @@ impl StarknetBlock { } pub fn parent_hash(&self) -> BlockHash { - self.header.parent_hash.0 + self.header.block_header_without_hash.parent_hash.0 } pub fn sequencer_address(&self) -> ContractAddress { - self.header.sequencer.0.into() + self.header.block_header_without_hash.sequencer.0.into() } pub fn timestamp(&self) -> BlockTimestamp { - self.header.timestamp + self.header.block_header_without_hash.timestamp } pub fn new_root(&self) -> Felt { - self.header.state_root.0 + self.header.block_header_without_hash.state_root.0 } pub(crate) fn set_block_hash(&mut self, block_hash: BlockHash) { @@ -254,13 +256,16 @@ impl StarknetBlock { } pub fn block_number(&self) -> BlockNumber { - self.header.block_number + self.header.block_header_without_hash.block_number } pub(crate) fn create_pending_block() -> Self { Self { header: BlockHeader { - l1_da_mode: L1DataAvailabilityMode::Blob, + block_header_without_hash: BlockHeaderWithoutHash { + l1_da_mode: L1DataAvailabilityMode::Blob, + ..Default::default() + }, ..BlockHeader::default() }, status: BlockStatus::Pending, @@ -269,11 +274,11 @@ impl StarknetBlock { } pub(crate) fn set_block_number(&mut self, block_number: u64) { - self.header.block_number = BlockNumber(block_number) + self.header.block_header_without_hash.block_number = BlockNumber(block_number) } pub(crate) fn set_timestamp(&mut self, timestamp: BlockTimestamp) { - self.header.timestamp = timestamp; + self.header.block_header_without_hash.timestamp = timestamp; } } @@ -281,9 +286,9 @@ impl HashProducer for StarknetBlock { type Error = Error; fn generate_hash(&self) -> DevnetResult { let hash = Pedersen::hash_array(&[ - felt!(self.header.block_number.0), // block number - self.header.state_root.0, // global_state_root - *self.header.sequencer.0.key(), // sequencer_address + felt!(self.header.block_header_without_hash.block_number.0), // block number + self.header.block_header_without_hash.state_root.0, // global_state_root + *self.header.block_header_without_hash.sequencer.0.key(), // sequencer_address Felt::ZERO, /* block_timestamp; would normally be * felt!(self.header.timestamp.0), but * is modified to enable replicability @@ -294,7 +299,7 @@ impl HashProducer for StarknetBlock { Felt::ZERO, // event_commitment Felt::ZERO, // protocol_version Felt::ZERO, // extra_data - self.header.parent_hash.0, // parent_block_hash + self.header.block_header_without_hash.parent_hash.0, // parent_block_hash ]); Ok(hash) @@ -303,7 +308,10 @@ impl HashProducer for StarknetBlock { #[cfg(test)] mod tests { - use starknet_api::block::{BlockHash, BlockHeader, BlockNumber, BlockStatus}; + use starknet_api::block::{ + BlockHash, BlockHeader, BlockHeaderWithoutHash, BlockNumber, BlockStatus, + }; + use starknet_api::data_availability::L1DataAvailabilityMode; use starknet_rs_core::types::{BlockId, BlockTag, Felt}; use starknet_types::traits::HashProducer; @@ -316,7 +324,7 @@ mod tests { let mut blocks = StarknetBlocks::default(); for block_number in 1..=10 { let mut block_to_insert = StarknetBlock::create_pending_block(); - block_to_insert.header.block_number = BlockNumber(block_number); + block_to_insert.header.block_header_without_hash.block_number = BlockNumber(block_number); block_to_insert.header.block_hash = starknet_api::block::BlockHash(Felt::from(block_number as u128)); blocks.insert(block_to_insert, StateDiff::default()); @@ -370,7 +378,7 @@ mod tests { ); let block_hash = block_to_insert.generate_hash().unwrap(); - block_to_insert.header.block_number = BlockNumber(10); + block_to_insert.header.block_header_without_hash.block_number = BlockNumber(10); block_to_insert.header.block_hash = starknet_api::block::BlockHash(block_hash); blocks.insert(block_to_insert, StateDiff::default()); @@ -404,7 +412,7 @@ mod tests { let last_block_number = 11; for block_number in 2..=last_block_number { let mut block_to_insert = StarknetBlock::create_pending_block(); - block_to_insert.header.block_number = BlockNumber(block_number); + block_to_insert.header.block_header_without_hash.block_number = BlockNumber(block_number); block_to_insert.header.block_hash = starknet_api::block::BlockHash(Felt::from(block_number as u128)); blocks.insert(block_to_insert.clone(), StateDiff::default()); @@ -662,7 +670,7 @@ mod tests { let mut block_to_insert = StarknetBlock::create_pending_block(); block_to_insert.header.block_hash = starknet_api::block::BlockHash(block_to_insert.generate_hash().unwrap()); - block_to_insert.header.block_number = BlockNumber(10); + block_to_insert.header.block_header_without_hash.block_number = BlockNumber(10); blocks.pending_block = block_to_insert.clone(); blocks.insert(block_to_insert.clone(), StateDiff::default()); @@ -698,26 +706,26 @@ mod tests { let mut block = StarknetBlock::create_pending_block(); block.status = BlockStatus::AcceptedOnL2; - block.header.block_number = BlockNumber(block_number); + block.header.block_header_without_hash.block_number = BlockNumber(block_number); block.set_block_hash(block.generate_hash().unwrap()); blocks.insert(block, StateDiff::default()); } assert!( - blocks.get_by_num(&BlockNumber(0)).unwrap().header.parent_hash == BlockHash::default() + blocks.get_by_num(&BlockNumber(0)).unwrap().header.block_header_without_hash.parent_hash == BlockHash::default() ); assert!( blocks.get_by_num(&BlockNumber(0)).unwrap().header.block_hash - == blocks.get_by_num(&BlockNumber(1)).unwrap().header.parent_hash + == blocks.get_by_num(&BlockNumber(1)).unwrap().header.block_header_without_hash.parent_hash ); assert!( blocks.get_by_num(&BlockNumber(1)).unwrap().header.block_hash - == blocks.get_by_num(&BlockNumber(2)).unwrap().header.parent_hash + == blocks.get_by_num(&BlockNumber(2)).unwrap().header.block_header_without_hash.parent_hash ); assert!( - blocks.get_by_num(&BlockNumber(1)).unwrap().header.parent_hash - != blocks.get_by_num(&BlockNumber(2)).unwrap().header.parent_hash + blocks.get_by_num(&BlockNumber(1)).unwrap().header.block_header_without_hash.parent_hash + != blocks.get_by_num(&BlockNumber(2)).unwrap().header.block_header_without_hash.parent_hash ) } @@ -727,7 +735,7 @@ mod tests { let mut block_to_insert = StarknetBlock::create_pending_block(); block_to_insert.header.block_hash = starknet_api::block::BlockHash(block_to_insert.generate_hash().unwrap()); - block_to_insert.header.block_number = BlockNumber(1); + block_to_insert.header.block_header_without_hash.block_number = BlockNumber(1); blocks.insert(block_to_insert.clone(), StateDiff::default()); @@ -740,12 +748,12 @@ mod tests { let block = StarknetBlock::create_pending_block(); assert!(block.status == BlockStatus::Pending); assert!(block.transaction_hashes.is_empty()); - assert_eq!( - block.header, - BlockHeader { - l1_da_mode: starknet_api::data_availability::L1DataAvailabilityMode::Blob, + assert_eq!(block.header, BlockHeader { + block_header_without_hash: BlockHeaderWithoutHash { + l1_da_mode: L1DataAvailabilityMode::Blob, ..Default::default() - } - ); + }, + ..Default::default() + }); } } diff --git a/crates/starknet-devnet-core/src/contract_class_choice.rs b/crates/starknet-devnet-core/src/contract_class_choice.rs index 3cf39b1a5..f5c92d49d 100644 --- a/crates/starknet-devnet-core/src/contract_class_choice.rs +++ b/crates/starknet-devnet-core/src/contract_class_choice.rs @@ -2,7 +2,7 @@ use std::str::FromStr; use starknet_rs_core::types::Felt; use starknet_rs_core::utils::get_selector_from_name; -use starknet_types::contract_class::{Cairo0ContractClass, Cairo0Json, ContractClass}; +use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::traits::HashProducer; use crate::constants::{CAIRO_0_ACCOUNT_CONTRACT, CAIRO_1_ACCOUNT_CONTRACT_SIERRA}; @@ -18,8 +18,7 @@ impl AccountContractClassChoice { pub fn get_class_wrapper(&self) -> DevnetResult { Ok(match self { AccountContractClassChoice::Cairo0 => { - let contract_json = Cairo0Json::raw_json_from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; - let contract_class = Cairo0ContractClass::RawJson(contract_json); + let contract_class = Cairo0ContractClass::from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; AccountClassWrapper { class_hash: contract_class.generate_hash()?, contract_class: ContractClass::Cairo0(contract_class), diff --git a/crates/starknet-devnet-core/src/error.rs b/crates/starknet-devnet-core/src/error.rs index 4f9db613b..1c8b73b1c 100644 --- a/crates/starknet-devnet-core/src/error.rs +++ b/crates/starknet-devnet-core/src/error.rs @@ -21,7 +21,7 @@ pub enum Error { #[error(transparent)] BlockifierExecutionError(#[from] blockifier::execution::errors::EntryPointExecutionError), #[error("{execution_error}")] - ExecutionError { execution_error: String, index: usize }, + ExecutionError { execution_error: String, index: usize }, // TODO change type of execution_error #[error("Types error: {0}")] TypesError(#[from] starknet_types::error::Error), #[error("I/O error: {0}")] @@ -131,7 +131,7 @@ impl From for Error { impl From for Error { fn from(value: FeeCheckError) -> Self { match value { - FeeCheckError::MaxL1GasAmountExceeded { .. } | FeeCheckError::MaxFeeExceeded { .. } => { + FeeCheckError::MaxGasAmountExceeded { .. } | FeeCheckError::MaxFeeExceeded { .. } => { TransactionValidationError::InsufficientMaxFee.into() } FeeCheckError::InsufficientFeeTokenBalance { .. } => { @@ -146,12 +146,12 @@ impl From for Error { match value { TransactionFeeError::FeeTransferError { .. } | TransactionFeeError::MaxFeeTooLow { .. } - | TransactionFeeError::MaxL1GasPriceTooLow { .. } - | TransactionFeeError::MaxL1GasAmountTooLow { .. } => { + | TransactionFeeError::MaxGasPriceTooLow { .. } + | TransactionFeeError::MaxGasAmountTooLow { .. } => { TransactionValidationError::InsufficientMaxFee.into() } TransactionFeeError::MaxFeeExceedsBalance { .. } - | TransactionFeeError::L1GasBoundsExceedBalance { .. } => { + | TransactionFeeError::GasBoundsExceedBalance { .. } => { TransactionValidationError::InsufficientAccountBalance.into() } err => Error::TransactionFeeError(err), diff --git a/crates/starknet-devnet-core/src/messaging/mod.rs b/crates/starknet-devnet-core/src/messaging/mod.rs index 6937dc45e..e7eed9e18 100644 --- a/crates/starknet-devnet-core/src/messaging/mod.rs +++ b/crates/starknet-devnet-core/src/messaging/mod.rs @@ -138,7 +138,7 @@ impl Starknet { let mut last_processed_block: u64 = 0; for block in blocks { messages.extend(self.get_block_messages(block)?); - last_processed_block = block.header.block_number.0; + last_processed_block = block.header.block_header_without_hash.block_number.0; } for message in &messages { diff --git a/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs index d003c2aee..58eabd08e 100644 --- a/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs @@ -1,3 +1,4 @@ +use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::transactions::ExecutableTransaction; use starknet_types::contract_class::ContractClass; use starknet_types::felt::{ClassHash, CompiledClassHash, TransactionHash}; @@ -27,11 +28,11 @@ pub fn add_declare_transaction( }); } - let blockifier_declare_transaction = broadcasted_declare_transaction - .create_blockifier_declare(&starknet.chain_id().to_felt(), false)?; + let executable_tx = + broadcasted_declare_transaction.create_sn_api_declare(&starknet.chain_id().to_felt())?; - let transaction_hash = blockifier_declare_transaction.tx_hash().0; - let class_hash = blockifier_declare_transaction.class_hash().0; + let transaction_hash = executable_tx.tx_hash.0; + let class_hash = executable_tx.class_hash().0; let (declare_transaction, contract_class, casm_hash, sender_address) = match broadcasted_declare_transaction { @@ -77,24 +78,27 @@ pub fn add_declare_transaction( )?); let transaction = TransactionWithHash::new(transaction_hash, declare_transaction); - let blockifier_execution_info = - blockifier::transaction::account_transaction::AccountTransaction::Declare( - blockifier_declare_transaction, - ) + let execution_info = + blockifier::transaction::account_transaction::AccountTransaction { + tx: starknet_api::executable_transaction::AccountTransaction::Declare(executable_tx), + execution_flags: ExecutionFlags { + only_query: false, + charge_fee: true, + validate, + }, + } .execute( &mut starknet.pending_state.state, &starknet.block_context, - true, - validate, )?; // if tx successful, store the class - if !blockifier_execution_info.is_reverted() { + if !execution_info.is_reverted() { let state = starknet.get_state(); state.declare_contract_class(class_hash, casm_hash, contract_class)?; } - starknet.handle_accepted_transaction(transaction, blockifier_execution_info)?; + starknet.handle_accepted_transaction(transaction, execution_info)?; Ok((transaction_hash, class_hash)) } @@ -134,21 +138,21 @@ fn assert_casm_hash_is_valid( mod tests { use blockifier::state::state_api::StateReader; use starknet_api::core::CompiledClassHash; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::{ BlockId, BlockTag, Felt, TransactionExecutionStatus, TransactionFinalityStatus, }; use starknet_types::constants::QUERY_VERSION_OFFSET; use starknet_types::contract_address::ContractAddress; use starknet_types::contract_class::ContractClass; + use starknet_types::rpc::transactions::BroadcastedDeclareTransaction; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; - use starknet_types::rpc::transactions::BroadcastedDeclareTransaction; use starknet_types::traits::HashProducer; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::tests::setup_starknet_with_no_signature_check_account; use crate::starknet::Starknet; + use crate::starknet::tests::setup_starknet_with_no_signature_check_account; use crate::state::{BlockNumberOrPending, CustomStateReader}; use crate::traits::{HashIdentified, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; diff --git a/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs index ae1be0a24..39c8c59bf 100644 --- a/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs @@ -1,3 +1,4 @@ +use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::transactions::ExecutableTransaction; use starknet_types::contract_address::ContractAddress; use starknet_types::felt::TransactionHash; @@ -25,10 +26,10 @@ pub fn add_deploy_account_transaction( }); } - let blockifier_deploy_account_transaction = broadcasted_deploy_account_transaction - .create_blockifier_deploy_account(&starknet.chain_id().to_felt(), false)?; + let executable_deploy_account_tx = broadcasted_deploy_account_transaction + .create_sn_api_deploy_account(&starknet.chain_id().to_felt())?; - let address = blockifier_deploy_account_transaction.contract_address.into(); + let address = executable_deploy_account_tx.contract_address.into(); let (class_hash, deploy_account_transaction) = match broadcasted_deploy_account_transaction { BroadcastedDeployAccountTransaction::V1(ref v1) => { @@ -52,16 +53,18 @@ pub fn add_deploy_account_transaction( if !starknet.pending_state.is_contract_declared(class_hash) { return Err(Error::StateError(crate::error::StateError::NoneClassHash(class_hash))); } - let transaction_hash = blockifier_deploy_account_transaction.tx_hash.0; + let transaction_hash = executable_deploy_account_tx.tx_hash.0; let transaction = TransactionWithHash::new(transaction_hash, deploy_account_transaction); - let blockifier_execution_info = - blockifier::transaction::account_transaction::AccountTransaction::DeployAccount( - blockifier_deploy_account_transaction, - ) - .execute(&mut starknet.pending_state.state, &starknet.block_context, true, true)?; + let execution_info = blockifier::transaction::account_transaction::AccountTransaction { + tx: starknet_api::executable_transaction::AccountTransaction::DeployAccount( + executable_deploy_account_tx, + ), + execution_flags: ExecutionFlags { only_query: false, charge_fee: true, validate: true }, + } + .execute(&mut starknet.pending_state.state, &starknet.block_context)?; - starknet.handle_accepted_transaction(transaction, blockifier_execution_info)?; + starknet.handle_accepted_transaction(transaction, execution_info)?; Ok((transaction_hash, address)) } @@ -70,7 +73,7 @@ mod tests { use blockifier::state::state_api::{State, StateReader}; use nonzero_ext::nonzero; - use starknet_api::transaction::{Fee, Tip}; + use starknet_api::transaction::fields::{Fee, Tip}; use starknet_rs_core::types::{ BlockId, BlockTag, Felt, TransactionExecutionStatus, TransactionFinalityStatus, }; @@ -89,7 +92,7 @@ mod tests { ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, }; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::{predeployed, Starknet}; + use crate::starknet::{Starknet, predeployed}; use crate::state::CustomState; use crate::traits::{Deployed, HashIdentifiedMut}; use crate::utils::get_storage_var_address; @@ -238,12 +241,12 @@ mod tests { Felt::ONE, ); - let blockifier_transaction = BroadcastedDeployAccountTransaction::V1(transaction.clone()) - .create_blockifier_deploy_account(&DEVNET_DEFAULT_CHAIN_ID.to_felt(), false) + let executable_tx = BroadcastedDeployAccountTransaction::V1(transaction.clone()) + .create_sn_api_deploy_account(&DEVNET_DEFAULT_CHAIN_ID.to_felt()) .unwrap(); // change balance at address - let account_address = ContractAddress::from(blockifier_transaction.contract_address); + let account_address = ContractAddress::from(executable_tx.contract_address); let balance_storage_var_address = get_storage_var_address("ERC20_balances", &[account_address.into()]) .unwrap() @@ -278,12 +281,12 @@ mod tests { let (mut starknet, account_class_hash) = setup(); let transaction = test_deploy_account_transaction_v3(account_class_hash, 0, 4000); - let blockifier_transaction = BroadcastedDeployAccountTransaction::V3(transaction.clone()) - .create_blockifier_deploy_account(&DEVNET_DEFAULT_CHAIN_ID.to_felt(), false) + let executable_tx = BroadcastedDeployAccountTransaction::V3(transaction.clone()) + .create_sn_api_deploy_account(&DEVNET_DEFAULT_CHAIN_ID.to_felt()) .unwrap(); // change balance at address - let account_address = ContractAddress::from(blockifier_transaction.contract_address); + let account_address = ContractAddress::from(executable_tx.contract_address); let balance_storage_var_address = get_storage_var_address("ERC20_balances", &[account_address.into()]) .unwrap() @@ -336,12 +339,12 @@ mod tests { Felt::from(13), Felt::ONE, ); - let blockifier_transaction = BroadcastedDeployAccountTransaction::V1(transaction.clone()) - .create_blockifier_deploy_account(&DEVNET_DEFAULT_CHAIN_ID.to_felt(), false) + let executable_tx = BroadcastedDeployAccountTransaction::V1(transaction.clone()) + .create_sn_api_deploy_account(&DEVNET_DEFAULT_CHAIN_ID.to_felt()) .unwrap(); // change balance at address - let account_address = ContractAddress::from(blockifier_transaction.contract_address); + let account_address = ContractAddress::from(executable_tx.contract_address); let balance_storage_var_address = get_storage_var_address("ERC20_balances", &[account_address.into()]) .unwrap() diff --git a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs index 96d17c785..1b8652b6b 100644 --- a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs @@ -1,3 +1,4 @@ +use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::transactions::ExecutableTransaction; use starknet_types::contract_address::ContractAddress; use starknet_types::felt::TransactionHash; @@ -24,10 +25,10 @@ pub fn add_invoke_transaction( }); } - let blockifier_invoke_transaction = broadcasted_invoke_transaction - .create_blockifier_invoke_transaction(&starknet.chain_id().to_felt(), false)?; + let sn_api_transaction = + broadcasted_invoke_transaction.create_sn_api_invoke(&starknet.chain_id().to_felt())?; - let transaction_hash = blockifier_invoke_transaction.tx_hash.0; + let transaction_hash = sn_api_transaction.tx_hash.0; let invoke_transaction = match broadcasted_invoke_transaction { BroadcastedInvokeTransaction::V1(ref v1) => { @@ -41,22 +42,25 @@ pub fn add_invoke_transaction( let validate = !(Starknet::is_account_impersonated( &mut starknet.pending_state, &starknet.cheats, - &ContractAddress::from(blockifier_invoke_transaction.sender_address()), + &ContractAddress::from(sn_api_transaction.sender_address()), )?); let block_context = starknet.block_context.clone(); let state = &mut starknet.get_state().state; - let blockifier_execution_info = - blockifier::transaction::account_transaction::AccountTransaction::Invoke( - blockifier_invoke_transaction, - ) - .execute(state, &block_context, true, validate)?; + let execution_info = + blockifier::transaction::account_transaction::AccountTransaction { + tx: starknet_api::executable_transaction::AccountTransaction::Invoke( + sn_api_transaction, + ), + execution_flags: ExecutionFlags { only_query: false, charge_fee: true, validate }, + } + .execute(state, &block_context)?; let transaction = TransactionWithHash::new(transaction_hash, invoke_transaction); - starknet.handle_accepted_transaction(transaction, blockifier_execution_info)?; + starknet.handle_accepted_transaction(transaction, execution_info)?; Ok(transaction_hash) } @@ -68,7 +72,7 @@ mod tests { use blockifier::state::state_api::StateReader; use nonzero_ext::nonzero; use starknet_api::core::Nonce; - use starknet_api::transaction::{Fee, Tip}; + use starknet_api::transaction::fields::{Fee, Tip}; use starknet_rs_core::types::{Felt, TransactionExecutionStatus, TransactionFinalityStatus}; use starknet_rs_core::utils::get_selector_from_name; use starknet_types::constants::QUERY_VERSION_OFFSET; @@ -90,7 +94,7 @@ mod tests { ETH_ERC20_CONTRACT_ADDRESS, }; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::{predeployed, Starknet}; + use crate::starknet::{Starknet, predeployed}; use crate::state::CustomState; use crate::traits::{Accounted, Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; @@ -485,17 +489,14 @@ mod tests { account.deploy(&mut starknet.pending_state).unwrap(); // dummy contract - let dummy_contract: Cairo0ContractClass = dummy_cairo_0_contract_class().into(); - let blockifier = blockifier::execution::contract_class::ContractClassV0::try_from( - dummy_contract.clone(), - ) - .unwrap(); + let dummy_contract = dummy_cairo_0_contract_class(); let increase_balance_selector = get_selector_from_name("increase_balance").unwrap(); // check if increase_balance function is present in the contract class - blockifier + let Cairo0ContractClass::Rpc(ref class) = dummy_contract; + class .entry_points_by_type - .get(&starknet_api::deprecated_contract_class::EntryPointType::External) + .get(&starknet_api::contract_class::EntryPointType::External) .unwrap() .iter() .find(|el| el.selector.0 == increase_balance_selector) diff --git a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs index 5f1c01a46..8b0836382 100644 --- a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs @@ -11,27 +11,18 @@ pub fn add_l1_handler_transaction( starknet: &mut Starknet, transaction: L1HandlerTransaction, ) -> DevnetResult { - let blockifier_transaction = - transaction.create_blockifier_transaction(starknet.chain_id().to_felt())?; - let transaction_hash = blockifier_transaction.tx_hash.0; + let executable_tx = transaction.create_sn_api_transaction(starknet.chain_id().to_felt())?; + + let transaction_hash = executable_tx.tx_hash.0; trace!("Executing L1 handler transaction [{:#064x}]", transaction_hash); - // Fees are charges on L1 as `L1HandlerTransaction` is not executed by an - // account, but directly by the sequencer. - // https://docs.starknet.io/documentation/architecture_and_concepts/Network_Architecture/messaging-mechanism/#l1-l2-message-fees - let charge_fee = false; - let validate = true; - - let blockifier_execution_info = blockifier_transaction.execute( - &mut starknet.pending_state.state, - &starknet.block_context, - charge_fee, - validate, - )?; + let execution_info = + blockifier::transaction::transaction_execution::Transaction::L1Handler(executable_tx) + .execute(&mut starknet.pending_state.state, &starknet.block_context)?; starknet.handle_accepted_transaction( TransactionWithHash::new(transaction_hash, Transaction::L1Handler(transaction.clone())), - blockifier_execution_info, + execution_info, )?; Ok(transaction_hash) @@ -60,7 +51,7 @@ mod tests { self, DEVNET_DEFAULT_CHAIN_ID, DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, }; - use crate::starknet::{predeployed, Starknet}; + use crate::starknet::{Starknet, predeployed}; use crate::state::CustomState; use crate::traits::{Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_l1l2_contract; @@ -208,26 +199,24 @@ mod tests { // dummy contract let dummy_contract: Cairo0ContractClass = dummy_cairo_l1l2_contract().into(); - let blockifier = blockifier::execution::contract_class::ContractClassV0::try_from( - dummy_contract.clone(), - ) - .unwrap(); + let withdraw_selector = get_selector_from_name("withdraw").unwrap(); let deposit_selector = get_selector_from_name("deposit").unwrap(); // check if withdraw function is present in the contract class - blockifier + let Cairo0ContractClass::Rpc(ref contract_class) = dummy_contract; + contract_class .entry_points_by_type - .get(&starknet_api::deprecated_contract_class::EntryPointType::External) + .get(&starknet_api::contract_class::EntryPointType::External) .unwrap() .iter() .find(|el| el.selector.0 == withdraw_selector) .unwrap(); // check if deposit function is present in the contract class - blockifier + contract_class .entry_points_by_type - .get(&starknet_api::deprecated_contract_class::EntryPointType::L1Handler) + .get(&starknet_api::contract_class::EntryPointType::L1Handler) .unwrap() .iter() .find(|el| el.selector.0 == deposit_selector) diff --git a/crates/starknet-devnet-core/src/starknet/defaulter.rs b/crates/starknet-devnet-core/src/starknet/defaulter.rs index 680c5ae0a..60b3ae255 100644 --- a/crates/starknet-devnet-core/src/starknet/defaulter.rs +++ b/crates/starknet-devnet-core/src/starknet/defaulter.rs @@ -1,12 +1,12 @@ use std::io::Read; +use blockifier::execution::contract_class::RunnableCompiledClass; use blockifier::state::errors::StateError; use blockifier::state::state_api::StateResult; -use starknet_api::contract_class::ContractClass; use starknet_api::core::{ClassHash, ContractAddress, Nonce, PatriciaKey}; use starknet_api::state::StorageKey; use starknet_rs_core::types::Felt; -use starknet_types::contract_class::convert_codegen_to_starknet_api_compiled_class; +use starknet_types::contract_class::convert_codegen_to_blockifier_compiled_class; use tracing::debug; use super::starknet_config::ForkConfig; @@ -140,9 +140,9 @@ impl StarknetDefaulter { } } - pub fn get_compiled_contract_class(&self, class_hash: ClassHash) -> StateResult { + pub fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { if let Some(origin) = &self.origin_reader { - origin.get_compiled_contract_class(class_hash) + origin.get_compiled_class(class_hash) } else { Err(StateError::UndeclaredClassHash(class_hash)) } @@ -214,7 +214,7 @@ impl BlockingOriginReader { Ok(class_hash) } - fn get_compiled_contract_class(&self, class_hash: ClassHash) -> StateResult { + fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { match self.send_body( "starknet_getClass", serde_json::json!({ @@ -228,7 +228,7 @@ impl BlockingOriginReader { serde_json::from_value(value) .map_err(|e| StateError::StateReadError(e.to_string()))?; - convert_codegen_to_starknet_api_compiled_class(contract_class) + convert_codegen_to_blockifier_compiled_class(contract_class) .map_err(|e| StateError::StateReadError(e.to_string())) } } diff --git a/crates/starknet-devnet-core/src/starknet/estimations.rs b/crates/starknet-devnet-core/src/starknet/estimations.rs index c868720bc..285ed7fc4 100644 --- a/crates/starknet-devnet-core/src/starknet/estimations.rs +++ b/crates/starknet-devnet-core/src/starknet/estimations.rs @@ -1,9 +1,11 @@ use blockifier::fee::fee_utils::{self}; use blockifier::state::cached_state::CachedState; use blockifier::state::state_api::StateReader; -use blockifier::transaction::account_transaction::AccountTransaction; +use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::objects::HasRelatedFeeType; +use blockifier::transaction::transaction_execution::Transaction; use blockifier::transaction::transactions::ExecutableTransaction; +use starknet_api::transaction::fields::GasVectorComputationMode; use starknet_rs_core::types::{BlockId, Felt, MsgFromL1, PriceUnit}; use starknet_types::contract_address::ContractAddress; use starknet_types::rpc::estimate_message_fee::{ @@ -32,14 +34,17 @@ pub fn estimate_fee( transactions .iter() .map(|txn| { - Ok(( - txn.to_blockifier_account_transaction(&chain_id, true)?, + let skip_validate_due_to_impersonation = Starknet::should_transaction_skip_validation_if_sender_is_impersonated( state, &cheats, txn, - )?, - )) + )?; + let validate = skip_validate_due_to_impersonation + .then_some(false) + .or(validate) + .unwrap_or(true); + Ok((txn.to_sn_api_account_transaction(&chain_id)?, validate)) }) - .collect::>>()? + .collect::>>()? }; let mut transactional_state = CachedState::create_transactional(&mut state.state); @@ -47,27 +52,32 @@ pub fn estimate_fee( transactions .into_iter() .enumerate() - .map(|(idx,(transaction, skip_validate_due_to_impersonation))| { + .map(|(idx, (transaction, validate))| { let estimate_fee_result = estimate_transaction_fee( &mut transactional_state, &block_context, - blockifier::transaction::transaction_execution::Transaction::AccountTransaction( - transaction, + Transaction::Account( + blockifier::transaction::account_transaction::AccountTransaction { + tx: transaction, + execution_flags: ExecutionFlags { + only_query: true, + charge_fee: charge_fee.unwrap_or(false), + validate, + }, + }, ), - charge_fee, - skip_validate_due_to_impersonation.then_some(false).or(validate), /* if skip validate is true, then - * this means that this transaction - * has to skip validation, because - * the sender is impersonated. - * Otherwise use the validate parameter that is passed to the estimateFee request */ - return_error_on_reverted_execution + return_error_on_reverted_execution, ); match estimate_fee_result { Ok(estimated_fee) => Ok(estimated_fee), // reverted transactions are failing with ExecutionError, but index is set to 0, so we override the index property - Err(Error::ExecutionError { execution_error , ..}) => Err(Error::ExecutionError { execution_error, index: idx }), - Err(err) => Err(Error::ExecutionError { execution_error: err.to_string(), index: idx }), + Err(Error::ExecutionError { execution_error, .. }) => { + Err(Error::ExecutionError { execution_error, index: idx }) + } + Err(err) => { + Err(Error::ExecutionError { execution_error: err.to_string(), index: idx }) + } } }) .collect() @@ -93,11 +103,7 @@ pub fn estimate_message_fee( estimate_transaction_fee( &mut transactional_state, &block_context, - blockifier::transaction::transaction_execution::Transaction::L1HandlerTransaction( - l1_transaction, - ), - None, - None, + Transaction::L1Handler(l1_transaction), true, ) } @@ -105,48 +111,38 @@ pub fn estimate_message_fee( fn estimate_transaction_fee( transactional_state: &mut CachedState, block_context: &blockifier::context::BlockContext, - transaction: blockifier::transaction::transaction_execution::Transaction, - charge_fee: Option, - validate: Option, + transaction: Transaction, return_error_on_reverted_execution: bool, ) -> DevnetResult { let fee_type = match transaction { - blockifier::transaction::transaction_execution::Transaction::AccountTransaction(ref tx) => { - tx.fee_type() - } - blockifier::transaction::transaction_execution::Transaction::L1HandlerTransaction( - ref tx, - ) => tx.fee_type(), + Transaction::Account(tx) => tx.fee_type(), + Transaction::L1Handler(tx) => tx.fee_type(), }; - let transaction_execution_info = transaction.execute( - transactional_state, - block_context, - charge_fee.unwrap_or(false), - validate.unwrap_or(true), - )?; + let transaction_execution_info = transaction.execute(transactional_state, block_context)?; // reverted transactions can only be Invoke transactions if let (true, Some(revert_error)) = (return_error_on_reverted_execution, transaction_execution_info.revert_error) { - return Err(Error::ExecutionError { execution_error: revert_error, index: 0 }); + return Err(Error::ExecutionError { execution_error: revert_error.to_string(), index: 0 }); } - let gas_vector = transaction_execution_info - .transaction_receipt - .resources - .to_gas_vector(&get_versioned_constants(), block_context.block_info().use_kzg_da)?; + let gas_vector = transaction_execution_info.receipt.resources.to_gas_vector( + &get_versioned_constants(), + block_context.block_info().use_kzg_da, + &GasVectorComputationMode::NoL2Gas, // TODO All? + ); let total_fee = fee_utils::get_fee_by_gas_vector(block_context.block_info(), gas_vector, &fee_type); let (gas_price, data_gas_price, unit) = match fee_type { - blockifier::transaction::objects::FeeType::Strk => ( + starknet_api::block::FeeType::Strk => ( block_context.block_info().gas_prices.strk_l1_gas_price.get(), block_context.block_info().gas_prices.strk_l1_data_gas_price.get(), PriceUnit::Fri, ), - blockifier::transaction::objects::FeeType::Eth => ( + starknet_api::block::FeeType::Eth => ( block_context.block_info().gas_prices.eth_l1_gas_price.get(), block_context.block_info().gas_prices.eth_l1_data_gas_price.get(), PriceUnit::Wei, diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index 4fd283cea..00f2e46fe 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -1,19 +1,18 @@ use std::num::NonZeroU128; use std::sync::Arc; -use blockifier::blockifier::block::{BlockInfo, GasPrices}; use blockifier::context::{BlockContext, ChainInfo, TransactionContext}; -use blockifier::execution::entry_point::CallEntryPoint; +use blockifier::execution::common_hints::ExecutionMode; use blockifier::state::cached_state::CachedState; use blockifier::state::state_api::StateReader; -use blockifier::transaction::account_transaction::AccountTransaction; +use blockifier::transaction::account_transaction::{AccountTransaction, ExecutionFlags}; use blockifier::transaction::objects::TransactionExecutionInfo; use blockifier::transaction::transactions::ExecutableTransaction; use parking_lot::RwLock; +use starknet_api::block::{BlockInfo, GasPriceVector, GasPrices}; use starknet_api::block::{BlockNumber, BlockStatus, BlockTimestamp, GasPrice, GasPricePerToken}; use starknet_api::core::SequencerContractAddress; -use starknet_api::felt; -use starknet_api::transaction::Fee; +use starknet_api::transaction::fields::Fee; use starknet_config::BlockGenerationOn; use starknet_rs_core::types::{ BlockId, BlockTag, Call, ExecutionResult, Felt, MsgFromL1, TransactionExecutionStatus, @@ -26,7 +25,7 @@ use starknet_types::contract_address::ContractAddress; use starknet_types::contract_class::ContractClass; use starknet_types::emitted_event::EmittedEvent; use starknet_types::felt::{ - felt_from_prefixed_hex, split_biguint, BlockHash, ClassHash, TransactionHash, + BlockHash, ClassHash, TransactionHash, felt_from_prefixed_hex, split_biguint, }; use starknet_types::num_bigint::BigUint; use starknet_types::patricia_key::PatriciaKey; @@ -74,7 +73,7 @@ use crate::state::state_diff::StateDiff; use crate::state::{CommittedClassStorage, CustomState, CustomStateReader, StarknetState}; use crate::traits::{AccountGenerator, Deployed, HashIdentified, HashIdentifiedMut}; use crate::transactions::{StarknetTransaction, StarknetTransactions}; -use crate::utils::{custom_bouncer_config, get_versioned_constants}; +use crate::{nonzero_gas_price, utils::{custom_bouncer_config, get_versioned_constants}}; mod add_declare_transaction; mod add_deploy_account_transaction; @@ -112,6 +111,7 @@ pub struct Starknet { impl Default for Starknet { fn default() -> Self { + let default_gas_price = DEVNET_DEFAULT_GAS_PRICE.get().try_into().unwrap(); Self { block_context: Self::init_block_context( DEVNET_DEFAULT_GAS_PRICE, @@ -133,10 +133,10 @@ impl Default for Starknet { pending_block_timestamp_shift: 0, next_block_timestamp: None, next_block_gas: GasModification { - gas_price_wei: DEVNET_DEFAULT_GAS_PRICE, - data_gas_price_wei: DEVNET_DEFAULT_DATA_GAS_PRICE, - gas_price_fri: DEVNET_DEFAULT_GAS_PRICE, - data_gas_price_fri: DEVNET_DEFAULT_DATA_GAS_PRICE, + gas_price_wei: default_gas_price, + data_gas_price_wei: default_gas_price, + gas_price_fri: default_gas_price, + data_gas_price_fri: default_gas_price, }, messaging: Default::default(), rpc_contract_classes: Default::default(), @@ -293,14 +293,14 @@ impl Starknet { Self::set_block_context_gas(&mut self.block_context, &self.next_block_gas); // Pending block header gas data needs to be set - self.blocks.pending_block.header.l1_gas_price.price_in_wei = - GasPrice(u128::from(self.next_block_gas.gas_price_wei)); - self.blocks.pending_block.header.l1_data_gas_price.price_in_wei = - GasPrice(u128::from(self.next_block_gas.data_gas_price_wei)); - self.blocks.pending_block.header.l1_gas_price.price_in_fri = - GasPrice(u128::from(self.next_block_gas.gas_price_fri)); - self.blocks.pending_block.header.l1_data_gas_price.price_in_fri = - GasPrice(u128::from(self.next_block_gas.data_gas_price_fri)); + self.blocks.pending_block.header.block_header_without_hash.l1_gas_price.price_in_wei = + GasPrice(self.next_block_gas.gas_price_wei.get()); + self.blocks.pending_block.header.block_header_without_hash.l1_data_gas_price.price_in_wei = + GasPrice(self.next_block_gas.data_gas_price_wei.get()); + self.blocks.pending_block.header.block_header_without_hash.l1_gas_price.price_in_fri = + GasPrice(self.next_block_gas.gas_price_fri.get()); + self.blocks.pending_block.header.block_header_without_hash.l1_data_gas_price.price_in_fri = + GasPrice(self.next_block_gas.data_gas_price_fri.get()); self.restart_pending_block()?; @@ -327,14 +327,14 @@ impl Starknet { // Set new block header // TODO why not store the whole next block header instead of storing separate properties? - new_block.header.l1_gas_price.price_in_fri = - GasPrice(self.next_block_gas.gas_price_fri.into()); - new_block.header.l1_gas_price.price_in_wei = - GasPrice(self.next_block_gas.gas_price_wei.into()); - new_block.header.l1_data_gas_price.price_in_fri = - GasPrice(self.next_block_gas.data_gas_price_fri.into()); - new_block.header.l1_data_gas_price.price_in_wei = - GasPrice(self.next_block_gas.data_gas_price_wei.into()); + new_block.header.block_header_without_hash.l1_gas_price.price_in_fri = + GasPrice(self.next_block_gas.gas_price_fri.get()); + new_block.header.block_header_without_hash.l1_gas_price.price_in_wei = + GasPrice(self.next_block_gas.gas_price_wei.get()); + new_block.header.block_header_without_hash.l1_data_gas_price.price_in_fri = + GasPrice(self.next_block_gas.data_gas_price_fri.get()); + new_block.header.block_header_without_hash.l1_data_gas_price.price_in_wei = + GasPrice(self.next_block_gas.data_gas_price_wei.get()); let new_block_number = self.blocks.next_block_number(); new_block.set_block_hash(if self.config.lite_mode { @@ -343,7 +343,7 @@ impl Starknet { new_block.generate_hash()? }); new_block.status = BlockStatus::AcceptedOnL2; - new_block.header.block_number = new_block_number; + new_block.header.block_header_without_hash.block_number = new_block_number; // set block timestamp and context block timestamp for contract execution let block_timestamp = self.next_block_timestamp(); @@ -424,6 +424,7 @@ impl Starknet { } #[allow(clippy::too_many_arguments)] + /// Create a BlockContext based on BlockContext::create_for_testing() fn init_block_context( gas_price_wei: NonZeroU128, gas_price_fri: NonZeroU128, @@ -434,20 +435,21 @@ impl Starknet { chain_id: ChainId, block_number: u64, ) -> BlockContext { - use starknet_api::core::{ContractAddress, PatriciaKey}; - use starknet_api::{contract_address, patricia_key}; - - // Create a BlockContext based on BlockContext::create_for_testing() - let block_info = BlockInfo { block_number: BlockNumber(block_number), block_timestamp: BlockTimestamp(0), - sequencer_address: contract_address!("0x1000"), + sequencer_address: starknet_api::contract_address!("0x1000"), gas_prices: GasPrices { - eth_l1_gas_price: gas_price_wei, - strk_l1_gas_price: gas_price_fri, - eth_l1_data_gas_price: data_gas_price_wei, - strk_l1_data_gas_price: data_gas_price_fri, + eth_gas_prices: GasPriceVector { + l1_gas_price: nonzero_gas_price!(gas_price_wei), + l1_data_gas_price: nonzero_gas_price!(data_gas_price_wei), + l2_gas_price: nonzero_gas_price!(gas_price_wei), + }, + strk_gas_prices: GasPriceVector { + l1_gas_price: nonzero_gas_price!(gas_price_fri), + l1_data_gas_price: nonzero_gas_price!(data_gas_price_fri), + l2_gas_price: nonzero_gas_price!(gas_price_fri), + }, }, use_kzg_da: USE_KZG_DA, }; @@ -455,10 +457,10 @@ impl Starknet { let chain_info = ChainInfo { chain_id: chain_id.into(), fee_token_addresses: blockifier::context::FeeTokenAddresses { - eth_fee_token_address: contract_address!( + eth_fee_token_address: starknet_api::contract_address!( eth_fee_token_address.to_hex_string().as_str() ), - strk_fee_token_address: contract_address!( + strk_fee_token_address: starknet_api::contract_address!( strk_fee_token_address.to_hex_string().as_str() ), }, @@ -491,10 +493,18 @@ impl Starknet { let mut block_info = block_context.block_info().clone(); // Block info gas needs to be set here - block_info.gas_prices.eth_l1_gas_price = gas_modification.gas_price_wei; - block_info.gas_prices.eth_l1_data_gas_price = gas_modification.data_gas_price_wei; - block_info.gas_prices.strk_l1_gas_price = gas_modification.gas_price_fri; - block_info.gas_prices.strk_l1_data_gas_price = gas_modification.data_gas_price_fri; + block_info.gas_prices = GasPrices { + eth_gas_prices: GasPriceVector { + l1_gas_price: nonzero_gas_price!(gas_modification.gas_price_wei), + l1_data_gas_price: nonzero_gas_price!(gas_modification.data_gas_price_wei), + l2_gas_price: nonzero_gas_price!(gas_modification.gas_price_wei), + }, + strk_gas_prices: GasPriceVector { + l1_gas_price: nonzero_gas_price!(gas_modification.gas_price_fri), + l1_data_gas_price: nonzero_gas_price!(gas_modification.data_gas_price_fri), + l2_gas_price: nonzero_gas_price!(gas_modification.gas_price_fri), + }, + }; // TODO: update block_context via preferred method in the documentation *block_context = BlockContext::new( @@ -529,8 +539,9 @@ impl Starknet { pub(crate) fn restart_pending_block(&mut self) -> DevnetResult<()> { let mut block = StarknetBlock::create_pending_block(); - block.header.block_number = self.block_context.block_info().block_number; - block.header.l1_gas_price = GasPricePerToken { + block.header.block_header_without_hash.block_number = + self.block_context.block_info().block_number; + block.header.block_header_without_hash.l1_gas_price = GasPricePerToken { price_in_fri: GasPrice( self.block_context.block_info().gas_prices.strk_l1_gas_price.get(), ), @@ -538,7 +549,7 @@ impl Starknet { self.block_context.block_info().gas_prices.eth_l1_gas_price.get(), ), }; - block.header.l1_data_gas_price = GasPricePerToken { + block.header.block_header_without_hash.l1_data_gas_price = GasPricePerToken { price_in_fri: GasPrice( self.block_context.block_info().gas_prices.strk_l1_data_gas_price.get(), ), @@ -546,7 +557,7 @@ impl Starknet { self.block_context.block_info().gas_prices.eth_l1_data_gas_price.get(), ), }; - block.header.sequencer = + block.header.block_header_without_hash.sequencer = SequencerContractAddress(self.block_context.block_info().sequencer_address); block.set_timestamp(self.block_context.block_info().block_timestamp); @@ -620,11 +631,15 @@ impl Starknet { state.assert_contract_deployed(ContractAddress::new(contract_address)?)?; - let call = CallEntryPoint { - calldata: starknet_api::transaction::Calldata(std::sync::Arc::new(calldata.clone())), + let mut initial_gas = + block_context.versioned_constants().sierra_gas_limit(&ExecutionMode::Execute); + let call = blockifier::execution::entry_point::CallEntryPoint { + calldata: starknet_api::transaction::fields::Calldata(std::sync::Arc::new( + calldata.clone(), + )), storage_address: contract_address.try_into()?, entry_point_selector: starknet_api::core::EntryPointSelector(entrypoint_selector), - initial_gas: block_context.versioned_constants().tx_initial_gas(), + initial_gas: initial_gas.0, ..Default::default() }; @@ -638,14 +653,12 @@ impl Starknet { }), blockifier::execution::common_hints::ExecutionMode::Execute, true, - )?; + blockifier::execution::entry_point::SierraGasRevertTracker::new(initial_gas), + ); let mut transactional_state = CachedState::create_transactional(&mut state.state); - let res = call.execute( - &mut transactional_state, - &mut Default::default(), - &mut execution_context, - )?; + let res = + call.execute(&mut transactional_state, &mut execution_context, &mut initial_gas.0)?; Ok(res.execution.retdata.0) } @@ -1110,7 +1123,7 @@ impl Starknet { let cheats = self.cheats.clone(); let state = self.get_mut_state_at(block_id)?; - let blockifier_transactions = { + let executable_txs = { transactions .iter() .enumerate() @@ -1127,15 +1140,21 @@ impl Starknet { }); } - Ok(( - txn.to_blockifier_account_transaction(&chain_id, true)?, - txn.get_type(), + let skip_validate_due_to_impersonation = Starknet::should_transaction_skip_validation_if_sender_is_impersonated( state, &cheats, txn, - )?, + )?; + + Ok(( + txn.to_blockifier_account_transaction(&chain_id, ExecutionFlags { + only_query: true, + charge_fee: !skip_fee_charge, + validate: !(skip_validate || skip_validate_due_to_impersonation), + })?, + txn.get_type(), )) }) - .collect::>>()? + .collect::>>()? }; let transactional_rpc_contract_classes = @@ -1143,16 +1162,11 @@ impl Starknet { let mut transactional_state = CachedState::new(CachedState::create_transactional(&mut state.state)); - for (idx, (blockifier_transaction, transaction_type, skip_validate_due_to_impersonation)) in - blockifier_transactions.into_iter().enumerate() + for (idx, (blockifier_transaction, transaction_type)) in + executable_txs.into_iter().enumerate() { let tx_execution_info = blockifier_transaction - .execute( - &mut transactional_state, - &block_context, - !skip_fee_charge, - !(skip_validate || skip_validate_due_to_impersonation), - ) + .execute(&mut transactional_state, &block_context) .map_err(|err| Error::ExecutionError { execution_error: Error::from(err).to_string(), index: idx, @@ -1478,7 +1492,7 @@ mod tests { starknet.generate_pending_block().unwrap(); assert_eq!( - starknet.pending_block().header.block_number, + starknet.pending_block().header.block_header_without_hash.block_number, initial_block_number.next().unwrap() ); } @@ -1541,26 +1555,38 @@ mod tests { assert!(*starknet.pending_block() != pending_block); assert_eq!(starknet.pending_block().status, BlockStatus::Pending); assert!(starknet.pending_block().get_transactions().is_empty()); - assert_eq!(starknet.pending_block().header.timestamp, initial_block_timestamp); - assert_eq!(starknet.pending_block().header.block_number, initial_block_number); - assert_eq!(starknet.pending_block().header.parent_hash, BlockHash::default()); assert_eq!( - starknet.pending_block().header.l1_gas_price.price_in_wei, + starknet.pending_block().header.block_header_without_hash.timestamp, + initial_block_timestamp + ); + assert_eq!( + starknet.pending_block().header.block_header_without_hash.block_number, + initial_block_number + ); + assert_eq!( + starknet.pending_block().header.block_header_without_hash.parent_hash, + BlockHash::default() + ); + assert_eq!( + starknet.pending_block().header.block_header_without_hash.l1_gas_price.price_in_wei, GasPrice(initial_gas_price_wei.get()) ); assert_eq!( - starknet.pending_block().header.l1_gas_price.price_in_fri, + starknet.pending_block().header.block_header_without_hash.l1_gas_price.price_in_fri, GasPrice(initial_gas_price_fri.get()) ); assert_eq!( - starknet.pending_block().header.l1_data_gas_price.price_in_wei, + starknet.pending_block().header.block_header_without_hash.l1_data_gas_price.price_in_wei, GasPrice(initial_data_gas_price_wei.get()) ); assert_eq!( - starknet.pending_block().header.l1_data_gas_price.price_in_fri, + starknet.pending_block().header.block_header_without_hash.l1_data_gas_price.price_in_fri, GasPrice(initial_data_gas_price_fri.get()) ); - assert_eq!(starknet.pending_block().header.sequencer.0, initial_sequencer); + assert_eq!( + starknet.pending_block().header.block_header_without_hash.sequencer.0, + initial_sequencer + ); } #[test] @@ -1725,7 +1751,7 @@ mod tests { // number of the accepted block -> 1 let block_number = starknet.get_latest_block().unwrap().block_number(); - assert_eq!(block_number.0, added_block.header.block_number.0); + assert_eq!(block_number.0, added_block.header.block_header_without_hash.block_number.0); starknet.generate_new_block_and_state().unwrap(); @@ -1733,7 +1759,7 @@ mod tests { starknet.blocks.get_by_hash(starknet.blocks.last_block_hash.unwrap()).unwrap(); let block_number2 = starknet.get_latest_block().unwrap().block_number(); - assert_eq!(block_number2.0, added_block2.header.block_number.0); + assert_eq!(block_number2.0, added_block2.header.block_header_without_hash.block_number.0); } #[test] @@ -1848,13 +1874,13 @@ mod tests { .blocks .pending_block .set_timestamp(BlockTimestamp(Starknet::get_unix_timestamp_as_seconds())); - let pending_block_timestamp = starknet.pending_block().header.timestamp; + let pending_block_timestamp = starknet.pending_block().header.block_header_without_hash.timestamp; let sleep_duration_secs = 5; thread::sleep(Duration::from_secs(sleep_duration_secs)); starknet.generate_new_block_and_state().unwrap(); - let block_timestamp = starknet.get_latest_block().unwrap().header.timestamp; + let block_timestamp = starknet.get_latest_block().unwrap().header.block_header_without_hash.timestamp; // check if the pending_block_timestamp is less than the block_timestamp, // by number of sleep seconds because the timeline of events is this: // ----(pending block timestamp)----(sleep)----(new block timestamp) diff --git a/crates/starknet-devnet-core/src/starknet/starknet_config.rs b/crates/starknet-devnet-core/src/starknet/starknet_config.rs index face8345b..355dcf7f2 100644 --- a/crates/starknet-devnet-core/src/starknet/starknet_config.rs +++ b/crates/starknet-devnet-core/src/starknet/starknet_config.rs @@ -141,10 +141,10 @@ impl Default for StarknetConfig { account_contract_class, predeployed_accounts_initial_balance: DEVNET_DEFAULT_INITIAL_BALANCE.into(), start_time: None, - gas_price_wei: DEVNET_DEFAULT_GAS_PRICE, - gas_price_fri: DEVNET_DEFAULT_GAS_PRICE, - data_gas_price_wei: DEVNET_DEFAULT_DATA_GAS_PRICE, - data_gas_price_fri: DEVNET_DEFAULT_DATA_GAS_PRICE, + gas_price_wei: DEVNET_DEFAULT_GAS_PRICE.get().try_into().unwrap(), + gas_price_fri: DEVNET_DEFAULT_GAS_PRICE.get().try_into().unwrap(), + data_gas_price_wei: DEVNET_DEFAULT_DATA_GAS_PRICE.get().try_into().unwrap(), + data_gas_price_fri: DEVNET_DEFAULT_DATA_GAS_PRICE.get().try_into().unwrap(), chain_id: DEVNET_DEFAULT_CHAIN_ID, dump_on: None, dump_path: None, diff --git a/crates/starknet-devnet-core/src/starknet/state_update.rs b/crates/starknet-devnet-core/src/starknet/state_update.rs index 087af95da..ab045559c 100644 --- a/crates/starknet-devnet-core/src/starknet/state_update.rs +++ b/crates/starknet-devnet-core/src/starknet/state_update.rs @@ -17,7 +17,7 @@ pub fn state_update_by_block_id( #[cfg(test)] mod tests { - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::{ BlockId, BlockTag, Felt, TransactionExecutionStatus, TransactionFinalityStatus, }; diff --git a/crates/starknet-devnet-core/src/starknet/transaction_trace.rs b/crates/starknet-devnet-core/src/starknet/transaction_trace.rs index dbb2533e5..047ee38ab 100644 --- a/crates/starknet-devnet-core/src/starknet/transaction_trace.rs +++ b/crates/starknet-devnet-core/src/starknet/transaction_trace.rs @@ -1,4 +1,5 @@ use blockifier::execution::call_info::CallInfo; +use blockifier::execution::stack_trace::ErrorStack; use blockifier::state::cached_state::CachedState; use blockifier::state::state_api::StateReader; use blockifier::transaction::objects::TransactionExecutionInfo; @@ -24,14 +25,15 @@ fn get_execute_call_info( true => ExecutionInvocation::Reverted(starknet_types::rpc::transactions::Reversion { revert_reason: execution_info .revert_error - .clone() - .unwrap_or("Revert reason not found".into()), + .as_ref() + .unwrap_or(&ErrorStack::default().into()) + .to_string(), }), }, - None => match execution_info.revert_error.clone() { + None => match &execution_info.revert_error { Some(revert_reason) => { ExecutionInvocation::Reverted(starknet_types::rpc::transactions::Reversion { - revert_reason, + revert_reason: revert_reason.to_string(), }) } None => { diff --git a/crates/starknet-devnet-core/src/state/mod.rs b/crates/starknet-devnet-core/src/state/mod.rs index 3d0c4737f..17125223f 100644 --- a/crates/starknet-devnet-core/src/state/mod.rs +++ b/crates/starknet-devnet-core/src/state/mod.rs @@ -229,12 +229,12 @@ impl StarknetState { } for class_hash in state_diff.cairo_0_declared_contracts { let class_hash = starknet_api::core::ClassHash(class_hash); - let compiled_class = self.get_compiled_contract_class(class_hash)?; + let compiled_class = self.get_compiled_class(class_hash)?; historic_state.set_contract_class(class_hash, compiled_class)?; } for class_hash in state_diff.declared_contracts { let class_hash = starknet_api::core::ClassHash(class_hash); - let compiled_class = self.get_compiled_contract_class(class_hash)?; + let compiled_class = self.get_compiled_class(class_hash)?; historic_state.set_contract_class(class_hash, compiled_class)?; } self.historic_state = historic_state; @@ -278,7 +278,7 @@ impl State for StarknetState { fn set_contract_class( &mut self, class_hash: starknet_api::core::ClassHash, - contract_class: blockifier::execution::contract_class::ContractClass, + contract_class: blockifier::execution::contract_class::RunnableCompiledClass, ) -> blockifier::state::state_api::StateResult<()> { self.state.set_contract_class(class_hash, contract_class) } @@ -290,14 +290,6 @@ impl State for StarknetState { ) -> blockifier::state::state_api::StateResult<()> { self.state.set_compiled_class_hash(class_hash, compiled_class_hash) } - - fn add_visited_pcs( - &mut self, - class_hash: starknet_api::core::ClassHash, - pcs: &std::collections::HashSet, - ) { - self.state.add_visited_pcs(class_hash, pcs) - } } impl blockifier::state::state_api::StateReader for StarknetState { @@ -323,13 +315,13 @@ impl blockifier::state::state_api::StateReader for StarknetState { self.state.get_class_hash_at(contract_address) } - fn get_compiled_contract_class( + fn get_compiled_class( &self, class_hash: starknet_api::core::ClassHash, ) -> blockifier::state::state_api::StateResult< - blockifier::execution::contract_class::ContractClass, + blockifier::execution::contract_class::RunnableCompiledClass, > { - self.state.get_compiled_contract_class(class_hash) + self.state.get_compiled_class(class_hash) } fn get_compiled_class_hash( @@ -348,12 +340,11 @@ impl CustomStateReader for StarknetState { } fn is_contract_declared(&self, class_hash: ClassHash) -> bool { - // get_compiled_contract_class is important if forking; checking hash is impossible via - // JSON-RPC + // get_compiled_class is important if forking; checking hash is impossible via JSON-RPC let class_hash = starknet_api::core::ClassHash(class_hash); self.get_compiled_class_hash(class_hash) .is_ok_and(|CompiledClassHash(class_hash)| class_hash != Felt::ZERO) - || self.get_compiled_contract_class(class_hash).is_ok() + || self.get_compiled_class(class_hash).is_ok() } fn is_contract_deployed_locally( @@ -503,7 +494,7 @@ mod tests { let class_hash = starknet_api::core::ClassHash(Felt::from_hex_unchecked("0xFE")); let casm_hash = Some(dummy_felt()); - match state.get_compiled_contract_class(class_hash) { + match state.get_compiled_class(class_hash) { Err(StateError::UndeclaredClassHash(reported_hash)) => { assert_eq!(reported_hash, class_hash); } @@ -518,8 +509,8 @@ mod tests { let block_number = 1; state.commit_diff(block_number).unwrap(); - match state.get_compiled_contract_class(class_hash) { - Ok(blockifier::execution::contract_class::ContractClass::V0(retrieved_class)) => { + match state.get_compiled_class(class_hash) { + Ok(retrieved_class) => { assert_eq!(retrieved_class, contract_class.clone().try_into().unwrap()); } other => panic!("Invalid result: {other:?}"), diff --git a/crates/starknet-devnet-core/src/state/state_diff.rs b/crates/starknet-devnet-core/src/state/state_diff.rs index 099e6d696..104e7740c 100644 --- a/crates/starknet-devnet-core/src/state/state_diff.rs +++ b/crates/starknet-devnet-core/src/state/state_diff.rs @@ -52,13 +52,13 @@ impl StateDiff { // extract differences of class_hash -> compile_class_hash mapping let class_hash_to_compiled_class_hash = diff - .compiled_class_hashes + .state_maps.compiled_class_hashes .into_iter() .map(|(class_hash, compiled_class_hash)| (class_hash.0, compiled_class_hash.0)) .collect(); let address_to_class_hash = diff - .class_hashes + .state_maps.class_hashes .iter() .map(|(address, class_hash)| { let contract_address = ContractAddress::from(*address); @@ -67,7 +67,7 @@ impl StateDiff { }) .collect::>(); - for (contract_address, class_hash) in diff.class_hashes { + for (contract_address, class_hash) in diff.state_maps.class_hashes { let old_class_hash = state.state.get_class_hash_at(contract_address)?; if old_class_hash != class_hash && old_class_hash != starknet_api::core::ClassHash::default() @@ -80,7 +80,7 @@ impl StateDiff { } let address_to_nonce = diff - .nonces + .state_maps.nonces .iter() .map(|(address, nonce)| { let contract_address = ContractAddress::from(*address); @@ -90,7 +90,7 @@ impl StateDiff { .collect::>(); let mut storage_updates = HashMap::>::new(); - diff.storage.iter().for_each(|((address, key), value)| { + diff.state_maps.storage.iter().for_each(|((address, key), value)| { let address_updates = storage_updates.entry((*address).into()).or_default(); address_updates.insert(key.0.into(), *value); }); @@ -179,30 +179,30 @@ mod tests { use blockifier::state::state_api::{State, StateReader}; use nonzero_ext::nonzero; use starknet_api::core::ClassHash; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::{BlockId, BlockTag, Felt}; use starknet_rs_core::utils::get_selector_from_name; use starknet_types::contract_address::ContractAddress; use starknet_types::contract_class::ContractClass; use starknet_types::felt::felt_from_prefixed_hex; use starknet_types::rpc::state::{Balance, ReplacedClasses}; + use starknet_types::rpc::transactions::BroadcastedInvokeTransaction; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; use starknet_types::rpc::transactions::broadcasted_invoke_transaction_v1::BroadcastedInvokeTransactionV1; - use starknet_types::rpc::transactions::BroadcastedInvokeTransaction; use starknet_types::traits::HashProducer; use super::StateDiff; use crate::account::Account; use crate::constants::{ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS}; - use crate::starknet::starknet_config::StarknetConfig; use crate::starknet::Starknet; + use crate::starknet::starknet_config::StarknetConfig; use crate::state::{CustomState, StarknetState}; use crate::traits::Deployed; use crate::utils::calculate_casm_hash; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; use crate::utils::test_utils::{ - cairo_0_account_without_validations, dummy_cairo_1_contract_class, dummy_contract_address, - dummy_felt, DUMMY_CAIRO_1_COMPILED_CLASS_HASH, + DUMMY_CAIRO_1_COMPILED_CLASS_HASH, cairo_0_account_without_validations, + dummy_cairo_1_contract_class, dummy_contract_address, dummy_felt, }; #[test] @@ -223,7 +223,7 @@ mod tests { let casm_hash = felt_from_prefixed_hex(DUMMY_CAIRO_1_COMPILED_CLASS_HASH).unwrap(); // necessary to prevent blockifier's state subtraction panic - state.get_compiled_contract_class(class_hash).expect_err("Shouldn't yet be declared"); + state.get_compiled_class(class_hash).expect_err("Shouldn't yet be declared"); let contract_class = ContractClass::Cairo1(dummy_cairo_1_contract_class()); state.declare_contract_class(class_hash.0, Some(casm_hash), contract_class).unwrap(); @@ -248,7 +248,7 @@ mod tests { let contract_class = ContractClass::Cairo0(dummy_cairo_0_contract_class().into()); // necessary to prevent blockifier's state subtraction panic - state.get_compiled_contract_class(class_hash).expect_err("Shouldn't yet be declared"); + state.get_compiled_class(class_hash).expect_err("Shouldn't yet be declared"); state.declare_contract_class(class_hash.0, None, contract_class).unwrap(); let block_number = 1; @@ -383,13 +383,10 @@ mod tests { let state_update = starknet.block_state_update(&BlockId::Tag(BlockTag::Latest)).unwrap(); - assert_eq!( - state_update.get_state_diff().replaced_classes, - vec![ReplacedClasses { - contract_address: replaceable_contract_address, - class_hash: new_class_hash - }] - ); + assert_eq!(state_update.get_state_diff().replaced_classes, vec![ReplacedClasses { + contract_address: replaceable_contract_address, + class_hash: new_class_hash + }]); } fn setup() -> StarknetState { diff --git a/crates/starknet-devnet-core/src/state/state_readers.rs b/crates/starknet-devnet-core/src/state/state_readers.rs index c09badd27..300ad4a5d 100644 --- a/crates/starknet-devnet-core/src/state/state_readers.rs +++ b/crates/starknet-devnet-core/src/state/state_readers.rs @@ -1,6 +1,6 @@ use std::collections::HashMap; -use blockifier::execution::contract_class::ContractClass; +use blockifier::execution::contract_class::RunnableCompiledClass; use blockifier::state::cached_state::StorageEntry; use blockifier::state::errors::StateError; use blockifier::state::state_api::{StateReader, StateResult}; @@ -17,7 +17,7 @@ pub struct DictState { pub storage_view: HashMap, pub address_to_nonce: HashMap, pub address_to_class_hash: HashMap, - pub class_hash_to_class: HashMap, + pub class_hash_to_class: HashMap, pub class_hash_to_compiled_class_hash: HashMap, defaulter: StarknetDefaulter, } @@ -48,10 +48,10 @@ impl StateReader for DictState { } } - fn get_compiled_contract_class(&self, class_hash: ClassHash) -> StateResult { + fn get_compiled_class(&self, class_hash: ClassHash) -> StateResult { match self.class_hash_to_class.get(&class_hash) { Some(contract_class) => Ok(contract_class.clone()), - None => self.defaulter.get_compiled_contract_class(class_hash), + None => self.defaulter.get_compiled_class(class_hash), } } @@ -110,7 +110,7 @@ impl DictState { pub fn set_contract_class( &mut self, class_hash: ClassHash, - contract_class: ContractClass, + contract_class: RunnableCompiledClass, ) -> StateResult<()> { self.class_hash_to_class.insert(class_hash, contract_class); Ok(()) diff --git a/crates/starknet-devnet-core/src/system_contract.rs b/crates/starknet-devnet-core/src/system_contract.rs index a87538bf1..3ebc84710 100644 --- a/crates/starknet-devnet-core/src/system_contract.rs +++ b/crates/starknet-devnet-core/src/system_contract.rs @@ -1,7 +1,7 @@ use blockifier::state::state_api::StateReader; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; -use starknet_types::contract_class::{Cairo0Json, ContractClass}; +use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::felt::ClassHash; use starknet_types::rpc::state::Balance; @@ -25,7 +25,7 @@ impl SystemContract { Ok(Self { class_hash, address: ContractAddress::new(address)?, - contract_class: Cairo0Json::raw_json_from_json_str(contract_class_json_str)?.into(), + contract_class: Cairo0ContractClass::from_json_str(contract_class_json_str)?.into(), }) } diff --git a/crates/starknet-devnet-core/src/transactions.rs b/crates/starknet-devnet-core/src/transactions.rs index 929df3c64..a26220b19 100644 --- a/crates/starknet-devnet-core/src/transactions.rs +++ b/crates/starknet-devnet-core/src/transactions.rs @@ -1,4 +1,5 @@ use blockifier::execution::call_info::CallInfo; +use blockifier::execution::stack_trace::ErrorStack; use blockifier::transaction::objects::TransactionExecutionInfo; use indexmap::IndexMap; use starknet_api::block::BlockNumber; @@ -74,8 +75,8 @@ impl StarknetTransaction { true => ExecutionResult::Reverted { reason: execution_info .revert_error - .clone() - .unwrap_or("No revert error".to_string()), + .as_ref() + .unwrap_or(&ErrorStack::default().into()).to_string(), }, false => ExecutionResult::Succeeded, }, @@ -165,7 +166,7 @@ impl StarknetTransaction { // L1 Handler transactions are in WEI // V3 transactions are in STRK(FRI) // Other transactions versions are in ETH(WEI) - let fee_amount = FeeAmount { amount: self.execution_info.transaction_receipt.fee }; + let fee_amount = FeeAmount { amount: self.execution_info.receipt.fee }; let actual_fee_in_units = match self.inner.transaction { Transaction::L1Handler(_) => FeeInUnits::WEI(fee_amount), Transaction::Declare(DeclareTransaction::V3(_)) diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index 1dc316b39..2e0be1528 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -1,14 +1,15 @@ use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount}; -use blockifier::versioned_constants::{StarknetVersion, VersionedConstants}; +use blockifier::versioned_constants::VersionedConstants; use serde_json::Value; -use starknet_rs_core::types::contract::CompiledClass; +use starknet_api::block::StarknetVersion; use starknet_rs_core::types::Felt; +use starknet_rs_core::types::contract::CompiledClass; use starknet_types::patricia_key::{PatriciaKey, StorageKey}; use crate::error::{DevnetResult, Error}; pub mod random_number_generator { - use rand::{thread_rng, Rng, SeedableRng}; + use rand::{Rng, SeedableRng, thread_rng}; use rand_mt::Mt64; pub fn generate_u32_random_number() -> u32 { @@ -40,7 +41,7 @@ pub(crate) fn get_storage_var_address( } pub(crate) fn get_versioned_constants() -> VersionedConstants { - VersionedConstants::get(StarknetVersion::V0_13_2).clone() + VersionedConstants::get(&StarknetVersion::V0_13_2).unwrap().clone() } /// Values not present here: https://docs.starknet.io/tools/limits-and-triggers/ @@ -50,7 +51,8 @@ pub(crate) fn custom_bouncer_config() -> BouncerConfig { BouncerConfig { block_max_capacity: BouncerWeights { n_steps: 40_000_000, - gas: 4_950_000, + l1_gas: 4_950_000, // TODO + sierra_gas: starknet_api::execution_resources::GasAmount(4_950_000), state_diff_size: 4_000, n_events: 5_000, builtin_count: BuiltinCount { @@ -80,13 +82,21 @@ pub fn calculate_casm_hash(casm_json: Value) -> DevnetResult { .map_err(|err| Error::UnexpectedInternalError { msg: err.to_string() }) } +#[macro_export] +macro_rules! nonzero_gas_price { + ($value:expr) => {{ + let gas_price = starknet_api::block::GasPrice(($value).get()); + starknet_api::block::NonzeroGasPrice::new(gas_price).unwrap() + }}; +} + #[cfg(test)] pub(crate) mod test_utils { use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; - use starknet_api::transaction::Fee; + use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; - use starknet_types::contract_class::{Cairo0ContractClass, Cairo0Json, ContractClass}; + use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; @@ -170,7 +180,7 @@ pub(crate) mod test_utils { let account_json_path = "../../contracts/test_artifacts/cairo0/account_without_validations/account.json"; - Cairo0Json::raw_json_from_path(account_json_path).unwrap().into() + serde_json::from_reader(std::fs::File::open(account_json_path).unwrap()).unwrap() } pub(crate) fn convert_broadcasted_declare_v2_to_v3( @@ -205,21 +215,21 @@ pub(crate) mod test_utils { #[cfg(any(test, feature = "test_utils"))] #[allow(clippy::unwrap_used)] pub mod exported_test_utils { - use starknet_types::contract_class::Cairo0Json; + use starknet_types::contract_class::Cairo0ContractClass; - pub fn dummy_cairo_l1l2_contract() -> Cairo0Json { + pub fn dummy_cairo_l1l2_contract() -> Cairo0ContractClass { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/l1l2.json").unwrap(); - Cairo0Json::raw_json_from_json_str(&json_str).unwrap() + serde_json::from_str(&json_str).unwrap() } - pub fn dummy_cairo_0_contract_class() -> Cairo0Json { + pub fn dummy_cairo_0_contract_class() -> Cairo0ContractClass { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/simple_contract.json") .unwrap(); - Cairo0Json::raw_json_from_json_str(&json_str).unwrap() + serde_json::from_str(&json_str).unwrap() } } @@ -231,7 +241,7 @@ mod tests { #[test] fn correct_simple_storage_var_address_generated() { let expected_storage_var_address = - blockifier::abi::abi_utils::get_storage_var_address("simple", &[]); + starknet_api::abi::abi_utils::get_storage_var_address("simple", &[]); let generated_storage_var_address = get_storage_var_address("simple", &[]).unwrap(); assert_eq!( @@ -242,10 +252,10 @@ mod tests { #[test] fn correct_complex_storage_var_address_generated() { - let expected_storage_var_address = blockifier::abi::abi_utils::get_storage_var_address( - "complex", - &[test_utils::dummy_felt()], - ); + let expected_storage_var_address = + starknet_api::abi::abi_utils::get_storage_var_address("complex", &[ + test_utils::dummy_felt(), + ]); let generated_storage_var_address = get_storage_var_address("complex", &[test_utils::dummy_felt()]).unwrap(); diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index c5ad3b55c..7b52aa555 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -1,8 +1,10 @@ use core::fmt::Debug; use std::str::FromStr; +use blockifier::execution::contract_class::RunnableCompiledClass; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; +use cairo_vm::types::errors::program_errors::ProgramError; use serde::de::IntoDeserializer; use serde::{Serialize, Serializer}; use starknet_api::contract_class::{ClassInfo, SierraVersion}; @@ -18,8 +20,6 @@ use crate::traits::HashProducer; pub mod deprecated; pub use deprecated::Cairo0ContractClass; -pub use deprecated::json_contract_class::Cairo0Json; -pub use deprecated::rpc_contract_class::DeprecatedContractClass; #[derive(Debug, Clone)] #[cfg_attr(feature = "testing", derive(Eq, PartialEq))] @@ -55,18 +55,6 @@ impl From for ContractClass { } } -impl From for ContractClass { - fn from(value: DeprecatedContractClass) -> Self { - ContractClass::Cairo0(value.into()) - } -} - -impl From for ContractClass { - fn from(value: Cairo0Json) -> Self { - ContractClass::Cairo0(value.into()) - } -} - impl From for ContractClass { fn from(value: SierraContractClass) -> Self { ContractClass::Cairo1(value) @@ -93,27 +81,16 @@ impl TryFrom for Cairo0ContractClass { } } -impl TryFrom for Cairo0Json { - type Error = Error; - fn try_from(value: ContractClass) -> Result { - match value { - ContractClass::Cairo0(Cairo0ContractClass::RawJson(contract)) => Ok(contract), - _ => Err(Error::ConversionError(crate::error::ConversionError::InvalidFormat)), - } - } -} - impl TryFrom for starknet_api::contract_class::ContractClass { type Error = Error; fn try_from(value: ContractClass) -> Result { match value { - ContractClass::Cairo0(deprecated_contract_class) => { - Ok(starknet_api::contract_class::ContractClass::V0( - deprecated_contract_class.try_into()?, - )) - } + ContractClass::Cairo0(deprecated_contract_class) => Ok( + starknet_api::contract_class::ContractClass::V0(deprecated_contract_class.into()), + ), ContractClass::Cairo1(ref sierra_contract_class) => { + // TODO any difference: USC vs CasmContractClass::from_contract_class ? let casm_json = usc::compile_contract(serde_json::to_value(sierra_contract_class).map_err( |err| Error::JsonError(JsonError::Custom { msg: err.to_string() }), @@ -143,16 +120,14 @@ impl TryFrom for ClassInfo { let abi_length = 0; ClassInfo::new( &starknet_api::contract_class::ContractClass::V0( - deprecated_contract_class.try_into()?, + deprecated_contract_class.into(), ), 0, abi_length, SierraVersion::DEPRECATED, ) - .map_err(|err| { - Error::ConversionError(ConversionError::InvalidInternalStructure( - err.to_string(), - )) + .map_err(|e| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) }) } ContractClass::Cairo1(sierra_contract_class) => { @@ -167,16 +142,16 @@ impl TryFrom for ClassInfo { 0 }; + let sierra_version = + SierraVersion::from_str(&sierra_contract_class.contract_class_version)?; ClassInfo::new( - &sierra_contract_class.into(), + &ContractClass::Cairo1(sierra_contract_class).try_into()?, sierra_program_length, abi_length, - SierraVersion::from_str(&sierra_contract_class.contract_class_version)?, + sierra_version, ) - .map_err(|err| { - Error::ConversionError(ConversionError::InvalidInternalStructure( - err.to_string(), - )) + .map_err(|e| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) }) } } @@ -196,20 +171,6 @@ impl HashProducer for ContractClass { } } -impl TryInto for ContractClass { - type Error = Error; - fn try_into(self) -> Result { - match self { - ContractClass::Cairo0(contract_class) => { - Ok(CodegenContractClass::Legacy(contract_class.try_into()?)) - } - ContractClass::Cairo1(contract_class) => { - Ok(CodegenContractClass::Sierra(convert_sierra_to_codegen(&contract_class)?)) - } - } - } -} - impl TryInto for CodegenContractClass { type Error = Error; fn try_into(self) -> Result { @@ -228,6 +189,47 @@ impl TryInto for CodegenContractClass { } } +impl TryFrom for RunnableCompiledClass { + type Error = Error; + + fn try_from(value: ContractClass) -> Result { + Ok(match value { + ContractClass::Cairo0(Cairo0ContractClass::Rpc(class)) => RunnableCompiledClass::V0( + class + .try_into() + .map_err(|e: ProgramError| ConversionError::InvalidInternalStructure(e.to_string()))?, + ), + ContractClass::Cairo1(class) => { + // TODO extract this as common logic + let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; + let casm_json = usc::compile_contract(json_value) + .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; + + let casm = serde_json::from_value::(casm_json) + .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; + + let versioned_casm = (casm, SierraVersion::from_str(&class.contract_class_version)?); + let compiled = versioned_casm.try_into().map_err(|e: ProgramError| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?; + RunnableCompiledClass::V1(compiled) + } + }) + } +} + +impl TryFrom for RunnableCompiledClass { + type Error = Error; + + fn try_from(value: Cairo0ContractClass) -> Result { + let Cairo0ContractClass::Rpc(class) = value; + let compiled_class = class.try_into().map_err(|e: ProgramError| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?; + Ok(RunnableCompiledClass::V0(compiled_class)) + } +} + fn convert_sierra_to_codegen( contract_class: &SierraContractClass, ) -> DevnetResult { @@ -252,28 +254,34 @@ fn convert_sierra_to_codegen( }) } -pub fn convert_codegen_to_starknet_api_compiled_class( +pub fn convert_codegen_to_blockifier_compiled_class( class: CodegenContractClass, -) -> Result { - Ok(match class { +) -> Result { + Ok(match &class { CodegenContractClass::Sierra(sierra) => { - let json_value = serde_json::to_value(class).map_err(JsonError::SerdeJsonError)?; + let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; let casm_json = usc::compile_contract(json_value) .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; let casm = serde_json::from_value::(casm_json) .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; - starknet_api::contract_class::ContractClass::V1(( - casm, - SierraVersion::from_str(&sierra.contract_class_version)?, - )) + let versioned_casm = (casm, SierraVersion::from_str(&sierra.contract_class_version)?); + let compiled = versioned_casm.try_into().map_err(|e: ProgramError| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?; + RunnableCompiledClass::V1(compiled) } CodegenContractClass::Legacy(_) => { let class_jsonified = serde_json::to_string(&class).map_err(JsonError::SerdeJsonError)?; - let class = DeprecatedContractClass::rpc_from_json_str(&class_jsonified)?; - starknet_api::contract_class::ContractClass::V0(class.try_into().unwrap()) + let class: starknet_api::deprecated_contract_class::ContractClass = + serde_json::from_str(&class_jsonified) + .map_err(|e| Error::JsonError(JsonError::SerdeJsonError(e)))?; + let compiled = class.try_into().map_err(|e: ProgramError| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?; + RunnableCompiledClass::V0(compiled) } }) } @@ -305,21 +313,13 @@ pub fn compute_sierra_class_hash(contract_class: &SierraContractClass) -> Devnet #[cfg(test)] mod tests { use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; - use serde::Deserialize; use serde_json::Deserializer; - use starknet_rs_core::types::LegacyEntryPointsByType; - use crate::contract_class::deprecated::rpc_contract_class::ContractClassAbiEntryWithType; - use crate::contract_class::{ - Cairo0Json, ContractClass, DeprecatedContractClass, convert_sierra_to_codegen, - }; + use crate::contract_class::{ContractClass, convert_sierra_to_codegen}; use crate::felt::felt_from_prefixed_hex; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; use crate::traits::HashProducer; - use crate::utils::test_utils::{ - CAIRO_0_ACCOUNT_CONTRACT_HASH, CAIRO_0_ACCOUNT_CONTRACT_PATH, CAIRO_1_CONTRACT_SIERRA_HASH, - CAIRO_1_EVENTS_CONTRACT_PATH, - }; + use crate::utils::test_utils::{CAIRO_1_CONTRACT_SIERRA_HASH, CAIRO_1_EVENTS_CONTRACT_PATH}; #[test] fn cairo_1_contract_class_hash_generated_successfully() { @@ -348,73 +348,4 @@ mod tests { convert_sierra_to_codegen(&contract_class).unwrap(); } - - #[test] - fn cairo_0_contract_class_hash_generated_successfully() { - let json_str = std::fs::read_to_string(CAIRO_0_ACCOUNT_CONTRACT_PATH).unwrap(); - let contract_class = Cairo0Json::raw_json_from_json_str(&json_str).unwrap(); - let class_hash = contract_class.generate_hash().unwrap(); - let expected_class_hash = felt_from_prefixed_hex(CAIRO_0_ACCOUNT_CONTRACT_HASH).unwrap(); - assert_eq!(class_hash, expected_class_hash); - } - - #[test] - fn contract_class_cairo_0_from_json_str_doesnt_accept_string_different_from_json() { - assert!(Cairo0Json::raw_json_from_json_str(" not JSON string").is_err()); - } - - /// The test takes a .casm artifact as raw json and generates its class hash. - /// Then it takes the same artifact as a `DeprecatedContractClass` and generates its class hash. - /// The test checks if both hashes are the same. - #[test] - fn cairo_0_contract_class_hash_generated_successfully_and_its_the_same_as_raw_json_contract_class_hash() - { - let contract_class = Cairo0Json::raw_json_from_path( - "../../contracts/test_artifacts/cairo0/ERC20_starknet_js.json", - ) - .unwrap(); - let class_hash = contract_class.generate_hash().unwrap(); - - // data taken from https://github.com/0xs34n/starknet.js/blob/ce57fdcaba61a8ef2382acc9233a9aac2ac8589a/__tests__/fixtures.ts#L126 - let expected_class_hash = felt_from_prefixed_hex( - "0x54328a1075b8820eb43caf0caa233923148c983742402dcfc38541dd843d01a", - ) - .unwrap(); - - assert_eq!(class_hash, expected_class_hash); - - // this struct is for deserializing part of the raw json artifact - // because DeprecatedContractClass expects the program property to be gzipped then base64 - // encoded we only take those params that dont have any special encoding - // Then to construct the `DeprecatedContractClass` we will assign the program property, - // instead of going through the process of gzipping and base64 encoding - #[derive(Deserialize)] - struct PartialDeprecatedContractClass { - pub abi: Vec, - /// The selector of each entry point is a unique identifier in the program. - pub entry_points_by_type: LegacyEntryPointsByType, - } - - // first check if generated class hash is the same when constructing - // `DeprecatedContractClass` via assigning properties - let PartialDeprecatedContractClass { abi, entry_points_by_type } = - serde_json::from_value::(contract_class.inner.clone()) - .unwrap(); - let program = contract_class.inner.get("program").unwrap(); - let deprecated_contract_class = - DeprecatedContractClass { program: program.clone(), abi, entry_points_by_type }; - - assert_eq!(deprecated_contract_class.generate_hash().unwrap(), expected_class_hash); - - // check if generated class hash is the same when deserializing to `DeprecatedContractClass` - let serialized_deprecated_contract_class = - serde_json::to_string(&deprecated_contract_class).unwrap(); - assert_eq!( - DeprecatedContractClass::rpc_from_json_str(&serialized_deprecated_contract_class) - .unwrap() - .generate_hash() - .unwrap(), - expected_class_hash - ); - } } diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs deleted file mode 100644 index 163be7481..000000000 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs +++ /dev/null @@ -1,130 +0,0 @@ -use serde::{Deserialize, Deserializer, Serialize}; - -#[derive(Debug, Copy, Clone, Eq, PartialEq, Deserialize, Serialize, Default)] -pub enum AbiEntryType { - #[serde(rename(deserialize = "constructor", serialize = "constructor"))] - Constructor, - #[serde(rename(deserialize = "event", serialize = "event"))] - Event, - #[serde(rename(deserialize = "function", serialize = "function"))] - #[default] - Function, - #[serde(rename(deserialize = "l1_handler", serialize = "l1_handler"))] - L1Handler, - #[serde(rename(deserialize = "struct", serialize = "struct"))] - Struct, -} - -#[derive(Debug, Clone, Eq, PartialEq, Serialize)] -#[serde(untagged)] -pub enum AbiEntry { - /// An event abi entry. - Event(EventAbiEntry), - /// A function abi entry. - Function(FunctionAbiEntry), - /// A struct abi entry. - Struct(StructAbiEntry), -} - -#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] -pub struct EventAbiEntry { - pub data: Vec, - pub keys: Vec, - pub name: String, -} - -/// A struct abi entry. -#[derive(Debug, Clone, Default, Eq, PartialEq, Deserialize, Serialize)] -pub struct StructAbiEntry { - pub members: Vec, - pub name: String, - pub size: usize, -} - -/// A struct member for [StructAbiEntry](`crate::deprecated_contract_class::StructAbiEntry`). -#[derive(Debug, Clone, Default, Eq, PartialEq, Deserialize, Serialize)] -pub struct StructMember { - pub name: String, - pub offset: usize, - pub r#type: String, -} - -#[derive(Debug, Clone, Default, Eq, PartialEq, Deserialize, Serialize)] -pub struct FunctionAbiEntry { - pub inputs: Vec, - pub name: String, - pub outputs: Vec, - #[serde(skip_serializing_if = "Option::is_none")] - #[serde(rename = "stateMutability")] - pub state_mutability: Option, -} - -impl<'de> Deserialize<'de> for AbiEntry { - fn deserialize(deserializer: D) -> Result - where - D: Deserializer<'de>, - { - let raw_value = serde_json::Value::deserialize(deserializer)?; - if raw_value.get("data").is_some() { - let entry = serde_json::from_value(raw_value) - .map_err(|e| serde::de::Error::custom(format!("Invalid event ABI entry: {e}")))?; - Ok(AbiEntry::Event(entry)) - } else if raw_value.get("members").is_some() { - let entry = serde_json::from_value(raw_value) - .map_err(|e| serde::de::Error::custom(format!("Invalid struct ABI entry: {e}")))?; - Ok(AbiEntry::Struct(entry)) - } else if raw_value.get("inputs").is_some() { - let entry = serde_json::from_value(raw_value).map_err(|e| { - serde::de::Error::custom(format!("Invalid function ABI entry: {e}")) - })?; - Ok(AbiEntry::Function(entry)) - } else { - Err(serde::de::Error::custom(format!("Invalid ABI entry: {raw_value}"))) - } - } -} - -#[cfg(test)] -mod tests { - use super::FunctionAbiEntry; - - #[test] - fn deserialize_function_abi_entry() { - let json_str = r#"{ - "name": "foo", - "inputs": [ - { - "name": "bar", - "type": "uint256" - } - ], - "outputs": [ - { - "name": "baz", - "type": "uint256" - } - ], - "stateMutability": "view" - }"#; - - serde_json::from_str::(json_str).unwrap(); - - let json_str = r#"{ - "name": "foo", - "inputs": [ - { - "name": "bar", - "type": "uint256" - } - ], - "outputs": [ - { - "name": "baz", - "type": "uint256" - } - ] - }"#; - - serde_json::from_str::(json_str).unwrap(); - } -} diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs deleted file mode 100644 index 189bacf37..000000000 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs +++ /dev/null @@ -1,265 +0,0 @@ -use core::fmt::{Debug, Display, Formatter}; -use std::collections::HashMap; - -use flate2::write::GzEncoder; -use flate2::Compression; -use serde::{Deserialize, Serialize}; -use serde_json::{json, Serializer as JsonSerializer, Value}; -use starknet_api::contract_class::EntryPointType; -use starknet_api::deprecated_contract_class::EntryPointV0; -use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; -use starknet_types_core::hash::{Pedersen, StarkHash}; - -use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; -use crate::error::{ConversionError, DevnetResult, Error, JsonError}; -use crate::felt::felt_from_prefixed_hex; -use crate::traits::HashProducer; -use crate::utils::StarknetFormatter; - -#[derive(Clone, Eq, PartialEq, Debug, Default, Serialize, Deserialize)] -pub struct Cairo0Json { - pub inner: Value, -} - -impl Cairo0Json { - pub fn raw_json_from_json_str(json_str: &str) -> DevnetResult { - let value: Value = serde_json::from_str(json_str).map_err(JsonError::SerdeJsonError)?; - - if value.is_object() { - Ok(Cairo0Json { inner: value }) - } else { - Err(Error::JsonError(JsonError::Custom { - msg: "expected JSON string to be an object".to_string(), - })) - } - } - - pub fn raw_json_from_path(path: &str) -> DevnetResult { - let contract_class_str = std::fs::read_to_string(path)?; - Cairo0Json::raw_json_from_json_str(&contract_class_str) - } - - /// Computes the hinted class hash of the contract class. - /// The parameter is a JSON object representing the contract class. - /// Pythonic hinted class hash computation is based on a JSON artifact produced by the - /// cairo-lang compiler. The JSON object contains his keys in alphabetical order. But when - /// those keys are made of digits only, they are sorted in ascending order. For example keys - /// "1", "10", "2" are sorted as "1", "2", "10" and keys "b", "a", "c" are sorted as "a", "b", - /// "c". The resulting object is being serialized to a string and then hashed. - /// In rust serde_json library when deserializing a JSON object, internally it uses a Map either - /// HashMap or IndexMap. Depending on the feature enabled if [preserver_order] is not enabled - /// HashMap will be used. In HashMap the keys order of insertion is not preserved and they - /// are sorted alphabetically, which doesn't work for our case, because the contract artifact - /// contains keys under the "hints" property that are only numbers. So we use IndexMap to - /// preserve order of the keys, but its disadvantage is removing entries from the json object, - /// because it uses swap_remove method on IndexMap, which doesn't preserve order. - /// So we traverse the JSON object and remove all entries with key - attributes or - /// accessible_scopes if they are empty arrays. - fn compute_hinted_class_hash(contract_class: &Value) -> crate::error::DevnetResult { - let mut abi_program_json = json!({ - "abi": contract_class.get("abi").unwrap_or(&Value::Null), - "program": contract_class.get("program").unwrap_or(&Value::Null) - }); - let program_json = abi_program_json - .get_mut("program") - .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; - - let debug_info_json = program_json.get_mut("debug_info"); - if debug_info_json.is_some() { - program_json - .as_object_mut() - .ok_or(JsonError::Custom { msg: "expected object".to_string() })? - .insert("debug_info".to_string(), serde_json::Value::Null); - } - - // Traverse the JSON and remove all entries with key attributes and accessible_scopes - // if they are empty arrays. - let modified_abi_program_json = - crate::utils::traverse_and_exclude_recursively(&abi_program_json, &|key, value| { - match value.as_array() { - Some(array) if array.is_empty() => { - key == "attributes" || key == "accessible_scopes" - } - _ => false, - } - }); - - let mut buffer = Vec::with_capacity(128); - let mut serializer = JsonSerializer::with_formatter(&mut buffer, StarknetFormatter); - modified_abi_program_json.serialize(&mut serializer).map_err(JsonError::SerdeJsonError)?; - - Ok(starknet_rs_core::utils::starknet_keccak(&buffer)) - } - - fn compute_cairo_0_contract_class_hash(json_class: &Value) -> crate::error::DevnetResult { - let mut hashes = vec![Felt::ZERO]; - - let entry_points_by_type: HashMap> = - serde_json::from_value( - json_class - .get("entry_points_by_type") - .ok_or(JsonError::Custom { - msg: "missing entry_points_by_type entry".to_string(), - })? - .clone(), - ) - .map_err(JsonError::SerdeJsonError)?; - - let entry_points_hash_by_type = |entry_point_type: EntryPointType| -> DevnetResult { - let felts: Vec = entry_points_by_type - .get(&entry_point_type) - .ok_or(ConversionError::InvalidInternalStructure( - "Missing entry point type".to_string(), - ))? - .iter() - .flat_map(|entry_point| { - let selector = entry_point.selector.0; - let offset = Felt::from(entry_point.offset.0 as u128); - - vec![selector, offset] - }) - .collect(); - - Ok(Pedersen::hash_array(&felts)) - }; - - hashes.push(entry_points_hash_by_type(EntryPointType::External)?); - hashes.push(entry_points_hash_by_type(EntryPointType::L1Handler)?); - hashes.push(entry_points_hash_by_type(EntryPointType::Constructor)?); - - let program_json = json_class - .get("program") - .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; - - let builtins_encoded_as_felts = program_json - .get("builtins") - .and_then(|v| v.as_array()) - .unwrap_or(&vec![]) - .iter() - .map(|el| { - el.as_str() - .map(|s| { - let hex_str = s - .as_bytes() - .iter() - .fold(String::from("0x"), |acc, &b| format!("{acc}{:02x}", b)); - felt_from_prefixed_hex(&hex_str) - }) - .ok_or(JsonError::Custom { msg: "expected string".into() })? - }) - .collect::>>()?; - - hashes.push(Pedersen::hash_array(&builtins_encoded_as_felts)); - - hashes.push(Cairo0Json::compute_hinted_class_hash(json_class)?); - - let program_data_felts = program_json - .get("data") - .unwrap_or(&serde_json::Value::Null) - .as_array() - .unwrap_or(&Vec::::new()) - .clone() - .into_iter() - .map(|v| { - felt_from_prefixed_hex( - v.as_str().ok_or(JsonError::Custom { msg: "expected string".into() })?, - ) - }) - .collect::>>()?; - - hashes.push(Pedersen::hash_array(&program_data_felts)); - - Ok(Pedersen::hash_array(&hashes)) - } -} - -impl Display for Cairo0Json { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - Display::fmt(&self.inner, f) - } -} - -impl TryInto for Cairo0Json { - type Error = Error; - fn try_into(self) -> Result { - let value = self.inner; - - let abi = value.get("abi"); - let entry_points_by_type = value - .get("entry_points_by_type") - .ok_or(JsonError::Custom { msg: "expected object".to_string() })?; - let program = - value.get("program").ok_or(JsonError::Custom { msg: "expected object".to_string() })?; - let compressed_program = json_into_raw_program(program)?; - - match abi { - Some(abi_json) => Ok(CompressedLegacyContractClass { - program: compressed_program, - entry_points_by_type: serde_json::from_value(entry_points_by_type.clone()) - .map_err(JsonError::SerdeJsonError)?, - abi: serde_json::from_value(abi_json.clone()).map_err(JsonError::SerdeJsonError)?, - }), - None => Ok(CompressedLegacyContractClass { - program: compressed_program, - entry_points_by_type: serde_json::from_value(entry_points_by_type.clone()) - .map_err(JsonError::SerdeJsonError)?, - abi: None, - }), - } - } -} - -impl HashProducer for Cairo0Json { - type Error = Error; - fn generate_hash(&self) -> DevnetResult { - Cairo0Json::compute_cairo_0_contract_class_hash(&self.inner) - } -} - -impl TryFrom for Cairo0Json { - type Error = Error; - fn try_from(value: DeprecatedContractClass) -> Result { - let abi_json = serde_json::to_value(value.abi).map_err(JsonError::SerdeJsonError)?; - let entry_points_json = - serde_json::to_value(value.entry_points_by_type).map_err(JsonError::SerdeJsonError)?; - - let json_value = json!({ - "program": value.program, - "abi": abi_json, - "entry_points_by_type": entry_points_json, - }); - - Ok(Cairo0Json { inner: json_value }) - } -} - -impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { - type Error = Error; - - fn try_from(value: Cairo0Json) -> Result { - serde_json::from_value(value.inner) - .map_err(|err| Error::JsonError(JsonError::SerdeJsonError(err))) - } -} - -pub fn json_into_raw_program(json_data: &Value) -> DevnetResult> { - let mut buffer = Vec::new(); - let encoder = GzEncoder::new(&mut buffer, Compression::best()); - serde_json::to_writer(encoder, &json_data).map_err(JsonError::SerdeJsonError)?; - - Ok(buffer) -} - -#[cfg(test)] -mod tests { - use starknet_rs_core::types::CompressedLegacyContractClass; - - use crate::contract_class::Cairo0Json; - use crate::utils::test_utils::CAIRO_0_ACCOUNT_CONTRACT_PATH; - - #[test] - fn test_unzipped_to_codegen_conversion() { - let class = Cairo0Json::raw_json_from_path(CAIRO_0_ACCOUNT_CONTRACT_PATH).unwrap(); - let _: CompressedLegacyContractClass = class.try_into().unwrap(); - } -} diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index c3f628a04..09c512acd 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -1,29 +1,28 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; +use starknet_rs_core::types::Felt; -use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; -use crate::contract_class::Cairo0Json; -use crate::error::{DevnetResult, Error}; -use crate::traits::HashProducer; +use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; -pub mod abi_entry; -pub mod json_contract_class; -pub mod rpc_contract_class; +use crate::error::{DevnetResult, Error, JsonError}; +use crate::traits::HashProducer; #[derive(Debug, Clone, Eq, PartialEq)] pub enum Cairo0ContractClass { - // TODO: remove once starknet_api raised - RawJson(Cairo0Json), Rpc(DeprecatedContractClass), } +impl Cairo0ContractClass { + pub fn from_json_str(s: &str) -> DevnetResult { + Ok(serde_json::from_str(s).map_err(JsonError::SerdeJsonError)?) + } +} + impl Serialize for Cairo0ContractClass { fn serialize(&self, serializer: S) -> Result where S: Serializer, { match self { - Cairo0ContractClass::RawJson(contract_json) => contract_json.serialize(serializer), Cairo0ContractClass::Rpc(contract) => contract.serialize(serializer), } } @@ -38,12 +37,6 @@ impl<'de> Deserialize<'de> for Cairo0ContractClass { } } -impl From for Cairo0ContractClass { - fn from(value: Cairo0Json) -> Self { - Cairo0ContractClass::RawJson(value) - } -} - impl From for Cairo0ContractClass { fn from(value: DeprecatedContractClass) -> Self { Cairo0ContractClass::Rpc(value) @@ -54,28 +47,15 @@ impl HashProducer for Cairo0ContractClass { type Error = Error; fn generate_hash(&self) -> DevnetResult { match self { - Cairo0ContractClass::RawJson(contract_json) => Ok(contract_json.generate_hash()?), - Cairo0ContractClass::Rpc(contract) => Ok(contract.generate_hash()?), + Cairo0ContractClass::Rpc(_) => todo!("copy from blockifier"), } } } -impl TryInto for Cairo0ContractClass { - type Error = Error; - fn try_into(self) -> Result { - match self { - Cairo0ContractClass::Rpc(contract_class) => contract_class.try_into(), - Cairo0ContractClass::RawJson(contract_class) => contract_class.try_into(), - } - } -} - -impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { - type Error = Error; - fn try_from(value: Cairo0ContractClass) -> Result { +impl From for starknet_api::deprecated_contract_class::ContractClass { + fn from(value: Cairo0ContractClass) -> Self { match value { - Cairo0ContractClass::RawJson(contract_class) => contract_class.try_into(), - Cairo0ContractClass::Rpc(contract_class) => contract_class.try_into(), + Cairo0ContractClass::Rpc(contract_class) => contract_class, } } } diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs deleted file mode 100644 index 0a75339d1..000000000 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs +++ /dev/null @@ -1,115 +0,0 @@ -use serde::{Deserialize, Serialize}; -use serde_json::Value; -use starknet_rs_core::types::{CompressedLegacyContractClass, Felt, LegacyEntryPointsByType}; - -use crate::contract_class::deprecated::abi_entry::{AbiEntry, AbiEntryType}; -use crate::contract_class::Cairo0Json; -use crate::error::{DevnetResult, Error, JsonError}; -use crate::serde_helpers::base_64_gzipped_json_string::{ - deserialize_to_serde_json_value_with_keys_ordered_in_alphabetical_order, - serialize_program_to_base64, -}; -use crate::traits::HashProducer; - -#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] -pub struct ContractClassAbiEntryWithType { - #[serde(flatten)] - pub entry: AbiEntry, - pub r#type: AbiEntryType, -} - -#[derive(Debug, Clone, Deserialize, Serialize)] -pub struct DeprecatedContractClass { - /// A base64 encoding of the gzip-compressed JSON representation of program. - #[serde( - deserialize_with = "deserialize_to_serde_json_value_with_keys_ordered_in_alphabetical_order", - serialize_with = "serialize_program_to_base64" - )] - pub program: Value, - pub abi: Vec, - /// The selector of each entry point is a unique identifier in the program. - pub entry_points_by_type: LegacyEntryPointsByType, -} - -impl DeprecatedContractClass { - pub fn rpc_from_json_str(json_str: &str) -> DevnetResult { - let res: DeprecatedContractClass = - serde_json::from_str(json_str).map_err(JsonError::SerdeJsonError)?; - - Ok(res) - } - - pub fn rpc_from_path(path: &str) -> DevnetResult { - let contract_class_str = std::fs::read_to_string(path)?; - DeprecatedContractClass::rpc_from_json_str(&contract_class_str) - } -} - -impl PartialEq for DeprecatedContractClass { - fn eq(&self, other: &Self) -> bool { - self.program == other.program && self.abi == other.abi - } -} - -impl Eq for DeprecatedContractClass {} - -impl Default for DeprecatedContractClass { - fn default() -> Self { - Self { - program: Value::default(), - abi: Vec::new(), - entry_points_by_type: LegacyEntryPointsByType { - constructor: Vec::new(), - external: Vec::new(), - l1_handler: Vec::new(), - }, - } - } -} - -impl HashProducer for DeprecatedContractClass { - type Error = Error; - fn generate_hash(&self) -> DevnetResult { - let json_value: Cairo0Json = self.clone().try_into()?; - json_value.generate_hash() - } -} - -impl TryInto for DeprecatedContractClass { - type Error = Error; - fn try_into(self) -> Result { - // TODO: improve - let cairo0: Cairo0Json = self.try_into()?; - cairo0.try_into() - } -} - -impl TryFrom for blockifier::execution::contract_class::ContractClassV0 { - type Error = Error; - - fn try_from(value: DeprecatedContractClass) -> Result { - let cairo_0_json = Cairo0Json::try_from(value)?; - cairo_0_json.try_into() - } -} - -#[cfg(test)] -mod tests { - use starknet_rs_core::types::CompressedLegacyContractClass; - - use crate::contract_class::DeprecatedContractClass; - use crate::utils::test_utils::CAIRO_0_RPC_CONTRACT_PATH; - - #[test] - fn test_rpc_deserialization() { - DeprecatedContractClass::rpc_from_path(CAIRO_0_RPC_CONTRACT_PATH).unwrap(); - } - - #[test] - fn test_rpc_to_codegen() { - let contract_class = - DeprecatedContractClass::rpc_from_path(CAIRO_0_RPC_CONTRACT_PATH).unwrap(); - - let _: CompressedLegacyContractClass = contract_class.try_into().unwrap(); - } -} diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index caa3ba945..c63645817 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -1,6 +1,7 @@ use std::sync::Arc; use blockifier::state::state_api::StateReader; +use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::objects::TransactionExecutionInfo; use broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; @@ -15,13 +16,13 @@ use starknet_api::contract_class::ClassInfo; use starknet_api::contract_class::EntryPointType; use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::executable_transaction::AccountTransaction; use starknet_api::transaction::fields::{Fee, Resource, Tip}; use starknet_rs_core::crypto::compute_hash_on_elements; use starknet_rs_core::types::{ BlockId, ExecutionResult, Felt, ResourceBounds, ResourceBoundsMapping, TransactionFinalityStatus, }; +use starknet_rs_core::utils::parse_cairo_short_string; use starknet_rs_crypto::poseidon_hash_many; use self::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; @@ -40,9 +41,7 @@ use super::state::ThinStateDiff; use super::transaction_receipt::{ ComputationResources, ExecutionResources, FeeInUnits, TransactionReceipt, }; -use crate::constants::{ - PREFIX_DECLARE, PREFIX_DEPLOY_ACCOUNT, PREFIX_INVOKE, QUERY_VERSION_OFFSET, -}; +use crate::constants::{PREFIX_DEPLOY_ACCOUNT, PREFIX_INVOKE, QUERY_VERSION_OFFSET}; use crate::contract_address::ContractAddress; use crate::contract_class::{ContractClass, compute_sierra_class_hash}; use crate::emitted_event::{Event, OrderedEvent}; @@ -278,6 +277,11 @@ impl BroadcastedTransactionCommon { } } +fn felt_to_sn_api_chain_id(f: &Felt) -> starknet_api::core::ChainId { + // TODO + starknet_api::core::ChainId::Other(parse_cairo_short_string(f).unwrap()) +} + /// Common fields for all transaction type of version 3 #[derive(Debug, Clone, Deserialize, Serialize)] pub struct BroadcastedTransactionCommonV3 { @@ -336,10 +340,10 @@ impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ValidRe starknet_api::transaction::fields::ValidResourceBounds::AllResources( starknet_api::transaction::fields::AllResourceBounds { l1_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( - value.inner.l1_gas, + value.inner.l1_gas.clone(), ), l2_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( - value.inner.l2_gas, + value.inner.l2_gas.clone(), ), l1_data_gas: todo!(), }, @@ -347,6 +351,8 @@ impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ValidRe } } +// TODO delete? + // impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ResourceBounds { // fn from(value: &ResourceBoundsWrapper) -> Self { @@ -481,26 +487,37 @@ pub enum BroadcastedTransaction { } impl BroadcastedTransaction { - pub fn to_blockifier_account_transaction( + pub fn to_blockifier_account_transaction(&self, chain_id: &Felt, execution_flags: ExecutionFlags)-> DevnetResult { + let sn_api_tx = self.to_sn_api_account_transaction(chain_id)?; + Ok(blockifier::transaction::account_transaction::AccountTransaction { + tx: sn_api_tx, + execution_flags, + }) + } + + pub fn to_sn_api_account_transaction( &self, chain_id: &Felt, - only_query: bool, - ) -> DevnetResult { - let blockifier_transaction = match self { - BroadcastedTransaction::Invoke(invoke_txn) => AccountTransaction::Invoke( - invoke_txn.create_blockifier_invoke_transaction(chain_id, only_query)?, - ), - BroadcastedTransaction::Declare(declare_txn) => AccountTransaction::Declare( - declare_txn.create_blockifier_declare(chain_id, only_query)?, - ), + ) -> DevnetResult { + let sn_api_tx = match self { + BroadcastedTransaction::Invoke(invoke_txn) => { + starknet_api::executable_transaction::AccountTransaction::Invoke( + invoke_txn.create_sn_api_invoke(chain_id)?, + ) + } + BroadcastedTransaction::Declare(declare_txn) => { + starknet_api::executable_transaction::AccountTransaction::Declare( + declare_txn.create_sn_api_declare(chain_id)?, + ) + } BroadcastedTransaction::DeployAccount(deploy_account_txn) => { - AccountTransaction::DeployAccount( - deploy_account_txn.create_blockifier_deploy_account(chain_id, only_query)?, + starknet_api::executable_transaction::AccountTransaction::DeployAccount( + deploy_account_txn.create_sn_api_deploy_account(chain_id)?, ) } }; - Ok(blockifier_transaction) + Ok(sn_api_tx) } pub fn get_type(&self) -> TransactionType { @@ -555,15 +572,13 @@ impl BroadcastedDeclareTransaction { /// /// # Arguments /// `chain_id` - the chain id to use for the transaction hash computation - pub fn create_blockifier_declare( + pub fn create_sn_api_declare( &self, chain_id: &Felt, - only_query: bool, ) -> DevnetResult { - let (transaction_hash, sn_api_transaction, class_info) = match self { + let (sn_api_transaction, class_info) = match self { BroadcastedDeclareTransaction::V1(v1) => { let class_hash = v1.generate_class_hash()?; - let transaction_hash = v1.calculate_transaction_hash(chain_id, &class_hash)?; let sn_api_declare = starknet_api::transaction::DeclareTransaction::V1( starknet_api::transaction::DeclareTransactionV0V1 { @@ -580,7 +595,7 @@ impl BroadcastedDeclareTransaction { let class_info: ClassInfo = ContractClass::Cairo0(v1.contract_class.clone()).try_into()?; - (transaction_hash, sn_api_declare, class_info) + (sn_api_declare, class_info) } BroadcastedDeclareTransaction::V2(v2) => { let sierra_class_hash: Felt = compute_sierra_class_hash(&v2.contract_class)?; @@ -600,27 +615,13 @@ impl BroadcastedDeclareTransaction { }, ); - let txn_hash = compute_hash_on_elements(&[ - PREFIX_DECLARE, - v2.common.version, - v2.sender_address.into(), - Felt::ZERO, // entry_point_selector - compute_hash_on_elements(&[sierra_class_hash]), - v2.common.max_fee.0.into(), - *chain_id, - v2.common.nonce, - v2.compiled_class_hash, - ]); - let class_info: ClassInfo = ContractClass::Cairo1(v2.contract_class.clone()).try_into()?; - (txn_hash, sn_api_declare, class_info) + (sn_api_declare, class_info) } BroadcastedDeclareTransaction::V3(v3) => { let sierra_class_hash = compute_sierra_class_hash(&v3.contract_class)?; - let transaction_hash = - v3.calculate_transaction_hash(chain_id, sierra_class_hash)?; let sn_api_declare = starknet_api::transaction::DeclareTransaction::V3( starknet_api::transaction::DeclareTransactionV3 { @@ -650,23 +651,15 @@ impl BroadcastedDeclareTransaction { let class_info: ClassInfo = ContractClass::Cairo1(v3.contract_class.clone()).try_into()?; - (transaction_hash, sn_api_declare, class_info) + (sn_api_declare, class_info) } }; - if only_query { - Ok(starknet_api::executable_transaction::DeclareTransaction::new_for_query( - sn_api_transaction, - starknet_api::transaction::TransactionHash(transaction_hash), - class_info, - )?) - } else { - Ok(starknet_api::executable_transaction::DeclareTransaction::create( - sn_api_transaction, - starknet_api::transaction::TransactionHash(transaction_hash), - class_info, - )?) - } + Ok(starknet_api::executable_transaction::DeclareTransaction::create( + sn_api_transaction, + class_info, + &felt_to_sn_api_chain_id(chain_id), + )?) } } @@ -698,10 +691,9 @@ impl BroadcastedDeployAccountTransaction { /// /// # Arguments /// `chain_id` - the chain id to use for the transaction hash computation - pub fn create_blockifier_deploy_account( + pub fn create_sn_api_deploy_account( &self, chain_id: &Felt, - only_query: bool, ) -> DevnetResult { let (transaction_hash, sn_api_transaction, contract_address) = match self { BroadcastedDeployAccountTransaction::V1(v1) => { @@ -794,7 +786,6 @@ impl BroadcastedDeployAccountTransaction { tx: sn_api_transaction, tx_hash: starknet_api::transaction::TransactionHash(transaction_hash), contract_address, - only_query, }) } } @@ -825,10 +816,9 @@ impl BroadcastedInvokeTransaction { /// /// # Arguments /// `chain_id` - the chain id to use for the transaction hash computation - pub fn create_blockifier_invoke_transaction( + pub fn create_sn_api_invoke( &self, chain_id: &Felt, - only_query: bool, ) -> DevnetResult { let (transaction_hash, sn_api_transaction) = match self { BroadcastedInvokeTransaction::V1(v1) => { @@ -889,7 +879,6 @@ impl BroadcastedInvokeTransaction { Ok(starknet_api::executable_transaction::InvokeTransaction { tx: sn_api_transaction, tx_hash: starknet_api::transaction::TransactionHash(transaction_hash), - only_query, }) } } @@ -1039,7 +1028,7 @@ pub struct BlockTransactionTrace { #[derive(Debug, Clone, Serialize)] #[cfg_attr(feature = "testing", derive(serde::Deserialize), serde(deny_unknown_fields))] pub struct Reversion { - pub revert_reason: String, + pub revert_reason: String, // TODO use blockifier's RevertError } #[derive(Debug, Clone, Serialize)] diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index 0278cac02..b161c1803 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs @@ -71,7 +71,7 @@ mod tests { use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; - use crate::contract_class::Cairo0Json; + use crate::contract_class::Cairo0ContractClass; use crate::felt::try_felt_to_num; use crate::rpc::transactions::BroadcastedDeclareTransaction; use crate::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; @@ -92,7 +92,7 @@ mod tests { fn correct_transaction_hash_computation_compared_to_a_transaction_from_feeder_gateway() { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/events.json").unwrap(); - let cairo0 = Cairo0Json::raw_json_from_json_str(&json_str).unwrap(); + let cairo0 = Cairo0ContractClass::from_json_str(&json_str).unwrap(); // this is declare v1 transaction send with starknet-rs let json_obj: serde_json::Value = serde_json::from_reader(std::fs::File::open(concat!( @@ -116,7 +116,7 @@ mod tests { let blockifier_declare_transaction = BroadcastedDeclareTransaction::V1(Box::new(broadcasted_tx)) - .create_blockifier_declare(&ChainId::goerli_legacy_id(), false) + .create_sn_api_declare(&ChainId::goerli_legacy_id()) .unwrap(); assert_eq!( diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs index 94ac425be..9faae59fa 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs @@ -52,8 +52,8 @@ mod tests { use crate::contract_address::ContractAddress; use crate::contract_class::ContractClass; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; use crate::rpc::transactions::BroadcastedDeclareTransaction; + use crate::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; use crate::utils::test_utils::CAIRO_1_EVENTS_CONTRACT_PATH; #[derive(Deserialize)] @@ -99,7 +99,7 @@ mod tests { let blockifier_declare_transaction = BroadcastedDeclareTransaction::V2(Box::new(broadcasted_declare_transaction)) - .create_blockifier_declare(&ChainId::goerli_legacy_id(), false) + .create_sn_api_declare(&ChainId::goerli_legacy_id()) .unwrap(); assert_eq!( diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs index fcb1d8454..b6e80d4fa 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs @@ -70,7 +70,7 @@ mod tests { use crate::rpc::transactions::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; use crate::rpc::transactions::BroadcastedTransactionCommonV3; use crate::utils::test_utils::{ - convert_from_sn_api_resource_bounds_mapping, from_u8_to_da_mode, + convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode, CAIRO_1_EVENTS_CONTRACT_PATH, }; @@ -122,7 +122,7 @@ mod tests { version: feeder_gateway_transaction.version, signature: vec![], nonce: feeder_gateway_transaction.nonce, - resource_bounds: convert_from_sn_api_resource_bounds_mapping( + resource_bounds: convert_from_sn_api_l1_resource_bounds( feeder_gateway_transaction.resource_bounds, ), tip: feeder_gateway_transaction.tip, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs index ae2e07e75..c6f850364 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs @@ -49,8 +49,8 @@ mod tests { use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::broadcasted_deploy_account_transaction_v1::BroadcastedDeployAccountTransactionV1; use crate::rpc::transactions::BroadcastedDeployAccountTransaction; + use crate::rpc::transactions::broadcasted_deploy_account_transaction_v1::BroadcastedDeployAccountTransactionV1; #[derive(Deserialize)] struct FeederGatewayDeployAccountTransaction { @@ -92,7 +92,7 @@ mod tests { let blockifier_deploy_account_transaction = BroadcastedDeployAccountTransaction::V1(broadcasted_tx) - .create_blockifier_deploy_account(&chain_id, false) + .create_sn_api_deploy_account(&chain_id) .unwrap(); assert_eq!( diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs index b65cc8801..d7edc2888 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs @@ -74,7 +74,7 @@ mod tests { use crate::rpc::transactions::broadcasted_deploy_account_transaction_v3::BroadcastedDeployAccountTransactionV3; use crate::rpc::transactions::BroadcastedTransactionCommonV3; use crate::utils::test_utils::{ - convert_from_sn_api_resource_bounds_mapping, from_u8_to_da_mode, + convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode, }; #[derive(Deserialize)] @@ -119,7 +119,7 @@ mod tests { version: feeder_gateway_transaction.version, signature: vec![], nonce: feeder_gateway_transaction.nonce, - resource_bounds: convert_from_sn_api_resource_bounds_mapping( + resource_bounds: convert_from_sn_api_l1_resource_bounds( feeder_gateway_transaction.resource_bounds, ), tip: feeder_gateway_transaction.tip, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs index 86243b0e4..cffbb9aad 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs @@ -45,8 +45,8 @@ mod tests { use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::broadcasted_invoke_transaction_v1::BroadcastedInvokeTransactionV1; use crate::rpc::transactions::BroadcastedInvokeTransaction; + use crate::rpc::transactions::broadcasted_invoke_transaction_v1::BroadcastedInvokeTransactionV1; #[derive(Deserialize)] struct FeederGatewayInvokeTransaction { @@ -84,10 +84,9 @@ mod tests { ); let chain_id = ChainId::goerli_legacy_id(); - let blockifier_transaction = BroadcastedInvokeTransaction::V1(transaction) - .create_blockifier_invoke_transaction(&chain_id, false) - .unwrap(); + let executable_tx = + BroadcastedInvokeTransaction::V1(transaction).create_sn_api_invoke(&chain_id).unwrap(); - assert_eq!(feeder_gateway_transaction.transaction_hash, blockifier_transaction.tx_hash.0); + assert_eq!(feeder_gateway_transaction.transaction_hash, *executable_tx.tx_hash()); } } diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs index b20dac260..62baea569 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs @@ -54,9 +54,7 @@ mod tests { use crate::contract_address::ContractAddress; use crate::rpc::transactions::broadcasted_invoke_transaction_v3::BroadcastedInvokeTransactionV3; use crate::rpc::transactions::BroadcastedTransactionCommonV3; - use crate::utils::test_utils::{ - convert_from_sn_api_resource_bounds_mapping, from_u8_to_da_mode, - }; + use crate::utils::test_utils::{convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode}; #[derive(Deserialize)] struct FeederGatewayInvokeTransactionV3 { @@ -98,7 +96,7 @@ mod tests { version: feeder_gateway_transaction.version, signature: vec![], nonce: feeder_gateway_transaction.nonce, - resource_bounds: convert_from_sn_api_resource_bounds_mapping( + resource_bounds: convert_from_sn_api_l1_resource_bounds( feeder_gateway_transaction.resource_bounds, ), tip: feeder_gateway_transaction.tip, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs b/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs index f23906d1d..fdcc11b84 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs @@ -58,12 +58,12 @@ impl L1HandlerTransaction { } /// Creates a blockifier version of `L1HandlerTransaction`. - pub fn create_blockifier_transaction( + pub fn create_sn_api_transaction( &self, chain_id: Felt, - ) -> DevnetResult { - let transaction = BlockifierL1HandlerTransaction { - tx: ApiL1HandlerTransaction { + ) -> DevnetResult { + let transaction = ApiL1HandlerTransaction { + tx: starknet_api::transaction::L1HandlerTransaction { contract_address: ApiContractAddress::try_from(self.contract_address)?, entry_point_selector: ApiEntryPointSelector(self.entry_point_selector), calldata: ApiCalldata(Arc::new(self.calldata.clone())), diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index 35fec5f95..44440b900 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -1,103 +1,11 @@ -use std::io; - -use serde_json::ser::Formatter; -use serde_json::{Map, Value}; - -/// The preserve_order feature enabled in the serde_json crate -/// removing a key from the object changes the order of the keys -/// When serde_json is not being used with the preserver order feature -/// deserializing to a serde_json::Value changes the order of the keys -/// -/// go through the object by visiting every key and value recursively, -/// and not including them into a new json obj if the condition is met -/// Empty objects are not included -/// Exclude_condition is a function that takes a key and a value and returns a bool -/// If the exclude_condition evaluates to true, the key and value are not included in the new object -pub fn traverse_and_exclude_recursively( - value: &Value, - exclude_condition: &F, -) -> serde_json::Value -where - F: Fn(&String, &Value) -> bool, -{ - match value { - Value::Object(object) => { - let mut new_object = Map::new(); - - for (key, value) in object { - if exclude_condition(key, value) { - continue; - } - let inner_val = traverse_and_exclude_recursively(value, exclude_condition); - new_object.insert(key.to_string(), inner_val); - } - - Value::Object(new_object.clone()) - } - // arrays are visited like the objects - recursively - Value::Array(array) => { - let mut inner_arr = Vec::::new(); - - for value in array { - let inner_val = traverse_and_exclude_recursively(value, exclude_condition); - - match inner_val.as_object() { - Some(inner_obj) if inner_obj.is_empty() => {} - _ => inner_arr.push(inner_val), - } - } - - Value::Array(inner_arr) - } - // handle non-object, non-array values - _ => value.clone(), - } -} - -/// JSON Formatter that serializes an object with the desired spaces -/// So the serialized object can match the object structure when compiling cairo program. -/// When serializing with the default formatter, the JSON string is without any spaces between -/// elements. Example here . -pub struct StarknetFormatter; - -impl Formatter for StarknetFormatter { - fn begin_object_value(&mut self, writer: &mut W) -> io::Result<()> - where - W: ?Sized + io::Write, - { - writer.write_all(b": ") - } - - fn begin_object_key(&mut self, writer: &mut W, first: bool) -> io::Result<()> - where - W: ?Sized + io::Write, - { - if first { Ok(()) } else { writer.write_all(b", ") } - } - - fn begin_array_value(&mut self, writer: &mut W, first: bool) -> io::Result<()> - where - W: ?Sized + io::Write, - { - if first { Ok(()) } else { writer.write_all(b", ") } - } -} - #[cfg(test)] pub(crate) mod test_utils { - use starknet_api::block::GasPrice; - use starknet_api::data_availability::DataAvailabilityMode; - use starknet_api::execution_resources::GasAmount; - use starknet_api::transaction::fields::ResourceBounds; + use starknet_api::{ + data_availability::DataAvailabilityMode, transaction::fields::ResourceBounds, + }; use crate::rpc::transactions::ResourceBoundsWrapper; - pub(crate) const CAIRO_0_ACCOUNT_CONTRACT_PATH: &str = - "../../contracts/test_artifacts/cairo0/account.json"; - - pub(crate) const CAIRO_0_ACCOUNT_CONTRACT_HASH: &str = - "0x4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f"; - pub(crate) const CAIRO_0_RPC_CONTRACT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/test_data/cairo_0_rpc.json"); @@ -121,97 +29,14 @@ pub(crate) mod test_utils { } } - pub(crate) fn convert_from_sn_api_resource_bounds_mapping( - resource_bounds: ResourceBoundsMapping, + pub(crate) fn convert_from_sn_api_l1_resource_bounds( + l1_resource_bounds: ResourceBounds, ) -> ResourceBoundsWrapper { - let l1_resource_bounds = resource_bounds - .0 - .get(&starknet_api::transaction::fields::Resource::L1Gas) - .cloned() - .unwrap_or(ResourceBounds { - max_amount: GasAmount(0), - max_price_per_unit: GasPrice(0), - }); - - let l2_resource_bounds = resource_bounds - .0 - .get(&starknet_api::transaction::fields::Resource::L2Gas) - .cloned() - .unwrap_or(ResourceBounds { - max_amount: GasAmount(0), - max_price_per_unit: GasPrice(0), - }); - ResourceBoundsWrapper::new( - l1_resource_bounds.max_amount, - l1_resource_bounds.max_price_per_unit, - l2_resource_bounds.max_amount, - l2_resource_bounds.max_price_per_unit, + l1_resource_bounds.max_amount.0, + l1_resource_bounds.max_price_per_unit.0, + 0, + 0, ) } } -#[cfg(test)] -mod tests { - use serde_json::Value; - - #[test] - fn serde_remove_elements_from_json() { - let input = r#" - { - "name": "John Doe", - "isStudent": true, - "age":30, - "address": { - "street": "Vlvo", - "city": "Anytown", - "state": "Any" - }, - "should_be_removed": [], - "scores": - [ - { - "street": "AAA", - "age": 5, - "should_be_removed": [] - }, - { - "age": 5 - } - ], - "arr": [90, 85, 95] - } - "#; - let expected_output = r#" - { - "name": "John Doe", - "isStudent": true, - "age":30, - "address": { - "street": "Vlvo", - "city": "Anytown", - "state": "Any" - }, - "scores": - [ - { - "street": "AAA", - "age": 5 - }, - { - "age": 5 - } - ], - "arr": [90, 85, 95] - } - "#; - let value: Value = serde_json::from_str(input).unwrap(); - - let res = crate::utils::traverse_and_exclude_recursively(&value, &|key, val| { - return key == "should_be_removed" - && val.is_array() - && val.as_array().unwrap().is_empty(); - }); - - assert_eq!(res, serde_json::from_str::(expected_output).unwrap()); - } -} From 532e1f2bdfa0382994ab91d9ed4ee55a381c2664 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 31 Jan 2025 13:26:58 +0100 Subject: [PATCH 04/41] Address gas changes (l2 treated as l1) - compilable [skip ci] --- crates/starknet-devnet-core/src/account.rs | 10 +- crates/starknet-devnet-core/src/blocks/mod.rs | 139 ++++++++++++++---- crates/starknet-devnet-core/src/error.rs | 3 +- .../src/starknet/add_declare_transaction.rs | 22 +-- .../add_deploy_account_transaction.rs | 2 +- .../src/starknet/add_invoke_transaction.rs | 15 +- .../starknet/add_l1_handler_transaction.rs | 2 +- .../src/starknet/estimations.rs | 14 +- .../starknet-devnet-core/src/starknet/mod.rs | 102 ++++++++----- .../src/state/state_diff.rs | 28 ++-- .../starknet-devnet-core/src/transactions.rs | 3 +- crates/starknet-devnet-core/src/utils.rs | 27 +++- .../src/rpc/contract_class.rs | 40 +++-- .../src/rpc/contract_class/deprecated/mod.rs | 3 +- .../src/rpc/estimate_message_fee.rs | 2 +- .../src/rpc/transaction_receipt.rs | 3 +- .../src/rpc/transactions.rs | 14 +- .../broadcasted_declare_transaction_v1.rs | 2 +- .../broadcasted_declare_transaction_v2.rs | 2 +- .../broadcasted_declare_transaction_v3.rs | 3 +- ...oadcasted_deploy_account_transaction_v1.rs | 2 +- ...oadcasted_deploy_account_transaction_v3.rs | 4 +- .../broadcasted_invoke_transaction_v1.rs | 2 +- .../transactions/l1_handler_transaction.rs | 4 +- crates/starknet-devnet-types/src/utils.rs | 5 +- tests/integration/test_account_selection.rs | 12 +- tests/integration/test_estimate_fee.rs | 16 +- .../integration/test_estimate_message_fee.rs | 9 +- tests/integration/test_fork.rs | 2 +- tests/integration/test_restart.rs | 7 +- .../integration/test_simulate_transactions.rs | 14 +- .../integration/test_transaction_handling.rs | 14 +- 32 files changed, 323 insertions(+), 204 deletions(-) diff --git a/crates/starknet-devnet-core/src/account.rs b/crates/starknet-devnet-core/src/account.rs index 3865b4ae0..ca6f20507 100644 --- a/crates/starknet-devnet-core/src/account.rs +++ b/crates/starknet-devnet-core/src/account.rs @@ -9,7 +9,7 @@ use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::error::Error; -use starknet_types::felt::{ClassHash, Key, felt_from_prefixed_hex, join_felts, split_biguint}; +use starknet_types::felt::{felt_from_prefixed_hex, join_felts, split_biguint, ClassHash, Key}; use starknet_types::num_bigint::BigUint; use starknet_types::rpc::state::Balance; use starknet_types::traits::HashProducer; @@ -110,10 +110,10 @@ impl Account { fn simulate_constructor(&self, state: &mut StarknetState) -> DevnetResult<()> { let core_address = self.account_address.try_into()?; - let interface_storage_var = - get_storage_var_address("SRC5_supported_interfaces", &[felt_from_prefixed_hex( - ISRC6_ID_HEX, - )?])?; + let interface_storage_var = get_storage_var_address( + "SRC5_supported_interfaces", + &[felt_from_prefixed_hex(ISRC6_ID_HEX)?], + )?; state.state.state.set_storage_at( core_address, interface_storage_var.try_into()?, diff --git a/crates/starknet-devnet-core/src/blocks/mod.rs b/crates/starknet-devnet-core/src/blocks/mod.rs index 2f645fa9f..b1a0ed045 100644 --- a/crates/starknet-devnet-core/src/blocks/mod.rs +++ b/crates/starknet-devnet-core/src/blocks/mod.rs @@ -17,8 +17,8 @@ use starknet_types_core::hash::{Pedersen, StarkHash}; use crate::constants::{DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, STARKNET_VERSION}; use crate::error::{DevnetResult, Error}; -use crate::state::StarknetState; use crate::state::state_diff::StateDiff; +use crate::state::StarknetState; use crate::traits::HashIdentified; pub(crate) struct StarknetBlocks { @@ -70,7 +70,8 @@ impl StarknetBlocks { /// hash pub fn insert(&mut self, mut block: StarknetBlock, state_diff: StateDiff) { if let Some(last_block_hash) = self.last_block_hash { - block.header.block_header_without_hash.parent_hash = starknet_api::block::BlockHash(last_block_hash); + block.header.block_header_without_hash.parent_hash = + starknet_api::block::BlockHash(last_block_hash); } let hash = block.block_hash(); @@ -183,12 +184,36 @@ impl From<&StarknetBlock> for TypesPendingBlockHeader { timestamp: value.timestamp(), starknet_version: STARKNET_VERSION.to_string(), l1_gas_price: ResourcePrice { - price_in_fri: value.header.block_header_without_hash.l1_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.block_header_without_hash.l1_gas_price.price_in_wei.0.into(), + price_in_fri: value + .header + .block_header_without_hash + .l1_gas_price + .price_in_fri + .0 + .into(), + price_in_wei: value + .header + .block_header_without_hash + .l1_gas_price + .price_in_wei + .0 + .into(), }, l1_data_gas_price: ResourcePrice { - price_in_fri: value.header.block_header_without_hash.l1_data_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.block_header_without_hash.l1_data_gas_price.price_in_wei.0.into(), + price_in_fri: value + .header + .block_header_without_hash + .l1_data_gas_price + .price_in_fri + .0 + .into(), + price_in_wei: value + .header + .block_header_without_hash + .l1_data_gas_price + .price_in_wei + .0 + .into(), }, l1_da_mode: value.header.block_header_without_hash.l1_da_mode, } @@ -206,12 +231,36 @@ impl From<&StarknetBlock> for TypesBlockHeader { timestamp: value.timestamp(), starknet_version: STARKNET_VERSION.to_string(), l1_gas_price: ResourcePrice { - price_in_fri: value.header.block_header_without_hash.l1_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.block_header_without_hash.l1_gas_price.price_in_wei.0.into(), + price_in_fri: value + .header + .block_header_without_hash + .l1_gas_price + .price_in_fri + .0 + .into(), + price_in_wei: value + .header + .block_header_without_hash + .l1_gas_price + .price_in_wei + .0 + .into(), }, l1_data_gas_price: ResourcePrice { - price_in_fri: value.header.block_header_without_hash.l1_data_gas_price.price_in_fri.0.into(), - price_in_wei: value.header.block_header_without_hash.l1_data_gas_price.price_in_wei.0.into(), + price_in_fri: value + .header + .block_header_without_hash + .l1_data_gas_price + .price_in_fri + .0 + .into(), + price_in_wei: value + .header + .block_header_without_hash + .l1_data_gas_price + .price_in_wei + .0 + .into(), }, l1_da_mode: value.header.block_header_without_hash.l1_da_mode, } @@ -289,17 +338,20 @@ impl HashProducer for StarknetBlock { felt!(self.header.block_header_without_hash.block_number.0), // block number self.header.block_header_without_hash.state_root.0, // global_state_root *self.header.block_header_without_hash.sequencer.0.key(), // sequencer_address - Felt::ZERO, /* block_timestamp; would normally be - * felt!(self.header.timestamp.0), but - * is modified to enable replicability - * in re-execution on loading on dump */ + Felt::ZERO, /* block_timestamp; + * would normally be + * felt!(self.header. + * timestamp.0), but + * is modified to enable replicability + * in re-execution on + * loading on dump */ felt!(self.transaction_hashes.len() as u64), // transaction_count Felt::ZERO, // transaction_commitment Felt::ZERO, // event_count Felt::ZERO, // event_commitment Felt::ZERO, // protocol_version Felt::ZERO, // extra_data - self.header.block_header_without_hash.parent_hash.0, // parent_block_hash + self.header.block_header_without_hash.parent_hash.0, // parent_block_hash ]); Ok(hash) @@ -324,7 +376,8 @@ mod tests { let mut blocks = StarknetBlocks::default(); for block_number in 1..=10 { let mut block_to_insert = StarknetBlock::create_pending_block(); - block_to_insert.header.block_header_without_hash.block_number = BlockNumber(block_number); + block_to_insert.header.block_header_without_hash.block_number = + BlockNumber(block_number); block_to_insert.header.block_hash = starknet_api::block::BlockHash(Felt::from(block_number as u128)); blocks.insert(block_to_insert, StateDiff::default()); @@ -412,7 +465,8 @@ mod tests { let last_block_number = 11; for block_number in 2..=last_block_number { let mut block_to_insert = StarknetBlock::create_pending_block(); - block_to_insert.header.block_header_without_hash.block_number = BlockNumber(block_number); + block_to_insert.header.block_header_without_hash.block_number = + BlockNumber(block_number); block_to_insert.header.block_hash = starknet_api::block::BlockHash(Felt::from(block_number as u128)); blocks.insert(block_to_insert.clone(), StateDiff::default()); @@ -713,19 +767,45 @@ mod tests { } assert!( - blocks.get_by_num(&BlockNumber(0)).unwrap().header.block_header_without_hash.parent_hash == BlockHash::default() + blocks + .get_by_num(&BlockNumber(0)) + .unwrap() + .header + .block_header_without_hash + .parent_hash + == BlockHash::default() ); assert!( blocks.get_by_num(&BlockNumber(0)).unwrap().header.block_hash - == blocks.get_by_num(&BlockNumber(1)).unwrap().header.block_header_without_hash.parent_hash + == blocks + .get_by_num(&BlockNumber(1)) + .unwrap() + .header + .block_header_without_hash + .parent_hash ); assert!( blocks.get_by_num(&BlockNumber(1)).unwrap().header.block_hash - == blocks.get_by_num(&BlockNumber(2)).unwrap().header.block_header_without_hash.parent_hash + == blocks + .get_by_num(&BlockNumber(2)) + .unwrap() + .header + .block_header_without_hash + .parent_hash ); assert!( - blocks.get_by_num(&BlockNumber(1)).unwrap().header.block_header_without_hash.parent_hash - != blocks.get_by_num(&BlockNumber(2)).unwrap().header.block_header_without_hash.parent_hash + blocks + .get_by_num(&BlockNumber(1)) + .unwrap() + .header + .block_header_without_hash + .parent_hash + != blocks + .get_by_num(&BlockNumber(2)) + .unwrap() + .header + .block_header_without_hash + .parent_hash ) } @@ -748,12 +828,15 @@ mod tests { let block = StarknetBlock::create_pending_block(); assert!(block.status == BlockStatus::Pending); assert!(block.transaction_hashes.is_empty()); - assert_eq!(block.header, BlockHeader { - block_header_without_hash: BlockHeaderWithoutHash { - l1_da_mode: L1DataAvailabilityMode::Blob, + assert_eq!( + block.header, + BlockHeader { + block_header_without_hash: BlockHeaderWithoutHash { + l1_da_mode: L1DataAvailabilityMode::Blob, + ..Default::default() + }, ..Default::default() - }, - ..Default::default() - }); + } + ); } } diff --git a/crates/starknet-devnet-core/src/error.rs b/crates/starknet-devnet-core/src/error.rs index 1c8b73b1c..bb5363863 100644 --- a/crates/starknet-devnet-core/src/error.rs +++ b/crates/starknet-devnet-core/src/error.rs @@ -21,7 +21,8 @@ pub enum Error { #[error(transparent)] BlockifierExecutionError(#[from] blockifier::execution::errors::EntryPointExecutionError), #[error("{execution_error}")] - ExecutionError { execution_error: String, index: usize }, // TODO change type of execution_error + ExecutionError { execution_error: String, index: usize }, /* TODO change type of + * execution_error */ #[error("Types error: {0}")] TypesError(#[from] starknet_types::error::Error), #[error("I/O error: {0}")] diff --git a/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs index 58eabd08e..5c862a46b 100644 --- a/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs @@ -78,19 +78,11 @@ pub fn add_declare_transaction( )?); let transaction = TransactionWithHash::new(transaction_hash, declare_transaction); - let execution_info = - blockifier::transaction::account_transaction::AccountTransaction { - tx: starknet_api::executable_transaction::AccountTransaction::Declare(executable_tx), - execution_flags: ExecutionFlags { - only_query: false, - charge_fee: true, - validate, - }, - } - .execute( - &mut starknet.pending_state.state, - &starknet.block_context, - )?; + let execution_info = blockifier::transaction::account_transaction::AccountTransaction { + tx: starknet_api::executable_transaction::AccountTransaction::Declare(executable_tx), + execution_flags: ExecutionFlags { only_query: false, charge_fee: true, validate }, + } + .execute(&mut starknet.pending_state.state, &starknet.block_context)?; // if tx successful, store the class if !execution_info.is_reverted() { @@ -145,14 +137,14 @@ mod tests { use starknet_types::constants::QUERY_VERSION_OFFSET; use starknet_types::contract_address::ContractAddress; use starknet_types::contract_class::ContractClass; - use starknet_types::rpc::transactions::BroadcastedDeclareTransaction; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; + use starknet_types::rpc::transactions::BroadcastedDeclareTransaction; use starknet_types::traits::HashProducer; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::Starknet; use crate::starknet::tests::setup_starknet_with_no_signature_check_account; + use crate::starknet::Starknet; use crate::state::{BlockNumberOrPending, CustomStateReader}; use crate::traits::{HashIdentified, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; diff --git a/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs index 39c8c59bf..d11f1bb27 100644 --- a/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs @@ -92,7 +92,7 @@ mod tests { ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, }; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::{Starknet, predeployed}; + use crate::starknet::{predeployed, Starknet}; use crate::state::CustomState; use crate::traits::{Deployed, HashIdentifiedMut}; use crate::utils::get_storage_var_address; diff --git a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs index 1b8652b6b..f7c6874f5 100644 --- a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs @@ -49,14 +49,11 @@ pub fn add_invoke_transaction( let state = &mut starknet.get_state().state; - let execution_info = - blockifier::transaction::account_transaction::AccountTransaction { - tx: starknet_api::executable_transaction::AccountTransaction::Invoke( - sn_api_transaction, - ), - execution_flags: ExecutionFlags { only_query: false, charge_fee: true, validate }, - } - .execute(state, &block_context)?; + let execution_info = blockifier::transaction::account_transaction::AccountTransaction { + tx: starknet_api::executable_transaction::AccountTransaction::Invoke(sn_api_transaction), + execution_flags: ExecutionFlags { only_query: false, charge_fee: true, validate }, + } + .execute(state, &block_context)?; let transaction = TransactionWithHash::new(transaction_hash, invoke_transaction); @@ -94,7 +91,7 @@ mod tests { ETH_ERC20_CONTRACT_ADDRESS, }; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::{Starknet, predeployed}; + use crate::starknet::{predeployed, Starknet}; use crate::state::CustomState; use crate::traits::{Accounted, Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; diff --git a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs index 8b0836382..bf8267aa2 100644 --- a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs @@ -51,7 +51,7 @@ mod tests { self, DEVNET_DEFAULT_CHAIN_ID, DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, }; - use crate::starknet::{Starknet, predeployed}; + use crate::starknet::{predeployed, Starknet}; use crate::state::CustomState; use crate::traits::{Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_l1l2_contract; diff --git a/crates/starknet-devnet-core/src/starknet/estimations.rs b/crates/starknet-devnet-core/src/starknet/estimations.rs index 285ed7fc4..246038f22 100644 --- a/crates/starknet-devnet-core/src/starknet/estimations.rs +++ b/crates/starknet-devnet-core/src/starknet/estimations.rs @@ -5,6 +5,7 @@ use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::objects::HasRelatedFeeType; use blockifier::transaction::transaction_execution::Transaction; use blockifier::transaction::transactions::ExecutableTransaction; +use starknet_api::block::FeeType; use starknet_api::transaction::fields::GasVectorComputationMode; use starknet_rs_core::types::{BlockId, Felt, MsgFromL1, PriceUnit}; use starknet_types::contract_address::ContractAddress; @@ -71,7 +72,8 @@ pub fn estimate_fee( match estimate_fee_result { Ok(estimated_fee) => Ok(estimated_fee), - // reverted transactions are failing with ExecutionError, but index is set to 0, so we override the index property + // reverted transactions are failing with ExecutionError, but index is set to 0, so + // we override the index property Err(Error::ExecutionError { execution_error, .. }) => { Err(Error::ExecutionError { execution_error, index: idx }) } @@ -114,7 +116,7 @@ fn estimate_transaction_fee( transaction: Transaction, return_error_on_reverted_execution: bool, ) -> DevnetResult { - let fee_type = match transaction { + let fee_type = match &transaction { Transaction::Account(tx) => tx.fee_type(), Transaction::L1Handler(tx) => tx.fee_type(), }; @@ -138,13 +140,13 @@ fn estimate_transaction_fee( let (gas_price, data_gas_price, unit) = match fee_type { starknet_api::block::FeeType::Strk => ( - block_context.block_info().gas_prices.strk_l1_gas_price.get(), - block_context.block_info().gas_prices.strk_l1_data_gas_price.get(), + block_context.block_info().gas_prices.l1_gas_price(&FeeType::Strk).get(), + block_context.block_info().gas_prices.l1_data_gas_price(&FeeType::Strk).get(), PriceUnit::Fri, ), starknet_api::block::FeeType::Eth => ( - block_context.block_info().gas_prices.eth_l1_gas_price.get(), - block_context.block_info().gas_prices.eth_l1_data_gas_price.get(), + block_context.block_info().gas_prices.l1_gas_price(&FeeType::Eth).get(), + block_context.block_info().gas_prices.l1_data_gas_price(&FeeType::Eth).get(), PriceUnit::Wei, ), }; diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index 00f2e46fe..b0634bb8e 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -9,8 +9,10 @@ use blockifier::transaction::account_transaction::{AccountTransaction, Execution use blockifier::transaction::objects::TransactionExecutionInfo; use blockifier::transaction::transactions::ExecutableTransaction; use parking_lot::RwLock; -use starknet_api::block::{BlockInfo, GasPriceVector, GasPrices}; -use starknet_api::block::{BlockNumber, BlockStatus, BlockTimestamp, GasPrice, GasPricePerToken}; +use starknet_api::block::{ + BlockInfo, BlockNumber, BlockStatus, BlockTimestamp, FeeType, GasPrice, GasPricePerToken, + GasPriceVector, GasPrices, +}; use starknet_api::core::SequencerContractAddress; use starknet_api::transaction::fields::Fee; use starknet_config::BlockGenerationOn; @@ -25,7 +27,7 @@ use starknet_types::contract_address::ContractAddress; use starknet_types::contract_class::ContractClass; use starknet_types::emitted_event::EmittedEvent; use starknet_types::felt::{ - BlockHash, ClassHash, TransactionHash, felt_from_prefixed_hex, split_biguint, + felt_from_prefixed_hex, split_biguint, BlockHash, ClassHash, TransactionHash, }; use starknet_types::num_bigint::BigUint; use starknet_types::patricia_key::PatriciaKey; @@ -67,13 +69,14 @@ use crate::constants::{ use crate::contract_class_choice::AccountContractClassChoice; use crate::error::{DevnetResult, Error, TransactionValidationError}; use crate::messaging::MessagingBroker; +use crate::nonzero_gas_price; use crate::predeployed_accounts::PredeployedAccounts; use crate::raw_execution::RawExecutionV1; use crate::state::state_diff::StateDiff; use crate::state::{CommittedClassStorage, CustomState, CustomStateReader, StarknetState}; use crate::traits::{AccountGenerator, Deployed, HashIdentified, HashIdentifiedMut}; use crate::transactions::{StarknetTransaction, StarknetTransactions}; -use crate::{nonzero_gas_price, utils::{custom_bouncer_config, get_versioned_constants}}; +use crate::utils::{custom_bouncer_config, get_versioned_constants}; mod add_declare_transaction; mod add_deploy_account_transaction; @@ -542,20 +545,33 @@ impl Starknet { block.header.block_header_without_hash.block_number = self.block_context.block_info().block_number; block.header.block_header_without_hash.l1_gas_price = GasPricePerToken { - price_in_fri: GasPrice( - self.block_context.block_info().gas_prices.strk_l1_gas_price.get(), - ), - price_in_wei: GasPrice( - self.block_context.block_info().gas_prices.eth_l1_gas_price.get(), - ), + price_in_fri: self + .block_context + .block_info() + .gas_prices + .l1_gas_price(&FeeType::Strk) + .get(), + price_in_wei: self + .block_context + .block_info() + .gas_prices + .l1_gas_price(&FeeType::Eth) + .get(), }; block.header.block_header_without_hash.l1_data_gas_price = GasPricePerToken { - price_in_fri: GasPrice( - self.block_context.block_info().gas_prices.strk_l1_data_gas_price.get(), - ), - price_in_wei: GasPrice( - self.block_context.block_info().gas_prices.eth_l1_data_gas_price.get(), - ), + price_in_fri: self + .block_context + .block_info() + .gas_prices + .l1_data_gas_price(&FeeType::Strk) + .get(), + + price_in_wei: self + .block_context + .block_info() + .gas_prices + .l1_data_gas_price(&FeeType::Eth) + .get(), }; block.header.block_header_without_hash.sequencer = SequencerContractAddress(self.block_context.block_info().sequencer_address); @@ -1146,11 +1162,14 @@ impl Starknet { )?; Ok(( - txn.to_blockifier_account_transaction(&chain_id, ExecutionFlags { - only_query: true, - charge_fee: !skip_fee_charge, - validate: !(skip_validate || skip_validate_due_to_impersonation), - })?, + txn.to_blockifier_account_transaction( + &chain_id, + ExecutionFlags { + only_query: true, + charge_fee: !skip_fee_charge, + validate: !(skip_validate || skip_validate_due_to_impersonation), + }, + )?, txn.get_type(), )) }) @@ -1372,7 +1391,7 @@ mod tests { use blockifier::execution::errors::{EntryPointExecutionError, PreExecutionError}; use blockifier::state::state_api::{State, StateReader}; use nonzero_ext::nonzero; - use starknet_api::block::{BlockHash, BlockNumber, BlockStatus, BlockTimestamp, GasPrice}; + use starknet_api::block::{BlockHash, BlockNumber, BlockStatus, BlockTimestamp, FeeType}; use starknet_api::core::EntryPointSelector; use starknet_rs_core::types::{BlockId, BlockTag, Felt}; use starknet_rs_core::utils::get_selector_from_name; @@ -1477,7 +1496,7 @@ mod tests { ); assert_eq!(block_ctx.block_info().block_number, BlockNumber(0)); assert_eq!(block_ctx.block_info().block_timestamp, BlockTimestamp(0)); - assert_eq!(block_ctx.block_info().gas_prices.eth_l1_gas_price.get(), 10); + assert_eq!(block_ctx.block_info().gas_prices.l1_gas_price(&FeeType::Eth).get().0, 10); assert_eq!( ContractAddress::from(block_ctx.chain_info().fee_token_addresses.eth_fee_token_address), fee_token_address @@ -1530,13 +1549,14 @@ mod tests { let mut starknet = Starknet::new(&config).unwrap(); let initial_block_number = starknet.block_context.block_info().block_number; - let initial_gas_price_wei = starknet.block_context.block_info().gas_prices.eth_l1_gas_price; + let initial_gas_price_wei = + starknet.block_context.block_info().gas_prices.l1_gas_price(&FeeType::Eth); let initial_gas_price_fri = - starknet.block_context.block_info().gas_prices.strk_l1_gas_price; + starknet.block_context.block_info().gas_prices.l1_gas_price(&FeeType::Strk); let initial_data_gas_price_wei = - starknet.block_context.block_info().gas_prices.eth_l1_data_gas_price; + starknet.block_context.block_info().gas_prices.l1_gas_price(&FeeType::Eth); let initial_data_gas_price_fri = - starknet.block_context.block_info().gas_prices.strk_l1_data_gas_price; + starknet.block_context.block_info().gas_prices.l1_data_gas_price(&FeeType::Strk); let initial_block_timestamp = starknet.block_context.block_info().block_timestamp; let initial_sequencer = starknet.block_context.block_info().sequencer_address; @@ -1569,19 +1589,29 @@ mod tests { ); assert_eq!( starknet.pending_block().header.block_header_without_hash.l1_gas_price.price_in_wei, - GasPrice(initial_gas_price_wei.get()) + initial_gas_price_wei.get() ); assert_eq!( starknet.pending_block().header.block_header_without_hash.l1_gas_price.price_in_fri, - GasPrice(initial_gas_price_fri.get()) + initial_gas_price_fri.get() ); assert_eq!( - starknet.pending_block().header.block_header_without_hash.l1_data_gas_price.price_in_wei, - GasPrice(initial_data_gas_price_wei.get()) + starknet + .pending_block() + .header + .block_header_without_hash + .l1_data_gas_price + .price_in_wei, + initial_data_gas_price_wei.get() ); assert_eq!( - starknet.pending_block().header.block_header_without_hash.l1_data_gas_price.price_in_fri, - GasPrice(initial_data_gas_price_fri.get()) + starknet + .pending_block() + .header + .block_header_without_hash + .l1_data_gas_price + .price_in_fri, + initial_data_gas_price_fri.get() ); assert_eq!( starknet.pending_block().header.block_header_without_hash.sequencer.0, @@ -1874,13 +1904,15 @@ mod tests { .blocks .pending_block .set_timestamp(BlockTimestamp(Starknet::get_unix_timestamp_as_seconds())); - let pending_block_timestamp = starknet.pending_block().header.block_header_without_hash.timestamp; + let pending_block_timestamp = + starknet.pending_block().header.block_header_without_hash.timestamp; let sleep_duration_secs = 5; thread::sleep(Duration::from_secs(sleep_duration_secs)); starknet.generate_new_block_and_state().unwrap(); - let block_timestamp = starknet.get_latest_block().unwrap().header.block_header_without_hash.timestamp; + let block_timestamp = + starknet.get_latest_block().unwrap().header.block_header_without_hash.timestamp; // check if the pending_block_timestamp is less than the block_timestamp, // by number of sleep seconds because the timeline of events is this: // ----(pending block timestamp)----(sleep)----(new block timestamp) diff --git a/crates/starknet-devnet-core/src/state/state_diff.rs b/crates/starknet-devnet-core/src/state/state_diff.rs index 104e7740c..0a88f0ca1 100644 --- a/crates/starknet-devnet-core/src/state/state_diff.rs +++ b/crates/starknet-devnet-core/src/state/state_diff.rs @@ -52,13 +52,15 @@ impl StateDiff { // extract differences of class_hash -> compile_class_hash mapping let class_hash_to_compiled_class_hash = diff - .state_maps.compiled_class_hashes + .state_maps + .compiled_class_hashes .into_iter() .map(|(class_hash, compiled_class_hash)| (class_hash.0, compiled_class_hash.0)) .collect(); let address_to_class_hash = diff - .state_maps.class_hashes + .state_maps + .class_hashes .iter() .map(|(address, class_hash)| { let contract_address = ContractAddress::from(*address); @@ -80,7 +82,8 @@ impl StateDiff { } let address_to_nonce = diff - .state_maps.nonces + .state_maps + .nonces .iter() .map(|(address, nonce)| { let contract_address = ContractAddress::from(*address); @@ -186,23 +189,23 @@ mod tests { use starknet_types::contract_class::ContractClass; use starknet_types::felt::felt_from_prefixed_hex; use starknet_types::rpc::state::{Balance, ReplacedClasses}; - use starknet_types::rpc::transactions::BroadcastedInvokeTransaction; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; use starknet_types::rpc::transactions::broadcasted_invoke_transaction_v1::BroadcastedInvokeTransactionV1; + use starknet_types::rpc::transactions::BroadcastedInvokeTransaction; use starknet_types::traits::HashProducer; use super::StateDiff; use crate::account::Account; use crate::constants::{ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS}; - use crate::starknet::Starknet; use crate::starknet::starknet_config::StarknetConfig; + use crate::starknet::Starknet; use crate::state::{CustomState, StarknetState}; use crate::traits::Deployed; use crate::utils::calculate_casm_hash; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; use crate::utils::test_utils::{ - DUMMY_CAIRO_1_COMPILED_CLASS_HASH, cairo_0_account_without_validations, - dummy_cairo_1_contract_class, dummy_contract_address, dummy_felt, + cairo_0_account_without_validations, dummy_cairo_1_contract_class, dummy_contract_address, + dummy_felt, DUMMY_CAIRO_1_COMPILED_CLASS_HASH, }; #[test] @@ -383,10 +386,13 @@ mod tests { let state_update = starknet.block_state_update(&BlockId::Tag(BlockTag::Latest)).unwrap(); - assert_eq!(state_update.get_state_diff().replaced_classes, vec![ReplacedClasses { - contract_address: replaceable_contract_address, - class_hash: new_class_hash - }]); + assert_eq!( + state_update.get_state_diff().replaced_classes, + vec![ReplacedClasses { + contract_address: replaceable_contract_address, + class_hash: new_class_hash + }] + ); } fn setup() -> StarknetState { diff --git a/crates/starknet-devnet-core/src/transactions.rs b/crates/starknet-devnet-core/src/transactions.rs index a26220b19..ccfbcb133 100644 --- a/crates/starknet-devnet-core/src/transactions.rs +++ b/crates/starknet-devnet-core/src/transactions.rs @@ -76,7 +76,8 @@ impl StarknetTransaction { reason: execution_info .revert_error .as_ref() - .unwrap_or(&ErrorStack::default().into()).to_string(), + .unwrap_or(&ErrorStack::default().into()) + .to_string(), }, false => ExecutionResult::Succeeded, }, diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index 2e0be1528..a94463941 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -2,14 +2,14 @@ use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount}; use blockifier::versioned_constants::VersionedConstants; use serde_json::Value; use starknet_api::block::StarknetVersion; -use starknet_rs_core::types::Felt; use starknet_rs_core::types::contract::CompiledClass; +use starknet_rs_core::types::Felt; use starknet_types::patricia_key::{PatriciaKey, StorageKey}; use crate::error::{DevnetResult, Error}; pub mod random_number_generator { - use rand::{Rng, SeedableRng, thread_rng}; + use rand::{thread_rng, Rng, SeedableRng}; use rand_mt::Mt64; pub fn generate_u32_random_number() -> u32 { @@ -215,6 +215,7 @@ pub(crate) mod test_utils { #[cfg(any(test, feature = "test_utils"))] #[allow(clippy::unwrap_used)] pub mod exported_test_utils { + use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_types::contract_class::Cairo0ContractClass; pub fn dummy_cairo_l1l2_contract() -> Cairo0ContractClass { @@ -224,6 +225,13 @@ pub mod exported_test_utils { serde_json::from_str(&json_str).unwrap() } + pub fn dummy_cairo_l1l2_contract_codegen() -> LegacyContractClass { + let json_str = + std::fs::read_to_string("../../contracts/test_artifacts/cairo0/l1l2.json").unwrap(); + + serde_json::from_str(&json_str).unwrap() + } + pub fn dummy_cairo_0_contract_class() -> Cairo0ContractClass { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/simple_contract.json") @@ -231,6 +239,13 @@ pub mod exported_test_utils { serde_json::from_str(&json_str).unwrap() } + + pub fn dummy_cairo_0_contract_class_codegen() -> LegacyContractClass { + let json_str = + std::fs::read_to_string("../../contracts/test_artifacts/cairo0/simple_contract.json") + .unwrap(); + serde_json::from_str(&json_str).unwrap() + } } #[cfg(test)] @@ -252,10 +267,10 @@ mod tests { #[test] fn correct_complex_storage_var_address_generated() { - let expected_storage_var_address = - starknet_api::abi::abi_utils::get_storage_var_address("complex", &[ - test_utils::dummy_felt(), - ]); + let expected_storage_var_address = starknet_api::abi::abi_utils::get_storage_var_address( + "complex", + &[test_utils::dummy_felt()], + ); let generated_storage_var_address = get_storage_var_address("complex", &[test_utils::dummy_felt()]).unwrap(); diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 7b52aa555..e7521ad29 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -10,7 +10,8 @@ use serde::{Serialize, Serializer}; use starknet_api::contract_class::{ClassInfo, SierraVersion}; use starknet_rs_core::types::contract::{SierraClass, SierraClassDebugInfo}; use starknet_rs_core::types::{ - ContractClass as CodegenContractClass, FlattenedSierraClass as CodegenSierraContractClass, + CompressedLegacyContractClass, ContractClass as CodegenContractClass, + FlattenedSierraClass as CodegenSierraContractClass, }; use starknet_types_core::felt::Felt; @@ -171,6 +172,24 @@ impl HashProducer for ContractClass { } } +impl TryInto for ContractClass { + type Error = Error; + fn try_into(self) -> Result { + match self { + ContractClass::Cairo0(Cairo0ContractClass::Rpc(contract_class)) => { + let class_json = + serde_json::to_string(&contract_class).map_err(JsonError::SerdeJsonError)?; + let codegen: CompressedLegacyContractClass = + serde_json::from_str(&class_json).map_err(JsonError::SerdeJsonError)?; + Ok(CodegenContractClass::Legacy(codegen)) + } + ContractClass::Cairo1(contract_class) => { + Ok(CodegenContractClass::Sierra(convert_sierra_to_codegen(&contract_class)?)) + } + } + } +} + impl TryInto for CodegenContractClass { type Error = Error; fn try_into(self) -> Result { @@ -194,21 +213,22 @@ impl TryFrom for RunnableCompiledClass { fn try_from(value: ContractClass) -> Result { Ok(match value { - ContractClass::Cairo0(Cairo0ContractClass::Rpc(class)) => RunnableCompiledClass::V0( - class - .try_into() - .map_err(|e: ProgramError| ConversionError::InvalidInternalStructure(e.to_string()))?, - ), + ContractClass::Cairo0(Cairo0ContractClass::Rpc(class)) => { + RunnableCompiledClass::V0(class.try_into().map_err(|e: ProgramError| { + ConversionError::InvalidInternalStructure(e.to_string()) + })?) + } ContractClass::Cairo1(class) => { // TODO extract this as common logic let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; let casm_json = usc::compile_contract(json_value) .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; - + let casm = serde_json::from_value::(casm_json) .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; - - let versioned_casm = (casm, SierraVersion::from_str(&class.contract_class_version)?); + + let versioned_casm = + (casm, SierraVersion::from_str(&class.contract_class_version)?); let compiled = versioned_casm.try_into().map_err(|e: ProgramError| { Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) })?; @@ -315,7 +335,7 @@ mod tests { use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use serde_json::Deserializer; - use crate::contract_class::{ContractClass, convert_sierra_to_codegen}; + use crate::contract_class::{convert_sierra_to_codegen, ContractClass}; use crate::felt::felt_from_prefixed_hex; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; use crate::traits::HashProducer; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index 09c512acd..10cb8ba99 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -1,7 +1,6 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use starknet_rs_core::types::Felt; - use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; +use starknet_rs_core::types::Felt; use crate::error::{DevnetResult, Error, JsonError}; use crate::traits::HashProducer; diff --git a/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs b/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs index bb8a00191..3100e8f16 100644 --- a/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs +++ b/crates/starknet-devnet-types/src/rpc/estimate_message_fee.rs @@ -1,8 +1,8 @@ use std::sync::Arc; -use starknet_api::executable_transaction::L1HandlerTransaction; use serde::Serialize; use starknet_api::core::EntryPointSelector; +use starknet_api::executable_transaction::L1HandlerTransaction; use starknet_api::transaction::fields::Calldata; use starknet_rs_core::types::requests::EstimateMessageFeeRequest; use starknet_rs_core::types::{ diff --git a/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs b/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs index 09eecd0b7..c725c2cb9 100644 --- a/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs +++ b/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs @@ -205,7 +205,8 @@ impl ComputationResources { execution_info .receipt .resources - .computation.vm_resources + .computation + .vm_resources .builtin_instance_counter .get(resource_name) .cloned() diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index c63645817..aaeaf3002 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -10,10 +10,8 @@ use declare_transaction_v2::DeclareTransactionV2; use deploy_transaction::DeployTransaction; use invoke_transaction_v1::InvokeTransactionV1; use serde::{Deserialize, Deserializer, Serialize, Serializer}; -use starknet_api::block::BlockNumber; -use starknet_api::block::GasPrice; -use starknet_api::contract_class::ClassInfo; -use starknet_api::contract_class::EntryPointType; +use starknet_api::block::{BlockNumber, GasPrice}; +use starknet_api::contract_class::{ClassInfo, EntryPointType}; use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::transaction::fields::{Fee, Resource, Tip}; @@ -43,7 +41,7 @@ use super::transaction_receipt::{ }; use crate::constants::{PREFIX_DEPLOY_ACCOUNT, PREFIX_INVOKE, QUERY_VERSION_OFFSET}; use crate::contract_address::ContractAddress; -use crate::contract_class::{ContractClass, compute_sierra_class_hash}; +use crate::contract_class::{compute_sierra_class_hash, ContractClass}; use crate::emitted_event::{Event, OrderedEvent}; use crate::error::{ConversionError, DevnetResult, Error, JsonError}; use crate::felt::{ @@ -487,7 +485,11 @@ pub enum BroadcastedTransaction { } impl BroadcastedTransaction { - pub fn to_blockifier_account_transaction(&self, chain_id: &Felt, execution_flags: ExecutionFlags)-> DevnetResult { + pub fn to_blockifier_account_transaction( + &self, + chain_id: &Felt, + execution_flags: ExecutionFlags, + ) -> DevnetResult { let sn_api_tx = self.to_sn_api_account_transaction(chain_id)?; Ok(blockifier::transaction::account_transaction::AccountTransaction { tx: sn_api_tx, diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index b161c1803..79fccea19 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs @@ -73,8 +73,8 @@ mod tests { use crate::contract_address::ContractAddress; use crate::contract_class::Cairo0ContractClass; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::BroadcastedDeclareTransaction; use crate::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; + use crate::rpc::transactions::BroadcastedDeclareTransaction; use crate::traits::HashProducer; #[derive(Deserialize)] diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs index 9faae59fa..e1773b97b 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v2.rs @@ -52,8 +52,8 @@ mod tests { use crate::contract_address::ContractAddress; use crate::contract_class::ContractClass; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::BroadcastedDeclareTransaction; use crate::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; + use crate::rpc::transactions::BroadcastedDeclareTransaction; use crate::utils::test_utils::CAIRO_1_EVENTS_CONTRACT_PATH; #[derive(Deserialize)] diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs index b6e80d4fa..31d3bd486 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs @@ -70,8 +70,7 @@ mod tests { use crate::rpc::transactions::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; use crate::rpc::transactions::BroadcastedTransactionCommonV3; use crate::utils::test_utils::{ - convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode, - CAIRO_1_EVENTS_CONTRACT_PATH, + convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode, CAIRO_1_EVENTS_CONTRACT_PATH, }; #[derive(Deserialize)] diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs index c6f850364..89e4c0294 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v1.rs @@ -49,8 +49,8 @@ mod tests { use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::BroadcastedDeployAccountTransaction; use crate::rpc::transactions::broadcasted_deploy_account_transaction_v1::BroadcastedDeployAccountTransactionV1; + use crate::rpc::transactions::BroadcastedDeployAccountTransaction; #[derive(Deserialize)] struct FeederGatewayDeployAccountTransaction { diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs index d7edc2888..865ea046c 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs @@ -73,9 +73,7 @@ mod tests { use crate::chain_id::ChainId; use crate::rpc::transactions::broadcasted_deploy_account_transaction_v3::BroadcastedDeployAccountTransactionV3; use crate::rpc::transactions::BroadcastedTransactionCommonV3; - use crate::utils::test_utils::{ - convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode, - }; + use crate::utils::test_utils::{convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode}; #[derive(Deserialize)] struct FeederGatewayDeployAccountTransactionV3 { diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs index cffbb9aad..96dc2320a 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs @@ -45,8 +45,8 @@ mod tests { use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; use crate::felt::try_felt_to_num; - use crate::rpc::transactions::BroadcastedInvokeTransaction; use crate::rpc::transactions::broadcasted_invoke_transaction_v1::BroadcastedInvokeTransactionV1; + use crate::rpc::transactions::BroadcastedInvokeTransaction; #[derive(Deserialize)] struct FeederGatewayInvokeTransaction { diff --git a/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs b/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs index fdcc11b84..862e87dba 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/l1_handler_transaction.rs @@ -6,9 +6,9 @@ use starknet_api::core::{ Nonce as ApiNonce, }; use starknet_api::executable_transaction::L1HandlerTransaction as ApiL1HandlerTransaction; +use starknet_api::transaction::fields::{Calldata as ApiCalldata, Fee as ApiFee}; use starknet_api::transaction::{ TransactionHash as ApiTransactionHash, TransactionVersion as ApiTransactionVersion, - fields::{Calldata as ApiCalldata, Fee as ApiFee}, }; use starknet_rs_core::crypto::compute_hash_on_elements; use starknet_rs_core::types::Felt; @@ -17,7 +17,7 @@ use super::serialize_paid_fee_on_l1; use crate::constants::PREFIX_L1_HANDLER; use crate::contract_address::ContractAddress; use crate::error::{ConversionError, DevnetResult, Error}; -use crate::felt::{Calldata, EntryPointSelector, Nonce, TransactionVersion, try_felt_to_num}; +use crate::felt::{try_felt_to_num, Calldata, EntryPointSelector, Nonce, TransactionVersion}; use crate::rpc::messaging::MessageToL2; #[derive(Debug, Clone, Default, Serialize, Eq, PartialEq)] diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index 44440b900..5dab4679f 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -1,8 +1,7 @@ #[cfg(test)] pub(crate) mod test_utils { - use starknet_api::{ - data_availability::DataAvailabilityMode, transaction::fields::ResourceBounds, - }; + use starknet_api::data_availability::DataAvailabilityMode; + use starknet_api::transaction::fields::ResourceBounds; use crate::rpc::transactions::ResourceBoundsWrapper; diff --git a/tests/integration/test_account_selection.rs b/tests/integration/test_account_selection.rs index bc02733c1..f6a399679 100644 --- a/tests/integration/test_account_selection.rs +++ b/tests/integration/test_account_selection.rs @@ -1,10 +1,9 @@ use std::sync::Arc; use serde_json::json; -use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class; +use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class_codegen; use starknet_rs_accounts::{Account, ExecutionEncoding, SingleOwnerAccount}; use starknet_rs_contract::ContractFactory; -use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_rs_core::types::{BlockId, BlockTag, Call, Felt, FunctionCall}; use starknet_rs_core::utils::{get_selector_from_name, get_udc_deployed_address, UdcUniqueness}; use starknet_rs_providers::Provider; @@ -139,14 +138,11 @@ async fn can_declare_deploy_invoke_cairo0_using_account( )); // get class - let contract_json = dummy_cairo_0_contract_class(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); - let class_hash = contract_artifact.class_hash().unwrap(); + let contract_class = Arc::new(dummy_cairo_0_contract_class_codegen()); + let class_hash = contract_class.class_hash().unwrap(); // declare class - let declaration_result = - account.declare_legacy(contract_artifact.clone()).send().await.unwrap(); + let declaration_result = account.declare_legacy(contract_class).send().await.unwrap(); assert_eq!(declaration_result.class_hash, class_hash); // deploy instance of class diff --git a/tests/integration/test_estimate_fee.rs b/tests/integration/test_estimate_fee.rs index eac7c7a46..9fd850abb 100644 --- a/tests/integration/test_estimate_fee.rs +++ b/tests/integration/test_estimate_fee.rs @@ -1,13 +1,12 @@ use std::sync::Arc; use server::test_utils::assert_contains; -use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class; +use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class_codegen; use starknet_rs_accounts::{ Account, AccountError, AccountFactory, AccountFactoryError, ConnectedAccount, ExecutionEncoder, ExecutionEncoding, OpenZeppelinAccountFactory, SingleOwnerAccount, }; use starknet_rs_contract::ContractFactory; -use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_rs_core::types::{ BlockId, BlockTag, BroadcastedDeclareTransactionV1, BroadcastedDeclareTransactionV3, BroadcastedInvokeTransaction, BroadcastedInvokeTransactionV1, BroadcastedInvokeTransactionV3, @@ -144,8 +143,7 @@ async fn estimate_fee_of_declare_v1() { let (signer, account_address) = devnet.get_first_predeployed_account().await; // get class - let contract_artifact = dummy_cairo_0_contract_class(); - let contract_artifact = Arc::new(serde_json::from_value(contract_artifact.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_0_contract_class_codegen()); // declare class let account = SingleOwnerAccount::new( @@ -267,14 +265,12 @@ async fn estimate_fee_of_invoke() { )); // get class - let contract_json = dummy_cairo_0_contract_class(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_0_contract_class_codegen()); let class_hash = contract_artifact.class_hash().unwrap(); // declare class let declaration_result = account - .declare_legacy(contract_artifact.clone()) + .declare_legacy(contract_artifact) .nonce(Felt::ZERO) .max_fee(Felt::from(1e18 as u128)) .send() @@ -488,9 +484,7 @@ async fn estimate_fee_of_multiple_txs() { account.set_block_id(BlockId::Tag(BlockTag::Latest)); // get class - let contract_json = dummy_cairo_0_contract_class(); - let contract_class: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_class = Arc::new(dummy_cairo_0_contract_class_codegen()); let class_hash = contract_class.class_hash().unwrap(); let prepared_legacy_declaration = account diff --git a/tests/integration/test_estimate_message_fee.rs b/tests/integration/test_estimate_message_fee.rs index 33fb67629..9032ea197 100644 --- a/tests/integration/test_estimate_message_fee.rs +++ b/tests/integration/test_estimate_message_fee.rs @@ -1,9 +1,8 @@ use std::sync::Arc; -use starknet_core::utils::exported_test_utils::dummy_cairo_l1l2_contract; +use starknet_core::utils::exported_test_utils::dummy_cairo_l1l2_contract_codegen; use starknet_rs_accounts::{Account, ExecutionEncoding, SingleOwnerAccount}; use starknet_rs_contract::ContractFactory; -use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_rs_core::types::{BlockId, BlockTag, EthAddress, Felt, MsgFromL1, StarknetError}; use starknet_rs_core::utils::{get_udc_deployed_address, UdcUniqueness}; use starknet_rs_providers::{Provider, ProviderError}; @@ -26,14 +25,12 @@ async fn estimate_message_fee() { )); // get class - let contract_json = dummy_cairo_l1l2_contract(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_l1l2_contract_codegen()); let class_hash = contract_artifact.class_hash().unwrap(); // declare class account - .declare_legacy(contract_artifact.clone()) + .declare_legacy(contract_artifact) .nonce(Felt::ZERO) .max_fee(Felt::from(1e18 as u128)) .send() diff --git a/tests/integration/test_fork.rs b/tests/integration/test_fork.rs index 1b1d25e71..a3d8adca2 100644 --- a/tests/integration/test_fork.rs +++ b/tests/integration/test_fork.rs @@ -176,7 +176,7 @@ async fn test_getting_cairo0_class_from_origin_and_fork() { .unwrap(); // assert_eq!(retrieved_class, ContractClass::Legacy(contract_class.compress().unwrap())); - // For now, successfully unwrapping the retrieved class serves as proof of correctness. + // TODO For now, successfully unwrapping the retrieved class serves as proof of correctness. // Currently asserting cairo0 artifacts is failing; related: https://github.com/0xSpaceShard/starknet-devnet-rs/pull/380 } diff --git a/tests/integration/test_restart.rs b/tests/integration/test_restart.rs index 0639bf0bb..198f0896f 100644 --- a/tests/integration/test_restart.rs +++ b/tests/integration/test_restart.rs @@ -1,11 +1,10 @@ use std::path::Path; use std::sync::Arc; -use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class; +use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class_codegen; use starknet_rs_accounts::{ Account, AccountFactory, ExecutionEncoding, OpenZeppelinAccountFactory, SingleOwnerAccount, }; -use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_rs_core::types::{BlockId, BlockTag, Felt, StarknetError}; use starknet_rs_core::utils::get_storage_var_address; use starknet_rs_providers::{Provider, ProviderError}; @@ -134,9 +133,7 @@ async fn assert_gas_price_unaffected_by_restart() { )); // prepare class for estimation of declaration - let contract_json = dummy_cairo_0_contract_class(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_0_contract_class_codegen()); // check gas price via fee estimation let estimate_before = diff --git a/tests/integration/test_simulate_transactions.rs b/tests/integration/test_simulate_transactions.rs index 43a249642..e09e02616 100644 --- a/tests/integration/test_simulate_transactions.rs +++ b/tests/integration/test_simulate_transactions.rs @@ -3,13 +3,12 @@ use std::{u128, u64}; use serde_json::json; use server::test_utils::assert_contains; -use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class; +use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class_codegen; use starknet_rs_accounts::{ Account, AccountError, AccountFactory, ConnectedAccount, ExecutionEncoder, ExecutionEncoding, OpenZeppelinAccountFactory, SingleOwnerAccount, }; use starknet_rs_contract::ContractFactory; -use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_rs_core::types::{ BlockId, BlockTag, BroadcastedDeclareTransaction, BroadcastedDeclareTransactionV3, BroadcastedDeployAccountTransaction, BroadcastedDeployAccountTransactionV3, @@ -53,9 +52,7 @@ async fn simulate_declare_v1() { ExecutionEncoding::New, ); - let contract_json = dummy_cairo_0_contract_class(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_0_contract_class_codegen()); let max_fee = Felt::ZERO; // TODO try 1e18 as u128 instead let nonce = Felt::ZERO; @@ -297,14 +294,11 @@ async fn simulate_invoke_v1() { )); // get class - let contract_json = dummy_cairo_0_contract_class(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_0_contract_class_codegen()); let class_hash = contract_artifact.class_hash().unwrap(); // declare class - let declaration_result = - account.declare_legacy(contract_artifact.clone()).send().await.unwrap(); + let declaration_result = account.declare_legacy(contract_artifact).send().await.unwrap(); assert_eq!(declaration_result.class_hash, class_hash); // deploy instance of class diff --git a/tests/integration/test_transaction_handling.rs b/tests/integration/test_transaction_handling.rs index 6924b8950..1134f3373 100644 --- a/tests/integration/test_transaction_handling.rs +++ b/tests/integration/test_transaction_handling.rs @@ -1,9 +1,8 @@ use std::sync::Arc; use server::test_utils::assert_contains; -use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class; +use starknet_core::utils::exported_test_utils::dummy_cairo_0_contract_class_codegen; use starknet_rs_accounts::{Account, AccountError, ExecutionEncoding, SingleOwnerAccount}; -use starknet_rs_core::types::contract::legacy::LegacyContractClass; use starknet_rs_core::types::{Felt, StarknetError}; use starknet_rs_providers::ProviderError; @@ -27,16 +26,11 @@ async fn test_failed_validation_with_expected_message() { )); // get class - let contract_json = dummy_cairo_0_contract_class(); - let contract_artifact: Arc = - Arc::new(serde_json::from_value(contract_json.inner).unwrap()); + let contract_artifact = Arc::new(dummy_cairo_0_contract_class_codegen()); // declare class - let declaration_result = account - .declare_legacy(contract_artifact.clone()) - .max_fee(Felt::from(1e18 as u128)) - .send() - .await; + let declaration_result = + account.declare_legacy(contract_artifact).max_fee(Felt::from(1e18 as u128)).send().await; match declaration_result { Err(AccountError::Provider(ProviderError::StarknetError( From 09f9009efc6bd937cba90be8cf62fb895c6f6e0c Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 31 Jan 2025 17:39:27 +0100 Subject: [PATCH 05/41] Use old custom implementation for cairo0 hash (runnable) [skip ci] --- .../src/rpc/contract_class/deprecated/mod.rs | 147 ++++++++++++++++- crates/starknet-devnet-types/src/utils.rs | 153 +++++++++++++++++- 2 files changed, 294 insertions(+), 6 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index 10cb8ba99..f82a7d98e 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -1,9 +1,17 @@ -use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use std::collections::HashMap; + +use serde::{Deserialize, Deserializer, Serialize}; +use serde_json::{Serializer as JsonSerializer, Value, json}; +use starknet_api::contract_class::EntryPointType; use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; +use starknet_api::deprecated_contract_class::EntryPointV0; use starknet_rs_core::types::Felt; +use starknet_types_core::hash::{Pedersen, StarkHash}; -use crate::error::{DevnetResult, Error, JsonError}; +use crate::error::{ConversionError, DevnetResult, Error, JsonError}; +use crate::felt::felt_from_prefixed_hex; use crate::traits::HashProducer; +use crate::utils::StarknetFormatter; #[derive(Debug, Clone, Eq, PartialEq)] pub enum Cairo0ContractClass { @@ -19,7 +27,7 @@ impl Cairo0ContractClass { impl Serialize for Cairo0ContractClass { fn serialize(&self, serializer: S) -> Result where - S: Serializer, + S: serde::Serializer, { match self { Cairo0ContractClass::Rpc(contract) => contract.serialize(serializer), @@ -42,11 +50,142 @@ impl From for Cairo0ContractClass { } } +/// Computes the hinted class hash of the contract class. +/// The parameter is a JSON object representing the contract class. +/// Pythonic hinted class hash computation is based on a JSON artifact produced by the +/// cairo-lang compiler. The JSON object contains his keys in alphabetical order. But when +/// those keys are made of digits only, they are sorted in ascending order. For example keys +/// "1", "10", "2" are sorted as "1", "2", "10" and keys "b", "a", "c" are sorted as "a", "b", +/// "c". The resulting object is being serialized to a string and then hashed. +/// In rust serde_json library when deserializing a JSON object, internally it uses a Map either +/// HashMap or IndexMap. Depending on the feature enabled if [preserver_order] is not enabled +/// HashMap will be used. In HashMap the keys order of insertion is not preserved and they +/// are sorted alphabetically, which doesn't work for our case, because the contract artifact +/// contains keys under the "hints" property that are only numbers. So we use IndexMap to +/// preserve order of the keys, but its disadvantage is removing entries from the json object, +/// because it uses swap_remove method on IndexMap, which doesn't preserve order. +/// So we traverse the JSON object and remove all entries with key - attributes or +/// accessible_scopes if they are empty arrays. +fn compute_hinted_class_hash(contract_class: &Value) -> crate::error::DevnetResult { + let mut abi_program_json = json!({ + "abi": contract_class.get("abi").unwrap_or(&Value::Null), + "program": contract_class.get("program").unwrap_or(&Value::Null) + }); + let program_json = abi_program_json + .get_mut("program") + .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; + + let debug_info_json = program_json.get_mut("debug_info"); + if debug_info_json.is_some() { + program_json + .as_object_mut() + .ok_or(JsonError::Custom { msg: "expected object".to_string() })? + .insert("debug_info".to_string(), serde_json::Value::Null); + } + + // Traverse the JSON and remove all entries with key attributes and accessible_scopes + // if they are empty arrays. + let modified_abi_program_json = crate::utils::traverse_and_exclude_recursively( + &abi_program_json, + &|key, value| match value.as_array() { + Some(array) if array.is_empty() => key == "attributes" || key == "accessible_scopes", + _ => false, + }, + ); + + let mut buffer = Vec::with_capacity(128); + let mut serializer = JsonSerializer::with_formatter(&mut buffer, StarknetFormatter); + modified_abi_program_json.serialize(&mut serializer).map_err(JsonError::SerdeJsonError)?; + + Ok(starknet_rs_core::utils::starknet_keccak(&buffer)) +} + +fn compute_cairo_0_contract_class_hash(json_class: &Value) -> crate::error::DevnetResult { + let mut hashes = vec![Felt::ZERO]; + + let entry_points_by_type: HashMap> = serde_json::from_value( + json_class + .get("entry_points_by_type") + .ok_or(JsonError::Custom { msg: "missing entry_points_by_type entry".to_string() })? + .clone(), + ) + .map_err(JsonError::SerdeJsonError)?; + + let entry_points_hash_by_type = |entry_point_type: EntryPointType| -> DevnetResult { + let felts: Vec = entry_points_by_type + .get(&entry_point_type) + .ok_or(ConversionError::InvalidInternalStructure( + "Missing entry point type".to_string(), + ))? + .iter() + .flat_map(|entry_point| { + let selector = entry_point.selector.0; + let offset = Felt::from(entry_point.offset.0 as u128); + + vec![selector, offset] + }) + .collect(); + + Ok(Pedersen::hash_array(&felts)) + }; + + hashes.push(entry_points_hash_by_type(EntryPointType::External)?); + hashes.push(entry_points_hash_by_type(EntryPointType::L1Handler)?); + hashes.push(entry_points_hash_by_type(EntryPointType::Constructor)?); + + let program_json = json_class + .get("program") + .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; + + let builtins_encoded_as_felts = program_json + .get("builtins") + .and_then(|v| v.as_array()) + .unwrap_or(&vec![]) + .iter() + .map(|el| { + el.as_str() + .map(|s| { + let hex_str = s + .as_bytes() + .iter() + .fold(String::from("0x"), |acc, &b| format!("{acc}{:02x}", b)); + felt_from_prefixed_hex(&hex_str) + }) + .ok_or(JsonError::Custom { msg: "expected string".into() })? + }) + .collect::>>()?; + + hashes.push(Pedersen::hash_array(&builtins_encoded_as_felts)); + + hashes.push(compute_hinted_class_hash(json_class)?); + + let program_data_felts = program_json + .get("data") + .unwrap_or(&serde_json::Value::Null) + .as_array() + .unwrap_or(&Vec::::new()) + .clone() + .into_iter() + .map(|v| { + felt_from_prefixed_hex( + v.as_str().ok_or(JsonError::Custom { msg: "expected string".into() })?, + ) + }) + .collect::>>()?; + + hashes.push(Pedersen::hash_array(&program_data_felts)); + + Ok(Pedersen::hash_array(&hashes)) +} + impl HashProducer for Cairo0ContractClass { type Error = Error; fn generate_hash(&self) -> DevnetResult { match self { - Cairo0ContractClass::Rpc(_) => todo!("copy from blockifier"), + Cairo0ContractClass::Rpc(class) => { + let class_json = serde_json::to_value(class).map_err(JsonError::SerdeJsonError)?; + compute_cairo_0_contract_class_hash(&class_json) + } } } } diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index 5dab4679f..3ef3e62f8 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -1,7 +1,91 @@ +use std::io; + +use serde_json::ser::Formatter; +use serde_json::{Map, Value}; + +/// The preserve_order feature enabled in the serde_json crate +/// removing a key from the object changes the order of the keys +/// When serde_json is not being used with the preserver order feature +/// deserializing to a serde_json::Value changes the order of the keys +/// +/// go through the object by visiting every key and value recursively, +/// and not including them into a new json obj if the condition is met +/// Empty objects are not included +/// Exclude_condition is a function that takes a key and a value and returns a bool +/// If the exclude_condition evaluates to true, the key and value are not included in the new object +pub fn traverse_and_exclude_recursively( + value: &Value, + exclude_condition: &F, +) -> serde_json::Value +where + F: Fn(&String, &Value) -> bool, +{ + match value { + Value::Object(object) => { + let mut new_object = Map::new(); + + for (key, value) in object { + if exclude_condition(key, value) { + continue; + } + let inner_val = traverse_and_exclude_recursively(value, exclude_condition); + new_object.insert(key.to_string(), inner_val); + } + + Value::Object(new_object.clone()) + } + // arrays are visited like the objects - recursively + Value::Array(array) => { + let mut inner_arr = Vec::::new(); + + for value in array { + let inner_val = traverse_and_exclude_recursively(value, exclude_condition); + + match inner_val.as_object() { + Some(inner_obj) if inner_obj.is_empty() => {} + _ => inner_arr.push(inner_val), + } + } + + Value::Array(inner_arr) + } + // handle non-object, non-array values + _ => value.clone(), + } +} + +/// JSON Formatter that serializes an object with the desired spaces +/// So the serialized object can match the object structure when compiling cairo program. +/// When serializing with the default formatter, the JSON string is without any spaces between +/// elements. Example here . +pub struct StarknetFormatter; + +impl Formatter for StarknetFormatter { + fn begin_object_value(&mut self, writer: &mut W) -> io::Result<()> + where + W: ?Sized + io::Write, + { + writer.write_all(b": ") + } + + fn begin_object_key(&mut self, writer: &mut W, first: bool) -> io::Result<()> + where + W: ?Sized + io::Write, + { + if first { Ok(()) } else { writer.write_all(b", ") } + } + + fn begin_array_value(&mut self, writer: &mut W, first: bool) -> io::Result<()> + where + W: ?Sized + io::Write, + { + if first { Ok(()) } else { writer.write_all(b", ") } + } +} + #[cfg(test)] pub(crate) mod test_utils { - use starknet_api::data_availability::DataAvailabilityMode; - use starknet_api::transaction::fields::ResourceBounds; + use starknet_api::{data_availability::DataAvailabilityMode, transaction::fields::ResourceBounds}; use crate::rpc::transactions::ResourceBoundsWrapper; @@ -39,3 +123,68 @@ pub(crate) mod test_utils { ) } } +#[cfg(test)] +mod tests { + use serde_json::Value; + + #[test] + fn serde_remove_elements_from_json() { + let input = r#" + { + "name": "John Doe", + "isStudent": true, + "age":30, + "address": { + "street": "Vlvo", + "city": "Anytown", + "state": "Any" + }, + "should_be_removed": [], + "scores": + [ + { + "street": "AAA", + "age": 5, + "should_be_removed": [] + }, + { + "age": 5 + } + ], + "arr": [90, 85, 95] + } + "#; + let expected_output = r#" + { + "name": "John Doe", + "isStudent": true, + "age":30, + "address": { + "street": "Vlvo", + "city": "Anytown", + "state": "Any" + }, + "scores": + [ + { + "street": "AAA", + "age": 5 + }, + { + "age": 5 + } + ], + "arr": [90, 85, 95] + } + "#; + let value: Value = serde_json::from_str(input).unwrap(); + + let res = crate::utils::traverse_and_exclude_recursively(&value, &|key, val| { + return key == "should_be_removed" + && val.is_array() + && val.as_array().unwrap().is_empty(); + }); + + assert_eq!(res, serde_json::from_str::(expected_output).unwrap()); + } +} From 418d5ffb18184128b1af0d9a3ea1b5a498886e69 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 31 Jan 2025 18:25:28 +0100 Subject: [PATCH 06/41] Suppress or remove unused; use only L1 gas in resource bounds conersion; partial clippy [skip ci] --- crates/starknet-devnet-core/src/account.rs | 1 - .../src/starknet/add_declare_transaction.rs | 4 +- .../starknet/add_l1_handler_transaction.rs | 2 +- .../starknet-devnet-core/src/starknet/mod.rs | 1 + crates/starknet-devnet-core/src/state/mod.rs | 6 +-- .../src/state/state_diff.rs | 2 +- crates/starknet-devnet-core/src/traits.rs | 1 + crates/starknet-devnet-core/src/utils.rs | 3 +- .../src/api/json_rpc/mod.rs | 3 ++ .../src/rpc/contract_class.rs | 1 + .../src/rpc/contract_class/deprecated/mod.rs | 8 ++-- .../src/rpc/transaction_receipt.rs | 4 +- .../src/rpc/transactions.rs | 41 ++++--------------- .../broadcasted_declare_transaction_v1.rs | 2 +- .../broadcasted_declare_transaction_v3.rs | 1 + crates/starknet-devnet-types/src/utils.rs | 7 ++-- tests/integration/common/background_devnet.rs | 2 - 17 files changed, 36 insertions(+), 53 deletions(-) diff --git a/crates/starknet-devnet-core/src/account.rs b/crates/starknet-devnet-core/src/account.rs index ca6f20507..58ec9b8d1 100644 --- a/crates/starknet-devnet-core/src/account.rs +++ b/crates/starknet-devnet-core/src/account.rs @@ -1,5 +1,4 @@ use std::sync::Arc; -use std::u128; use blockifier::state::state_api::StateReader; use starknet_api::core::calculate_contract_address; diff --git a/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs index 5c862a46b..8599d320c 100644 --- a/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_declare_transaction.rs @@ -163,7 +163,7 @@ mod tests { Fee(10000), &Vec::new(), Felt::ZERO, - &contract_class.into(), + &contract_class, Felt::ONE, ))) } @@ -367,7 +367,7 @@ mod tests { Fee(0), &vec![], dummy_felt(), - &dummy_cairo_0_contract_class().into(), + &dummy_cairo_0_contract_class(), Felt::ONE, ); diff --git a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs index bf8267aa2..bd6073fd0 100644 --- a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs @@ -198,7 +198,7 @@ mod tests { account.deploy(&mut starknet.pending_state).unwrap(); // dummy contract - let dummy_contract: Cairo0ContractClass = dummy_cairo_l1l2_contract().into(); + let dummy_contract = dummy_cairo_l1l2_contract(); let withdraw_selector = get_selector_from_name("withdraw").unwrap(); let deposit_selector = get_selector_from_name("deposit").unwrap(); diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index b0634bb8e..d8dc8d73b 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -114,6 +114,7 @@ pub struct Starknet { impl Default for Starknet { fn default() -> Self { + #[allow(clippy::unwrap_used)] // TODO let default_gas_price = DEVNET_DEFAULT_GAS_PRICE.get().try_into().unwrap(); Self { block_context: Self::init_block_context( diff --git a/crates/starknet-devnet-core/src/state/mod.rs b/crates/starknet-devnet-core/src/state/mod.rs index 17125223f..4acdfd520 100644 --- a/crates/starknet-devnet-core/src/state/mod.rs +++ b/crates/starknet-devnet-core/src/state/mod.rs @@ -433,7 +433,7 @@ mod tests { use starknet_api::state::StorageKey; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; - use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; + use starknet_types::contract_class::ContractClass; use super::StarknetState; use crate::state::{BlockNumberOrPending, CustomState, CustomStateReader}; @@ -451,7 +451,7 @@ mod tests { let class_hash = dummy_felt(); let casm_hash = Some(dummy_felt()); - let contract_class = ContractClass::Cairo0(dummy_cairo_0_contract_class().into()); + let contract_class = ContractClass::Cairo0(dummy_cairo_0_contract_class()); state.declare_contract_class(class_hash, casm_hash, contract_class).unwrap(); assert!(state.is_contract_declared(dummy_felt())); @@ -501,7 +501,7 @@ mod tests { other => panic!("Invalid result: {other:?}"), } - let contract_class: Cairo0ContractClass = dummy_cairo_0_contract_class().into(); + let contract_class = dummy_cairo_0_contract_class(); state .declare_contract_class(class_hash.0, casm_hash, contract_class.clone().into()) .unwrap(); diff --git a/crates/starknet-devnet-core/src/state/state_diff.rs b/crates/starknet-devnet-core/src/state/state_diff.rs index 0a88f0ca1..7728aad2a 100644 --- a/crates/starknet-devnet-core/src/state/state_diff.rs +++ b/crates/starknet-devnet-core/src/state/state_diff.rs @@ -248,7 +248,7 @@ mod tests { fn correct_difference_in_cairo_0_declared_classes() { let mut state = setup(); let class_hash = starknet_api::core::ClassHash(Felt::ONE); - let contract_class = ContractClass::Cairo0(dummy_cairo_0_contract_class().into()); + let contract_class = ContractClass::Cairo0(dummy_cairo_0_contract_class()); // necessary to prevent blockifier's state subtraction panic state.get_compiled_class(class_hash).expect_err("Shouldn't yet be declared"); diff --git a/crates/starknet-devnet-core/src/traits.rs b/crates/starknet-devnet-core/src/traits.rs index 143e70dd2..4e2a6dd44 100644 --- a/crates/starknet-devnet-core/src/traits.rs +++ b/crates/starknet-devnet-core/src/traits.rs @@ -56,6 +56,7 @@ pub trait Accounted { /// # Arguments /// `state` - state of the devnet /// `token` - enum `FeeToken` to get balance in + #[allow(unused)] // TODO used only in tests? fn get_balance(&self, state: &mut impl StateReader, token: FeeToken) -> DevnetResult; } diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index a94463941..6283a28b4 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -41,6 +41,7 @@ pub(crate) fn get_storage_var_address( } pub(crate) fn get_versioned_constants() -> VersionedConstants { + #[allow(clippy::unwrap_used)] // TODO VersionedConstants::get(&StarknetVersion::V0_13_2).unwrap().clone() } @@ -139,7 +140,7 @@ pub(crate) mod test_utils { Fee(100), &vec![], dummy_felt(), - &contract_class.clone().into(), + &contract_class.clone(), Felt::ONE, ); let class_hash = contract_class.generate_hash().unwrap(); diff --git a/crates/starknet-devnet-server/src/api/json_rpc/mod.rs b/crates/starknet-devnet-server/src/api/json_rpc/mod.rs index abf4ec055..6deed6610 100644 --- a/crates/starknet-devnet-server/src/api/json_rpc/mod.rs +++ b/crates/starknet-devnet-server/src/api/json_rpc/mod.rs @@ -623,6 +623,7 @@ impl std::fmt::Display for JsonRpcRequest { #[derive(Serialize)] #[serde(untagged)] +#[allow(clippy::large_enum_variant)] pub enum JsonRpcResponse { Starknet(StarknetResponse), Devnet(DevnetResponse), @@ -644,6 +645,7 @@ impl From for JsonRpcResponse { #[derive(Serialize)] #[cfg_attr(test, derive(Deserialize))] #[serde(untagged)] +#[allow(clippy::large_enum_variant)] pub enum StarknetResponse { Block(Block), PendingBlock(PendingBlock), @@ -673,6 +675,7 @@ pub enum StarknetResponse { #[derive(Serialize)] #[serde(untagged)] +#[allow(clippy::large_enum_variant)] pub enum DevnetResponse { MessagingContractAddress(MessagingLoadAddress), FlushedMessages(FlushedMessages), diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index e7521ad29..3bb321c5d 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -24,6 +24,7 @@ pub use deprecated::Cairo0ContractClass; #[derive(Debug, Clone)] #[cfg_attr(feature = "testing", derive(Eq, PartialEq))] +#[allow(clippy::large_enum_variant)] pub enum ContractClass { Cairo0(Cairo0ContractClass), Cairo1(SierraContractClass), diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index f82a7d98e..c533931c6 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -1,10 +1,11 @@ use std::collections::HashMap; use serde::{Deserialize, Deserializer, Serialize}; -use serde_json::{Serializer as JsonSerializer, Value, json}; +use serde_json::{json, Serializer as JsonSerializer, Value}; use starknet_api::contract_class::EntryPointType; -use starknet_api::deprecated_contract_class::ContractClass as DeprecatedContractClass; -use starknet_api::deprecated_contract_class::EntryPointV0; +use starknet_api::deprecated_contract_class::{ + ContractClass as DeprecatedContractClass, EntryPointV0, +}; use starknet_rs_core::types::Felt; use starknet_types_core::hash::{Pedersen, StarkHash}; @@ -100,6 +101,7 @@ fn compute_hinted_class_hash(contract_class: &Value) -> crate::error::DevnetResu Ok(starknet_rs_core::utils::starknet_keccak(&buffer)) } +// TODO perhaps rely on an imported util? fn compute_cairo_0_contract_class_hash(json_class: &Value) -> crate::error::DevnetResult { let mut hashes = vec![Felt::ZERO]; diff --git a/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs b/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs index c725c2cb9..0d8f68a5a 100644 --- a/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs +++ b/crates/starknet-devnet-types/src/rpc/transaction_receipt.rs @@ -190,8 +190,8 @@ impl From<&blockifier::transaction::objects::TransactionExecutionInfo> for Execu Self { computation_resources, data_availability: DataAvailability { - l1_gas: execution_info.receipt.da_gas.l1_gas.0.into(), - l1_data_gas: execution_info.receipt.da_gas.l1_data_gas.0.into(), + l1_gas: execution_info.receipt.da_gas.l1_gas.0, + l1_data_gas: execution_info.receipt.da_gas.l1_data_gas.0, }, } } diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index aaeaf3002..95262b836 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -275,9 +275,10 @@ impl BroadcastedTransactionCommon { } } -fn felt_to_sn_api_chain_id(f: &Felt) -> starknet_api::core::ChainId { - // TODO - starknet_api::core::ChainId::Other(parse_cairo_short_string(f).unwrap()) +fn felt_to_sn_api_chain_id(f: &Felt) -> DevnetResult { + Ok(starknet_api::core::ChainId::Other( + parse_cairo_short_string(f).map_err(|e| ConversionError::OutOfRangeError(e.to_string()))?, + )) } /// Common fields for all transaction type of version 3 @@ -335,38 +336,13 @@ fn convert_resource_bounds_from_starknet_rs_to_starknet_api( impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ValidResourceBounds { fn from(value: &ResourceBoundsWrapper) -> Self { - starknet_api::transaction::fields::ValidResourceBounds::AllResources( - starknet_api::transaction::fields::AllResourceBounds { - l1_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( - value.inner.l1_gas.clone(), - ), - l2_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( - value.inner.l2_gas.clone(), - ), - l1_data_gas: todo!(), - }, + // TODO l1_data_gas? l2_gas? + starknet_api::transaction::fields::ValidResourceBounds::L1Gas( + convert_resource_bounds_from_starknet_rs_to_starknet_api(value.inner.l1_gas.clone()), ) } } -// TODO delete? - -// impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ResourceBounds { -// fn from(value: &ResourceBoundsWrapper) -> Self { - -// starknet_api::transaction::fields::ResourceBounds::from(BTreeMap::from([ -// (Resource::L1Gas, starknet_api::transaction::fields::ResourceBounds { -// max_amount: GasAmount(value.inner.l1_gas.max_amount), -// max_price_per_unit: GasPrice(value.inner.l1_gas.max_price_per_unit), -// }), -// (Resource::L2Gas, starknet_api::transaction::fields::ResourceBounds { -// max_amount: GasAmount(value.inner.l2_gas.max_amount), -// max_price_per_unit: GasPrice(value.inner.l2_gas.max_price_per_unit), -// }), -// ])) -// } -// } - impl BroadcastedTransactionCommonV3 { /// Checks if total accumulated fee of resource_bounds for l1 is equal to 0 or for l2 is not /// zero @@ -660,7 +636,7 @@ impl BroadcastedDeclareTransaction { Ok(starknet_api::executable_transaction::DeclareTransaction::create( sn_api_transaction, class_info, - &felt_to_sn_api_chain_id(chain_id), + &felt_to_sn_api_chain_id(chain_id)?, )?) } } @@ -1036,6 +1012,7 @@ pub struct Reversion { #[derive(Debug, Clone, Serialize)] #[cfg_attr(feature = "testing", derive(serde::Deserialize))] #[serde(untagged)] +#[allow(clippy::large_enum_variant)] pub enum ExecutionInvocation { Succeeded(FunctionInvocation), Reverted(Reversion), diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index 79fccea19..d22ca5d37 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs @@ -110,7 +110,7 @@ mod tests { Fee(try_felt_to_num(feeder_gateway_transaction.max_fee).unwrap()), &vec![], feeder_gateway_transaction.nonce, - &cairo0.into(), + &cairo0, feeder_gateway_transaction.version, ); diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs index 31d3bd486..9e3662864 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs @@ -31,6 +31,7 @@ impl BroadcastedDeclareTransactionV3 { /// `chain_id` - the chain id to use for the transaction hash computation /// `class_hash` - the class hash to use for the transaction hash computation, /// computed from the contract class + #[allow(unused)] // TODO used only in tests pub(crate) fn calculate_transaction_hash( &self, chain_id: &Felt, diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index 3ef3e62f8..ca801df0b 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -85,7 +85,8 @@ impl Formatter for StarknetFormatter { #[cfg(test)] pub(crate) mod test_utils { - use starknet_api::{data_availability::DataAvailabilityMode, transaction::fields::ResourceBounds}; + use starknet_api::data_availability::DataAvailabilityMode; + use starknet_api::transaction::fields::ResourceBounds; use crate::rpc::transactions::ResourceBoundsWrapper; @@ -180,9 +181,7 @@ mod tests { let value: Value = serde_json::from_str(input).unwrap(); let res = crate::utils::traverse_and_exclude_recursively(&value, &|key, val| { - return key == "should_be_removed" - && val.is_array() - && val.as_array().unwrap().is_empty(); + key == "should_be_removed" && val.is_array() && val.as_array().unwrap().is_empty() }); assert_eq!(res, serde_json::from_str::(expected_output).unwrap()); diff --git a/tests/integration/common/background_devnet.rs b/tests/integration/common/background_devnet.rs index 77f865b3d..3134bfdd1 100644 --- a/tests/integration/common/background_devnet.rs +++ b/tests/integration/common/background_devnet.rs @@ -33,7 +33,6 @@ pub struct BackgroundDevnet { reqwest_client: ReqwestClient, pub json_rpc_client: JsonRpcClient, pub process: SafeChild, - pub port: u16, pub url: String, rpc_url: Url, } @@ -183,7 +182,6 @@ impl BackgroundDevnet { Ok(BackgroundDevnet { reqwest_client: ReqwestClient::new(devnet_url.clone(), client), json_rpc_client: JsonRpcClient::new(HttpTransport::new(devnet_rpc_url.clone())), - port, process: safe_process, url: devnet_url, rpc_url: devnet_rpc_url, From 4794f1d078d213a0fa4c7d3d14fe0a5cda508361 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 3 Feb 2025 10:16:45 +0100 Subject: [PATCH 07/41] Finalize clippy --- .../src/api/json_rpc/spec_reader/data_generator.rs | 2 +- tests/integration/general_integration_tests.rs | 6 +++--- tests/integration/test_gas_modification.rs | 1 + tests/integration/test_simulate_transactions.rs | 1 - 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/crates/starknet-devnet-server/src/api/json_rpc/spec_reader/data_generator.rs b/crates/starknet-devnet-server/src/api/json_rpc/spec_reader/data_generator.rs index 82ba797bc..960c35bc9 100644 --- a/crates/starknet-devnet-server/src/api/json_rpc/spec_reader/data_generator.rs +++ b/crates/starknet-devnet-server/src/api/json_rpc/spec_reader/data_generator.rs @@ -51,7 +51,7 @@ impl<'a> RandDataGenerator<'a> { } } -impl<'a> Visitor for RandDataGenerator<'a> { +impl Visitor for RandDataGenerator<'_> { fn do_for_boolean_primitive(&self) -> Result { Ok(serde_json::Value::Bool(rand::thread_rng().gen_bool(0.5))) } diff --git a/tests/integration/general_integration_tests.rs b/tests/integration/general_integration_tests.rs index 5186a9dda..f88801d0f 100644 --- a/tests/integration/general_integration_tests.rs +++ b/tests/integration/general_integration_tests.rs @@ -158,13 +158,13 @@ async fn test_config() { "--chain-id", "MAINNET", "--dump-on", - &expected_config["dump_on"].as_str().unwrap(), + expected_config["dump_on"].as_str().unwrap(), "--dump-path", - &expected_config["dump_path"].as_str().unwrap(), + expected_config["dump_path"].as_str().unwrap(), "--block-generation-on", "demand", "--state-archive-capacity", - &expected_config["state_archive"].as_str().unwrap(), + expected_config["state_archive"].as_str().unwrap(), "--host", expected_config["server_config"]["host"].as_str().unwrap(), "--timeout", diff --git a/tests/integration/test_gas_modification.rs b/tests/integration/test_gas_modification.rs index 924614e2a..b09e3391b 100644 --- a/tests/integration/test_gas_modification.rs +++ b/tests/integration/test_gas_modification.rs @@ -48,6 +48,7 @@ impl SetGasPrice for BackgroundDevnet { /// 1. Execute simulateTransactions with a declare transaction and check gas fees. /// 2. Set the gas values. /// 3. Execute simulateTransactions again and check gas fees. +/// /// Chain ID assertion justified in: https://github.com/0xSpaceShard/starknet-devnet-rs/pull/551#discussion_r1682755696 async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { // get account diff --git a/tests/integration/test_simulate_transactions.rs b/tests/integration/test_simulate_transactions.rs index e09e02616..66ec24047 100644 --- a/tests/integration/test_simulate_transactions.rs +++ b/tests/integration/test_simulate_transactions.rs @@ -1,5 +1,4 @@ use std::sync::Arc; -use std::{u128, u64}; use serde_json::json; use server::test_utils::assert_contains; From a2c4ed52ba6868a594bd7962fa64adf45118272e Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 3 Feb 2025 12:45:56 +0100 Subject: [PATCH 08/41] Remove declare v3 tx hash test --- .../broadcasted_declare_transaction_v3.rs | 137 +----------------- ...73171ec25fa75313394318fc83a074a6631c3.json | 36 ----- 2 files changed, 3 insertions(+), 170 deletions(-) delete mode 100644 crates/starknet-devnet-types/test_data/sequencer_response/declare_v3_integration_0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3.json diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs index 9e3662864..2a93e75fd 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v3.rs @@ -1,13 +1,10 @@ use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use serde::Deserialize; use starknet_rs_core::types::Felt; -use starknet_rs_crypto::poseidon_hash_many; use super::BroadcastedTransactionCommonV3; -use crate::constants::PREFIX_DECLARE; use crate::contract_address::ContractAddress; -use crate::error::DevnetResult; -use crate::felt::{ClassHash, CompiledClassHash}; +use crate::felt::CompiledClassHash; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; #[derive(Debug, Clone, Deserialize)] @@ -22,133 +19,5 @@ pub struct BroadcastedDeclareTransactionV3 { pub account_deployment_data: Vec, } -impl BroadcastedDeclareTransactionV3 { - /// Computes the transaction hash as follows: - /// h(common_tx_fields, h(account_deployment_data), class_hash, compiled_class_hash) with - /// poseidon hash - /// - /// # Arguments - /// `chain_id` - the chain id to use for the transaction hash computation - /// `class_hash` - the class hash to use for the transaction hash computation, - /// computed from the contract class - #[allow(unused)] // TODO used only in tests - pub(crate) fn calculate_transaction_hash( - &self, - chain_id: &Felt, - class_hash: ClassHash, - ) -> DevnetResult { - let common_fields = self.common.common_fields_for_hash( - PREFIX_DECLARE, - *chain_id, - self.sender_address.into(), - )?; - - let account_deployment_data_hash = poseidon_hash_many(&self.account_deployment_data); - - let fields_to_hash = [ - common_fields.as_slice(), - &[account_deployment_data_hash], - &[class_hash], - &[self.compiled_class_hash], - ] - .concat(); - - let txn_hash = poseidon_hash_many(fields_to_hash.as_slice()); - Ok(txn_hash) - } -} - -#[cfg(test)] -mod tests { - use serde::Deserialize; - use starknet_api::transaction::fields::{ResourceBounds, Tip}; - use starknet_types_core::felt::Felt; - - use crate::chain_id::ChainId; - use crate::contract_address::ContractAddress; - use crate::contract_class::ContractClass; - use crate::felt::{ClassHash, CompiledClassHash}; - use crate::rpc::transactions::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; - use crate::rpc::transactions::BroadcastedTransactionCommonV3; - use crate::utils::test_utils::{ - convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode, CAIRO_1_EVENTS_CONTRACT_PATH, - }; - - #[derive(Deserialize)] - struct FeederGatewayDeclareTransactionV3 { - // common - transaction_hash: Felt, - nonce: Felt, - version: Felt, - nonce_data_availability_mode: u8, - fee_data_availability_mode: u8, - resource_bounds: ResourceBounds, - tip: Tip, - paymaster_data: Vec, - account_deployment_data: Vec, - // specific - sender_address: Felt, - compiled_class_hash: CompiledClassHash, - class_hash: ClassHash, - } - - /// Data for test case is taken from https://spaceshard.slack.com/archives/C05FAMWQ8JE/p1700501793152349?thread_ts=1700058492.284919&cid=C05FAMWQ8JE - /// The transaction was taken from https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3 - #[test] - fn correct_transaction_hash_computation_compared_to_a_transaction_from_feeder_gateway() { - let json_obj: serde_json::Value = serde_json::from_reader( - std::fs::File::open(concat!( - env!("CARGO_MANIFEST_DIR"), - "/test_data/sequencer_response/declare_v3_integration_0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3.json" - )) - .unwrap(), - ) - .unwrap(); - - let feeder_gateway_transaction: FeederGatewayDeclareTransactionV3 = - serde_json::from_value(json_obj.get("transaction").unwrap().clone()).unwrap(); - - // cairo_1_contract is only needed for constructing BroadcastedDeclareTransactionV3 - // the class_hash and compiled_class_hash will be provided from - // FeederGatewayDeclareTransactionV3 - - let cairo_1_contract = ContractClass::cairo_1_from_sierra_json_str( - &std::fs::read_to_string(CAIRO_1_EVENTS_CONTRACT_PATH).unwrap(), - ) - .unwrap(); - - let broadcasted_txn = BroadcastedDeclareTransactionV3 { - common: BroadcastedTransactionCommonV3 { - version: feeder_gateway_transaction.version, - signature: vec![], - nonce: feeder_gateway_transaction.nonce, - resource_bounds: convert_from_sn_api_l1_resource_bounds( - feeder_gateway_transaction.resource_bounds, - ), - tip: feeder_gateway_transaction.tip, - paymaster_data: feeder_gateway_transaction.paymaster_data, - nonce_data_availability_mode: from_u8_to_da_mode( - feeder_gateway_transaction.nonce_data_availability_mode, - ), - fee_data_availability_mode: from_u8_to_da_mode( - feeder_gateway_transaction.fee_data_availability_mode, - ), - }, - contract_class: cairo_1_contract, - sender_address: ContractAddress::new(feeder_gateway_transaction.sender_address) - .unwrap(), - compiled_class_hash: feeder_gateway_transaction.compiled_class_hash, - account_deployment_data: feeder_gateway_transaction.account_deployment_data, - }; - - assert_eq!( - broadcasted_txn - .calculate_transaction_hash( - &ChainId::goerli_legacy_id(), - feeder_gateway_transaction.class_hash - ) - .unwrap(), - feeder_gateway_transaction.transaction_hash - ); - } -} +// This file used to contain a test which asserts tx hash calculation. But this is no longer +// Devnet's responsibility, so there are no such tests. diff --git a/crates/starknet-devnet-types/test_data/sequencer_response/declare_v3_integration_0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3.json b/crates/starknet-devnet-types/test_data/sequencer_response/declare_v3_integration_0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3.json deleted file mode 100644 index d7ab3380d..000000000 --- a/crates/starknet-devnet-types/test_data/sequencer_response/declare_v3_integration_0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3.json +++ /dev/null @@ -1,36 +0,0 @@ -{ - "execution_status": "SUCCEEDED", - "finality_status": "ACCEPTED_ON_L1", - "status": "ACCEPTED_ON_L1", - "block_hash": "0x3372a677fc331bfdc6c4ee5430b4b934b486668dedbfeadae5e50b9af37a27e", - "block_number": 319709, - "transaction_index": 1, - "transaction": { - "transaction_hash": "0x41d1f5206ef58a443e7d3d1ca073171ec25fa75313394318fc83a074a6631c3", - "version": "0x3", - "signature": [ - "0x29a49dff154fede73dd7b5ca5a0beadf40b4b069f3a850cd8428e54dc809ccc", - "0x429d142a17223b4f2acde0f5ecb9ad453e188b245003c86fab5c109bad58fc3" - ], - "nonce": "0x1", - "nonce_data_availability_mode": 0, - "fee_data_availability_mode": 0, - "resource_bounds": { - "L1_GAS": { - "max_amount": "0x186a0", - "max_price_per_unit": "0x2540be400" - }, - "L2_GAS": { - "max_amount": "0x0", - "max_price_per_unit": "0x0" - } - }, - "tip": "0x0", - "paymaster_data": [], - "sender_address": "0x2fab82e4aef1d8664874e1f194951856d48463c3e6bf9a8c68e234a629a6f50", - "class_hash": "0x5ae9d09292a50ed48c5930904c880dab56e85b825022a7d689cfc9e65e01ee7", - "compiled_class_hash": "0x1add56d64bebf8140f3b8a38bdf102b7874437f0c861ab4ca7526ec33b4d0f8", - "account_deployment_data": [], - "type": "DECLARE" - } -} \ No newline at end of file From aa77572bf3804f6a81789d6f33bb33dccdc97df5 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 3 Feb 2025 12:59:22 +0100 Subject: [PATCH 09/41] Remove invoke v3 tx hash logic and test --- .../src/rpc/transactions.rs | 29 ++--- .../broadcasted_invoke_transaction_v3.rs | 106 ------------------ ...d3b1904196a10101190d2b12a41cc61cfd17c.json | 52 --------- 3 files changed, 8 insertions(+), 179 deletions(-) delete mode 100644 crates/starknet-devnet-types/test_data/sequencer_response/invoke_v3_integration_0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c.json diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index 95262b836..bf1b50cf3 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -39,7 +39,7 @@ use super::state::ThinStateDiff; use super::transaction_receipt::{ ComputationResources, ExecutionResources, FeeInUnits, TransactionReceipt, }; -use crate::constants::{PREFIX_DEPLOY_ACCOUNT, PREFIX_INVOKE, QUERY_VERSION_OFFSET}; +use crate::constants::{PREFIX_DEPLOY_ACCOUNT, QUERY_VERSION_OFFSET}; use crate::contract_address::ContractAddress; use crate::contract_class::{compute_sierra_class_hash, ContractClass}; use crate::emitted_event::{Event, OrderedEvent}; @@ -798,19 +798,8 @@ impl BroadcastedInvokeTransaction { &self, chain_id: &Felt, ) -> DevnetResult { - let (transaction_hash, sn_api_transaction) = match self { + let sn_api_transaction = match self { BroadcastedInvokeTransaction::V1(v1) => { - let txn_hash = compute_hash_on_elements(&[ - PREFIX_INVOKE, - v1.common.version, - v1.sender_address.into(), - Felt::ZERO, // entry_point_selector - compute_hash_on_elements(&v1.calldata), - v1.common.max_fee.0.into(), - *chain_id, - v1.common.nonce, - ]); - let sn_api_transaction = starknet_api::transaction::InvokeTransactionV1 { max_fee: v1.common.max_fee, signature: starknet_api::transaction::fields::TransactionSignature( @@ -823,11 +812,9 @@ impl BroadcastedInvokeTransaction { )), }; - (txn_hash, starknet_api::transaction::InvokeTransaction::V1(sn_api_transaction)) + starknet_api::transaction::InvokeTransaction::V1(sn_api_transaction) } BroadcastedInvokeTransaction::V3(v3) => { - let txn_hash = v3.calculate_transaction_hash(chain_id)?; - let sn_api_transaction = starknet_api::transaction::InvokeTransactionV3 { resource_bounds: (&v3.common.resource_bounds).into(), tip: v3.common.tip, @@ -850,14 +837,14 @@ impl BroadcastedInvokeTransaction { ), }; - (txn_hash, starknet_api::transaction::InvokeTransaction::V3(sn_api_transaction)) + starknet_api::transaction::InvokeTransaction::V3(sn_api_transaction) } }; - Ok(starknet_api::executable_transaction::InvokeTransaction { - tx: sn_api_transaction, - tx_hash: starknet_api::transaction::TransactionHash(transaction_hash), - }) + Ok(starknet_api::executable_transaction::InvokeTransaction::create( + sn_api_transaction, + &felt_to_sn_api_chain_id(chain_id)?, + )?) } } diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs index 62baea569..11caef0f3 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v3.rs @@ -1,11 +1,8 @@ use serde::Deserialize; use starknet_rs_core::types::Felt; -use starknet_rs_crypto::poseidon_hash_many; use super::BroadcastedTransactionCommonV3; -use crate::constants::PREFIX_INVOKE; use crate::contract_address::ContractAddress; -use crate::error::DevnetResult; use crate::felt::Calldata; #[derive(Debug, Clone, Deserialize)] @@ -17,106 +14,3 @@ pub struct BroadcastedInvokeTransactionV3 { pub calldata: Calldata, pub account_deployment_data: Vec, } - -impl BroadcastedInvokeTransactionV3 { - /// Computes the transaction hash as follows: - /// h(common_tx_fields, h(account_deployment_data),h(calldata)) with poseidon hash - /// - /// # Arguments - /// `chain_id` - the chain id to use for the transaction hash computation - pub(crate) fn calculate_transaction_hash(&self, chain_id: &Felt) -> DevnetResult { - let common_fields = self.common.common_fields_for_hash( - PREFIX_INVOKE, - *chain_id, - self.sender_address.into(), - )?; - - let account_deployment_data_hash = poseidon_hash_many(&self.account_deployment_data); - - let call_data_hash = poseidon_hash_many(&self.calldata); - - let fields_to_hash = - [common_fields.as_slice(), &[account_deployment_data_hash], &[call_data_hash]].concat(); - - let txn_hash = poseidon_hash_many(fields_to_hash.as_slice()); - - Ok(txn_hash) - } -} - -#[cfg(test)] -mod tests { - use serde::Deserialize; - use starknet_api::transaction::fields::{ResourceBounds, Tip}; - use starknet_rs_core::types::Felt; - - use crate::chain_id::ChainId; - use crate::contract_address::ContractAddress; - use crate::rpc::transactions::broadcasted_invoke_transaction_v3::BroadcastedInvokeTransactionV3; - use crate::rpc::transactions::BroadcastedTransactionCommonV3; - use crate::utils::test_utils::{convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode}; - - #[derive(Deserialize)] - struct FeederGatewayInvokeTransactionV3 { - // common - transaction_hash: Felt, - nonce: Felt, - version: Felt, - nonce_data_availability_mode: u8, - fee_data_availability_mode: u8, - resource_bounds: ResourceBounds, - tip: Tip, - paymaster_data: Vec, - account_deployment_data: Vec, - // specific - sender_address: Felt, - calldata: Vec, - } - - /// Data for test case is taken from https://spaceshard.slack.com/archives/C05FAMWQ8JE/p1700501793152349?thread_ts=1700058492.284919&cid=C05FAMWQ8JE - /// The transaction was taken from https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c - #[test] - fn correct_transaction_hash_computation_compared_to_a_transaction_from_feeder_gateway() { - let json_obj: serde_json::Value = serde_json::from_reader( - std::fs::File::open(concat!( - env!("CARGO_MANIFEST_DIR"), - "/test_data/sequencer_response/invoke_v3_integration_0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c.json" - )) - .unwrap(), - ) - .unwrap(); - - let feeder_gateway_transaction: FeederGatewayInvokeTransactionV3 = serde_json::from_str( - &serde_json::to_string_pretty(&json_obj.get("transaction").unwrap().clone()).unwrap(), - ) - .unwrap(); - - let broadcasted_txn = BroadcastedInvokeTransactionV3 { - common: BroadcastedTransactionCommonV3 { - version: feeder_gateway_transaction.version, - signature: vec![], - nonce: feeder_gateway_transaction.nonce, - resource_bounds: convert_from_sn_api_l1_resource_bounds( - feeder_gateway_transaction.resource_bounds, - ), - tip: feeder_gateway_transaction.tip, - paymaster_data: feeder_gateway_transaction.paymaster_data, - nonce_data_availability_mode: from_u8_to_da_mode( - feeder_gateway_transaction.nonce_data_availability_mode, - ), - fee_data_availability_mode: from_u8_to_da_mode( - feeder_gateway_transaction.fee_data_availability_mode, - ), - }, - sender_address: ContractAddress::new(feeder_gateway_transaction.sender_address) - .unwrap(), - calldata: feeder_gateway_transaction.calldata, - account_deployment_data: feeder_gateway_transaction.account_deployment_data, - }; - - assert_eq!( - feeder_gateway_transaction.transaction_hash, - broadcasted_txn.calculate_transaction_hash(&ChainId::goerli_legacy_id()).unwrap() - ); - } -} diff --git a/crates/starknet-devnet-types/test_data/sequencer_response/invoke_v3_integration_0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c.json b/crates/starknet-devnet-types/test_data/sequencer_response/invoke_v3_integration_0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c.json deleted file mode 100644 index c1c901982..000000000 --- a/crates/starknet-devnet-types/test_data/sequencer_response/invoke_v3_integration_0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "execution_status": "SUCCEEDED", - "finality_status": "ACCEPTED_ON_L1", - "status": "ACCEPTED_ON_L1", - "block_hash": "0x5f23f7e63bba9ce13263451946566d8a0dff71b0455f41cae8386f136d55e43", - "block_number": 319100, - "transaction_index": 1, - "transaction": { - "transaction_hash": "0x41906f1c314cca5f43170ea75d3b1904196a10101190d2b12a41cc61cfd17c", - "version": "0x3", - "signature": [ - "0xef42616755b8a9b7c97d2deb1ba4a4176d3c838a20c367072f141af446ee7", - "0xc6514ea8a88bcb0f4b2a40ddc609461a35af802ba0b35586ade6d8a4be2934" - ], - "nonce": "0x8a9", - "nonce_data_availability_mode": 0, - "fee_data_availability_mode": 0, - "resource_bounds": { - "L1_GAS": { - "max_amount": "0x186a0", - "max_price_per_unit": "0x5af3107a4000" - }, - "L2_GAS": { - "max_amount": "0x0", - "max_price_per_unit": "0x0" - } - }, - "tip": "0x0", - "paymaster_data": [], - "sender_address": "0x3f6f3bc663aedc5285d6013cc3ffcbc4341d86ab488b8b68d297f8258793c41", - "calldata": [ - "0x2", - "0x4c312760dfd17a954cdd09e76aa9f149f806d88ec3e402ffaf5c4926f568a42", - "0x31aafc75f498fdfa7528880ad27246b4c15af4954f96228c9a132b328de1c92", - "0x0", - "0x6", - "0x450703c32370cf7ffff540b9352e7ee4ad583af143a361155f2b485c0c39684", - "0xb17d8a2731ba7ca1816631e6be14f0fc1b8390422d649fa27f0fbb0c91eea8", - "0x6", - "0x0", - "0x6", - "0x6333f10b24ed58cc33e9bac40b0d52e067e32a175a97ca9e2ce89fe2b002d82", - "0x3", - "0x602e89fe5703e5b093d13d0a81c9e6d213338dc15c59f4d3ff3542d1d7dfb7d", - "0x20d621301bea11ffd9108af1d65847e9049412159294d0883585d4ad43ad61b", - "0x276faadb842bfcbba834f3af948386a2eb694f7006e118ad6c80305791d3247", - "0x613816405e6334ab420e53d4b38a0451cb2ebca2755171315958c87d303cf6" - ], - "account_deployment_data": [], - "type": "INVOKE_FUNCTION" - } -} \ No newline at end of file From def59f46166c00e123959f34a886485b04b2b6c9 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 3 Feb 2025 13:30:42 +0100 Subject: [PATCH 10/41] Remove deploy account v3 tx hash logic+test; remove starknet-rs-crypto --- Cargo.lock | 1 - Cargo.toml | 1 - crates/starknet-devnet-types/Cargo.toml | 1 - crates/starknet-devnet-types/src/constants.rs | 8 - .../src/rpc/transactions.rs | 209 +----------------- ...oadcasted_deploy_account_transaction_v3.rs | 138 ------------ crates/starknet-devnet-types/src/utils.rs | 28 --- ...d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0.json | 38 ---- 8 files changed, 10 insertions(+), 414 deletions(-) delete mode 100644 crates/starknet-devnet-types/test_data/sequencer_response/deploy_account_v3_integration_0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0.json diff --git a/Cargo.lock b/Cargo.lock index 2afd5f1e6..f231066fb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5923,7 +5923,6 @@ dependencies = [ "serde", "serde_json", "starknet-core", - "starknet-crypto 0.7.4", "starknet-types-core", "starknet_api", "thiserror", diff --git a/Cargo.toml b/Cargo.toml index c424a2368..ad8930eee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,7 +85,6 @@ starknet-rs-core = { version = "0.12.1", package = "starknet-core" } starknet-rs-providers = { version = "0.12.1", package = "starknet-providers" } starknet-rs-accounts = { version = "0.12.0", package = "starknet-accounts" } starknet-rs-contract = { version = "0.12.0", package = "starknet-contract" } -starknet-rs-crypto = { version = "0.7.4", package = "starknet-crypto" } cairo-vm = "=1.0.1" # Cairo-lang dependencies diff --git a/crates/starknet-devnet-types/Cargo.toml b/crates/starknet-devnet-types/Cargo.toml index 3736ff776..65ae6b705 100644 --- a/crates/starknet-devnet-types/Cargo.toml +++ b/crates/starknet-devnet-types/Cargo.toml @@ -23,7 +23,6 @@ starknet_api = { workspace = true } starknet-types-core = { workspace = true } thiserror = { workspace = true } starknet-rs-core = { workspace = true } -starknet-rs-crypto = { workspace = true } cairo-vm = { workspace = true } serde = { workspace = true } serde_json = { workspace = true, features = [ diff --git a/crates/starknet-devnet-types/src/constants.rs b/crates/starknet-devnet-types/src/constants.rs index 74505ae28..ea429584b 100644 --- a/crates/starknet-devnet-types/src/constants.rs +++ b/crates/starknet-devnet-types/src/constants.rs @@ -12,14 +12,6 @@ pub const PREFIX_INVOKE: Felt = Felt::from_raw([ 18443034532770911073, ]); -/// Cairo string for "deploy_account" from starknet-rs -pub(crate) const PREFIX_DEPLOY_ACCOUNT: Felt = Felt::from_raw([ - 461298303000467581, - 18446744073709551615, - 18443211694809419988, - 3350261884043292318, -]); - /// Cairo string for "declare" from starknet-rs pub(crate) const PREFIX_DECLARE: Felt = Felt::from_raw([ 191557713328401194, diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index bf1b50cf3..6a0ae3bd3 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -12,16 +12,13 @@ use invoke_transaction_v1::InvokeTransactionV1; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use starknet_api::block::{BlockNumber, GasPrice}; use starknet_api::contract_class::{ClassInfo, EntryPointType}; -use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::transaction::fields::{Fee, Resource, Tip}; -use starknet_rs_core::crypto::compute_hash_on_elements; +use starknet_api::transaction::fields::{Fee, Tip}; use starknet_rs_core::types::{ BlockId, ExecutionResult, Felt, ResourceBounds, ResourceBoundsMapping, TransactionFinalityStatus, }; use starknet_rs_core::utils::parse_cairo_short_string; -use starknet_rs_crypto::poseidon_hash_many; use self::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; use self::broadcasted_deploy_account_transaction_v1::BroadcastedDeployAccountTransactionV1; @@ -39,11 +36,11 @@ use super::state::ThinStateDiff; use super::transaction_receipt::{ ComputationResources, ExecutionResources, FeeInUnits, TransactionReceipt, }; -use crate::constants::{PREFIX_DEPLOY_ACCOUNT, QUERY_VERSION_OFFSET}; +use crate::constants::QUERY_VERSION_OFFSET; use crate::contract_address::ContractAddress; use crate::contract_class::{compute_sierra_class_hash, ContractClass}; use crate::emitted_event::{Event, OrderedEvent}; -use crate::error::{ConversionError, DevnetResult, Error, JsonError}; +use crate::error::{ConversionError, DevnetResult}; use crate::felt::{ BlockHash, Calldata, EntryPointSelector, Nonce, TransactionHash, TransactionSignature, TransactionVersion, @@ -68,9 +65,6 @@ pub mod deploy_transaction; pub mod invoke_transaction_v1; pub mod invoke_transaction_v3; -/// number of bits to be shifted when encoding the data availability mode into `Felt` type -const DATA_AVAILABILITY_MODE_BITS: u8 = 32; - pub mod l1_handler_transaction; #[derive(Debug, Clone, Serialize)] @@ -360,96 +354,6 @@ impl BroadcastedTransactionCommonV3 { pub fn is_only_query(&self) -> bool { is_only_query_common(&self.version) } - - /// Returns an array of Felts that reflects the `common_tx_fields` according to SNIP-8(https://github.com/starknet-io/SNIPs/blob/main/SNIPS/snip-8.md/#protocol-changes). - /// - /// # Arguments - /// tx_prefix - the prefix of the transaction hash - /// chain_id - the chain id of the network the transaction is broadcasted to - /// address - the address of the sender - pub(crate) fn common_fields_for_hash( - &self, - tx_prefix: Felt, - chain_id: Felt, - address: Felt, - ) -> Result, Error> { - let array: Vec = vec![ - tx_prefix, // TX_PREFIX - self.version, // version - address, // address - poseidon_hash_many(self.get_resource_bounds_array()?.as_slice()), /* h(tip, resource_bounds_for_fee) */ - poseidon_hash_many(&self.paymaster_data), // h(paymaster_data) - chain_id, // chain_id - self.nonce, // nonce - self.get_data_availability_modes_field_element(), /* nonce_data_availability || - * fee_data_availability_mode */ - ]; - - Ok(array) - } - - /// Returns the array of Felts that reflects (tip, resource_bounds_for_fee) from SNIP-8 - pub(crate) fn get_resource_bounds_array(&self) -> Result, Error> { - let mut array = Vec::::new(); - array.push(Felt::from(self.tip.0)); - - fn field_element_from_resource_bounds( - resource: Resource, - resource_bounds: &ResourceBounds, - ) -> Result { - let resource_name_as_json_string = - serde_json::to_value(resource).map_err(JsonError::SerdeJsonError)?; - - let resource_name_bytes = resource_name_as_json_string - .as_str() - .ok_or(Error::JsonError(JsonError::Custom { - msg: "resource name is not a string".into(), - }))? - .as_bytes(); - - // (resource||max_amount||max_price_per_unit) from SNIP-8 https://github.com/starknet-io/SNIPs/blob/main/SNIPS/snip-8.md#protocol-changes - let bytes: Vec = [ - resource_name_bytes, - resource_bounds.max_amount.to_be_bytes().as_slice(), - resource_bounds.max_price_per_unit.to_be_bytes().as_slice(), - ] - .into_iter() - .flatten() - .copied() - .collect(); - - Ok(Felt::from_bytes_be_slice(&bytes)) - } - array.push(field_element_from_resource_bounds( - Resource::L1Gas, - &self.resource_bounds.inner.l1_gas, - )?); - array.push(field_element_from_resource_bounds( - Resource::L2Gas, - &self.resource_bounds.inner.l2_gas, - )?); - - Ok(array) - } - - /// Returns Felt that encodes the data availability modes of the transaction - pub(crate) fn get_data_availability_modes_field_element(&self) -> Felt { - fn get_data_availability_mode_value_as_u64( - data_availability_mode: DataAvailabilityMode, - ) -> u64 { - match data_availability_mode { - DataAvailabilityMode::L1 => 0, - DataAvailabilityMode::L2 => 1, - } - } - - let da_mode = get_data_availability_mode_value_as_u64(self.nonce_data_availability_mode) - << DATA_AVAILABILITY_MODE_BITS; - let da_mode = - da_mode + get_data_availability_mode_value_as_u64(self.fee_data_availability_mode); - - Felt::from(da_mode) - } } #[derive(Debug, Clone, Deserialize)] @@ -673,33 +577,8 @@ impl BroadcastedDeployAccountTransaction { &self, chain_id: &Felt, ) -> DevnetResult { - let (transaction_hash, sn_api_transaction, contract_address) = match self { + let sn_api_transaction = match self { BroadcastedDeployAccountTransaction::V1(v1) => { - let contract_address = calculate_contract_address( - starknet_api::transaction::fields::ContractAddressSalt( - v1.contract_address_salt, - ), - starknet_api::core::ClassHash(v1.class_hash), - &starknet_api::transaction::fields::Calldata(Arc::new( - v1.constructor_calldata.clone(), - )), - starknet_api::core::ContractAddress::from(0u8), - )?; - - let mut calldata_to_hash = vec![v1.class_hash, v1.contract_address_salt]; - calldata_to_hash.extend(v1.constructor_calldata.iter()); - - let transaction_hash = compute_hash_on_elements(&[ - PREFIX_DEPLOY_ACCOUNT, - v1.common.version, - ContractAddress::from(contract_address).into(), - Felt::ZERO, // entry_point_selector - compute_hash_on_elements(&calldata_to_hash), - v1.common.max_fee.0.into(), - *chain_id, - v1.common.nonce, - ]); - let sn_api_transaction = starknet_api::transaction::DeployAccountTransactionV1 { max_fee: v1.common.max_fee, signature: starknet_api::transaction::fields::TransactionSignature( @@ -715,22 +594,9 @@ impl BroadcastedDeployAccountTransaction { )), }; - ( - transaction_hash, - starknet_api::transaction::DeployAccountTransaction::V1(sn_api_transaction), - contract_address, - ) + starknet_api::transaction::DeployAccountTransaction::V1(sn_api_transaction) } BroadcastedDeployAccountTransaction::V3(v3) => { - let contract_address = - BroadcastedDeployAccountTransactionV3::calculate_contract_address( - &v3.contract_address_salt, - &v3.class_hash, - &v3.constructor_calldata, - )?; - - let transaction_hash = v3.calculate_transaction_hash(chain_id, contract_address)?; - let sn_api_transaction = starknet_api::transaction::DeployAccountTransactionV3 { resource_bounds: (&v3.common.resource_bounds).into(), tip: v3.common.tip, @@ -752,19 +618,14 @@ impl BroadcastedDeployAccountTransaction { )), }; - ( - transaction_hash, - starknet_api::transaction::DeployAccountTransaction::V3(sn_api_transaction), - contract_address.try_into()?, - ) + starknet_api::transaction::DeployAccountTransaction::V3(sn_api_transaction) } }; - Ok(starknet_api::executable_transaction::DeployAccountTransaction { - tx: sn_api_transaction, - tx_hash: starknet_api::transaction::TransactionHash(transaction_hash), - contract_address, - }) + Ok(starknet_api::executable_transaction::DeployAccountTransaction::create( + sn_api_transaction, + &felt_to_sn_api_chain_id(chain_id)?, + )?) } } @@ -1105,53 +966,3 @@ impl FunctionInvocation { }) } } - -#[cfg(test)] -mod tests { - use starknet_rs_crypto::poseidon_hash_many; - - use super::BroadcastedTransactionCommonV3; - use crate::felt::felt_from_prefixed_hex; - - #[test] - fn test_dummy_transaction_hash_taken_from_papyrus() { - let txn_json_str = r#"{ - "signature": ["0x3", "0x4"], - "version": "0x3", - "nonce": "0x9", - "sender_address": "0x12fd538", - "constructor_calldata": ["0x21b", "0x151"], - "nonce_data_availability_mode": "L1", - "fee_data_availability_mode": "L1", - "resource_bounds": { - "l2_gas": { - "max_amount": "0x0", - "max_price_per_unit": "0x0" - }, - "l1_gas": { - "max_amount": "0x7c9", - "max_price_per_unit": "0x1" - } - }, - "tip": "0x0", - "paymaster_data": [], - "account_deployment_data": [], - "calldata": [ - "0x11", - "0x26" - ] - }"#; - - let common_fields = - serde_json::from_str::(txn_json_str).unwrap(); - let common_fields_hash = - poseidon_hash_many(&common_fields.get_resource_bounds_array().unwrap()); - - let expected_hash = felt_from_prefixed_hex( - "0x07be65f04548dfe645c70f07d1f8ead572c09e0e6e125c47d4cc22b4de3597cc", - ) - .unwrap(); - - assert_eq!(common_fields_hash, expected_hash); - } -} diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs index 865ea046c..d9ff6885f 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_deploy_account_transaction_v3.rs @@ -1,14 +1,6 @@ -use std::sync::Arc; - use serde::Deserialize; -use starknet_api::core::calculate_contract_address; -use starknet_rs_crypto::poseidon_hash_many; -use starknet_types_core::felt::Felt; use super::BroadcastedTransactionCommonV3; -use crate::constants::PREFIX_DEPLOY_ACCOUNT; -use crate::contract_address::ContractAddress; -use crate::error::DevnetResult; use crate::felt::{Calldata, ClassHash, ContractAddressSalt}; #[derive(Debug, Clone, Deserialize)] @@ -20,133 +12,3 @@ pub struct BroadcastedDeployAccountTransactionV3 { pub constructor_calldata: Calldata, pub class_hash: ClassHash, } - -impl BroadcastedDeployAccountTransactionV3 { - pub(crate) fn calculate_transaction_hash( - &self, - chain_id: &Felt, - contract_address: ContractAddress, - ) -> DevnetResult { - let common_fields = self.common.common_fields_for_hash( - PREFIX_DEPLOY_ACCOUNT, - *chain_id, - contract_address.into(), - )?; - - let constructor_calldata_hash = poseidon_hash_many(&self.constructor_calldata); - - let fields_to_hash = [ - common_fields.as_slice(), - &[constructor_calldata_hash], - &[self.class_hash], - &[self.contract_address_salt], - ] - .concat(); - - let txn_hash = poseidon_hash_many(fields_to_hash.as_slice()); - - Ok(txn_hash) - } - - pub(crate) fn calculate_contract_address( - contract_address_salt: &Felt, - class_hash: &ClassHash, - constructor_calldata: &Calldata, - ) -> DevnetResult { - let contract_address = calculate_contract_address( - starknet_api::transaction::fields::ContractAddressSalt(*contract_address_salt), - starknet_api::core::ClassHash(*class_hash), - &starknet_api::transaction::fields::Calldata(Arc::new(constructor_calldata.clone())), - starknet_api::core::ContractAddress::from(0u8), - )?; - - Ok(ContractAddress::from(contract_address)) - } -} - -#[cfg(test)] -mod tests { - use serde::Deserialize; - use starknet_api::transaction::fields::{ResourceBounds, Tip}; - use starknet_rs_core::types::Felt; - - use crate::chain_id::ChainId; - use crate::rpc::transactions::broadcasted_deploy_account_transaction_v3::BroadcastedDeployAccountTransactionV3; - use crate::rpc::transactions::BroadcastedTransactionCommonV3; - use crate::utils::test_utils::{convert_from_sn_api_l1_resource_bounds, from_u8_to_da_mode}; - - #[derive(Deserialize)] - struct FeederGatewayDeployAccountTransactionV3 { - // common - transaction_hash: Felt, - nonce: Felt, - version: Felt, - nonce_data_availability_mode: u8, - fee_data_availability_mode: u8, - resource_bounds: ResourceBounds, - tip: Tip, - paymaster_data: Vec, - // specific - class_hash: Felt, - constructor_calldata: Vec, - contract_address_salt: Felt, - } - - /// Data for test case is taken from https://spaceshard.slack.com/archives/C05FAMWQ8JE/p1700501793152349?thread_ts=1700058492.284919&cid=C05FAMWQ8JE - /// The transaction was taken from https://external.integration.starknet.io/feeder_gateway/get_transaction?transactionHash=0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0 - #[test] - fn correct_transaction_hash_computation_compared_to_a_transaction_from_feeder_gateway() { - let json_obj: serde_json::Value = serde_json::from_reader( - std::fs::File::open(concat!( - env!("CARGO_MANIFEST_DIR"), - "/test_data/sequencer_response/deploy_account_v3_integration_0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0.json" - )) - .unwrap(), - ) - .unwrap(); - - let feeder_gateway_transaction: FeederGatewayDeployAccountTransactionV3 = - serde_json::from_str( - &serde_json::to_string_pretty(&json_obj.get("transaction").unwrap().clone()) - .unwrap(), - ) - .unwrap(); - - let broadcasted_txn = BroadcastedDeployAccountTransactionV3 { - common: BroadcastedTransactionCommonV3 { - version: feeder_gateway_transaction.version, - signature: vec![], - nonce: feeder_gateway_transaction.nonce, - resource_bounds: convert_from_sn_api_l1_resource_bounds( - feeder_gateway_transaction.resource_bounds, - ), - tip: feeder_gateway_transaction.tip, - paymaster_data: feeder_gateway_transaction.paymaster_data, - nonce_data_availability_mode: from_u8_to_da_mode( - feeder_gateway_transaction.nonce_data_availability_mode, - ), - fee_data_availability_mode: from_u8_to_da_mode( - feeder_gateway_transaction.fee_data_availability_mode, - ), - }, - constructor_calldata: feeder_gateway_transaction.constructor_calldata, - contract_address_salt: feeder_gateway_transaction.contract_address_salt, - class_hash: feeder_gateway_transaction.class_hash, - }; - - assert_eq!( - feeder_gateway_transaction.transaction_hash, - broadcasted_txn - .calculate_transaction_hash( - &ChainId::goerli_legacy_id(), - BroadcastedDeployAccountTransactionV3::calculate_contract_address( - &broadcasted_txn.contract_address_salt, - &broadcasted_txn.class_hash, - &broadcasted_txn.constructor_calldata - ) - .unwrap() - ) - .unwrap() - ); - } -} diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index ca801df0b..12d59ead4 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -85,11 +85,6 @@ impl Formatter for StarknetFormatter { #[cfg(test)] pub(crate) mod test_utils { - use starknet_api::data_availability::DataAvailabilityMode; - use starknet_api::transaction::fields::ResourceBounds; - - use crate::rpc::transactions::ResourceBoundsWrapper; - pub(crate) const CAIRO_0_RPC_CONTRACT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/test_data/cairo_0_rpc.json"); @@ -100,29 +95,6 @@ pub(crate) mod test_utils { pub(crate) const CAIRO_1_CONTRACT_SIERRA_HASH: &str = "0x113bf26d112a164297e04381212c9bd7409f07591f0a04f539bdf56693eaaf3"; - - /// Converts integer to DataAvailabilityMode - /// # Arguments - /// - /// * `da_mode` - integer representing the data availability mode - pub(crate) fn from_u8_to_da_mode(da_mode: u8) -> DataAvailabilityMode { - match da_mode { - 0 => DataAvailabilityMode::L1, - 1 => DataAvailabilityMode::L2, - _ => panic!("Invalid data availability mode"), - } - } - - pub(crate) fn convert_from_sn_api_l1_resource_bounds( - l1_resource_bounds: ResourceBounds, - ) -> ResourceBoundsWrapper { - ResourceBoundsWrapper::new( - l1_resource_bounds.max_amount.0, - l1_resource_bounds.max_price_per_unit.0, - 0, - 0, - ) - } } #[cfg(test)] mod tests { diff --git a/crates/starknet-devnet-types/test_data/sequencer_response/deploy_account_v3_integration_0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0.json b/crates/starknet-devnet-types/test_data/sequencer_response/deploy_account_v3_integration_0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0.json deleted file mode 100644 index 4c1bde88a..000000000 --- a/crates/starknet-devnet-types/test_data/sequencer_response/deploy_account_v3_integration_0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "execution_status": "SUCCEEDED", - "finality_status": "ACCEPTED_ON_L1", - "status": "ACCEPTED_ON_L1", - "block_hash": "0xff810c2cc83851e2f80af89252e4dc42fb7d549a362d2db72f76ba329d7b96", - "block_number": 319693, - "transaction_index": 4, - "transaction": { - "transaction_hash": "0x29fd7881f14380842414cdfdd8d6c0b1f2174f8916edcfeb1ede1eb26ac3ef0", - "version": "0x3", - "signature": [ - "0x6d756e754793d828c6c1a89c13f7ec70dbd8837dfeea5028a673b80e0d6b4ec", - "0x4daebba599f860daee8f6e100601d98873052e1c61530c630cc4375c6bd48e3" - ], - "nonce": "0x0", - "nonce_data_availability_mode": 0, - "fee_data_availability_mode": 0, - "resource_bounds": { - "L1_GAS": { - "max_amount": "0x186a0", - "max_price_per_unit": "0x5af3107a4000" - }, - "L2_GAS": { - "max_amount": "0x0", - "max_price_per_unit": "0x0" - } - }, - "tip": "0x0", - "paymaster_data": [], - "sender_address": "0x2fab82e4aef1d8664874e1f194951856d48463c3e6bf9a8c68e234a629a6f50", - "contract_address_salt": "0x0", - "class_hash": "0x2338634f11772ea342365abd5be9d9dc8a6f44f159ad782fdebd3db5d969738", - "constructor_calldata": [ - "0x5cd65f3d7daea6c63939d659b8473ea0c5cd81576035a4d34e52fb06840196c" - ], - "type": "DEPLOY_ACCOUNT" - } -} \ No newline at end of file From 1fd223a978cf448a5757624d6243c16bea35ba9b Mon Sep 17 00:00:00 2001 From: FabijanC Date: Tue, 4 Feb 2025 15:00:42 +0100 Subject: [PATCH 11/41] Reinstate old Cairo0 support [WIP] [skip ci] --- .../src/starknet/add_invoke_transaction.rs | 11 +- .../starknet/add_l1_handler_transaction.rs | 11 +- .../src/rpc/contract_class.rs | 34 +-- .../contract_class/deprecated/abi_entry.rs | 130 +++++++++ .../deprecated/json_contract_class.rs | 265 ++++++++++++++++++ .../src/rpc/contract_class/deprecated/mod.rs | 186 +++--------- .../deprecated/rpc_contract_class.rs | 115 ++++++++ .../broadcasted_declare_transaction_v1.rs | 2 +- crates/starknet-devnet-types/src/utils.rs | 3 + 9 files changed, 579 insertions(+), 178 deletions(-) create mode 100644 crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs create mode 100644 crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs create mode 100644 crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs diff --git a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs index f7c6874f5..29ca07fae 100644 --- a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs @@ -74,7 +74,7 @@ mod tests { use starknet_rs_core::utils::get_selector_from_name; use starknet_types::constants::QUERY_VERSION_OFFSET; use starknet_types::contract_address::ContractAddress; - use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; + use starknet_types::contract_class::ContractClass; use starknet_types::contract_storage_key::ContractStorageKey; use starknet_types::rpc::gas_modification::GasModification; use starknet_types::rpc::state::Balance; @@ -91,7 +91,7 @@ mod tests { ETH_ERC20_CONTRACT_ADDRESS, }; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::{predeployed, Starknet}; + use crate::starknet::{Starknet, predeployed}; use crate::state::CustomState; use crate::traits::{Accounted, Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; @@ -487,11 +487,12 @@ mod tests { // dummy contract let dummy_contract = dummy_cairo_0_contract_class(); - let increase_balance_selector = get_selector_from_name("increase_balance").unwrap(); // check if increase_balance function is present in the contract class - let Cairo0ContractClass::Rpc(ref class) = dummy_contract; - class + let increase_balance_selector = get_selector_from_name("increase_balance").unwrap(); + let sn_api_class: starknet_api::deprecated_contract_class::ContractClass = + dummy_contract.clone().try_into().unwrap(); + sn_api_class .entry_points_by_type .get(&starknet_api::contract_class::EntryPointType::External) .unwrap() diff --git a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs index bd6073fd0..bc304b24d 100644 --- a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs @@ -40,7 +40,7 @@ mod tests { use starknet_rs_core::utils::get_selector_from_name; use starknet_types::chain_id::ChainId; use starknet_types::contract_address::ContractAddress; - use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; + use starknet_types::contract_class::ContractClass; use starknet_types::felt::felt_from_prefixed_hex; use starknet_types::rpc::state::Balance; use starknet_types::rpc::transactions::l1_handler_transaction::L1HandlerTransaction; @@ -51,7 +51,7 @@ mod tests { self, DEVNET_DEFAULT_CHAIN_ID, DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, }; - use crate::starknet::{predeployed, Starknet}; + use crate::starknet::{Starknet, predeployed}; use crate::state::CustomState; use crate::traits::{Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_l1l2_contract; @@ -199,13 +199,14 @@ mod tests { // dummy contract let dummy_contract = dummy_cairo_l1l2_contract(); + let sn_api_class: starknet_api::deprecated_contract_class::ContractClass = + dummy_contract.clone().try_into().unwrap(); let withdraw_selector = get_selector_from_name("withdraw").unwrap(); let deposit_selector = get_selector_from_name("deposit").unwrap(); // check if withdraw function is present in the contract class - let Cairo0ContractClass::Rpc(ref contract_class) = dummy_contract; - contract_class + sn_api_class .entry_points_by_type .get(&starknet_api::contract_class::EntryPointType::External) .unwrap() @@ -214,7 +215,7 @@ mod tests { .unwrap(); // check if deposit function is present in the contract class - contract_class + sn_api_class .entry_points_by_type .get(&starknet_api::contract_class::EntryPointType::L1Handler) .unwrap() diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 3bb321c5d..5fceef456 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -88,9 +88,11 @@ impl TryFrom for starknet_api::contract_class::ContractClass { fn try_from(value: ContractClass) -> Result { match value { - ContractClass::Cairo0(deprecated_contract_class) => Ok( - starknet_api::contract_class::ContractClass::V0(deprecated_contract_class.into()), - ), + ContractClass::Cairo0(deprecated_contract_class) => { + Ok(starknet_api::contract_class::ContractClass::V0( + deprecated_contract_class.try_into()?, + )) + } ContractClass::Cairo1(ref sierra_contract_class) => { // TODO any difference: USC vs CasmContractClass::from_contract_class ? let casm_json = @@ -122,7 +124,7 @@ impl TryFrom for ClassInfo { let abi_length = 0; ClassInfo::new( &starknet_api::contract_class::ContractClass::V0( - deprecated_contract_class.into(), + deprecated_contract_class.try_into()?, ), 0, abi_length, @@ -177,7 +179,7 @@ impl TryInto for ContractClass { type Error = Error; fn try_into(self) -> Result { match self { - ContractClass::Cairo0(Cairo0ContractClass::Rpc(contract_class)) => { + ContractClass::Cairo0(contract_class) => { let class_json = serde_json::to_string(&contract_class).map_err(JsonError::SerdeJsonError)?; let codegen: CompressedLegacyContractClass = @@ -214,11 +216,7 @@ impl TryFrom for RunnableCompiledClass { fn try_from(value: ContractClass) -> Result { Ok(match value { - ContractClass::Cairo0(Cairo0ContractClass::Rpc(class)) => { - RunnableCompiledClass::V0(class.try_into().map_err(|e: ProgramError| { - ConversionError::InvalidInternalStructure(e.to_string()) - })?) - } + ContractClass::Cairo0(class) => class.try_into()?, ContractClass::Cairo1(class) => { // TODO extract this as common logic let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; @@ -242,12 +240,14 @@ impl TryFrom for RunnableCompiledClass { impl TryFrom for RunnableCompiledClass { type Error = Error; - fn try_from(value: Cairo0ContractClass) -> Result { - let Cairo0ContractClass::Rpc(class) = value; - let compiled_class = class.try_into().map_err(|e: ProgramError| { - Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) - })?; - Ok(RunnableCompiledClass::V0(compiled_class)) + fn try_from(class: Cairo0ContractClass) -> Result { + Ok(RunnableCompiledClass::V0(match class { + Cairo0ContractClass::RawJson(cairo0_json) => serde_json::from_value(cairo0_json.inner) + .map_err(|e| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?, + Cairo0ContractClass::Rpc(deprecated_contract_class) => todo!(), + })) } } @@ -336,7 +336,7 @@ mod tests { use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use serde_json::Deserializer; - use crate::contract_class::{convert_sierra_to_codegen, ContractClass}; + use crate::contract_class::{ContractClass, convert_sierra_to_codegen}; use crate::felt::felt_from_prefixed_hex; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; use crate::traits::HashProducer; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs new file mode 100644 index 000000000..163be7481 --- /dev/null +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/abi_entry.rs @@ -0,0 +1,130 @@ +use serde::{Deserialize, Deserializer, Serialize}; + +#[derive(Debug, Copy, Clone, Eq, PartialEq, Deserialize, Serialize, Default)] +pub enum AbiEntryType { + #[serde(rename(deserialize = "constructor", serialize = "constructor"))] + Constructor, + #[serde(rename(deserialize = "event", serialize = "event"))] + Event, + #[serde(rename(deserialize = "function", serialize = "function"))] + #[default] + Function, + #[serde(rename(deserialize = "l1_handler", serialize = "l1_handler"))] + L1Handler, + #[serde(rename(deserialize = "struct", serialize = "struct"))] + Struct, +} + +#[derive(Debug, Clone, Eq, PartialEq, Serialize)] +#[serde(untagged)] +pub enum AbiEntry { + /// An event abi entry. + Event(EventAbiEntry), + /// A function abi entry. + Function(FunctionAbiEntry), + /// A struct abi entry. + Struct(StructAbiEntry), +} + +#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] +pub struct EventAbiEntry { + pub data: Vec, + pub keys: Vec, + pub name: String, +} + +/// A struct abi entry. +#[derive(Debug, Clone, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct StructAbiEntry { + pub members: Vec, + pub name: String, + pub size: usize, +} + +/// A struct member for [StructAbiEntry](`crate::deprecated_contract_class::StructAbiEntry`). +#[derive(Debug, Clone, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct StructMember { + pub name: String, + pub offset: usize, + pub r#type: String, +} + +#[derive(Debug, Clone, Default, Eq, PartialEq, Deserialize, Serialize)] +pub struct FunctionAbiEntry { + pub inputs: Vec, + pub name: String, + pub outputs: Vec, + #[serde(skip_serializing_if = "Option::is_none")] + #[serde(rename = "stateMutability")] + pub state_mutability: Option, +} + +impl<'de> Deserialize<'de> for AbiEntry { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + let raw_value = serde_json::Value::deserialize(deserializer)?; + if raw_value.get("data").is_some() { + let entry = serde_json::from_value(raw_value) + .map_err(|e| serde::de::Error::custom(format!("Invalid event ABI entry: {e}")))?; + Ok(AbiEntry::Event(entry)) + } else if raw_value.get("members").is_some() { + let entry = serde_json::from_value(raw_value) + .map_err(|e| serde::de::Error::custom(format!("Invalid struct ABI entry: {e}")))?; + Ok(AbiEntry::Struct(entry)) + } else if raw_value.get("inputs").is_some() { + let entry = serde_json::from_value(raw_value).map_err(|e| { + serde::de::Error::custom(format!("Invalid function ABI entry: {e}")) + })?; + Ok(AbiEntry::Function(entry)) + } else { + Err(serde::de::Error::custom(format!("Invalid ABI entry: {raw_value}"))) + } + } +} + +#[cfg(test)] +mod tests { + use super::FunctionAbiEntry; + + #[test] + fn deserialize_function_abi_entry() { + let json_str = r#"{ + "name": "foo", + "inputs": [ + { + "name": "bar", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "baz", + "type": "uint256" + } + ], + "stateMutability": "view" + }"#; + + serde_json::from_str::(json_str).unwrap(); + + let json_str = r#"{ + "name": "foo", + "inputs": [ + { + "name": "bar", + "type": "uint256" + } + ], + "outputs": [ + { + "name": "baz", + "type": "uint256" + } + ] + }"#; + + serde_json::from_str::(json_str).unwrap(); + } +} diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs new file mode 100644 index 000000000..6daea4fd8 --- /dev/null +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs @@ -0,0 +1,265 @@ +use core::fmt::{Debug, Display, Formatter}; +use std::collections::HashMap; + +use flate2::Compression; +use flate2::write::GzEncoder; +use serde::{Deserialize, Serialize}; +use serde_json::{Serializer as JsonSerializer, Value, json}; +use starknet_api::contract_class::EntryPointType; +use starknet_api::deprecated_contract_class::EntryPointV0; +use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; +use starknet_types_core::hash::{Pedersen, StarkHash}; + +use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; +use crate::error::{ConversionError, DevnetResult, Error, JsonError}; +use crate::felt::felt_from_prefixed_hex; +use crate::traits::HashProducer; +use crate::utils::StarknetFormatter; + +#[derive(Clone, Eq, PartialEq, Debug, Default, Serialize, Deserialize)] +pub struct Cairo0Json { + pub inner: Value, +} + +impl Cairo0Json { + pub fn raw_json_from_json_str(json_str: &str) -> DevnetResult { + let value: Value = serde_json::from_str(json_str).map_err(JsonError::SerdeJsonError)?; + + if value.is_object() { + Ok(Cairo0Json { inner: value }) + } else { + Err(Error::JsonError(JsonError::Custom { + msg: "expected JSON string to be an object".to_string(), + })) + } + } + + pub fn raw_json_from_path(path: &str) -> DevnetResult { + let contract_class_str = std::fs::read_to_string(path)?; + Cairo0Json::raw_json_from_json_str(&contract_class_str) + } + + /// Computes the hinted class hash of the contract class. + /// The parameter is a JSON object representing the contract class. + /// Pythonic hinted class hash computation is based on a JSON artifact produced by the + /// cairo-lang compiler. The JSON object contains his keys in alphabetical order. But when + /// those keys are made of digits only, they are sorted in ascending order. For example keys + /// "1", "10", "2" are sorted as "1", "2", "10" and keys "b", "a", "c" are sorted as "a", "b", + /// "c". The resulting object is being serialized to a string and then hashed. + /// In rust serde_json library when deserializing a JSON object, internally it uses a Map either + /// HashMap or IndexMap. Depending on the feature enabled if [preserver_order] is not enabled + /// HashMap will be used. In HashMap the keys order of insertion is not preserved and they + /// are sorted alphabetically, which doesn't work for our case, because the contract artifact + /// contains keys under the "hints" property that are only numbers. So we use IndexMap to + /// preserve order of the keys, but its disadvantage is removing entries from the json object, + /// because it uses swap_remove method on IndexMap, which doesn't preserve order. + /// So we traverse the JSON object and remove all entries with key - attributes or + /// accessible_scopes if they are empty arrays. + fn compute_hinted_class_hash(contract_class: &Value) -> crate::error::DevnetResult { + let mut abi_program_json = json!({ + "abi": contract_class.get("abi").unwrap_or(&Value::Null), + "program": contract_class.get("program").unwrap_or(&Value::Null) + }); + let program_json = abi_program_json + .get_mut("program") + .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; + + let debug_info_json = program_json.get_mut("debug_info"); + if debug_info_json.is_some() { + program_json + .as_object_mut() + .ok_or(JsonError::Custom { msg: "expected object".to_string() })? + .insert("debug_info".to_string(), serde_json::Value::Null); + } + + // Traverse the JSON and remove all entries with key attributes and accessible_scopes + // if they are empty arrays. + let modified_abi_program_json = + crate::utils::traverse_and_exclude_recursively(&abi_program_json, &|key, value| { + match value.as_array() { + Some(array) if array.is_empty() => { + key == "attributes" || key == "accessible_scopes" + } + _ => false, + } + }); + + let mut buffer = Vec::with_capacity(128); + let mut serializer = JsonSerializer::with_formatter(&mut buffer, StarknetFormatter); + modified_abi_program_json.serialize(&mut serializer).map_err(JsonError::SerdeJsonError)?; + + Ok(starknet_rs_core::utils::starknet_keccak(&buffer)) + } + + fn compute_cairo_0_contract_class_hash(json_class: &Value) -> crate::error::DevnetResult { + let mut hashes = vec![Felt::ZERO]; + + let entry_points_by_type: HashMap> = + serde_json::from_value( + json_class + .get("entry_points_by_type") + .ok_or(JsonError::Custom { + msg: "missing entry_points_by_type entry".to_string(), + })? + .clone(), + ) + .map_err(JsonError::SerdeJsonError)?; + + let entry_points_hash_by_type = |entry_point_type: EntryPointType| -> DevnetResult { + let felts: Vec = entry_points_by_type + .get(&entry_point_type) + .ok_or(ConversionError::InvalidInternalStructure( + "Missing entry point type".to_string(), + ))? + .iter() + .flat_map(|entry_point| { + let selector = entry_point.selector.0; + let offset = Felt::from(entry_point.offset.0 as u128); + + vec![selector, offset] + }) + .collect(); + + Ok(Pedersen::hash_array(&felts)) + }; + + hashes.push(entry_points_hash_by_type(EntryPointType::External)?); + hashes.push(entry_points_hash_by_type(EntryPointType::L1Handler)?); + hashes.push(entry_points_hash_by_type(EntryPointType::Constructor)?); + + let program_json = json_class + .get("program") + .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; + + let builtins_encoded_as_felts = program_json + .get("builtins") + .and_then(|v| v.as_array()) + .unwrap_or(&vec![]) + .iter() + .map(|el| { + el.as_str() + .map(|s| { + let hex_str = s + .as_bytes() + .iter() + .fold(String::from("0x"), |acc, &b| format!("{acc}{:02x}", b)); + felt_from_prefixed_hex(&hex_str) + }) + .ok_or(JsonError::Custom { msg: "expected string".into() })? + }) + .collect::>>()?; + + hashes.push(Pedersen::hash_array(&builtins_encoded_as_felts)); + + hashes.push(Cairo0Json::compute_hinted_class_hash(json_class)?); + + let program_data_felts = program_json + .get("data") + .unwrap_or(&serde_json::Value::Null) + .as_array() + .unwrap_or(&Vec::::new()) + .clone() + .into_iter() + .map(|v| { + felt_from_prefixed_hex( + v.as_str().ok_or(JsonError::Custom { msg: "expected string".into() })?, + ) + }) + .collect::>>()?; + + hashes.push(Pedersen::hash_array(&program_data_felts)); + + Ok(Pedersen::hash_array(&hashes)) + } +} + +impl Display for Cairo0Json { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + Display::fmt(&self.inner, f) + } +} + +impl TryInto for Cairo0Json { + type Error = Error; + fn try_into(self) -> Result { + let value = self.inner; + + let abi = value.get("abi"); + let entry_points_by_type = value + .get("entry_points_by_type") + .ok_or(JsonError::Custom { msg: "expected object".to_string() })?; + let program = + value.get("program").ok_or(JsonError::Custom { msg: "expected object".to_string() })?; + let compressed_program = json_into_raw_program(program)?; + + match abi { + Some(abi_json) => Ok(CompressedLegacyContractClass { + program: compressed_program, + entry_points_by_type: serde_json::from_value(entry_points_by_type.clone()) + .map_err(JsonError::SerdeJsonError)?, + abi: serde_json::from_value(abi_json.clone()).map_err(JsonError::SerdeJsonError)?, + }), + None => Ok(CompressedLegacyContractClass { + program: compressed_program, + entry_points_by_type: serde_json::from_value(entry_points_by_type.clone()) + .map_err(JsonError::SerdeJsonError)?, + abi: None, + }), + } + } +} + +impl HashProducer for Cairo0Json { + type Error = Error; + fn generate_hash(&self) -> DevnetResult { + Cairo0Json::compute_cairo_0_contract_class_hash(&self.inner) + } +} + +impl TryFrom for Cairo0Json { + type Error = Error; + fn try_from(value: DeprecatedContractClass) -> Result { + let abi_json = serde_json::to_value(value.abi).map_err(JsonError::SerdeJsonError)?; + let entry_points_json = + serde_json::to_value(value.entry_points_by_type).map_err(JsonError::SerdeJsonError)?; + + let json_value = json!({ + "program": value.program, + "abi": abi_json, + "entry_points_by_type": entry_points_json, + }); + + Ok(Cairo0Json { inner: json_value }) + } +} + +impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { + type Error = Error; + + fn try_from(value: Cairo0Json) -> Result { + serde_json::from_value(value.inner) + .map_err(|err| Error::JsonError(JsonError::SerdeJsonError(err))) + } +} + +pub fn json_into_raw_program(json_data: &Value) -> DevnetResult> { + let mut buffer = Vec::new(); + let encoder = GzEncoder::new(&mut buffer, Compression::best()); + serde_json::to_writer(encoder, &json_data).map_err(JsonError::SerdeJsonError)?; + + Ok(buffer) +} + +#[cfg(test)] +mod tests { + use starknet_rs_core::types::CompressedLegacyContractClass; + + use crate::contract_class::deprecated::Cairo0Json; + use crate::utils::test_utils::CAIRO_0_ACCOUNT_CONTRACT_PATH; + + #[test] + fn test_unzipped_to_codegen_conversion() { + let class = Cairo0Json::raw_json_from_path(CAIRO_0_ACCOUNT_CONTRACT_PATH).unwrap(); + let _: CompressedLegacyContractClass = class.try_into().unwrap(); + } +} diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index c533931c6..67fdafedc 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -1,36 +1,35 @@ -use std::collections::HashMap; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; -use serde::{Deserialize, Deserializer, Serialize}; -use serde_json::{json, Serializer as JsonSerializer, Value}; -use starknet_api::contract_class::EntryPointType; -use starknet_api::deprecated_contract_class::{ - ContractClass as DeprecatedContractClass, EntryPointV0, -}; -use starknet_rs_core::types::Felt; -use starknet_types_core::hash::{Pedersen, StarkHash}; - -use crate::error::{ConversionError, DevnetResult, Error, JsonError}; -use crate::felt::felt_from_prefixed_hex; +use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; +use crate::contract_class::deprecated::json_contract_class::Cairo0Json; +use crate::error::{DevnetResult, Error}; use crate::traits::HashProducer; -use crate::utils::StarknetFormatter; + +pub mod abi_entry; +pub mod json_contract_class; +pub mod rpc_contract_class; #[derive(Debug, Clone, Eq, PartialEq)] pub enum Cairo0ContractClass { + // TODO: remove once starknet_api raised + RawJson(Cairo0Json), Rpc(DeprecatedContractClass), } impl Cairo0ContractClass { pub fn from_json_str(s: &str) -> DevnetResult { - Ok(serde_json::from_str(s).map_err(JsonError::SerdeJsonError)?) + todo!() } } impl Serialize for Cairo0ContractClass { fn serialize(&self, serializer: S) -> Result where - S: serde::Serializer, + S: Serializer, { match self { + Cairo0ContractClass::RawJson(contract_json) => contract_json.serialize(serializer), Cairo0ContractClass::Rpc(contract) => contract.serialize(serializer), } } @@ -45,157 +44,44 @@ impl<'de> Deserialize<'de> for Cairo0ContractClass { } } +impl From for Cairo0ContractClass { + fn from(value: Cairo0Json) -> Self { + Cairo0ContractClass::RawJson(value) + } +} + impl From for Cairo0ContractClass { fn from(value: DeprecatedContractClass) -> Self { Cairo0ContractClass::Rpc(value) } } -/// Computes the hinted class hash of the contract class. -/// The parameter is a JSON object representing the contract class. -/// Pythonic hinted class hash computation is based on a JSON artifact produced by the -/// cairo-lang compiler. The JSON object contains his keys in alphabetical order. But when -/// those keys are made of digits only, they are sorted in ascending order. For example keys -/// "1", "10", "2" are sorted as "1", "2", "10" and keys "b", "a", "c" are sorted as "a", "b", -/// "c". The resulting object is being serialized to a string and then hashed. -/// In rust serde_json library when deserializing a JSON object, internally it uses a Map either -/// HashMap or IndexMap. Depending on the feature enabled if [preserver_order] is not enabled -/// HashMap will be used. In HashMap the keys order of insertion is not preserved and they -/// are sorted alphabetically, which doesn't work for our case, because the contract artifact -/// contains keys under the "hints" property that are only numbers. So we use IndexMap to -/// preserve order of the keys, but its disadvantage is removing entries from the json object, -/// because it uses swap_remove method on IndexMap, which doesn't preserve order. -/// So we traverse the JSON object and remove all entries with key - attributes or -/// accessible_scopes if they are empty arrays. -fn compute_hinted_class_hash(contract_class: &Value) -> crate::error::DevnetResult { - let mut abi_program_json = json!({ - "abi": contract_class.get("abi").unwrap_or(&Value::Null), - "program": contract_class.get("program").unwrap_or(&Value::Null) - }); - let program_json = abi_program_json - .get_mut("program") - .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; - - let debug_info_json = program_json.get_mut("debug_info"); - if debug_info_json.is_some() { - program_json - .as_object_mut() - .ok_or(JsonError::Custom { msg: "expected object".to_string() })? - .insert("debug_info".to_string(), serde_json::Value::Null); +impl HashProducer for Cairo0ContractClass { + type Error = Error; + fn generate_hash(&self) -> DevnetResult { + match self { + Cairo0ContractClass::RawJson(contract_json) => Ok(contract_json.generate_hash()?), + Cairo0ContractClass::Rpc(contract) => Ok(contract.generate_hash()?), + } } - - // Traverse the JSON and remove all entries with key attributes and accessible_scopes - // if they are empty arrays. - let modified_abi_program_json = crate::utils::traverse_and_exclude_recursively( - &abi_program_json, - &|key, value| match value.as_array() { - Some(array) if array.is_empty() => key == "attributes" || key == "accessible_scopes", - _ => false, - }, - ); - - let mut buffer = Vec::with_capacity(128); - let mut serializer = JsonSerializer::with_formatter(&mut buffer, StarknetFormatter); - modified_abi_program_json.serialize(&mut serializer).map_err(JsonError::SerdeJsonError)?; - - Ok(starknet_rs_core::utils::starknet_keccak(&buffer)) } -// TODO perhaps rely on an imported util? -fn compute_cairo_0_contract_class_hash(json_class: &Value) -> crate::error::DevnetResult { - let mut hashes = vec![Felt::ZERO]; - - let entry_points_by_type: HashMap> = serde_json::from_value( - json_class - .get("entry_points_by_type") - .ok_or(JsonError::Custom { msg: "missing entry_points_by_type entry".to_string() })? - .clone(), - ) - .map_err(JsonError::SerdeJsonError)?; - - let entry_points_hash_by_type = |entry_point_type: EntryPointType| -> DevnetResult { - let felts: Vec = entry_points_by_type - .get(&entry_point_type) - .ok_or(ConversionError::InvalidInternalStructure( - "Missing entry point type".to_string(), - ))? - .iter() - .flat_map(|entry_point| { - let selector = entry_point.selector.0; - let offset = Felt::from(entry_point.offset.0 as u128); - - vec![selector, offset] - }) - .collect(); - - Ok(Pedersen::hash_array(&felts)) - }; - - hashes.push(entry_points_hash_by_type(EntryPointType::External)?); - hashes.push(entry_points_hash_by_type(EntryPointType::L1Handler)?); - hashes.push(entry_points_hash_by_type(EntryPointType::Constructor)?); - - let program_json = json_class - .get("program") - .ok_or(JsonError::Custom { msg: "missing program entry".to_string() })?; - - let builtins_encoded_as_felts = program_json - .get("builtins") - .and_then(|v| v.as_array()) - .unwrap_or(&vec![]) - .iter() - .map(|el| { - el.as_str() - .map(|s| { - let hex_str = s - .as_bytes() - .iter() - .fold(String::from("0x"), |acc, &b| format!("{acc}{:02x}", b)); - felt_from_prefixed_hex(&hex_str) - }) - .ok_or(JsonError::Custom { msg: "expected string".into() })? - }) - .collect::>>()?; - - hashes.push(Pedersen::hash_array(&builtins_encoded_as_felts)); - - hashes.push(compute_hinted_class_hash(json_class)?); - - let program_data_felts = program_json - .get("data") - .unwrap_or(&serde_json::Value::Null) - .as_array() - .unwrap_or(&Vec::::new()) - .clone() - .into_iter() - .map(|v| { - felt_from_prefixed_hex( - v.as_str().ok_or(JsonError::Custom { msg: "expected string".into() })?, - ) - }) - .collect::>>()?; - - hashes.push(Pedersen::hash_array(&program_data_felts)); - - Ok(Pedersen::hash_array(&hashes)) -} - -impl HashProducer for Cairo0ContractClass { +impl TryInto for Cairo0ContractClass { type Error = Error; - fn generate_hash(&self) -> DevnetResult { + fn try_into(self) -> Result { match self { - Cairo0ContractClass::Rpc(class) => { - let class_json = serde_json::to_value(class).map_err(JsonError::SerdeJsonError)?; - compute_cairo_0_contract_class_hash(&class_json) - } + Cairo0ContractClass::Rpc(contract_class) => contract_class.try_into(), + Cairo0ContractClass::RawJson(contract_class) => contract_class.try_into(), } } } -impl From for starknet_api::deprecated_contract_class::ContractClass { - fn from(value: Cairo0ContractClass) -> Self { +impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { + type Error = Error; + fn try_from(value: Cairo0ContractClass) -> Result { match value { - Cairo0ContractClass::Rpc(contract_class) => contract_class, + Cairo0ContractClass::RawJson(contract_class) => contract_class.try_into(), + Cairo0ContractClass::Rpc(contract_class) => contract_class.try_into(), } } } diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs new file mode 100644 index 000000000..75da28de6 --- /dev/null +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs @@ -0,0 +1,115 @@ +use serde::{Deserialize, Serialize}; +use serde_json::Value; +use starknet_rs_core::types::{CompressedLegacyContractClass, Felt, LegacyEntryPointsByType}; + +use crate::contract_class::deprecated::Cairo0Json; +use crate::contract_class::deprecated::abi_entry::{AbiEntry, AbiEntryType}; +use crate::error::{DevnetResult, Error, JsonError}; +use crate::serde_helpers::base_64_gzipped_json_string::{ + deserialize_to_serde_json_value_with_keys_ordered_in_alphabetical_order, + serialize_program_to_base64, +}; +use crate::traits::HashProducer; + +#[derive(Debug, Clone, Eq, PartialEq, Deserialize, Serialize)] +pub struct ContractClassAbiEntryWithType { + #[serde(flatten)] + pub entry: AbiEntry, + pub r#type: AbiEntryType, +} + +#[derive(Debug, Clone, Deserialize, Serialize)] +pub struct DeprecatedContractClass { + /// A base64 encoding of the gzip-compressed JSON representation of program. + #[serde( + deserialize_with = "deserialize_to_serde_json_value_with_keys_ordered_in_alphabetical_order", + serialize_with = "serialize_program_to_base64" + )] + pub program: Value, + pub abi: Vec, + /// The selector of each entry point is a unique identifier in the program. + pub entry_points_by_type: LegacyEntryPointsByType, +} + +impl DeprecatedContractClass { + pub fn rpc_from_json_str(json_str: &str) -> DevnetResult { + let res: DeprecatedContractClass = + serde_json::from_str(json_str).map_err(JsonError::SerdeJsonError)?; + + Ok(res) + } + + pub fn rpc_from_path(path: &str) -> DevnetResult { + let contract_class_str = std::fs::read_to_string(path)?; + DeprecatedContractClass::rpc_from_json_str(&contract_class_str) + } +} + +impl PartialEq for DeprecatedContractClass { + fn eq(&self, other: &Self) -> bool { + self.program == other.program && self.abi == other.abi + } +} + +impl Eq for DeprecatedContractClass {} + +impl Default for DeprecatedContractClass { + fn default() -> Self { + Self { + program: Value::default(), + abi: Vec::new(), + entry_points_by_type: LegacyEntryPointsByType { + constructor: Vec::new(), + external: Vec::new(), + l1_handler: Vec::new(), + }, + } + } +} + +impl HashProducer for DeprecatedContractClass { + type Error = Error; + fn generate_hash(&self) -> DevnetResult { + let json_value: Cairo0Json = self.clone().try_into()?; + json_value.generate_hash() + } +} + +impl TryInto for DeprecatedContractClass { + type Error = Error; + fn try_into(self) -> Result { + // TODO: improve + let cairo0: Cairo0Json = self.try_into()?; + cairo0.try_into() + } +} + +impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { + type Error = Error; + + fn try_from(value: DeprecatedContractClass) -> Result { + let cairo_0_json = Cairo0Json::try_from(value)?; + cairo_0_json.try_into() + } +} + +#[cfg(test)] +mod tests { + use starknet_rs_core::types::CompressedLegacyContractClass; + + use crate::contract_class::deprecated::DeprecatedContractClass; + use crate::utils::test_utils::CAIRO_0_RPC_CONTRACT_PATH; + + #[test] + fn test_rpc_deserialization() { + DeprecatedContractClass::rpc_from_path(CAIRO_0_RPC_CONTRACT_PATH).unwrap(); + } + + #[test] + fn test_rpc_to_codegen() { + let contract_class = + DeprecatedContractClass::rpc_from_path(CAIRO_0_RPC_CONTRACT_PATH).unwrap(); + + let _: CompressedLegacyContractClass = contract_class.try_into().unwrap(); + } +} diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index d22ca5d37..1bd232888 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs @@ -92,7 +92,7 @@ mod tests { fn correct_transaction_hash_computation_compared_to_a_transaction_from_feeder_gateway() { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/events.json").unwrap(); - let cairo0 = Cairo0ContractClass::from_json_str(&json_str).unwrap(); + let cairo0: Cairo0ContractClass = serde_json::from_str(&json_str).unwrap(); // this is declare v1 transaction send with starknet-rs let json_obj: serde_json::Value = serde_json::from_reader(std::fs::File::open(concat!( diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index 12d59ead4..3a8d1a472 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -85,6 +85,9 @@ impl Formatter for StarknetFormatter { #[cfg(test)] pub(crate) mod test_utils { + pub(crate) const CAIRO_0_ACCOUNT_CONTRACT_PATH: &str = + "../../contracts/test_artifacts/cairo0/account.json"; + pub(crate) const CAIRO_0_RPC_CONTRACT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/test_data/cairo_0_rpc.json"); From 92773f829fb45dfe00d14f143d249fbded6db468 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 10:31:36 +0100 Subject: [PATCH 12/41] Remove from_json_str todo [skip ci] --- crates/starknet-devnet-core/src/account.rs | 5 +++-- crates/starknet-devnet-core/src/contract_class_choice.rs | 5 ++++- crates/starknet-devnet-core/src/system_contract.rs | 5 ++++- crates/starknet-devnet-types/src/rpc/contract_class.rs | 7 +++++++ .../src/rpc/contract_class/deprecated/mod.rs | 6 ------ 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/crates/starknet-devnet-core/src/account.rs b/crates/starknet-devnet-core/src/account.rs index 58ec9b8d1..94f7e1e38 100644 --- a/crates/starknet-devnet-core/src/account.rs +++ b/crates/starknet-devnet-core/src/account.rs @@ -6,7 +6,8 @@ use starknet_api::transaction::fields::{Calldata, ContractAddressSalt}; use starknet_api::{felt, patricia_key}; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; -use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; +use starknet_types::contract_class::deprecated::json_contract_class::Cairo0Json; +use starknet_types::contract_class::ContractClass; use starknet_types::error::Error; use starknet_types::felt::{felt_from_prefixed_hex, join_felts, split_biguint, ClassHash, Key}; use starknet_types::num_bigint::BigUint; @@ -49,7 +50,7 @@ impl Account { eth_fee_token_address: ContractAddress, strk_fee_token_address: ContractAddress, ) -> DevnetResult { - let account_contract_class = Cairo0ContractClass::from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; + let account_contract_class = Cairo0Json::raw_json_from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; let class_hash = account_contract_class.generate_hash()?; // very big number diff --git a/crates/starknet-devnet-core/src/contract_class_choice.rs b/crates/starknet-devnet-core/src/contract_class_choice.rs index f5c92d49d..40452dfd9 100644 --- a/crates/starknet-devnet-core/src/contract_class_choice.rs +++ b/crates/starknet-devnet-core/src/contract_class_choice.rs @@ -2,6 +2,7 @@ use std::str::FromStr; use starknet_rs_core::types::Felt; use starknet_rs_core::utils::get_selector_from_name; +use starknet_types::contract_class::deprecated::json_contract_class::Cairo0Json; use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::traits::HashProducer; @@ -18,7 +19,9 @@ impl AccountContractClassChoice { pub fn get_class_wrapper(&self) -> DevnetResult { Ok(match self { AccountContractClassChoice::Cairo0 => { - let contract_class = Cairo0ContractClass::from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; + let contract_json = Cairo0Json::raw_json_from_json_str(CAIRO_0_ACCOUNT_CONTRACT)?; + let contract_class = Cairo0ContractClass::RawJson(contract_json); + AccountClassWrapper { class_hash: contract_class.generate_hash()?, contract_class: ContractClass::Cairo0(contract_class), diff --git a/crates/starknet-devnet-core/src/system_contract.rs b/crates/starknet-devnet-core/src/system_contract.rs index 3ebc84710..4838e6837 100644 --- a/crates/starknet-devnet-core/src/system_contract.rs +++ b/crates/starknet-devnet-core/src/system_contract.rs @@ -1,6 +1,7 @@ use blockifier::state::state_api::StateReader; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; +use starknet_types::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::felt::ClassHash; use starknet_types::rpc::state::Balance; @@ -25,7 +26,9 @@ impl SystemContract { Ok(Self { class_hash, address: ContractAddress::new(address)?, - contract_class: Cairo0ContractClass::from_json_str(contract_class_json_str)?.into(), + contract_class: ContractClass::Cairo0(Cairo0ContractClass::Rpc( + DeprecatedContractClass::rpc_from_json_str(contract_class_json_str)?, + )), }) } diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 5fceef456..112b8d40b 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -5,6 +5,7 @@ use blockifier::execution::contract_class::RunnableCompiledClass; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use cairo_vm::types::errors::program_errors::ProgramError; +use deprecated::json_contract_class::Cairo0Json; use serde::de::IntoDeserializer; use serde::{Serialize, Serializer}; use starknet_api::contract_class::{ClassInfo, SierraVersion}; @@ -63,6 +64,12 @@ impl From for ContractClass { } } +impl From for ContractClass { + fn from(value: Cairo0Json) -> Self { + ContractClass::Cairo0(value.into()) + } +} + impl TryFrom for SierraContractClass { type Error = Error; fn try_from(value: ContractClass) -> Result { diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index 67fdafedc..3bedb0bfc 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -17,12 +17,6 @@ pub enum Cairo0ContractClass { Rpc(DeprecatedContractClass), } -impl Cairo0ContractClass { - pub fn from_json_str(s: &str) -> DevnetResult { - todo!() - } -} - impl Serialize for Cairo0ContractClass { fn serialize(&self, serializer: S) -> Result where From bab6e98e9c5dc2a8e15d52a5e3983f5e3c88ff21 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 11:28:12 +0100 Subject: [PATCH 13/41] Use RawJson in SystemContract::new_cairo0 [skip ci] --- crates/starknet-devnet-core/src/system_contract.rs | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/crates/starknet-devnet-core/src/system_contract.rs b/crates/starknet-devnet-core/src/system_contract.rs index 4838e6837..3b0510056 100644 --- a/crates/starknet-devnet-core/src/system_contract.rs +++ b/crates/starknet-devnet-core/src/system_contract.rs @@ -1,8 +1,8 @@ use blockifier::state::state_api::StateReader; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; -use starknet_types::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; -use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; +use starknet_types::contract_class::ContractClass; +use starknet_types::contract_class::deprecated::json_contract_class::Cairo0Json; use starknet_types::felt::ClassHash; use starknet_types::rpc::state::Balance; @@ -26,9 +26,7 @@ impl SystemContract { Ok(Self { class_hash, address: ContractAddress::new(address)?, - contract_class: ContractClass::Cairo0(Cairo0ContractClass::Rpc( - DeprecatedContractClass::rpc_from_json_str(contract_class_json_str)?, - )), + contract_class: Cairo0Json::raw_json_from_json_str(contract_class_json_str)?.into(), }) } From 5ead944218d0a89ee6a9d111c916f80fc19ec666 Mon Sep 17 00:00:00 2001 From: marioiordanov Date: Wed, 5 Feb 2025 12:40:48 +0200 Subject: [PATCH 14/41] cairo0 rpc contract class to RunnableCompiledClass --- .../src/rpc/contract_class.rs | 54 +++++++++++++++++-- 1 file changed, 50 insertions(+), 4 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 5fceef456..71e2416d0 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -1,17 +1,22 @@ use core::fmt::Debug; +use std::collections::HashMap; use std::str::FromStr; +use std::sync::Arc; -use blockifier::execution::contract_class::RunnableCompiledClass; +use blockifier::execution::contract_class::{ + CompiledClassV0, CompiledClassV0Inner, RunnableCompiledClass, deserialize_program, +}; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use cairo_vm::types::errors::program_errors::ProgramError; use serde::de::IntoDeserializer; use serde::{Serialize, Serializer}; -use starknet_api::contract_class::{ClassInfo, SierraVersion}; +use starknet_api::contract_class::{ClassInfo, EntryPointType, SierraVersion}; +use starknet_api::deprecated_contract_class::{EntryPointOffset, EntryPointV0}; use starknet_rs_core::types::contract::{SierraClass, SierraClassDebugInfo}; use starknet_rs_core::types::{ CompressedLegacyContractClass, ContractClass as CodegenContractClass, - FlattenedSierraClass as CodegenSierraContractClass, + FlattenedSierraClass as CodegenSierraContractClass, LegacyContractEntryPoint, }; use starknet_types_core::felt::Felt; @@ -246,7 +251,48 @@ impl TryFrom for RunnableCompiledClass { .map_err(|e| { Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) })?, - Cairo0ContractClass::Rpc(deprecated_contract_class) => todo!(), + Cairo0ContractClass::Rpc(deprecated_contract_class) => { + let deserializer = deprecated_contract_class.program.into_deserializer(); + let program = deserialize_program(deserializer).map_err(|e| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?; + + fn convert_to_entrypoints_v0<'a, I>(entry_points: I) -> Vec + where + I: Iterator, + { + entry_points + .map(|entry_point| EntryPointV0 { + selector: starknet_api::core::EntryPointSelector(entry_point.selector), + offset: EntryPointOffset(entry_point.offset as usize), + }) + .collect() + } + + let mut entry_points_by_type = HashMap::new(); + entry_points_by_type.insert( + EntryPointType::Constructor, + convert_to_entrypoints_v0( + deprecated_contract_class.entry_points_by_type.constructor.iter(), + ), + ); + + entry_points_by_type.insert( + EntryPointType::External, + convert_to_entrypoints_v0( + deprecated_contract_class.entry_points_by_type.external.iter(), + ), + ); + + entry_points_by_type.insert( + EntryPointType::L1Handler, + convert_to_entrypoints_v0( + deprecated_contract_class.entry_points_by_type.l1_handler.iter(), + ), + ); + + CompiledClassV0(Arc::new(CompiledClassV0Inner { program, entry_points_by_type })) + } })) } } From 53e9918157e23ad00c6ee180d18dd461ae3e295a Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 11:49:45 +0100 Subject: [PATCH 15/41] Fix formatting --- .../src/starknet/add_invoke_transaction.rs | 2 +- .../src/starknet/add_l1_handler_transaction.rs | 2 +- crates/starknet-devnet-core/src/system_contract.rs | 2 +- crates/starknet-devnet-types/src/rpc/contract_class.rs | 4 ++-- .../src/rpc/contract_class/deprecated/json_contract_class.rs | 4 ++-- .../src/rpc/contract_class/deprecated/mod.rs | 2 +- .../src/rpc/contract_class/deprecated/rpc_contract_class.rs | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs index 29ca07fae..2c39cb884 100644 --- a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs @@ -91,7 +91,7 @@ mod tests { ETH_ERC20_CONTRACT_ADDRESS, }; use crate::error::{Error, TransactionValidationError}; - use crate::starknet::{Starknet, predeployed}; + use crate::starknet::{predeployed, Starknet}; use crate::state::CustomState; use crate::traits::{Accounted, Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_0_contract_class; diff --git a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs index bc304b24d..a116b50a8 100644 --- a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs @@ -51,7 +51,7 @@ mod tests { self, DEVNET_DEFAULT_CHAIN_ID, DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, }; - use crate::starknet::{Starknet, predeployed}; + use crate::starknet::{predeployed, Starknet}; use crate::state::CustomState; use crate::traits::{Deployed, HashIdentifiedMut}; use crate::utils::exported_test_utils::dummy_cairo_l1l2_contract; diff --git a/crates/starknet-devnet-core/src/system_contract.rs b/crates/starknet-devnet-core/src/system_contract.rs index 3b0510056..12a22361c 100644 --- a/crates/starknet-devnet-core/src/system_contract.rs +++ b/crates/starknet-devnet-core/src/system_contract.rs @@ -1,8 +1,8 @@ use blockifier::state::state_api::StateReader; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; -use starknet_types::contract_class::ContractClass; use starknet_types::contract_class::deprecated::json_contract_class::Cairo0Json; +use starknet_types::contract_class::ContractClass; use starknet_types::felt::ClassHash; use starknet_types::rpc::state::Balance; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index d2389d240..2aaeb35a2 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -4,7 +4,7 @@ use std::str::FromStr; use std::sync::Arc; use blockifier::execution::contract_class::{ - CompiledClassV0, CompiledClassV0Inner, RunnableCompiledClass, deserialize_program, + deserialize_program, CompiledClassV0, CompiledClassV0Inner, RunnableCompiledClass, }; use cairo_lang_starknet_classes::casm_contract_class::CasmContractClass; use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; @@ -389,7 +389,7 @@ mod tests { use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; use serde_json::Deserializer; - use crate::contract_class::{ContractClass, convert_sierra_to_codegen}; + use crate::contract_class::{convert_sierra_to_codegen, ContractClass}; use crate::felt::felt_from_prefixed_hex; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; use crate::traits::HashProducer; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs index 6daea4fd8..3b9de4fdc 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/json_contract_class.rs @@ -1,10 +1,10 @@ use core::fmt::{Debug, Display, Formatter}; use std::collections::HashMap; -use flate2::Compression; use flate2::write::GzEncoder; +use flate2::Compression; use serde::{Deserialize, Serialize}; -use serde_json::{Serializer as JsonSerializer, Value, json}; +use serde_json::{json, Serializer as JsonSerializer, Value}; use starknet_api::contract_class::EntryPointType; use starknet_api::deprecated_contract_class::EntryPointV0; use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs index 3bedb0bfc..5ea0c4852 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/mod.rs @@ -1,8 +1,8 @@ use serde::{Deserialize, Deserializer, Serialize, Serializer}; use starknet_rs_core::types::{CompressedLegacyContractClass, Felt}; -use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; use crate::contract_class::deprecated::json_contract_class::Cairo0Json; +use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; use crate::error::{DevnetResult, Error}; use crate::traits::HashProducer; diff --git a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs index 75da28de6..40ecd9203 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs @@ -2,8 +2,8 @@ use serde::{Deserialize, Serialize}; use serde_json::Value; use starknet_rs_core::types::{CompressedLegacyContractClass, Felt, LegacyEntryPointsByType}; -use crate::contract_class::deprecated::Cairo0Json; use crate::contract_class::deprecated::abi_entry::{AbiEntry, AbiEntryType}; +use crate::contract_class::deprecated::Cairo0Json; use crate::error::{DevnetResult, Error, JsonError}; use crate::serde_helpers::base_64_gzipped_json_string::{ deserialize_to_serde_json_value_with_keys_ordered_in_alphabetical_order, From 4a039a9c5fb8bde696180472f08f115e918c238b Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 12:36:15 +0100 Subject: [PATCH 16/41] Fix loading of cairo0 test artifacts --- crates/starknet-devnet-core/src/utils.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index 6283a28b4..d2b2a686f 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -97,6 +97,7 @@ pub(crate) mod test_utils { use starknet_api::transaction::fields::Fee; use starknet_rs_core::types::Felt; use starknet_types::contract_address::ContractAddress; + use starknet_types::contract_class::deprecated::json_contract_class::Cairo0Json; use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; @@ -181,7 +182,7 @@ pub(crate) mod test_utils { let account_json_path = "../../contracts/test_artifacts/cairo0/account_without_validations/account.json"; - serde_json::from_reader(std::fs::File::open(account_json_path).unwrap()).unwrap() + Cairo0Json::raw_json_from_path(account_json_path).unwrap().into() } pub(crate) fn convert_broadcasted_declare_v2_to_v3( @@ -217,6 +218,7 @@ pub(crate) mod test_utils { #[allow(clippy::unwrap_used)] pub mod exported_test_utils { use starknet_rs_core::types::contract::legacy::LegacyContractClass; + use starknet_types::contract_class::deprecated::json_contract_class::Cairo0Json; use starknet_types::contract_class::Cairo0ContractClass; pub fn dummy_cairo_l1l2_contract() -> Cairo0ContractClass { @@ -238,7 +240,7 @@ pub mod exported_test_utils { std::fs::read_to_string("../../contracts/test_artifacts/cairo0/simple_contract.json") .unwrap(); - serde_json::from_str(&json_str).unwrap() + Cairo0Json::raw_json_from_json_str(&json_str).unwrap().into() } pub fn dummy_cairo_0_contract_class_codegen() -> LegacyContractClass { From 347a79c1806a0b167ccb302ea1e359716e0872cc Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 12:41:04 +0100 Subject: [PATCH 17/41] Revert cairo0 account deletion and deleted cairo0 tests --- contracts/test_artifacts/cairo0/account.json | 1 + .../src/rpc/contract_class.rs | 80 ++++++++++++++++++- crates/starknet-devnet-types/src/utils.rs | 3 + 3 files changed, 83 insertions(+), 1 deletion(-) create mode 100644 contracts/test_artifacts/cairo0/account.json diff --git a/contracts/test_artifacts/cairo0/account.json b/contracts/test_artifacts/cairo0/account.json new file mode 100644 index 000000000..7258b7637 --- /dev/null +++ b/contracts/test_artifacts/cairo0/account.json @@ -0,0 +1 @@ +{"abi":[{"members":[{"name":"to","offset":0,"type":"felt"},{"name":"selector","offset":1,"type":"felt"},{"name":"data_offset","offset":2,"type":"felt"},{"name":"data_len","offset":3,"type":"felt"}],"name":"AccountCallArray","size":4,"type":"struct"},{"inputs":[{"name":"publicKey","type":"felt"}],"name":"constructor","outputs":[],"type":"constructor"},{"inputs":[],"name":"getPublicKey","outputs":[{"name":"publicKey","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"interfaceId","type":"felt"}],"name":"supportsInterface","outputs":[{"name":"success","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"newPublicKey","type":"felt"}],"name":"setPublicKey","outputs":[],"type":"function"},{"inputs":[{"name":"hash","type":"felt"},{"name":"signature_len","type":"felt"},{"name":"signature","type":"felt*"}],"name":"isValidSignature","outputs":[{"name":"isValid","type":"felt"}],"stateMutability":"view","type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__validate__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"}],"name":"__validate_declare__","outputs":[],"type":"function"},{"inputs":[{"name":"class_hash","type":"felt"},{"name":"salt","type":"felt"},{"name":"publicKey","type":"felt"}],"name":"__validate_deploy__","outputs":[],"type":"function"},{"inputs":[{"name":"call_array_len","type":"felt"},{"name":"call_array","type":"AccountCallArray*"},{"name":"calldata_len","type":"felt"},{"name":"calldata","type":"felt*"}],"name":"__execute__","outputs":[{"name":"response_len","type":"felt"},{"name":"response","type":"felt*"}],"type":"function"}],"entry_points_by_type":{"CONSTRUCTOR":[{"offset":"0x16e","selector":"0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}],"EXTERNAL":[{"offset":"0x1cd","selector":"0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9"},{"offset":"0x2bb","selector":"0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad"},{"offset":"0x224","selector":"0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"},{"offset":"0x191","selector":"0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079"},{"offset":"0x1f4","selector":"0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e"},{"offset":"0x25f","selector":"0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3"},{"offset":"0x1b2","selector":"0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd"},{"offset":"0x285","selector":"0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895"}],"L1_HANDLER":[]},"program":{"attributes":[{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.assert_only_self"],"end_pc":192,"flow_tracking_data":{"ap_tracking":{"group":16,"offset":12},"reference_ids":{}},"name":"error_message","start_pc":191,"value":"Account: caller is not this account"},{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.execute"],"end_pc":269,"flow_tracking_data":{"ap_tracking":{"group":21,"offset":9},"reference_ids":{}},"name":"error_message","start_pc":259,"value":"Account: deprecated tx version"},{"accessible_scopes":["openzeppelin.account.library","openzeppelin.account.library.Account","openzeppelin.account.library.Account.execute"],"end_pc":274,"flow_tracking_data":{"ap_tracking":{"group":21,"offset":49},"reference_ids":{}},"name":"error_message","start_pc":272,"value":"Account: reentrant call"}],"builtins":["pedersen","range_check","ecdsa","bitwise"],"compiler_version":"0.10.2","data":["0x40780017fff7fff","0x1","0x208b7fff7fff7ffe","0x20780017fff7ffd","0x3","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080007fff8000","0x400080007ffd7fff","0x482480017ffd8001","0x1","0x482480017ffd8001","0x1","0xa0680017fff7ffe","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb","0x402a7ffc7ffd7fff","0x208b7fff7fff7ffe","0x480280007ffb8000","0x480280017ffb8000","0x484480017fff8000","0x2aaaaaaaaaaaab05555555555555556","0x48307fff7ffd8000","0x480280027ffb8000","0x480280037ffb8000","0x484480017fff8000","0x4000000000000088000000000000001","0x48307fff7ffd8000","0xa0680017fff8000","0xe","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48287ffc80007fff","0x40307ffc7ff87fff","0x48297ffd80007ffc","0x482680017ffd8000","0x1","0x48507fff7ffe8000","0x40507ff97ff57fff","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0xa0680017fff8000","0xc","0x480680017fff8000","0x800000000000011000000000000000000000000000000000000000000000000","0x48287ffd80007fff","0x48327fff7ffc8000","0x40307ffa7ff67fff","0x48527ffe7ffc8000","0x40507ff97ff57fff","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0x40317ffd7ff97ffd","0x48297ffc80007ffd","0x48527fff7ffc8000","0x40507ffb7ff77fff","0x40780017fff7fff","0x2","0x482680017ffb8000","0x4","0x208b7fff7fff7ffe","0x48297ffd80007ffc","0x20680017fff7fff","0x4","0x402780017ffc7ffc","0x1","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc","0x208b7fff7fff7ffe","0x480680017fff8000","0x43616c6c436f6e7472616374","0x400280007ff97fff","0x400380017ff97ffa","0x400380027ff97ffb","0x400380037ff97ffc","0x400380047ff97ffd","0x482680017ff98000","0x7","0x480280057ff98000","0x480280067ff98000","0x208b7fff7fff7ffe","0x480680017fff8000","0x47657443616c6c657241646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x476574436f6e747261637441646472657373","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f7261676552656164","0x400280007ffc7fff","0x400380017ffc7ffd","0x482680017ffc8000","0x3","0x480280027ffc8000","0x208b7fff7fff7ffe","0x480680017fff8000","0x53746f726167655772697465","0x400280007ffb7fff","0x400380017ffb7ffc","0x400380027ffb7ffd","0x482680017ffb8000","0x3","0x208b7fff7fff7ffe","0x480680017fff8000","0x4765745478496e666f","0x400280007ffd7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x208b7fff7fff7ffe","0x400380017ff97ffa","0x400380007ff97ffb","0x482680017ff98000","0x2","0x208b7fff7fff7ffe","0xa0680017fff8000","0xc","0x40780017fff7fff","0x6","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x480680017fff8000","0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f","0x208b7fff7fff7ffe","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa","0x480a7ffb7fff8000","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6","0x48127ffe7fff8000","0x48127ff57fff8000","0x48127ff57fff8000","0x48127ffc7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed","0x480a7ffa7fff8000","0x48127ffe7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0","0x48127ff67fff8000","0x48127ff67fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x208b7fff7fff7ffe","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa4","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a","0x40127fff7fff7ff9","0x48127ffe7fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x482680017ffd8000","0x800000000000010ffffffffffffffffffffffffffffffffffffffff59942a8c","0x20680017fff7fff","0x8","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbf","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ffa7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffac","0x480a7ff97fff8000","0x480a7ffb7fff8000","0x48127ffd7fff8000","0x480280007ffd8000","0x480280017ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff87","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffd7fff8000","0x48127ff37fff8000","0x480680017fff8000","0x1","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x480a7ff57fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff74","0x480a7ff97fff8000","0x480680017fff8000","0x1","0x480080007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a","0x480680017fff8000","0x1","0x40127fff7fff7ffe","0x40137ffd7fff8000","0x48127fdc7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49","0x400680017fff7fff","0x0","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef","0x40137fff7fff8001","0x48127ffb7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffd7fff8000","0x480a80017fff8000","0x1104800180018000","0x35","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee5","0x40137fff7fff8002","0x48127ffc7fff8000","0x480a7ffa7fff8000","0x480a80017fff8000","0x480a80027fff8000","0x1104800180018000","0xa","0x48127ffe7fff8000","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a80007fff8000","0x48127ffa7fff8000","0x480a80027fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x20780017fff7ffb","0x6","0x480a7ffa7fff8000","0x480680017fff8000","0x0","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480280007ffc8000","0x480280017ffc8000","0x480280027ffc8000","0x480280037ffc8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11","0x40137ffe7fff8000","0x40137fff7fff8001","0x40137ffd7fff8002","0x480a7ffd7fff8000","0x480a80017fff8000","0x480a80007fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2","0x480a80027fff8000","0x482680017ffb8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffc8000","0x4","0x482a80007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4","0x48127ffe7fff8000","0x482880007ffe8000","0x208b7fff7fff7ffe","0x20780017fff7ffa","0x4","0x480a7ff97fff8000","0x208b7fff7fff7ffe","0x480280007ffb8000","0x400280007ffd7fff","0x480280017ffb8000","0x400280017ffd7fff","0x480280037ffb8000","0x400280027ffd7fff","0x480280027ffb8000","0x48327fff7ffc8000","0x400280037ffd7fff","0x480a7ff97fff8000","0x482680017ffa8000","0x800000000000011000000000000000000000000000000000000000000000000","0x482680017ffb8000","0x4","0x480a7ffc7fff8000","0x482680017ffd8000","0x4","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3e","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x402b7ffd7ffc7ffd","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee","0x48127ff47fff8000","0x48127ff47fff8000","0x48127ffb7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff19","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3","0x40780017fff7fff","0x1","0x48127ffc7fff8000","0x48127ffc7fff8000","0x48127ffc7fff8000","0x480280037ffb8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04","0x208b7fff7fff7ffe","0x40780017fff7fff","0x1","0x4003800080007ffc","0x4826800180008000","0x1","0x480a7ffd7fff8000","0x4828800080007ffe","0x480a80007fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280017ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x2","0x480280017ffd8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x1","0x480280007ffd8000","0x480280017ffd8000","0x482680017ffd8000","0x2","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc","0x48127ffe7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3","0x48127ff37fff8000","0x48127ff37fff8000","0x48127ffb7fff8000","0x48127ff27fff8000","0x480280047ffb8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff67fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe61","0x48127ffe7fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecf","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x482480017ffc8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff38000","0x482480017ff28000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd3","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff97fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe26","0x48127ffe7fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe94","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x1","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff77fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe00","0x48127ffe7fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480080057ffb8000","0x480080037ffa8000","0x480080047ff98000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6e","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffb7fff8000","0x208b7fff7fff7ffe","0x482680017ffd8000","0x3","0x402a7ffd7ffc7fff","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280027ffb8000","0x480280007ffd8000","0x480280017ffd8000","0x480280027ffd8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6","0x40780017fff7fff","0x1","0x48127ffb7fff8000","0x48127ffb7fff8000","0x48127ffc7fff8000","0x48127ffa7fff8000","0x480280047ffb8000","0x480680017fff8000","0x0","0x48127ff97fff8000","0x208b7fff7fff7ffe","0x480a7ff57fff8000","0x480a7ff67fff8000","0x480a7ff77fff8000","0x480a7ff87fff8000","0x480a7ff97fff8000","0x480a7ffa7fff8000","0x480a7ffb7fff8000","0x480a7ffc7fff8000","0x480a7ffd7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5a","0x208b7fff7fff7ffe","0x40780017fff7fff","0x3","0x4003800080007ffb","0x400380007ffd7ffb","0x402780017ffd8001","0x1","0x4826800180008000","0x1","0x40297ffb7fff8002","0x4826800180008000","0x1","0x480a7ffc7fff8000","0x480a7ffb7fff8000","0x1104800180018000","0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f","0x480a80017fff8000","0x4829800080008002","0x480a80007fff8000","0x208b7fff7fff7ffe","0x40780017fff7fff","0x4","0x480280027ffb8000","0x480280007ffd8000","0x400080007ffe7fff","0x482680017ffd8000","0x1","0x480280007ffd8000","0x484480017fff8000","0x4","0x48307fff7ffd8000","0x480280027ffb8000","0x480080007ffe8000","0x400080017ffe7fff","0x482480017ffd8000","0x1","0x480080007ffc8000","0x48307fff7ffe8000","0x402a7ffd7ffc7fff","0x480280027ffb8000","0x480280007ffb8000","0x480280017ffb8000","0x480280037ffb8000","0x480280047ffb8000","0x482480017ffb8000","0x2","0x480280007ffd8000","0x482680017ffd8000","0x1","0x480080007ff28000","0x482480017ff18000","0x1","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2","0x40137ff97fff8000","0x40137ffa7fff8001","0x40137ffb7fff8002","0x40137ffc7fff8003","0x48127ffd7fff8000","0x1104800180018000","0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7","0x480a80007fff8000","0x480a80017fff8000","0x48127ffb7fff8000","0x480a80027fff8000","0x480a80037fff8000","0x48127ff97fff8000","0x48127ff97fff8000","0x208b7fff7fff7ffe"],"debug_info":[],"hints":{"0":[{"accessible_scopes":["starkware.cairo.common.alloc","starkware.cairo.common.alloc.alloc"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":0,"offset":0},"reference_ids":{}}}],"6":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_enter_scope({'n': ids.len})","flow_tracking_data":{"ap_tracking":{"group":1,"offset":0},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.len":0}}}],"14":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"n -= 1\nids.continue_copying = 1 if n > 0 else 0","flow_tracking_data":{"ap_tracking":{"group":1,"offset":5},"reference_ids":{"starkware.cairo.common.memcpy.memcpy.continue_copying":1}}}],"17":[{"accessible_scopes":["starkware.cairo.common.memcpy","starkware.cairo.common.memcpy.memcpy"],"code":"vm_exit_scope()","flow_tracking_data":{"ap_tracking":{"group":1,"offset":6},"reference_ids":{}}}],"18":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))","flow_tracking_data":{"ap_tracking":{"group":2,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_le_felt.a":2,"starkware.cairo.common.math.assert_le_felt.b":3,"starkware.cairo.common.math.assert_le_felt.range_check_ptr":4}}}],"28":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"memory[ap] = 1 if excluded != 0 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":8},"reference_ids":{}}}],"42":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"memory[ap] = 1 if excluded != 1 else 0","flow_tracking_data":{"ap_tracking":{"group":2,"offset":9},"reference_ids":{}}}],"54":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_le_felt"],"code":"assert excluded == 2","flow_tracking_data":{"ap_tracking":{"group":2,"offset":10},"reference_ids":{}}}],"63":[{"accessible_scopes":["starkware.cairo.common.math","starkware.cairo.common.math.assert_lt_felt"],"code":"from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'","flow_tracking_data":{"ap_tracking":{"group":3,"offset":0},"reference_ids":{"starkware.cairo.common.math.assert_lt_felt.a":5,"starkware.cairo.common.math.assert_lt_felt.b":6}}}],"81":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.call_contract"],"code":"syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":4,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.call_contract.syscall_ptr":7}}}],"89":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_caller_address"],"code":"syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":5,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":8}}}],"96":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_contract_address"],"code":"syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":6,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":9}}}],"104":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_read"],"code":"syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":7,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_read.syscall_ptr":10}}}],"113":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.storage_write"],"code":"syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":8,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.storage_write.syscall_ptr":11}}}],"119":[{"accessible_scopes":["starkware.starknet.common.syscalls","starkware.starknet.common.syscalls.get_tx_info"],"code":"syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)","flow_tracking_data":{"ap_tracking":{"group":9,"offset":1},"reference_ids":{"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":12}}}],"123":[{"accessible_scopes":["starkware.cairo.common.signature","starkware.cairo.common.signature.verify_ecdsa_signature"],"code":"ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))","flow_tracking_data":{"ap_tracking":{"group":10,"offset":0},"reference_ids":{"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":15,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":13,"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":14}}}],"128":[{"accessible_scopes":["starkware.cairo.common.math_cmp","starkware.cairo.common.math_cmp.is_le_felt"],"code":"memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1","flow_tracking_data":{"ap_tracking":{"group":11,"offset":0},"reference_ids":{"starkware.cairo.common.math_cmp.is_le_felt.a":16,"starkware.cairo.common.math_cmp.is_le_felt.b":17}}}],"375":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.constructor"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":30,"offset":35},"reference_ids":{}}}],"392":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.getPublicKey_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":32,"offset":0},"reference_ids":{}}}],"425":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.supportsInterface_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":36,"offset":0},"reference_ids":{}}}],"470":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.setPublicKey"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":40,"offset":50},"reference_ids":{}}}],"491":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.isValidSignature_encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":42,"offset":0},"reference_ids":{}}}],"579":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":45,"offset":77},"reference_ids":{}}}],"617":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_declare__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":47,"offset":63},"reference_ids":{}}}],"657":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__validate_deploy__"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":49,"offset":65},"reference_ids":{}}}],"680":[{"accessible_scopes":["__main__","__main__","__wrappers__","__wrappers__.__execute___encode_return"],"code":"memory[ap] = segments.add()","flow_tracking_data":{"ap_tracking":{"group":52,"offset":0},"reference_ids":{}}}]},"identifiers":{"__main__.Account":{"destination":"openzeppelin.account.library.Account","type":"alias"},"__main__.AccountCallArray":{"destination":"openzeppelin.account.library.AccountCallArray","type":"alias"},"__main__.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"__main__.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"__main__.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"__main__.__execute__":{"decorators":["external"],"pc":668,"type":"function"},"__main__.__execute__.Args":{"full_name":"__main__.__execute__.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__execute__.ImplicitArgs":{"full_name":"__main__.__execute__.ImplicitArgs","members":{"bitwise_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin*","offset":3},"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":4},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":5,"type":"struct"},"__main__.__execute__.Return":{"cairo_type":"(response_len: felt, response: felt*)","type":"type_definition"},"__main__.__execute__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate__":{"decorators":["external"],"pc":531,"type":"function"},"__main__.__validate__.Args":{"full_name":"__main__.__validate__.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"__main__.__validate__.ImplicitArgs":{"full_name":"__main__.__validate__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_declare__":{"decorators":["external"],"pc":590,"type":"function"},"__main__.__validate_declare__.Args":{"full_name":"__main__.__validate_declare__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.__validate_declare__.ImplicitArgs":{"full_name":"__main__.__validate_declare__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_declare__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.__validate_deploy__":{"decorators":["external"],"pc":628,"type":"function"},"__main__.__validate_deploy__.Args":{"full_name":"__main__.__validate_deploy__.Args","members":{"class_hash":{"cairo_type":"felt","offset":0},"publicKey":{"cairo_type":"felt","offset":2},"salt":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.__validate_deploy__.ImplicitArgs":{"full_name":"__main__.__validate_deploy__.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.__validate_deploy__.Return":{"cairo_type":"()","type":"type_definition"},"__main__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.constructor":{"decorators":["constructor"],"pc":359,"type":"function"},"__main__.constructor.Args":{"full_name":"__main__.constructor.Args","members":{"publicKey":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.constructor.ImplicitArgs":{"full_name":"__main__.constructor.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.constructor.Return":{"cairo_type":"()","type":"type_definition"},"__main__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.getPublicKey":{"decorators":["view"],"pc":386,"type":"function"},"__main__.getPublicKey.Args":{"full_name":"__main__.getPublicKey.Args","members":{},"size":0,"type":"struct"},"__main__.getPublicKey.ImplicitArgs":{"full_name":"__main__.getPublicKey.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.getPublicKey.Return":{"cairo_type":"(publicKey: felt)","type":"type_definition"},"__main__.getPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"__main__.isValidSignature":{"decorators":["view"],"pc":481,"type":"function"},"__main__.isValidSignature.Args":{"full_name":"__main__.isValidSignature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"signature":{"cairo_type":"felt*","offset":2},"signature_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"__main__.isValidSignature.ImplicitArgs":{"full_name":"__main__.isValidSignature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"__main__.isValidSignature.Return":{"cairo_type":"(isValid: felt)","type":"type_definition"},"__main__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.setPublicKey":{"decorators":["external"],"pc":454,"type":"function"},"__main__.setPublicKey.Args":{"full_name":"__main__.setPublicKey.Args","members":{"newPublicKey":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.setPublicKey.ImplicitArgs":{"full_name":"__main__.setPublicKey.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.setPublicKey.Return":{"cairo_type":"()","type":"type_definition"},"__main__.setPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__main__.supportsInterface":{"decorators":["view"],"pc":418,"type":"function"},"__main__.supportsInterface.Args":{"full_name":"__main__.supportsInterface.Args","members":{"interfaceId":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"__main__.supportsInterface.ImplicitArgs":{"full_name":"__main__.supportsInterface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"__main__.supportsInterface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"__main__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__execute__":{"decorators":["external"],"pc":699,"type":"function"},"__wrappers__.__execute__.Args":{"full_name":"__wrappers__.__execute__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.ImplicitArgs":{"full_name":"__wrappers__.__execute__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: starkware.cairo.common.cairo_builtins.BitwiseBuiltin*, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__execute__.SIZEOF_LOCALS":{"type":"const","value":4},"__wrappers__.__execute__.__wrapped_func":{"destination":"__main__.__execute__","type":"alias"},"__wrappers__.__execute___encode_return":{"decorators":[],"pc":680,"type":"function"},"__wrappers__.__execute___encode_return.Args":{"full_name":"__wrappers__.__execute___encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":2},"ret_value":{"cairo_type":"(response_len: felt, response: felt*)","offset":0}},"size":3,"type":"struct"},"__wrappers__.__execute___encode_return.ImplicitArgs":{"full_name":"__wrappers__.__execute___encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__execute___encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.__execute___encode_return.SIZEOF_LOCALS":{"type":"const","value":3},"__wrappers__.__execute___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate__":{"decorators":["external"],"pc":548,"type":"function"},"__wrappers__.__validate__.Args":{"full_name":"__wrappers__.__validate__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.ImplicitArgs":{"full_name":"__wrappers__.__validate__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate__.__wrapped_func":{"destination":"__main__.__validate__","type":"alias"},"__wrappers__.__validate___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_declare__":{"decorators":["external"],"pc":607,"type":"function"},"__wrappers__.__validate_declare__.Args":{"full_name":"__wrappers__.__validate_declare__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.ImplicitArgs":{"full_name":"__wrappers__.__validate_declare__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_declare__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_declare__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_declare__.__wrapped_func":{"destination":"__main__.__validate_declare__","type":"alias"},"__wrappers__.__validate_declare___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.__validate_deploy__":{"decorators":["external"],"pc":645,"type":"function"},"__wrappers__.__validate_deploy__.Args":{"full_name":"__wrappers__.__validate_deploy__.Args","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.ImplicitArgs":{"full_name":"__wrappers__.__validate_deploy__.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.__validate_deploy__.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.__validate_deploy__.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.__validate_deploy__.__wrapped_func":{"destination":"__main__.__validate_deploy__","type":"alias"},"__wrappers__.__validate_deploy___encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.constructor":{"decorators":["constructor"],"pc":366,"type":"function"},"__wrappers__.constructor.Args":{"full_name":"__wrappers__.constructor.Args","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.ImplicitArgs":{"full_name":"__wrappers__.constructor.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.constructor.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.constructor.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.constructor.__wrapped_func":{"destination":"__main__.constructor","type":"alias"},"__wrappers__.constructor_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.getPublicKey":{"decorators":["view"],"pc":401,"type":"function"},"__wrappers__.getPublicKey.Args":{"full_name":"__wrappers__.getPublicKey.Args","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey.ImplicitArgs":{"full_name":"__wrappers__.getPublicKey.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.getPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.getPublicKey.__wrapped_func":{"destination":"__main__.getPublicKey","type":"alias"},"__wrappers__.getPublicKey_encode_return":{"decorators":[],"pc":392,"type":"function"},"__wrappers__.getPublicKey_encode_return.Args":{"full_name":"__wrappers__.getPublicKey_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(publicKey: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.getPublicKey_encode_return.ImplicitArgs":{"full_name":"__wrappers__.getPublicKey_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.getPublicKey_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.getPublicKey_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.getPublicKey_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.isValidSignature":{"decorators":["view"],"pc":500,"type":"function"},"__wrappers__.isValidSignature.Args":{"full_name":"__wrappers__.isValidSignature.Args","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.isValidSignature.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.isValidSignature.__wrapped_func":{"destination":"__main__.isValidSignature","type":"alias"},"__wrappers__.isValidSignature_encode_return":{"decorators":[],"pc":491,"type":"function"},"__wrappers__.isValidSignature_encode_return.Args":{"full_name":"__wrappers__.isValidSignature_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(isValid: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.isValidSignature_encode_return.ImplicitArgs":{"full_name":"__wrappers__.isValidSignature_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.isValidSignature_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.isValidSignature_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.setPublicKey":{"decorators":["external"],"pc":461,"type":"function"},"__wrappers__.setPublicKey.Args":{"full_name":"__wrappers__.setPublicKey.Args","members":{},"size":0,"type":"struct"},"__wrappers__.setPublicKey.ImplicitArgs":{"full_name":"__wrappers__.setPublicKey.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.setPublicKey.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.setPublicKey.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.setPublicKey.__wrapped_func":{"destination":"__main__.setPublicKey","type":"alias"},"__wrappers__.setPublicKey_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"__wrappers__.supportsInterface":{"decorators":["view"],"pc":434,"type":"function"},"__wrappers__.supportsInterface.Args":{"full_name":"__wrappers__.supportsInterface.Args","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface.Return":{"cairo_type":"(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)","type":"type_definition"},"__wrappers__.supportsInterface.SIZEOF_LOCALS":{"type":"const","value":0},"__wrappers__.supportsInterface.__wrapped_func":{"destination":"__main__.supportsInterface","type":"alias"},"__wrappers__.supportsInterface_encode_return":{"decorators":[],"pc":425,"type":"function"},"__wrappers__.supportsInterface_encode_return.Args":{"full_name":"__wrappers__.supportsInterface_encode_return.Args","members":{"range_check_ptr":{"cairo_type":"felt","offset":1},"ret_value":{"cairo_type":"(success: felt)","offset":0}},"size":2,"type":"struct"},"__wrappers__.supportsInterface_encode_return.ImplicitArgs":{"full_name":"__wrappers__.supportsInterface_encode_return.ImplicitArgs","members":{},"size":0,"type":"struct"},"__wrappers__.supportsInterface_encode_return.Return":{"cairo_type":"(range_check_ptr: felt, data_len: felt, data: felt*)","type":"type_definition"},"__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS":{"type":"const","value":1},"__wrappers__.supportsInterface_encode_return.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"openzeppelin.account.library.Account":{"type":"namespace"},"openzeppelin.account.library.Account.Args":{"full_name":"openzeppelin.account.library.Account.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.ImplicitArgs","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account._execute_list":{"decorators":[],"pc":301,"type":"function"},"openzeppelin.account.library.Account._execute_list.Args":{"full_name":"openzeppelin.account.library.Account._execute_list.Args","members":{"calls":{"cairo_type":"openzeppelin.account.library.Call*","offset":1},"calls_len":{"cairo_type":"felt","offset":0},"response":{"cairo_type":"felt*","offset":2}},"size":3,"type":"struct"},"openzeppelin.account.library.Account._execute_list.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account._execute_list.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account._execute_list.Return":{"cairo_type":"(response_len: felt)","type":"type_definition"},"openzeppelin.account.library.Account._execute_list.SIZEOF_LOCALS":{"type":"const","value":3},"openzeppelin.account.library.Account._from_call_array_to_call":{"decorators":[],"pc":335,"type":"function"},"openzeppelin.account.library.Account._from_call_array_to_call.Args":{"full_name":"openzeppelin.account.library.Account._from_call_array_to_call.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":2},"calls":{"cairo_type":"openzeppelin.account.library.Call*","offset":3}},"size":4,"type":"struct"},"openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account._from_call_array_to_call.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account._from_call_array_to_call.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.assert_only_self":{"decorators":[],"pc":185,"type":"function"},"openzeppelin.account.library.Account.assert_only_self.Args":{"full_name":"openzeppelin.account.library.Account.assert_only_self.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.assert_only_self.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.assert_only_self.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.assert_only_self.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.assert_only_self.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.execute":{"decorators":[],"pc":254,"type":"function"},"openzeppelin.account.library.Account.execute.Args":{"full_name":"openzeppelin.account.library.Account.execute.Args","members":{"call_array":{"cairo_type":"openzeppelin.account.library.AccountCallArray*","offset":1},"call_array_len":{"cairo_type":"felt","offset":0},"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2}},"size":4,"type":"struct"},"openzeppelin.account.library.Account.execute.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.execute.ImplicitArgs","members":{"bitwise_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin*","offset":3},"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":4},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":5,"type":"struct"},"openzeppelin.account.library.Account.execute.Return":{"cairo_type":"(response_len: felt, response: felt*)","type":"type_definition"},"openzeppelin.account.library.Account.execute.SIZEOF_LOCALS":{"type":"const","value":3},"openzeppelin.account.library.Account.get_public_key":{"decorators":[],"pc":194,"type":"function"},"openzeppelin.account.library.Account.get_public_key.Args":{"full_name":"openzeppelin.account.library.Account.get_public_key.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account.get_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.get_public_key.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.get_public_key.Return":{"cairo_type":"(public_key: felt)","type":"type_definition"},"openzeppelin.account.library.Account.get_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.initializer":{"decorators":[],"pc":178,"type":"function"},"openzeppelin.account.library.Account.initializer.Args":{"full_name":"openzeppelin.account.library.Account.initializer.Args","members":{"_public_key":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.initializer.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.initializer.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.initializer.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.initializer.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.is_valid_signature":{"decorators":[],"pc":235,"type":"function"},"openzeppelin.account.library.Account.is_valid_signature.Args":{"full_name":"openzeppelin.account.library.Account.is_valid_signature.Args","members":{"hash":{"cairo_type":"felt","offset":0},"signature":{"cairo_type":"felt*","offset":2},"signature_len":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":2},"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":3},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.Account.is_valid_signature.Return":{"cairo_type":"(is_valid: felt)","type":"type_definition"},"openzeppelin.account.library.Account.is_valid_signature.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.set_public_key":{"decorators":[],"pc":226,"type":"function"},"openzeppelin.account.library.Account.set_public_key.Args":{"full_name":"openzeppelin.account.library.Account.set_public_key.Args","members":{"new_public_key":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.set_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.set_public_key.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.set_public_key.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account.set_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account.supports_interface":{"decorators":[],"pc":200,"type":"function"},"openzeppelin.account.library.Account.supports_interface.Args":{"full_name":"openzeppelin.account.library.Account.supports_interface.Args","members":{"interface_id":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account.supports_interface.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account.supports_interface.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account.supports_interface.Return":{"cairo_type":"(success: felt)","type":"type_definition"},"openzeppelin.account.library.Account.supports_interface.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.AccountCallArray":{"full_name":"openzeppelin.account.library.AccountCallArray","members":{"data_len":{"cairo_type":"felt","offset":3},"data_offset":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.Account_public_key":{"type":"namespace"},"openzeppelin.account.library.Account_public_key.Args":{"full_name":"openzeppelin.account.library.Account_public_key.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"openzeppelin.account.library.Account_public_key.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.ImplicitArgs","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account_public_key.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.addr":{"decorators":[],"pc":148,"type":"function"},"openzeppelin.account.library.Account_public_key.addr.Args":{"full_name":"openzeppelin.account.library.Account_public_key.addr.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.addr.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.addr.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":0},"range_check_ptr":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"openzeppelin.account.library.Account_public_key.addr.Return":{"cairo_type":"(res: felt)","type":"type_definition"},"openzeppelin.account.library.Account_public_key.addr.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.hash2":{"destination":"starkware.cairo.common.hash.hash2","type":"alias"},"openzeppelin.account.library.Account_public_key.normalize_address":{"destination":"starkware.starknet.common.storage.normalize_address","type":"alias"},"openzeppelin.account.library.Account_public_key.read":{"decorators":[],"pc":153,"type":"function"},"openzeppelin.account.library.Account_public_key.read.Args":{"full_name":"openzeppelin.account.library.Account_public_key.read.Args","members":{},"size":0,"type":"struct"},"openzeppelin.account.library.Account_public_key.read.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.read.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account_public_key.read.Return":{"cairo_type":"(public_key: felt)","type":"type_definition"},"openzeppelin.account.library.Account_public_key.read.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.Account_public_key.storage_read":{"destination":"starkware.starknet.common.syscalls.storage_read","type":"alias"},"openzeppelin.account.library.Account_public_key.storage_write":{"destination":"starkware.starknet.common.syscalls.storage_write","type":"alias"},"openzeppelin.account.library.Account_public_key.write":{"decorators":[],"pc":166,"type":"function"},"openzeppelin.account.library.Account_public_key.write.Args":{"full_name":"openzeppelin.account.library.Account_public_key.write.Args","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"openzeppelin.account.library.Account_public_key.write.ImplicitArgs":{"full_name":"openzeppelin.account.library.Account_public_key.write.ImplicitArgs","members":{"pedersen_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.HashBuiltin*","offset":1},"range_check_ptr":{"cairo_type":"felt","offset":2},"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":3,"type":"struct"},"openzeppelin.account.library.Account_public_key.write.Return":{"cairo_type":"()","type":"type_definition"},"openzeppelin.account.library.Account_public_key.write.SIZEOF_LOCALS":{"type":"const","value":0},"openzeppelin.account.library.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"openzeppelin.account.library.Call":{"full_name":"openzeppelin.account.library.Call","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_len":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":1},"to":{"cairo_type":"felt","offset":0}},"size":4,"type":"struct"},"openzeppelin.account.library.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"openzeppelin.account.library.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"openzeppelin.account.library.IACCOUNT_ID":{"destination":"openzeppelin.utils.constants.library.IACCOUNT_ID","type":"alias"},"openzeppelin.account.library.IERC165_ID":{"destination":"openzeppelin.utils.constants.library.IERC165_ID","type":"alias"},"openzeppelin.account.library.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"openzeppelin.account.library.TRANSACTION_VERSION":{"destination":"openzeppelin.utils.constants.library.TRANSACTION_VERSION","type":"alias"},"openzeppelin.account.library.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"openzeppelin.account.library.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"openzeppelin.account.library.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"openzeppelin.account.library.call_contract":{"destination":"starkware.starknet.common.syscalls.call_contract","type":"alias"},"openzeppelin.account.library.get_caller_address":{"destination":"starkware.starknet.common.syscalls.get_caller_address","type":"alias"},"openzeppelin.account.library.get_contract_address":{"destination":"starkware.starknet.common.syscalls.get_contract_address","type":"alias"},"openzeppelin.account.library.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"openzeppelin.account.library.get_tx_info":{"destination":"starkware.starknet.common.syscalls.get_tx_info","type":"alias"},"openzeppelin.account.library.is_le_felt":{"destination":"starkware.cairo.common.math_cmp.is_le_felt","type":"alias"},"openzeppelin.account.library.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"openzeppelin.account.library.split_felt":{"destination":"starkware.cairo.common.math.split_felt","type":"alias"},"openzeppelin.account.library.verify_ecdsa_signature":{"destination":"starkware.cairo.common.signature.verify_ecdsa_signature","type":"alias"},"openzeppelin.account.library.verify_eth_signature_uint256":{"destination":"starkware.cairo.common.cairo_secp.signature.verify_eth_signature_uint256","type":"alias"},"openzeppelin.utils.constants.library.DEFAULT_ADMIN_ROLE":{"type":"const","value":0},"openzeppelin.utils.constants.library.IACCESSCONTROL_ID":{"type":"const","value":2036718347},"openzeppelin.utils.constants.library.IACCOUNT_ID":{"type":"const","value":2792084853},"openzeppelin.utils.constants.library.IERC165_ID":{"type":"const","value":33540519},"openzeppelin.utils.constants.library.IERC721_ENUMERABLE_ID":{"type":"const","value":2014223715},"openzeppelin.utils.constants.library.IERC721_ID":{"type":"const","value":2158778573},"openzeppelin.utils.constants.library.IERC721_METADATA_ID":{"type":"const","value":1532892063},"openzeppelin.utils.constants.library.IERC721_RECEIVER_ID":{"type":"const","value":353073666},"openzeppelin.utils.constants.library.INVALID_ID":{"type":"const","value":4294967295},"openzeppelin.utils.constants.library.TRANSACTION_VERSION":{"type":"const","value":1},"openzeppelin.utils.constants.library.UINT8_MAX":{"type":"const","value":255},"starkware.cairo.common.alloc.alloc":{"decorators":[],"pc":0,"type":"function"},"starkware.cairo.common.alloc.alloc.Args":{"full_name":"starkware.cairo.common.alloc.alloc.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.ImplicitArgs":{"full_name":"starkware.cairo.common.alloc.alloc.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.alloc.alloc.Return":{"cairo_type":"(ptr: felt*)","type":"type_definition"},"starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.bitwise.ALL_ONES":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719234},"starkware.cairo.common.bitwise.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.bool.FALSE":{"type":"const","value":0},"starkware.cairo.common.bool.TRUE":{"type":"const","value":1},"starkware.cairo.common.cairo_builtins.BitwiseBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","members":{"x":{"cairo_type":"felt","offset":0},"x_and_y":{"cairo_type":"felt","offset":2},"x_or_y":{"cairo_type":"felt","offset":4},"x_xor_y":{"cairo_type":"felt","offset":3},"y":{"cairo_type":"felt","offset":1}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcOpBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","members":{"m":{"cairo_type":"felt","offset":4},"p":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":0},"q":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":2},"r":{"cairo_type":"starkware.cairo.common.ec_point.EcPoint","offset":5}},"size":7,"type":"struct"},"starkware.cairo.common.cairo_builtins.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.cairo_builtins.HashBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.HashBuiltin","members":{"result":{"cairo_type":"felt","offset":2},"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.KeccakBuiltin","members":{"input":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":0},"output":{"cairo_type":"starkware.cairo.common.keccak_state.KeccakBuiltinState","offset":8}},"size":16,"type":"struct"},"starkware.cairo.common.cairo_builtins.KeccakBuiltinState":{"destination":"starkware.cairo.common.keccak_state.KeccakBuiltinState","type":"alias"},"starkware.cairo.common.cairo_builtins.SignatureBuiltin":{"full_name":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","members":{"message":{"cairo_type":"felt","offset":1},"pub_key":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.cairo_keccak.keccak.BLOCK_SIZE":{"destination":"starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.BYTES_IN_WORD":{"type":"const","value":8},"starkware.cairo.common.cairo_keccak.keccak.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_CAPACITY_IN_WORDS":{"type":"const","value":8},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_BYTES":{"type":"const","value":136},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_WORDS":{"type":"const","value":17},"starkware.cairo.common.cairo_keccak.keccak.KECCAK_STATE_SIZE_FELTS":{"type":"const","value":25},"starkware.cairo.common.cairo_keccak.keccak.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_lt":{"destination":"starkware.cairo.common.math.assert_lt","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_and":{"destination":"starkware.cairo.common.bitwise.bitwise_and","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_or":{"destination":"starkware.cairo.common.bitwise.bitwise_or","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.bitwise_xor":{"destination":"starkware.cairo.common.bitwise.bitwise_xor","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.memcpy":{"destination":"starkware.cairo.common.memcpy.memcpy","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.memset":{"destination":"starkware.cairo.common.memset.memset","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.packed_keccak_func":{"destination":"starkware.cairo.common.cairo_keccak.packed_keccak.packed_keccak_func","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.pow":{"destination":"starkware.cairo.common.pow.pow","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.split_felt":{"destination":"starkware.cairo.common.math.split_felt","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.uint256_reverse_endian":{"destination":"starkware.cairo.common.uint256.uint256_reverse_endian","type":"alias"},"starkware.cairo.common.cairo_keccak.keccak.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.ALL_ONES":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719234},"starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE":{"type":"const","value":3},"starkware.cairo.common.cairo_keccak.packed_keccak.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.SHIFTS":{"type":"const","value":340282366920938463481821351505477763073},"starkware.cairo.common.cairo_keccak.packed_keccak.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_keccak.packed_keccak.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.BASE":{"destination":"starkware.cairo.common.cairo_secp.constants.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.BigInt3":{"full_name":"starkware.cairo.common.cairo_secp.bigint.BigInt3","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.RC_BOUND":{"destination":"starkware.cairo.common.math_cmp.RC_BOUND","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3":{"full_name":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5":{"full_name":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5","members":{"d0":{"cairo_type":"felt","offset":0},"d1":{"cairo_type":"felt","offset":1},"d2":{"cairo_type":"felt","offset":2},"d3":{"cairo_type":"felt","offset":3},"d4":{"cairo_type":"felt","offset":4}},"size":5,"type":"struct"},"starkware.cairo.common.cairo_secp.bigint.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.bigint.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_secp.constants.BASE":{"type":"const","value":77371252455336267181195264},"starkware.cairo.common.cairo_secp.constants.BETA":{"type":"const","value":7},"starkware.cairo.common.cairo_secp.constants.N0":{"type":"const","value":10428087374290690730508609},"starkware.cairo.common.cairo_secp.constants.N1":{"type":"const","value":77371252455330678278691517},"starkware.cairo.common.cairo_secp.constants.N2":{"type":"const","value":19342813113834066795298815},"starkware.cairo.common.cairo_secp.constants.P0":{"type":"const","value":77371252455336262886226991},"starkware.cairo.common.cairo_secp.constants.P1":{"type":"const","value":77371252455336267181195263},"starkware.cairo.common.cairo_secp.constants.P2":{"type":"const","value":19342813113834066795298815},"starkware.cairo.common.cairo_secp.constants.SECP_REM":{"type":"const","value":4294968273},"starkware.cairo.common.cairo_secp.ec.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.EcPoint":{"full_name":"starkware.cairo.common.cairo_secp.ec.EcPoint","members":{"x":{"cairo_type":"starkware.cairo.common.cairo_secp.bigint.BigInt3","offset":0},"y":{"cairo_type":"starkware.cairo.common.cairo_secp.bigint.BigInt3","offset":3}},"size":6,"type":"struct"},"starkware.cairo.common.cairo_secp.ec.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.is_zero":{"destination":"starkware.cairo.common.cairo_secp.field.is_zero","type":"alias"},"starkware.cairo.common.cairo_secp.ec.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.ec.unreduced_mul":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_mul","type":"alias"},"starkware.cairo.common.cairo_secp.ec.unreduced_sqr":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_sqr","type":"alias"},"starkware.cairo.common.cairo_secp.ec.verify_zero":{"destination":"starkware.cairo.common.cairo_secp.field.verify_zero","type":"alias"},"starkware.cairo.common.cairo_secp.field.BASE":{"destination":"starkware.cairo.common.cairo_secp.constants.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.field.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.field.P0":{"destination":"starkware.cairo.common.cairo_secp.constants.P0","type":"alias"},"starkware.cairo.common.cairo_secp.field.P1":{"destination":"starkware.cairo.common.cairo_secp.constants.P1","type":"alias"},"starkware.cairo.common.cairo_secp.field.P2":{"destination":"starkware.cairo.common.cairo_secp.constants.P2","type":"alias"},"starkware.cairo.common.cairo_secp.field.SECP_REM":{"destination":"starkware.cairo.common.cairo_secp.constants.SECP_REM","type":"alias"},"starkware.cairo.common.cairo_secp.field.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.field.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.field.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BASE":{"destination":"starkware.cairo.common.cairo_secp.bigint.BASE","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BETA":{"destination":"starkware.cairo.common.cairo_secp.constants.BETA","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.BigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.cairo_secp.signature.EcPoint":{"destination":"starkware.cairo.common.cairo_secp.ec.EcPoint","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N0":{"destination":"starkware.cairo.common.cairo_secp.constants.N0","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N1":{"destination":"starkware.cairo.common.cairo_secp.constants.N1","type":"alias"},"starkware.cairo.common.cairo_secp.signature.N2":{"destination":"starkware.cairo.common.cairo_secp.constants.N2","type":"alias"},"starkware.cairo.common.cairo_secp.signature.RC_BOUND":{"destination":"starkware.cairo.common.math_cmp.RC_BOUND","type":"alias"},"starkware.cairo.common.cairo_secp.signature.Uint256":{"destination":"starkware.cairo.common.uint256.Uint256","type":"alias"},"starkware.cairo.common.cairo_secp.signature.UnreducedBigInt3":{"destination":"starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.alloc":{"destination":"starkware.cairo.common.alloc.alloc","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_nn":{"destination":"starkware.cairo.common.math.assert_nn","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.cairo_secp.signature.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.cairo_secp.signature.bigint_mul":{"destination":"starkware.cairo.common.cairo_secp.bigint.bigint_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.bigint_to_uint256":{"destination":"starkware.cairo.common.cairo_secp.bigint.bigint_to_uint256","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_add":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_add","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_mul":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.ec_negate":{"destination":"starkware.cairo.common.cairo_secp.ec.ec_negate","type":"alias"},"starkware.cairo.common.cairo_secp.signature.finalize_keccak":{"destination":"starkware.cairo.common.cairo_keccak.keccak.finalize_keccak","type":"alias"},"starkware.cairo.common.cairo_secp.signature.keccak_uint256s_bigend":{"destination":"starkware.cairo.common.cairo_keccak.keccak.keccak_uint256s_bigend","type":"alias"},"starkware.cairo.common.cairo_secp.signature.nondet_bigint3":{"destination":"starkware.cairo.common.cairo_secp.bigint.nondet_bigint3","type":"alias"},"starkware.cairo.common.cairo_secp.signature.reduce":{"destination":"starkware.cairo.common.cairo_secp.field.reduce","type":"alias"},"starkware.cairo.common.cairo_secp.signature.uint256_to_bigint":{"destination":"starkware.cairo.common.cairo_secp.bigint.uint256_to_bigint","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unreduced_mul":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_mul","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unreduced_sqr":{"destination":"starkware.cairo.common.cairo_secp.field.unreduced_sqr","type":"alias"},"starkware.cairo.common.cairo_secp.signature.unsigned_div_rem":{"destination":"starkware.cairo.common.math.unsigned_div_rem","type":"alias"},"starkware.cairo.common.cairo_secp.signature.validate_reduced_field_element":{"destination":"starkware.cairo.common.cairo_secp.field.validate_reduced_field_element","type":"alias"},"starkware.cairo.common.cairo_secp.signature.verify_zero":{"destination":"starkware.cairo.common.cairo_secp.field.verify_zero","type":"alias"},"starkware.cairo.common.dict_access.DictAccess":{"full_name":"starkware.cairo.common.dict_access.DictAccess","members":{"key":{"cairo_type":"felt","offset":0},"new_value":{"cairo_type":"felt","offset":2},"prev_value":{"cairo_type":"felt","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.ec.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.ec.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.ec.StarkCurve":{"type":"namespace"},"starkware.cairo.common.ec.StarkCurve.ALPHA":{"type":"const","value":1},"starkware.cairo.common.ec.StarkCurve.Args":{"full_name":"starkware.cairo.common.ec.StarkCurve.Args","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.BETA":{"type":"const","value":-476910135076337975234679399815567221425937815956490878998147463828055613816},"starkware.cairo.common.ec.StarkCurve.GEN_X":{"type":"const","value":874739451078007766457464989774322083649278607533249481151382481072868806602},"starkware.cairo.common.ec.StarkCurve.GEN_Y":{"type":"const","value":152666792071518830868575557812948353041420400780739481342941381225525861407},"starkware.cairo.common.ec.StarkCurve.ImplicitArgs":{"full_name":"starkware.cairo.common.ec.StarkCurve.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.ec.StarkCurve.ORDER":{"type":"const","value":-96363463615509210819012598251359154898},"starkware.cairo.common.ec.StarkCurve.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.ec.is_quad_residue":{"destination":"starkware.cairo.common.math.is_quad_residue","type":"alias"},"starkware.cairo.common.ec_point.EcPoint":{"full_name":"starkware.cairo.common.ec_point.EcPoint","members":{"x":{"cairo_type":"felt","offset":0},"y":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.hash.HashBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.HashBuiltin","type":"alias"},"starkware.cairo.common.keccak_state.KeccakBuiltinState":{"full_name":"starkware.cairo.common.keccak_state.KeccakBuiltinState","members":{"s0":{"cairo_type":"felt","offset":0},"s1":{"cairo_type":"felt","offset":1},"s2":{"cairo_type":"felt","offset":2},"s3":{"cairo_type":"felt","offset":3},"s4":{"cairo_type":"felt","offset":4},"s5":{"cairo_type":"felt","offset":5},"s6":{"cairo_type":"felt","offset":6},"s7":{"cairo_type":"felt","offset":7}},"size":8,"type":"struct"},"starkware.cairo.common.math.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.math.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.math.assert_le_felt":{"decorators":["known_ap_change"],"pc":18,"type":"function"},"starkware.cairo.common.math.assert_le_felt.Args":{"full_name":"starkware.cairo.common.math.assert_le_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_le_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_le_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH":{"type":"const","value":5316911983139663648412552867652567041},"starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH":{"type":"const","value":3544607988759775765608368578435044694},"starkware.cairo.common.math.assert_le_felt.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_le_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.a","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.b","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.range_check_ptr":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_le_felt.range_check_ptr","references":[{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-5), felt*)]"},{"ap_tracking_data":{"group":2,"offset":8},"pc":28,"value":"cast([fp + (-5)] + 4, felt)"}],"type":"reference"},"starkware.cairo.common.math.assert_le_felt.skip_exclude_a":{"pc":42,"type":"label"},"starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a":{"pc":54,"type":"label"},"starkware.cairo.common.math.assert_lt_felt":{"decorators":["known_ap_change"],"pc":63,"type":"function"},"starkware.cairo.common.math.assert_lt_felt.Args":{"full_name":"starkware.cairo.common.math.assert_lt_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math.assert_lt_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math.assert_lt_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math.assert_lt_felt.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math.assert_lt_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_lt_felt.a","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math.assert_lt_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math.assert_lt_felt.b","references":[{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.RC_BOUND":{"type":"const","value":340282366920938463463374607431768211456},"starkware.cairo.common.math_cmp.assert_le_felt":{"destination":"starkware.cairo.common.math.assert_le_felt","type":"alias"},"starkware.cairo.common.math_cmp.assert_lt_felt":{"destination":"starkware.cairo.common.math.assert_lt_felt","type":"alias"},"starkware.cairo.common.math_cmp.is_le_felt":{"decorators":["known_ap_change"],"pc":128,"type":"function"},"starkware.cairo.common.math_cmp.is_le_felt.Args":{"full_name":"starkware.cairo.common.math_cmp.is_le_felt.Args","members":{"a":{"cairo_type":"felt","offset":0},"b":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs":{"full_name":"starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs","members":{"range_check_ptr":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.math_cmp.is_le_felt.Return":{"cairo_type":"felt","type":"type_definition"},"starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.math_cmp.is_le_felt.a":{"cairo_type":"felt","full_name":"starkware.cairo.common.math_cmp.is_le_felt.a","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.is_le_felt.b":{"cairo_type":"felt","full_name":"starkware.cairo.common.math_cmp.is_le_felt.b","references":[{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.math_cmp.is_le_felt.not_le":{"pc":140,"type":"label"},"starkware.cairo.common.memcpy.memcpy":{"decorators":[],"pc":3,"type":"function"},"starkware.cairo.common.memcpy.memcpy.Args":{"full_name":"starkware.cairo.common.memcpy.memcpy.Args","members":{"dst":{"cairo_type":"felt*","offset":0},"len":{"cairo_type":"felt","offset":2},"src":{"cairo_type":"felt*","offset":1}},"size":3,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.ImplicitArgs":{"full_name":"starkware.cairo.common.memcpy.memcpy.ImplicitArgs","members":{},"size":0,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.LoopFrame":{"full_name":"starkware.cairo.common.memcpy.memcpy.LoopFrame","members":{"dst":{"cairo_type":"felt*","offset":0},"src":{"cairo_type":"felt*","offset":1}},"size":2,"type":"struct"},"starkware.cairo.common.memcpy.memcpy.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.memcpy.memcpy.continue_copying":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.continue_copying","references":[{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.len":{"cairo_type":"felt","full_name":"starkware.cairo.common.memcpy.memcpy.len","references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.memcpy.memcpy.loop":{"pc":8,"type":"label"},"starkware.cairo.common.pow.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"starkware.cairo.common.pow.get_ap":{"destination":"starkware.cairo.common.registers.get_ap","type":"alias"},"starkware.cairo.common.pow.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.registers.get_ap":{"destination":"starkware.cairo.lang.compiler.lib.registers.get_ap","type":"alias"},"starkware.cairo.common.registers.get_fp_and_pc":{"destination":"starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.signature.EcOpBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.EcOpBuiltin","type":"alias"},"starkware.cairo.common.signature.EcPoint":{"destination":"starkware.cairo.common.ec_point.EcPoint","type":"alias"},"starkware.cairo.common.signature.FALSE":{"destination":"starkware.cairo.common.bool.FALSE","type":"alias"},"starkware.cairo.common.signature.SignatureBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.SignatureBuiltin","type":"alias"},"starkware.cairo.common.signature.StarkCurve":{"destination":"starkware.cairo.common.ec.StarkCurve","type":"alias"},"starkware.cairo.common.signature.TRUE":{"destination":"starkware.cairo.common.bool.TRUE","type":"alias"},"starkware.cairo.common.signature.ec_add":{"destination":"starkware.cairo.common.ec.ec_add","type":"alias"},"starkware.cairo.common.signature.ec_mul":{"destination":"starkware.cairo.common.ec.ec_mul","type":"alias"},"starkware.cairo.common.signature.ec_sub":{"destination":"starkware.cairo.common.ec.ec_sub","type":"alias"},"starkware.cairo.common.signature.is_x_on_curve":{"destination":"starkware.cairo.common.ec.is_x_on_curve","type":"alias"},"starkware.cairo.common.signature.recover_y":{"destination":"starkware.cairo.common.ec.recover_y","type":"alias"},"starkware.cairo.common.signature.verify_ecdsa_signature":{"decorators":[],"pc":123,"type":"function"},"starkware.cairo.common.signature.verify_ecdsa_signature.Args":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.Args","members":{"message":{"cairo_type":"felt","offset":0},"public_key":{"cairo_type":"felt","offset":1},"signature_r":{"cairo_type":"felt","offset":2},"signature_s":{"cairo_type":"felt","offset":3}},"size":4,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs":{"full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs","members":{"ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","offset":0}},"size":1,"type":"struct"},"starkware.cairo.common.signature.verify_ecdsa_signature.Return":{"cairo_type":"()","type":"type_definition"},"starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr":{"cairo_type":"starkware.cairo.common.cairo_builtins.SignatureBuiltin*","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":125,"value":"cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_r","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-4), felt*)]"}],"type":"reference"},"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s":{"cairo_type":"felt","full_name":"starkware.cairo.common.signature.verify_ecdsa_signature.signature_s","references":[{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-3), felt*)]"}],"type":"reference"},"starkware.cairo.common.uint256.ALL_ONES":{"type":"const","value":340282366920938463463374607431768211455},"starkware.cairo.common.uint256.BitwiseBuiltin":{"destination":"starkware.cairo.common.cairo_builtins.BitwiseBuiltin","type":"alias"},"starkware.cairo.common.uint256.HALF_SHIFT":{"type":"const","value":18446744073709551616},"starkware.cairo.common.uint256.SHIFT":{"type":"const","value":340282366920938463463374607431768211456},"starkware.cairo.common.uint256.Uint256":{"full_name":"starkware.cairo.common.uint256.Uint256","members":{"high":{"cairo_type":"felt","offset":1},"low":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.cairo.common.uint256.assert_in_range":{"destination":"starkware.cairo.common.math.assert_in_range","type":"alias"},"starkware.cairo.common.uint256.assert_le":{"destination":"starkware.cairo.common.math.assert_le","type":"alias"},"starkware.cairo.common.uint256.assert_nn_le":{"destination":"starkware.cairo.common.math.assert_nn_le","type":"alias"},"starkware.cairo.common.uint256.assert_not_zero":{"destination":"starkware.cairo.common.math.assert_not_zero","type":"alias"},"starkware.cairo.common.uint256.bitwise_and":{"destination":"starkware.cairo.common.bitwise.bitwise_and","type":"alias"},"starkware.cairo.common.uint256.bitwise_or":{"destination":"starkware.cairo.common.bitwise.bitwise_or","type":"alias"},"starkware.cairo.common.uint256.bitwise_xor":{"destination":"starkware.cairo.common.bitwise.bitwise_xor","type":"alias"},"starkware.cairo.common.uint256.get_ap":{"destination":"starkware.cairo.common.registers.get_ap","type":"alias"},"starkware.cairo.common.uint256.get_fp_and_pc":{"destination":"starkware.cairo.common.registers.get_fp_and_pc","type":"alias"},"starkware.cairo.common.uint256.is_le":{"destination":"starkware.cairo.common.math_cmp.is_le","type":"alias"},"starkware.cairo.common.uint256.pow":{"destination":"starkware.cairo.common.pow.pow","type":"alias"},"starkware.starknet.common.storage.ADDR_BOUND":{"type":"const","value":-106710729501573572985208420194530329073740042555888586719489},"starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE":{"type":"const","value":256},"starkware.starknet.common.storage.assert_250_bit":{"destination":"starkware.cairo.common.math.assert_250_bit","type":"alias"},"starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR":{"type":"const","value":20853273475220472486191784820},"starkware.starknet.common.syscalls.CallContract":{"full_name":"starkware.starknet.common.syscalls.CallContract","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.CallContractRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.CallContractRequest":{"full_name":"starkware.starknet.common.syscalls.CallContractRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"contract_address":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.CallContractResponse":{"full_name":"starkware.starknet.common.syscalls.CallContractResponse","members":{"retdata":{"cairo_type":"felt*","offset":1},"retdata_size":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR":{"type":"const","value":21167594061783206823196716140},"starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR":{"type":"const","value":23274015802972845247556842986379118667122},"starkware.starknet.common.syscalls.DEPLOY_SELECTOR":{"type":"const","value":75202468540281},"starkware.starknet.common.syscalls.Deploy":{"full_name":"starkware.starknet.common.syscalls.Deploy","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.DeployRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.DeployResponse","offset":6}},"size":9,"type":"struct"},"starkware.starknet.common.syscalls.DeployRequest":{"full_name":"starkware.starknet.common.syscalls.DeployRequest","members":{"class_hash":{"cairo_type":"felt","offset":1},"constructor_calldata":{"cairo_type":"felt*","offset":4},"constructor_calldata_size":{"cairo_type":"felt","offset":3},"contract_address_salt":{"cairo_type":"felt","offset":2},"deploy_from_zero":{"cairo_type":"felt","offset":5},"selector":{"cairo_type":"felt","offset":0}},"size":6,"type":"struct"},"starkware.starknet.common.syscalls.DeployResponse":{"full_name":"starkware.starknet.common.syscalls.DeployResponse","members":{"constructor_retdata":{"cairo_type":"felt*","offset":2},"constructor_retdata_size":{"cairo_type":"felt","offset":1},"contract_address":{"cairo_type":"felt","offset":0}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.DictAccess":{"destination":"starkware.cairo.common.dict_access.DictAccess","type":"alias"},"starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR":{"type":"const","value":1280709301550335749748},"starkware.starknet.common.syscalls.EmitEvent":{"full_name":"starkware.starknet.common.syscalls.EmitEvent","members":{"data":{"cairo_type":"felt*","offset":4},"data_len":{"cairo_type":"felt","offset":3},"keys":{"cairo_type":"felt*","offset":2},"keys_len":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR":{"type":"const","value":1448089106835523001438702345020786},"starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR":{"type":"const","value":24294903732626645868215235778792757751152},"starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR":{"type":"const","value":94901967781393078444254803017658102643},"starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR":{"type":"const","value":6219495360805491471215297013070624192820083},"starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR":{"type":"const","value":1592190833581991703053805829594610833820054387},"starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR":{"type":"const","value":1317029390204112103023},"starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR":{"type":"const","value":1448089128652340074717162277007973},"starkware.starknet.common.syscalls.GetBlockNumber":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumber","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockNumberResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockNumberResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockNumberResponse","members":{"block_number":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestamp":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestamp","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampRequest":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetBlockTimestampResponse":{"full_name":"starkware.starknet.common.syscalls.GetBlockTimestampResponse","members":{"block_timestamp":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddress":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetCallerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetCallerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetCallerAddressResponse","members":{"caller_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddress":{"full_name":"starkware.starknet.common.syscalls.GetContractAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetContractAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetContractAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetContractAddressResponse","members":{"contract_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddress":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddress","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressRequest":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetSequencerAddressResponse":{"full_name":"starkware.starknet.common.syscalls.GetSequencerAddressResponse","members":{"sequencer_address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfo":{"full_name":"starkware.starknet.common.syscalls.GetTxInfo","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxInfoResponse","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxInfoResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxInfoResponse","members":{"tx_info":{"cairo_type":"starkware.starknet.common.syscalls.TxInfo*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignature":{"full_name":"starkware.starknet.common.syscalls.GetTxSignature","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.GetTxSignatureResponse","offset":1}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureRequest":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureRequest","members":{"selector":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.GetTxSignatureResponse":{"full_name":"starkware.starknet.common.syscalls.GetTxSignatureResponse","members":{"signature":{"cairo_type":"felt*","offset":1},"signature_len":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR":{"type":"const","value":436233452754198157705746250789557519228244616562},"starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR":{"type":"const","value":92376026794327011772951660},"starkware.starknet.common.syscalls.LibraryCall":{"full_name":"starkware.starknet.common.syscalls.LibraryCall","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.LibraryCallRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.CallContractResponse","offset":5}},"size":7,"type":"struct"},"starkware.starknet.common.syscalls.LibraryCallRequest":{"full_name":"starkware.starknet.common.syscalls.LibraryCallRequest","members":{"calldata":{"cairo_type":"felt*","offset":4},"calldata_size":{"cairo_type":"felt","offset":3},"class_hash":{"cairo_type":"felt","offset":1},"function_selector":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0}},"size":5,"type":"struct"},"starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR":{"type":"const","value":433017908768303439907196859243777073},"starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR":{"type":"const","value":100890693370601760042082660},"starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR":{"type":"const","value":25828017502874050592466629733},"starkware.starknet.common.syscalls.SendMessageToL1SysCall":{"full_name":"starkware.starknet.common.syscalls.SendMessageToL1SysCall","members":{"payload_ptr":{"cairo_type":"felt*","offset":3},"payload_size":{"cairo_type":"felt","offset":2},"selector":{"cairo_type":"felt","offset":0},"to_address":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.StorageRead":{"full_name":"starkware.starknet.common.syscalls.StorageRead","members":{"request":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadRequest","offset":0},"response":{"cairo_type":"starkware.starknet.common.syscalls.StorageReadResponse","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadRequest":{"full_name":"starkware.starknet.common.syscalls.StorageReadRequest","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.StorageReadResponse":{"full_name":"starkware.starknet.common.syscalls.StorageReadResponse","members":{"value":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.StorageWrite":{"full_name":"starkware.starknet.common.syscalls.StorageWrite","members":{"address":{"cairo_type":"felt","offset":1},"selector":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":2}},"size":3,"type":"struct"},"starkware.starknet.common.syscalls.TxInfo":{"full_name":"starkware.starknet.common.syscalls.TxInfo","members":{"account_contract_address":{"cairo_type":"felt","offset":1},"chain_id":{"cairo_type":"felt","offset":6},"max_fee":{"cairo_type":"felt","offset":2},"nonce":{"cairo_type":"felt","offset":7},"signature":{"cairo_type":"felt*","offset":4},"signature_len":{"cairo_type":"felt","offset":3},"transaction_hash":{"cairo_type":"felt","offset":5},"version":{"cairo_type":"felt","offset":0}},"size":8,"type":"struct"},"starkware.starknet.common.syscalls.call_contract":{"decorators":[],"pc":74,"type":"function"},"starkware.starknet.common.syscalls.call_contract.Args":{"full_name":"starkware.starknet.common.syscalls.call_contract.Args","members":{"calldata":{"cairo_type":"felt*","offset":3},"calldata_size":{"cairo_type":"felt","offset":2},"contract_address":{"cairo_type":"felt","offset":0},"function_selector":{"cairo_type":"felt","offset":1}},"size":4,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.call_contract.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.call_contract.Return":{"cairo_type":"(retdata_size: felt, retdata: felt*)","type":"type_definition"},"starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.call_contract.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.call_contract.syscall_ptr","references":[{"ap_tracking_data":{"group":4,"offset":0},"pc":74,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":4,"offset":1},"pc":81,"value":"cast([fp + (-7)] + 7, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_caller_address":{"decorators":[],"pc":86,"type":"function"},"starkware.starknet.common.syscalls.get_caller_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_caller_address.Return":{"cairo_type":"(caller_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr","references":[{"ap_tracking_data":{"group":5,"offset":0},"pc":86,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":5,"offset":1},"pc":89,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_contract_address":{"decorators":[],"pc":93,"type":"function"},"starkware.starknet.common.syscalls.get_contract_address.Args":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_contract_address.Return":{"cairo_type":"(contract_address: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr","references":[{"ap_tracking_data":{"group":6,"offset":0},"pc":93,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":6,"offset":1},"pc":96,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.get_tx_info":{"decorators":[],"pc":116,"type":"function"},"starkware.starknet.common.syscalls.get_tx_info.Args":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.Args","members":{},"size":0,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.get_tx_info.Return":{"cairo_type":"(tx_info: starkware.starknet.common.syscalls.TxInfo*)","type":"type_definition"},"starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr","references":[{"ap_tracking_data":{"group":9,"offset":0},"pc":116,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":9,"offset":1},"pc":119,"value":"cast([fp + (-3)] + 2, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_read":{"decorators":[],"pc":100,"type":"function"},"starkware.starknet.common.syscalls.storage_read.Args":{"full_name":"starkware.starknet.common.syscalls.storage_read.Args","members":{"address":{"cairo_type":"felt","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_read.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_read.Return":{"cairo_type":"(value: felt)","type":"type_definition"},"starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_read.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_read.syscall_ptr","references":[{"ap_tracking_data":{"group":7,"offset":0},"pc":100,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":7,"offset":1},"pc":104,"value":"cast([fp + (-4)] + 3, felt*)"}],"type":"reference"},"starkware.starknet.common.syscalls.storage_write":{"decorators":[],"pc":108,"type":"function"},"starkware.starknet.common.syscalls.storage_write.Args":{"full_name":"starkware.starknet.common.syscalls.storage_write.Args","members":{"address":{"cairo_type":"felt","offset":0},"value":{"cairo_type":"felt","offset":1}},"size":2,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.ImplicitArgs":{"full_name":"starkware.starknet.common.syscalls.storage_write.ImplicitArgs","members":{"syscall_ptr":{"cairo_type":"felt*","offset":0}},"size":1,"type":"struct"},"starkware.starknet.common.syscalls.storage_write.Return":{"cairo_type":"()","type":"type_definition"},"starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS":{"type":"const","value":0},"starkware.starknet.common.syscalls.storage_write.syscall_ptr":{"cairo_type":"felt*","full_name":"starkware.starknet.common.syscalls.storage_write.syscall_ptr","references":[{"ap_tracking_data":{"group":8,"offset":0},"pc":108,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":8,"offset":1},"pc":113,"value":"cast([fp + (-5)] + 3, felt*)"}],"type":"reference"}},"main_scope":"__main__","prime":"0x800000000000011000000000000000000000000000000000000000000000001","reference_manager":{"references":[{"ap_tracking_data":{"group":1,"offset":0},"pc":3,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":1,"offset":3},"pc":10,"value":"[cast(ap, felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":2,"offset":0},"pc":18,"value":"[cast(fp + (-5), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":3,"offset":0},"pc":63,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":4,"offset":0},"pc":74,"value":"[cast(fp + (-7), felt**)]"},{"ap_tracking_data":{"group":5,"offset":0},"pc":86,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":6,"offset":0},"pc":93,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":7,"offset":0},"pc":100,"value":"[cast(fp + (-4), felt**)]"},{"ap_tracking_data":{"group":8,"offset":0},"pc":108,"value":"[cast(fp + (-5), felt**)]"},{"ap_tracking_data":{"group":9,"offset":0},"pc":116,"value":"[cast(fp + (-3), felt**)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-3), felt*)]"},{"ap_tracking_data":{"group":10,"offset":0},"pc":123,"value":"[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-4), felt*)]"},{"ap_tracking_data":{"group":11,"offset":0},"pc":128,"value":"[cast(fp + (-3), felt*)]"}]}}} \ No newline at end of file diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 2aaeb35a2..a1d7c3e06 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -387,13 +387,22 @@ pub fn compute_sierra_class_hash(contract_class: &SierraContractClass) -> Devnet #[cfg(test)] mod tests { use cairo_lang_starknet_classes::contract_class::ContractClass as SierraContractClass; + use serde::Deserialize; use serde_json::Deserializer; + use starknet_rs_core::types::LegacyEntryPointsByType; + use crate::contract_class::deprecated::json_contract_class::Cairo0Json; + use crate::contract_class::deprecated::rpc_contract_class::{ + ContractClassAbiEntryWithType, DeprecatedContractClass, + }; use crate::contract_class::{convert_sierra_to_codegen, ContractClass}; use crate::felt::felt_from_prefixed_hex; use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::deserialize_to_sierra_contract_class; use crate::traits::HashProducer; - use crate::utils::test_utils::{CAIRO_1_CONTRACT_SIERRA_HASH, CAIRO_1_EVENTS_CONTRACT_PATH}; + use crate::utils::test_utils::{ + CAIRO_0_ACCOUNT_CONTRACT_HASH, CAIRO_0_ACCOUNT_CONTRACT_PATH, CAIRO_1_CONTRACT_SIERRA_HASH, + CAIRO_1_EVENTS_CONTRACT_PATH, + }; #[test] fn cairo_1_contract_class_hash_generated_successfully() { @@ -422,4 +431,73 @@ mod tests { convert_sierra_to_codegen(&contract_class).unwrap(); } + + #[test] + fn cairo_0_contract_class_hash_generated_successfully() { + let json_str = std::fs::read_to_string(CAIRO_0_ACCOUNT_CONTRACT_PATH).unwrap(); + let contract_class = Cairo0Json::raw_json_from_json_str(&json_str).unwrap(); + let class_hash = contract_class.generate_hash().unwrap(); + let expected_class_hash = felt_from_prefixed_hex(CAIRO_0_ACCOUNT_CONTRACT_HASH).unwrap(); + assert_eq!(class_hash, expected_class_hash); + } + + #[test] + fn contract_class_cairo_0_from_json_str_doesnt_accept_string_different_from_json() { + assert!(Cairo0Json::raw_json_from_json_str(" not JSON string").is_err()); + } + + /// The test takes a .casm artifact as raw json and generates its class hash. + /// Then it takes the same artifact as a `DeprecatedContractClass` and generates its class hash. + /// The test checks if both hashes are the same. + #[test] + fn cairo_0_contract_class_hash_generated_successfully_and_its_the_same_as_raw_json_contract_class_hash() + { + let contract_class = Cairo0Json::raw_json_from_path( + "../../contracts/test_artifacts/cairo0/ERC20_starknet_js.json", + ) + .unwrap(); + let class_hash = contract_class.generate_hash().unwrap(); + + // data taken from https://github.com/0xs34n/starknet.js/blob/ce57fdcaba61a8ef2382acc9233a9aac2ac8589a/__tests__/fixtures.ts#L126 + let expected_class_hash = felt_from_prefixed_hex( + "0x54328a1075b8820eb43caf0caa233923148c983742402dcfc38541dd843d01a", + ) + .unwrap(); + + assert_eq!(class_hash, expected_class_hash); + + // this struct is for deserializing part of the raw json artifact + // because DeprecatedContractClass expects the program property to be gzipped then base64 + // encoded we only take those params that dont have any special encoding + // Then to construct the `DeprecatedContractClass` we will assign the program property, + // instead of going through the process of gzipping and base64 encoding + #[derive(Deserialize)] + struct PartialDeprecatedContractClass { + pub abi: Vec, + /// The selector of each entry point is a unique identifier in the program. + pub entry_points_by_type: LegacyEntryPointsByType, + } + + // first check if generated class hash is the same when constructing + // `DeprecatedContractClass` via assigning properties + let PartialDeprecatedContractClass { abi, entry_points_by_type } = + serde_json::from_value::(contract_class.inner.clone()) + .unwrap(); + let program = contract_class.inner.get("program").unwrap(); + let deprecated_contract_class = + DeprecatedContractClass { program: program.clone(), abi, entry_points_by_type }; + + assert_eq!(deprecated_contract_class.generate_hash().unwrap(), expected_class_hash); + + // check if generated class hash is the same when deserializing to `DeprecatedContractClass` + let serialized_deprecated_contract_class = + serde_json::to_string(&deprecated_contract_class).unwrap(); + assert_eq!( + DeprecatedContractClass::rpc_from_json_str(&serialized_deprecated_contract_class) + .unwrap() + .generate_hash() + .unwrap(), + expected_class_hash + ); + } } diff --git a/crates/starknet-devnet-types/src/utils.rs b/crates/starknet-devnet-types/src/utils.rs index 3a8d1a472..0efc4b5bb 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -91,6 +91,9 @@ pub(crate) mod test_utils { pub(crate) const CAIRO_0_RPC_CONTRACT_PATH: &str = concat!(env!("CARGO_MANIFEST_DIR"), "/test_data/cairo_0_rpc.json"); + pub(crate) const CAIRO_0_ACCOUNT_CONTRACT_HASH: &str = + "0x4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f"; + /// contract declared in transaction https://alpha4.starknet.io/feeder_gateway/get_transaction?transactionHash=0x01b852f1fe2b13db21a44f8884bc4b7760dc277bb3820b970dba929860275617 /// cairo code is in the same directory as the sierra artifacts pub(crate) const CAIRO_1_EVENTS_CONTRACT_PATH: &str = From 4fd45a2e0a69151dfa0955cf37559db167dadaca Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 13:07:17 +0100 Subject: [PATCH 18/41] Fix l1l2 cairo0 test artifact loading --- crates/starknet-devnet-core/src/utils.rs | 2 +- .../rpc/transactions/broadcasted_declare_transaction_v1.rs | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index d2b2a686f..9cc8eeb96 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -225,7 +225,7 @@ pub mod exported_test_utils { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/l1l2.json").unwrap(); - serde_json::from_str(&json_str).unwrap() + Cairo0Json::raw_json_from_json_str(&json_str).unwrap().into() } pub fn dummy_cairo_l1l2_contract_codegen() -> LegacyContractClass { diff --git a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index 1bd232888..c048d97df 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs @@ -71,6 +71,7 @@ mod tests { use crate::chain_id::ChainId; use crate::contract_address::ContractAddress; + use crate::contract_class::deprecated::json_contract_class::Cairo0Json; use crate::contract_class::Cairo0ContractClass; use crate::felt::try_felt_to_num; use crate::rpc::transactions::broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; @@ -92,7 +93,8 @@ mod tests { fn correct_transaction_hash_computation_compared_to_a_transaction_from_feeder_gateway() { let json_str = std::fs::read_to_string("../../contracts/test_artifacts/cairo0/events.json").unwrap(); - let cairo0: Cairo0ContractClass = serde_json::from_str(&json_str).unwrap(); + let cairo0: Cairo0ContractClass = + Cairo0Json::raw_json_from_json_str(&json_str).unwrap().into(); // this is declare v1 transaction send with starknet-rs let json_obj: serde_json::Value = serde_json::from_reader(std::fs::File::open(concat!( From 790f6dccb0ed0ceaf71deeb7b69436a209618fd0 Mon Sep 17 00:00:00 2001 From: marioiordanov Date: Wed, 5 Feb 2025 15:08:55 +0200 Subject: [PATCH 19/41] fix runResource error --- crates/starknet-devnet-core/src/starknet/mod.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index d8dc8d73b..0a6e399ab 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -669,7 +669,7 @@ impl Starknet { ), }), blockifier::execution::common_hints::ExecutionMode::Execute, - true, + false, blockifier::execution::entry_point::SierraGasRevertTracker::new(initial_gas), ); From 8b935f43cc4ab09c0ffa12f108634775a63f6db0 Mon Sep 17 00:00:00 2001 From: marioiordanov Date: Wed, 5 Feb 2025 17:02:02 +0200 Subject: [PATCH 20/41] fix only query version --- .../src/rpc/transactions.rs | 58 ++++++++++++++----- 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index 6a0ae3bd3..7b7fbe7e3 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -12,8 +12,10 @@ use invoke_transaction_v1::InvokeTransactionV1; use serde::{Deserialize, Deserializer, Serialize, Serializer}; use starknet_api::block::{BlockNumber, GasPrice}; use starknet_api::contract_class::{ClassInfo, EntryPointType}; +use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::transaction::fields::{Fee, Tip}; +use starknet_api::transaction::{TransactionHasher, TransactionOptions, signed_tx_version}; use starknet_rs_core::types::{ BlockId, ExecutionResult, Felt, ResourceBounds, ResourceBoundsMapping, TransactionFinalityStatus, @@ -38,7 +40,7 @@ use super::transaction_receipt::{ }; use crate::constants::QUERY_VERSION_OFFSET; use crate::contract_address::ContractAddress; -use crate::contract_class::{compute_sierra_class_hash, ContractClass}; +use crate::contract_class::{ContractClass, compute_sierra_class_hash}; use crate::emitted_event::{Event, OrderedEvent}; use crate::error::{ConversionError, DevnetResult}; use crate::felt::{ @@ -537,11 +539,18 @@ impl BroadcastedDeclareTransaction { } }; - Ok(starknet_api::executable_transaction::DeclareTransaction::create( - sn_api_transaction, + let chain_id = felt_to_sn_api_chain_id(chain_id)?; + let tx_version: starknet_api::transaction::TransactionVersion = + signed_tx_version(&sn_api_transaction.version(), &TransactionOptions { + only_query: self.is_only_query(), + }); + let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; + + Ok(starknet_api::executable_transaction::DeclareTransaction { + tx: sn_api_transaction, + tx_hash, class_info, - &felt_to_sn_api_chain_id(chain_id)?, - )?) + }) } } @@ -622,10 +631,26 @@ impl BroadcastedDeployAccountTransaction { } }; - Ok(starknet_api::executable_transaction::DeployAccountTransaction::create( - sn_api_transaction, - &felt_to_sn_api_chain_id(chain_id)?, - )?) + let chain_id = felt_to_sn_api_chain_id(chain_id)?; + let tx_version: starknet_api::transaction::TransactionVersion = + signed_tx_version(&sn_api_transaction.version(), &TransactionOptions { + only_query: self.is_only_query(), + }); + let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; + + // copied from starknet_api::executable_transaction::DeployAccountTransaction::create( + let contract_address = calculate_contract_address( + sn_api_transaction.contract_address_salt(), + sn_api_transaction.class_hash(), + &sn_api_transaction.constructor_calldata(), + starknet_api::core::ContractAddress::default(), + )?; + + Ok(starknet_api::executable_transaction::DeployAccountTransaction { + tx: sn_api_transaction, + tx_hash, + contract_address, + }) } } @@ -702,10 +727,17 @@ impl BroadcastedInvokeTransaction { } }; - Ok(starknet_api::executable_transaction::InvokeTransaction::create( - sn_api_transaction, - &felt_to_sn_api_chain_id(chain_id)?, - )?) + let chain_id = felt_to_sn_api_chain_id(chain_id)?; + let tx_version: starknet_api::transaction::TransactionVersion = + signed_tx_version(&sn_api_transaction.version(), &TransactionOptions { + only_query: self.is_only_query(), + }); + let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; + + Ok(starknet_api::executable_transaction::InvokeTransaction { + tx: sn_api_transaction, + tx_hash, + }) } } From a05893586240f5cb0a00839b23c801e1256b6038 Mon Sep 17 00:00:00 2001 From: marioiordanov Date: Wed, 5 Feb 2025 17:06:46 +0200 Subject: [PATCH 21/41] formatting --- .../src/rpc/transactions.rs | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index 7b7fbe7e3..4fddbb146 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -15,7 +15,7 @@ use starknet_api::contract_class::{ClassInfo, EntryPointType}; use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; use starknet_api::transaction::fields::{Fee, Tip}; -use starknet_api::transaction::{TransactionHasher, TransactionOptions, signed_tx_version}; +use starknet_api::transaction::{signed_tx_version, TransactionHasher, TransactionOptions}; use starknet_rs_core::types::{ BlockId, ExecutionResult, Felt, ResourceBounds, ResourceBoundsMapping, TransactionFinalityStatus, @@ -40,7 +40,7 @@ use super::transaction_receipt::{ }; use crate::constants::QUERY_VERSION_OFFSET; use crate::contract_address::ContractAddress; -use crate::contract_class::{ContractClass, compute_sierra_class_hash}; +use crate::contract_class::{compute_sierra_class_hash, ContractClass}; use crate::emitted_event::{Event, OrderedEvent}; use crate::error::{ConversionError, DevnetResult}; use crate::felt::{ @@ -540,10 +540,10 @@ impl BroadcastedDeclareTransaction { }; let chain_id = felt_to_sn_api_chain_id(chain_id)?; - let tx_version: starknet_api::transaction::TransactionVersion = - signed_tx_version(&sn_api_transaction.version(), &TransactionOptions { - only_query: self.is_only_query(), - }); + let tx_version: starknet_api::transaction::TransactionVersion = signed_tx_version( + &sn_api_transaction.version(), + &TransactionOptions { only_query: self.is_only_query() }, + ); let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; Ok(starknet_api::executable_transaction::DeclareTransaction { @@ -632,10 +632,10 @@ impl BroadcastedDeployAccountTransaction { }; let chain_id = felt_to_sn_api_chain_id(chain_id)?; - let tx_version: starknet_api::transaction::TransactionVersion = - signed_tx_version(&sn_api_transaction.version(), &TransactionOptions { - only_query: self.is_only_query(), - }); + let tx_version: starknet_api::transaction::TransactionVersion = signed_tx_version( + &sn_api_transaction.version(), + &TransactionOptions { only_query: self.is_only_query() }, + ); let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; // copied from starknet_api::executable_transaction::DeployAccountTransaction::create( @@ -728,10 +728,10 @@ impl BroadcastedInvokeTransaction { }; let chain_id = felt_to_sn_api_chain_id(chain_id)?; - let tx_version: starknet_api::transaction::TransactionVersion = - signed_tx_version(&sn_api_transaction.version(), &TransactionOptions { - only_query: self.is_only_query(), - }); + let tx_version: starknet_api::transaction::TransactionVersion = signed_tx_version( + &sn_api_transaction.version(), + &TransactionOptions { only_query: self.is_only_query() }, + ); let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; Ok(starknet_api::executable_transaction::InvokeTransaction { From a4a253342fb0c3d07ea0452d1ae25b0254e36e2b Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 21:11:10 +0100 Subject: [PATCH 22/41] Fix declare v1 tx hash calculation (revert to old impl) --- .../src/rpc/transactions.rs | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index 4fddbb146..c0d56f8e7 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -460,7 +460,9 @@ impl BroadcastedDeclareTransaction { &self, chain_id: &Felt, ) -> DevnetResult { - let (sn_api_transaction, class_info) = match self { + let sn_api_chain_id = felt_to_sn_api_chain_id(chain_id)?; + + let (sn_api_transaction, tx_hash, class_info) = match self { BroadcastedDeclareTransaction::V1(v1) => { let class_hash = v1.generate_class_hash()?; @@ -479,7 +481,10 @@ impl BroadcastedDeclareTransaction { let class_info: ClassInfo = ContractClass::Cairo0(v1.contract_class.clone()).try_into()?; - (sn_api_declare, class_info) + let tx_hash = v1.calculate_transaction_hash(chain_id, &class_hash)?; + let sn_api_tx_hash = starknet_api::transaction::TransactionHash(tx_hash); + + (sn_api_declare, sn_api_tx_hash, class_info) } BroadcastedDeclareTransaction::V2(v2) => { let sierra_class_hash: Felt = compute_sierra_class_hash(&v2.contract_class)?; @@ -502,7 +507,15 @@ impl BroadcastedDeclareTransaction { let class_info: ClassInfo = ContractClass::Cairo1(v2.contract_class.clone()).try_into()?; - (sn_api_declare, class_info) + let tx_version: starknet_api::transaction::TransactionVersion = signed_tx_version( + &sn_api_declare.version(), + &TransactionOptions { only_query: self.is_only_query() }, + ); + + let tx_hash = + sn_api_declare.calculate_transaction_hash(&sn_api_chain_id, &tx_version)?; + + (sn_api_declare, tx_hash, class_info) } BroadcastedDeclareTransaction::V3(v3) => { let sierra_class_hash = compute_sierra_class_hash(&v3.contract_class)?; @@ -535,17 +548,18 @@ impl BroadcastedDeclareTransaction { let class_info: ClassInfo = ContractClass::Cairo1(v3.contract_class.clone()).try_into()?; - (sn_api_declare, class_info) + let tx_version: starknet_api::transaction::TransactionVersion = signed_tx_version( + &sn_api_declare.version(), + &TransactionOptions { only_query: self.is_only_query() }, + ); + + let tx_hash = + sn_api_declare.calculate_transaction_hash(&sn_api_chain_id, &tx_version)?; + + (sn_api_declare, tx_hash, class_info) } }; - let chain_id = felt_to_sn_api_chain_id(chain_id)?; - let tx_version: starknet_api::transaction::TransactionVersion = signed_tx_version( - &sn_api_transaction.version(), - &TransactionOptions { only_query: self.is_only_query() }, - ); - let tx_hash = sn_api_transaction.calculate_transaction_hash(&chain_id, &tx_version)?; - Ok(starknet_api::executable_transaction::DeclareTransaction { tx: sn_api_transaction, tx_hash, From c17070fc579b1bb184601cf38e450755b43ca1f5 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 21:17:10 +0100 Subject: [PATCH 23/41] Fix insufficient l1 gas error message --- tests/integration/test_v3_transactions.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/test_v3_transactions.rs b/tests/integration/test_v3_transactions.rs index e4e60ca7c..57ec6f32d 100644 --- a/tests/integration/test_v3_transactions.rs +++ b/tests/integration/test_v3_transactions.rs @@ -395,7 +395,7 @@ async fn transaction_with_less_gas_units_and_or_less_gas_price_should_return_err let execution_result = receipt.receipt.execution_result(); match execution_result { ExecutionResult::Reverted { reason } => { - assert_contains(reason.as_str(), "Insufficient max L1 gas"); + assert_contains(reason.as_str(), "Insufficient max L1Gas"); } other => panic!("Unexpected result: {:?}", other), } From 183c94ab8f768205efa19222650b541e158b3d92 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 5 Feb 2025 21:40:06 +0100 Subject: [PATCH 24/41] Fix conversion to Codegen class - revert to old impl (fix remaining test) --- crates/starknet-devnet-types/src/rpc/contract_class.rs | 10 +++------- tests/integration/test_restart.rs | 8 +++++--- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index a1d7c3e06..963d76e85 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -16,8 +16,8 @@ use starknet_api::contract_class::{ClassInfo, EntryPointType, SierraVersion}; use starknet_api::deprecated_contract_class::{EntryPointOffset, EntryPointV0}; use starknet_rs_core::types::contract::{SierraClass, SierraClassDebugInfo}; use starknet_rs_core::types::{ - CompressedLegacyContractClass, ContractClass as CodegenContractClass, - FlattenedSierraClass as CodegenSierraContractClass, LegacyContractEntryPoint, + ContractClass as CodegenContractClass, FlattenedSierraClass as CodegenSierraContractClass, + LegacyContractEntryPoint, }; use starknet_types_core::felt::Felt; @@ -192,11 +192,7 @@ impl TryInto for ContractClass { fn try_into(self) -> Result { match self { ContractClass::Cairo0(contract_class) => { - let class_json = - serde_json::to_string(&contract_class).map_err(JsonError::SerdeJsonError)?; - let codegen: CompressedLegacyContractClass = - serde_json::from_str(&class_json).map_err(JsonError::SerdeJsonError)?; - Ok(CodegenContractClass::Legacy(codegen)) + Ok(CodegenContractClass::Legacy(contract_class.try_into()?)) } ContractClass::Cairo1(contract_class) => { Ok(CodegenContractClass::Sierra(convert_sierra_to_codegen(&contract_class)?)) diff --git a/tests/integration/test_restart.rs b/tests/integration/test_restart.rs index 198f0896f..866eff133 100644 --- a/tests/integration/test_restart.rs +++ b/tests/integration/test_restart.rs @@ -14,7 +14,8 @@ use crate::common::constants::{ self, CAIRO_0_ACCOUNT_CONTRACT_HASH, CHAIN_ID, ETH_ERC20_CONTRACT_ADDRESS, }; use crate::common::utils::{ - get_deployable_account_signer, remove_file, send_ctrl_c_signal_and_wait, FeeUnit, + assert_tx_successful, get_deployable_account_signer, remove_file, send_ctrl_c_signal_and_wait, + FeeUnit, }; #[tokio::test] @@ -90,9 +91,10 @@ async fn assert_account_deployment_reverted() { let deployment = account_factory.deploy_v1(salt).max_fee(Felt::from(1e18 as u128)); let deployment_address = deployment.address(); devnet.mint(deployment_address, 1e18 as u128).await; - deployment.send().await.unwrap(); + let deployment_tx = deployment.send().await.unwrap(); - // assert there is a class associated with the deployment address + // assert deployment successful and class associated with deployment address is present + assert_tx_successful(&deployment_tx.transaction_hash, &devnet.json_rpc_client).await; devnet .json_rpc_client .get_class_at(BlockId::Tag(BlockTag::Latest), deployment_address) From 452735a1ed582b46b5371229715f28528582d357 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Thu, 6 Feb 2025 11:22:26 +0100 Subject: [PATCH 25/41] Use versioned constants for Starknet v0.13.4 --- crates/starknet-devnet-core/src/utils.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index 9cc8eeb96..5b9fa0c89 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -42,7 +42,7 @@ pub(crate) fn get_storage_var_address( pub(crate) fn get_versioned_constants() -> VersionedConstants { #[allow(clippy::unwrap_used)] // TODO - VersionedConstants::get(&StarknetVersion::V0_13_2).unwrap().clone() + VersionedConstants::get(&StarknetVersion::V0_13_4).unwrap().clone() } /// Values not present here: https://docs.starknet.io/tools/limits-and-triggers/ From 07b5375a75da9f566edc351b14d7e77e85d7c49f Mon Sep 17 00:00:00 2001 From: FabijanC Date: Thu, 6 Feb 2025 17:11:18 +0100 Subject: [PATCH 26/41] Implement EntrypointNotFound error case via checking ahead --- crates/starknet-devnet-core/src/error.rs | 2 + .../starknet-devnet-core/src/starknet/mod.rs | 11 ++++- .../src/api/json_rpc/endpoints.rs | 1 + .../src/api/json_rpc/error.rs | 10 ++++- .../src/rpc/contract_class.rs | 40 +++++++++++++++++++ tests/integration/test_call.rs | 11 ++++- 6 files changed, 71 insertions(+), 4 deletions(-) diff --git a/crates/starknet-devnet-core/src/error.rs b/crates/starknet-devnet-core/src/error.rs index bb5363863..258648b70 100644 --- a/crates/starknet-devnet-core/src/error.rs +++ b/crates/starknet-devnet-core/src/error.rs @@ -73,6 +73,8 @@ pub enum Error { CompiledClassHashMismatch, #[error("{msg}")] ClassAlreadyDeclared { msg: String }, + #[error("Requested entrypoint does not exist in the contract")] + EntrypointNotFound, } impl From for Error { diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index 0a6e399ab..14e40a7c7 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -643,11 +643,18 @@ impl Starknet { entrypoint_selector: Felt, calldata: Vec, ) -> DevnetResult> { + match self.get_class_at(block_id, ContractAddress::new(contract_address)?) { + Ok(class) => { + if !class.has_entrypoint(entrypoint_selector) { + return Err(Error::EntrypointNotFound); + } + } + Err(error) => return Err(error), + }; + let block_context = self.block_context.clone(); let state = self.get_mut_state_at(block_id)?; - state.assert_contract_deployed(ContractAddress::new(contract_address)?)?; - let mut initial_gas = block_context.versioned_constants().sierra_gas_limit(&ExecutionMode::Execute); let call = blockifier::execution::entry_point::CallEntryPoint { diff --git a/crates/starknet-devnet-server/src/api/json_rpc/endpoints.rs b/crates/starknet-devnet-server/src/api/json_rpc/endpoints.rs index 230bd9d9a..c1ef36dba 100644 --- a/crates/starknet-devnet-server/src/api/json_rpc/endpoints.rs +++ b/crates/starknet-devnet-server/src/api/json_rpc/endpoints.rs @@ -288,6 +288,7 @@ impl JsonRpcHandler { Ok(result) => Ok(StarknetResponse::Call(result).into()), Err(Error::NoBlock) => Err(ApiError::BlockNotFound), Err(Error::ContractNotFound) => Err(ApiError::ContractNotFound), + Err(Error::EntrypointNotFound) => Err(ApiError::EntrypointNotFound), Err(e @ Error::NoStateAtBlock { .. }) => { Err(ApiError::NoStateAtBlock { msg: e.to_string() }) } diff --git a/crates/starknet-devnet-server/src/api/json_rpc/error.rs b/crates/starknet-devnet-server/src/api/json_rpc/error.rs index 112af8882..76928c7d8 100644 --- a/crates/starknet-devnet-server/src/api/json_rpc/error.rs +++ b/crates/starknet-devnet-server/src/api/json_rpc/error.rs @@ -62,6 +62,8 @@ pub enum ApiError { CompiledClassHashMismatch, #[error("Transaction execution error")] ExecutionError { execution_error: String, index: usize }, + #[error("Requested entrypoint does not exist in the contract")] + EntrypointNotFound, } impl ApiError { @@ -209,6 +211,11 @@ impl ApiError { })), }, ApiError::HttpApiError(http_api_error) => http_api_error.http_api_error_to_rpc_error(), + ApiError::EntrypointNotFound => RpcError { + code: crate::rpc_core::error::ErrorCode::ServerError(21), + message: error_message.into(), + data: None, + }, } } @@ -240,7 +247,8 @@ impl ApiError { | Self::ValidationFailure { .. } | Self::HttpApiError(_) | Self::CompiledClassHashMismatch - | Self::ExecutionError { .. } => false, + | Self::ExecutionError { .. } + | Self::EntrypointNotFound => false, } } } diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 963d76e85..b7870576b 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -55,6 +55,46 @@ impl ContractClass { Ok(sierra_contract_class) } + + pub fn has_entrypoint(&self, selector: Felt) -> bool { + match self { + ContractClass::Cairo0(class) => match class { + Cairo0ContractClass::RawJson(class) => { + #[allow(clippy::unwrap_used)] + let entry_points = + class.inner["entry_points_by_type"]["EXTERNAL"].as_array().unwrap(); + for entry_point in entry_points { + #[allow(clippy::unwrap_used)] + let candidate_selector: Felt = + serde_json::from_value(entry_point["selector"].clone()).unwrap(); + if candidate_selector == selector { + return true; + } + } + + false + } + Cairo0ContractClass::Rpc(class) => { + for candidate_entrypoint in &class.entry_points_by_type.external { + if candidate_entrypoint.selector == selector { + return true; + } + } + + false + } + }, + ContractClass::Cairo1(class) => { + for candidate_entrypoint in &class.entry_points_by_type.external { + if candidate_entrypoint.selector == selector.to_biguint() { + return true; + } + } + + false + } + } + } } impl From for ContractClass { diff --git a/tests/integration/test_call.rs b/tests/integration/test_call.rs index 2ece78594..5d5b687c5 100644 --- a/tests/integration/test_call.rs +++ b/tests/integration/test_call.rs @@ -1,4 +1,5 @@ use starknet_rs_core::types::{BlockId, BlockTag, Felt, FunctionCall, StarknetError}; +use starknet_rs_providers::jsonrpc::JsonRpcError; use starknet_rs_providers::{Provider, ProviderError}; use crate::common::background_devnet::BackgroundDevnet; @@ -32,6 +33,8 @@ async fn calling_method_of_undeployed_contract() { } } +// TODO add cairo0 nonexistent method error + #[tokio::test] async fn calling_nonexistent_contract_method() { let devnet = BackgroundDevnet::spawn().await.expect("Could not start Devnet"); @@ -53,7 +56,13 @@ async fn calling_nonexistent_contract_method() { .expect_err("Should have failed"); match err { - ProviderError::StarknetError(StarknetError::ContractError(_)) => (), + ProviderError::Other(ref error) => { + let error = error.as_any().downcast_ref::().unwrap(); + assert_eq!( + (error.code, error.message.as_str()), + (21, "Requested entrypoint does not exist in the contract") + ); + } _ => panic!("Invalid error: {err:?}"), } } From 66705f73b37ddae02d7095de6db068cdf2c09bd8 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 7 Feb 2025 15:56:54 +0100 Subject: [PATCH 27/41] Adapt non-existent cairo1 method test --- tests/integration/test_call.rs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/tests/integration/test_call.rs b/tests/integration/test_call.rs index 5d5b687c5..1a8068795 100644 --- a/tests/integration/test_call.rs +++ b/tests/integration/test_call.rs @@ -1,5 +1,5 @@ +use server::test_utils::assert_contains; use starknet_rs_core::types::{BlockId, BlockTag, Felt, FunctionCall, StarknetError}; -use starknet_rs_providers::jsonrpc::JsonRpcError; use starknet_rs_providers::{Provider, ProviderError}; use crate::common::background_devnet::BackgroundDevnet; @@ -55,14 +55,5 @@ async fn calling_nonexistent_contract_method() { .await .expect_err("Should have failed"); - match err { - ProviderError::Other(ref error) => { - let error = error.as_any().downcast_ref::().unwrap(); - assert_eq!( - (error.code, error.message.as_str()), - (21, "Requested entrypoint does not exist in the contract") - ); - } - _ => panic!("Invalid error: {err:?}"), - } + assert_contains(&err.to_string(), "Requested entrypoint does not exist in the contract"); } From c59768349e2640306796931c301ef415522108db Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 7 Feb 2025 16:00:14 +0100 Subject: [PATCH 28/41] Replace entrypoint check logic --- crates/starknet-devnet-core/src/constants.rs | 3 +++ .../starknet-devnet-core/src/starknet/mod.rs | 21 +++++++++---------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/crates/starknet-devnet-core/src/constants.rs b/crates/starknet-devnet-core/src/constants.rs index ce46cf69b..df6792932 100644 --- a/crates/starknet-devnet-core/src/constants.rs +++ b/crates/starknet-devnet-core/src/constants.rs @@ -97,3 +97,6 @@ pub const CHARGEABLE_ACCOUNT_PUBLIC_KEY: &str = pub const CHARGEABLE_ACCOUNT_PRIVATE_KEY: &str = "0x5FB2959E3011A873A7160F5BB32B0ECE"; pub const CHARGEABLE_ACCOUNT_ADDRESS: &str = "0x1CAF2DF5ED5DDE1AE3FAEF4ACD72522AC3CB16E23F6DC4C7F9FAED67124C511"; + +pub const ENTRYPOINT_NOT_FOUND_ERROR_ENCODED: Felt = + Felt::from_hex_unchecked("0x454e545259504f494e545f4e4f545f464f554e44"); diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index 14e40a7c7..35851f939 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -63,8 +63,8 @@ use crate::blocks::{StarknetBlock, StarknetBlocks}; use crate::constants::{ CHARGEABLE_ACCOUNT_ADDRESS, CHARGEABLE_ACCOUNT_PRIVATE_KEY, DEVNET_DEFAULT_CHAIN_ID, DEVNET_DEFAULT_DATA_GAS_PRICE, DEVNET_DEFAULT_GAS_PRICE, DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, - ETH_ERC20_CONTRACT_ADDRESS, ETH_ERC20_NAME, ETH_ERC20_SYMBOL, STRK_ERC20_CONTRACT_ADDRESS, - STRK_ERC20_NAME, STRK_ERC20_SYMBOL, USE_KZG_DA, + ENTRYPOINT_NOT_FOUND_ERROR_ENCODED, ETH_ERC20_CONTRACT_ADDRESS, ETH_ERC20_NAME, + ETH_ERC20_SYMBOL, STRK_ERC20_CONTRACT_ADDRESS, STRK_ERC20_NAME, STRK_ERC20_SYMBOL, USE_KZG_DA, }; use crate::contract_class_choice::AccountContractClassChoice; use crate::error::{DevnetResult, Error, TransactionValidationError}; @@ -643,18 +643,11 @@ impl Starknet { entrypoint_selector: Felt, calldata: Vec, ) -> DevnetResult> { - match self.get_class_at(block_id, ContractAddress::new(contract_address)?) { - Ok(class) => { - if !class.has_entrypoint(entrypoint_selector) { - return Err(Error::EntrypointNotFound); - } - } - Err(error) => return Err(error), - }; - let block_context = self.block_context.clone(); let state = self.get_mut_state_at(block_id)?; + state.assert_contract_deployed(ContractAddress::new(contract_address)?)?; + let mut initial_gas = block_context.versioned_constants().sierra_gas_limit(&ExecutionMode::Execute); let call = blockifier::execution::entry_point::CallEntryPoint { @@ -684,6 +677,12 @@ impl Starknet { let res = call.execute(&mut transactional_state, &mut execution_context, &mut initial_gas.0)?; + if res.execution.failed + && res.execution.retdata.0.first() == Some(&ENTRYPOINT_NOT_FOUND_ERROR_ENCODED) + { + return Err(Error::EntrypointNotFound); + } + Ok(res.execution.retdata.0) } From 7a8733d9580d39e89a36238abb016c798b78b3ac Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 7 Feb 2025 16:20:37 +0100 Subject: [PATCH 29/41] Adapt hardcoded values in set gas tests --- tests/integration/test_gas_modification.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/integration/test_gas_modification.rs b/tests/integration/test_gas_modification.rs index b09e3391b..1b469e96c 100644 --- a/tests/integration/test_gas_modification.rs +++ b/tests/integration/test_gas_modification.rs @@ -112,7 +112,7 @@ async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { resp_no_flags["fee_estimation"]["data_gas_price"], to_hex_felt(&DEVNET_DEFAULT_GAS_PRICE) ); - assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0xa7275ca6d3000"); + assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x7398c659d800"); let params_skip_validation_and_fee_charge = get_params(&["SKIP_VALIDATE", "SKIP_FEE_CHARGE"]); let resp_skip_validation = &devnet @@ -130,7 +130,7 @@ async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { resp_skip_validation["fee_estimation"]["data_gas_price"], to_hex_felt(&DEVNET_DEFAULT_GAS_PRICE) ); - assert_eq!(resp_skip_validation["fee_estimation"]["overall_fee"], "0xa7247397f6000"); + assert_eq!(resp_skip_validation["fee_estimation"]["overall_fee"], "0x736a356c0800"); assert_difference_if_validation( resp_no_flags, @@ -161,7 +161,7 @@ async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { assert_eq!(resp_no_flags["fee_estimation"]["gas_price"], to_hex_felt(&wei_price)); assert_eq!(resp_no_flags["fee_estimation"]["data_gas_price"], to_hex_felt(&wei_price_data)); - assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x38008384ec45ab780000"); + assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x261b37abed7125c0000"); let resp_skip_validation = &devnet .send_custom_rpc("starknet_simulateTransactions", params_skip_validation_and_fee_charge) @@ -172,7 +172,7 @@ async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { resp_skip_validation["fee_estimation"]["data_gas_price"], to_hex_felt(&wei_price_data) ); - assert_eq!(resp_skip_validation["fee_estimation"]["overall_fee"], "0x37ff89b813a3e6700000"); + assert_eq!(resp_skip_validation["fee_estimation"]["overall_fee"], "0x260b9ade6354d540000"); assert_difference_if_validation( resp_no_flags, From 8ae1400efdee7cd16fcfff9dfd6597046722bac2 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Fri, 7 Feb 2025 16:38:52 +0100 Subject: [PATCH 30/41] Fix test starknet::mod::calling_nonexistent_contract_method --- crates/starknet-devnet-core/src/starknet/mod.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index 35851f939..f89755487 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -1395,11 +1395,9 @@ mod tests { use std::thread; use std::time::Duration; - use blockifier::execution::errors::{EntryPointExecutionError, PreExecutionError}; use blockifier::state::state_api::{State, StateReader}; use nonzero_ext::nonzero; use starknet_api::block::{BlockHash, BlockNumber, BlockStatus, BlockTimestamp, FeeType}; - use starknet_api::core::EntryPointSelector; use starknet_rs_core::types::{BlockId, BlockTag, Felt}; use starknet_rs_core::utils::get_selector_from_name; use starknet_types::contract_address::ContractAddress; @@ -1732,9 +1730,7 @@ mod tests { entry_point_selector, vec![Felt::from(predeployed_account.account_address)], ) { - Err(Error::BlockifierExecutionError(EntryPointExecutionError::PreExecutionError( - PreExecutionError::EntryPointNotFound(EntryPointSelector(missing_selector)), - ))) => assert_eq!(missing_selector, entry_point_selector), + Err(Error::EntrypointNotFound) => (), unexpected => panic!("Should have failed; got {unexpected:?}"), } } From 5a05a6e23f30c60ffbe6f90b0a58782113f1eb49 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 10 Feb 2025 11:40:43 +0100 Subject: [PATCH 31/41] Temporarily address panic error message assertion --- tests/integration/test_estimate_fee.rs | 10 ++++++++-- .../integration/test_simulate_transactions.rs | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/tests/integration/test_estimate_fee.rs b/tests/integration/test_estimate_fee.rs index 9fd850abb..6d4e3b88f 100644 --- a/tests/integration/test_estimate_fee.rs +++ b/tests/integration/test_estimate_fee.rs @@ -407,7 +407,11 @@ async fn message_available_if_estimation_reverts() { execution_error, .. }), - )) => assert_contains(&execution_error, panic_reason), + )) => { + // TODO temporarily replace assert_contains(&execution_error, panic_reason) + assert_contains(&execution_error, "0x526573756c743a3a756e77726170206661696c65642e"); + assert_contains(&execution_error, "('Result::unwrap failed.')"); + } other => panic!("Invalid err: {other:?}"), }; } @@ -649,7 +653,9 @@ async fn estimate_fee_of_declare_and_deploy_via_udc_returns_index_of_second_tran TransactionExecutionErrorData { transaction_index, execution_error }, )) => { assert_eq!(transaction_index, 1); - assert_contains(&execution_error, "not found in contract"); + // TODO temporarily replace assert_contains(&execution_error, "not found in contract") + assert_contains(&execution_error, "0x526573756c743a3a756e77726170206661696c65642e"); + assert_contains(&execution_error, "('Result::unwrap failed.')"); } other => panic!("Unexpected error: {:?}", other), } diff --git a/tests/integration/test_simulate_transactions.rs b/tests/integration/test_simulate_transactions.rs index 66ec24047..3524535ec 100644 --- a/tests/integration/test_simulate_transactions.rs +++ b/tests/integration/test_simulate_transactions.rs @@ -535,7 +535,13 @@ async fn simulate_of_multiple_txs_shouldnt_return_an_error_if_invoke_transaction execute_invocation: ExecuteInvocation::Reverted(reverted_invocation), .. }) => { - assert_contains(&reverted_invocation.revert_reason, "not found in contract"); + // TODO replacement for assert_contains(&reverted_invocation.revert_reason, "not found + // in contract") + assert_contains( + &reverted_invocation.revert_reason, + "0x526573756c743a3a756e77726170206661696c65642e", + ); + assert_contains(&reverted_invocation.revert_reason, "('Result::unwrap failed.')"); } other_trace => panic!("Unexpected trace {:?}", other_trace), } @@ -1061,7 +1067,15 @@ async fn simulate_invoke_v3_with_failing_execution_should_return_a_trace_of_reve TransactionTrace::Invoke(InvokeTransactionTrace { execute_invocation: ExecuteInvocation::Reverted(reverted_invocation), .. - }) => assert_contains(&reverted_invocation.revert_reason, panic_reason), + }) => { + // TODO replacement for assert_contains(&reverted_invocation.revert_reason, + // panic_reason) + assert_contains( + &reverted_invocation.revert_reason, + "0x526573756c743a3a756e77726170206661696c65642e", + ); + assert_contains(&reverted_invocation.revert_reason, "('Result::unwrap failed.')"); + } other => panic!("Unexpected trace {other:?}"), } } From 29cc4a0d5541abf2a3136fa64c5621799537bd78 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 10 Feb 2025 13:52:28 +0100 Subject: [PATCH 32/41] Fix l1_handler test --- .../src/starknet/add_l1_handler_transaction.rs | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs index a116b50a8..22e64e4ba 100644 --- a/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_l1_handler_transaction.rs @@ -33,7 +33,7 @@ mod tests { // Constants taken from test_estimate_message_fee.rs. const WHITELISTED_L1_ADDRESS: &str = "0x8359E4B0152ed5A731162D3c7B0D8D56edB165A0"; - use blockifier::execution::errors::{EntryPointExecutionError, PreExecutionError}; + use blockifier::execution::errors::EntryPointExecutionError; use blockifier::transaction::errors::TransactionExecutionError::ExecutionError; use nonzero_ext::nonzero; use starknet_rs_core::types::{Felt, TransactionExecutionStatus, TransactionFinalityStatus}; @@ -49,7 +49,8 @@ mod tests { use crate::account::Account; use crate::constants::{ self, DEVNET_DEFAULT_CHAIN_ID, DEVNET_DEFAULT_STARTING_BLOCK_NUMBER, - ETH_ERC20_CONTRACT_ADDRESS, STRK_ERC20_CONTRACT_ADDRESS, + ENTRYPOINT_NOT_FOUND_ERROR_ENCODED, ETH_ERC20_CONTRACT_ADDRESS, + STRK_ERC20_CONTRACT_ADDRESS, }; use crate::starknet::{predeployed, Starknet}; use crate::state::CustomState; @@ -125,13 +126,14 @@ mod tests { match result { Err(crate::error::Error::BlockifierTransactionError(ExecutionError { - error: - EntryPointExecutionError::PreExecutionError(PreExecutionError::EntryPointNotFound( - selector, - )), + error: EntryPointExecutionError::ExecutionFailed { error_trace }, .. })) => { - assert_eq!(selector.0, withdraw_selector) + let error_stack = error_trace.stack; + assert_eq!(error_stack.len(), 1); + let error_frame = error_stack.first().unwrap(); + assert_eq!(error_frame.selector.0, withdraw_selector); + assert_eq!(error_trace.last_retdata.0, vec![ENTRYPOINT_NOT_FOUND_ERROR_ENCODED]); } other => panic!("Wrong result: {other:?}"), } From e7f8f3bbd30a56c338990826026686758d7448b1 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 10 Feb 2025 16:01:27 +0100 Subject: [PATCH 33/41] Fix test: nonce_should_be_incremented_if_invoke_reverted --- .../starknet-devnet-core/src/starknet/add_invoke_transaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs index 2c39cb884..986160cdc 100644 --- a/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs +++ b/crates/starknet-devnet-core/src/starknet/add_invoke_transaction.rs @@ -431,7 +431,7 @@ mod tests { Felt::from(10), // calldata ]; - let insufficient_max_fee = 139; // this is minimum fee (enough for passing validation), anything lower than that is bounced back + let insufficient_max_fee = 140; // this is minimum fee (enough for passing validation), anything lower than that is bounced back let invoke_transaction = BroadcastedInvokeTransactionV1::new( account_address.into(), Fee(insufficient_max_fee), From c78eec4734504342d641074b55efb62ed851cc43 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 10 Feb 2025 16:01:43 +0100 Subject: [PATCH 34/41] Fix panic in validate --- crates/starknet-devnet-core/src/error.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/crates/starknet-devnet-core/src/error.rs b/crates/starknet-devnet-core/src/error.rs index 258648b70..3b1ad9932 100644 --- a/crates/starknet-devnet-core/src/error.rs +++ b/crates/starknet-devnet-core/src/error.rs @@ -126,6 +126,10 @@ impl From for Error { err @ TransactionExecutionError::DeclareTransactionError { .. } => { Error::ClassAlreadyDeclared { msg: err.to_string() } } + TransactionExecutionError::PanicInValidate { panic_reason } => { + TransactionValidationError::ValidationFailure { reason: panic_reason.to_string() } + .into() + } other => Self::BlockifierTransactionError(other), } } From 484e769d7ad3aa4100a782bf85b5cddf4c48ee13 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Mon, 10 Feb 2025 16:02:57 +0100 Subject: [PATCH 35/41] Use blockifier's default BouncerConfig impl --- crates/starknet-devnet-core/src/utils.rs | 29 +++--------------------- 1 file changed, 3 insertions(+), 26 deletions(-) diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index 5b9fa0c89..d41a3cea6 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -1,4 +1,4 @@ -use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount}; +use blockifier::bouncer::BouncerConfig; use blockifier::versioned_constants::VersionedConstants; use serde_json::Value; use starknet_api::block::StarknetVersion; @@ -40,37 +40,14 @@ pub(crate) fn get_storage_var_address( Ok(PatriciaKey::new(storage_var_address)?) } +// This should be modified when updating to the version after 0.13.4 pub(crate) fn get_versioned_constants() -> VersionedConstants { #[allow(clippy::unwrap_used)] // TODO VersionedConstants::get(&StarknetVersion::V0_13_4).unwrap().clone() } -/// Values not present here: https://docs.starknet.io/tools/limits-and-triggers/ -/// Asked the blockifier team about the values, they provided them here: -/// https://spaceshard.slack.com/archives/C029F9AN8LX/p1721657837687799?thread_ts=1721400009.781699&cid=C029F9AN8LX pub(crate) fn custom_bouncer_config() -> BouncerConfig { - BouncerConfig { - block_max_capacity: BouncerWeights { - n_steps: 40_000_000, - l1_gas: 4_950_000, // TODO - sierra_gas: starknet_api::execution_resources::GasAmount(4_950_000), - state_diff_size: 4_000, - n_events: 5_000, - builtin_count: BuiltinCount { - pedersen: 1_250_000, - poseidon: 1_250_000, - range_check: 250_000, - range_check96: 250_000, - add_mod: 250_000, - mul_mod: 250_000, - ecdsa: 19_531, - bitwise: 625_000, - ec_op: 39_062, - keccak: 19_531, - }, - ..BouncerWeights::max() - }, - } + BouncerConfig::default() } /// Returns the hash of a compiled class. From 9bb119326e0c8090dfa0f0d4215e7fe484846ea8 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Tue, 11 Feb 2025 10:15:24 +0100 Subject: [PATCH 36/41] Restore BouncerConfig; expand with starkware's suggestions --- crates/starknet-devnet-core/src/utils.rs | 29 ++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index d41a3cea6..363c35c25 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -1,4 +1,4 @@ -use blockifier::bouncer::BouncerConfig; +use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount}; use blockifier::versioned_constants::VersionedConstants; use serde_json::Value; use starknet_api::block::StarknetVersion; @@ -46,8 +46,33 @@ pub(crate) fn get_versioned_constants() -> VersionedConstants { VersionedConstants::get(&StarknetVersion::V0_13_4).unwrap().clone() } +/// Values not present here: https://docs.starknet.io/tools/limits-and-triggers/ +/// Asked the blockifier team about the values, they provided them in these threads: +/// https://spaceshard.slack.com/archives/C029F9AN8LX/p1721657837687799?thread_ts=1721400009.781699&cid=C029F9AN8LX +/// https://spaceshard.slack.com/archives/C029F9AN8LX/p1739259794326519?thread_ts=1738840494.497479&cid=C029F9AN8LX pub(crate) fn custom_bouncer_config() -> BouncerConfig { - BouncerConfig::default() + BouncerConfig { + block_max_capacity: BouncerWeights { + n_steps: 40_000_000, + l1_gas: 4_950_000, + sierra_gas: starknet_api::execution_resources::GasAmount(250_000_000), + state_diff_size: 4_000, + n_events: 5_000, + builtin_count: BuiltinCount { + pedersen: 1_250_000, + poseidon: 1_250_000, + range_check: 250_000, + range_check96: 250_000, + add_mod: 250_000, + mul_mod: 250_000, + ecdsa: 19_531, + bitwise: 625_000, + ec_op: 39_062, + keccak: 19_531, + }, + ..BouncerWeights::max() + }, + } } /// Returns the hash of a compiled class. From f8f782569b39af6ea9217d310b1d419a06b7474c Mon Sep 17 00:00:00 2001 From: FabijanC Date: Tue, 11 Feb 2025 12:47:30 +0100 Subject: [PATCH 37/41] Improve gas TODOs --- .../src/starknet/estimations.rs | 2 +- .../starknet-devnet-core/src/starknet/mod.rs | 2 +- crates/starknet-devnet-core/src/utils.rs | 2 +- .../src/rpc/transactions.rs | 28 +++++++++++++++---- 4 files changed, 26 insertions(+), 8 deletions(-) diff --git a/crates/starknet-devnet-core/src/starknet/estimations.rs b/crates/starknet-devnet-core/src/starknet/estimations.rs index 246038f22..8f9821d17 100644 --- a/crates/starknet-devnet-core/src/starknet/estimations.rs +++ b/crates/starknet-devnet-core/src/starknet/estimations.rs @@ -133,7 +133,7 @@ fn estimate_transaction_fee( let gas_vector = transaction_execution_info.receipt.resources.to_gas_vector( &get_versioned_constants(), block_context.block_info().use_kzg_da, - &GasVectorComputationMode::NoL2Gas, // TODO All? + &GasVectorComputationMode::NoL2Gas, // TODO gas ); let total_fee = fee_utils::get_fee_by_gas_vector(block_context.block_info(), gas_vector, &fee_type); diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index f89755487..6f03daeb7 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -114,7 +114,7 @@ pub struct Starknet { impl Default for Starknet { fn default() -> Self { - #[allow(clippy::unwrap_used)] // TODO + #[allow(clippy::unwrap_used)] let default_gas_price = DEVNET_DEFAULT_GAS_PRICE.get().try_into().unwrap(); Self { block_context: Self::init_block_context( diff --git a/crates/starknet-devnet-core/src/utils.rs b/crates/starknet-devnet-core/src/utils.rs index 363c35c25..80f37173f 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -42,7 +42,7 @@ pub(crate) fn get_storage_var_address( // This should be modified when updating to the version after 0.13.4 pub(crate) fn get_versioned_constants() -> VersionedConstants { - #[allow(clippy::unwrap_used)] // TODO + #[allow(clippy::unwrap_used)] VersionedConstants::get(&StarknetVersion::V0_13_4).unwrap().clone() } diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index c0d56f8e7..f0cb8a778 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -14,7 +14,7 @@ use starknet_api::block::{BlockNumber, GasPrice}; use starknet_api::contract_class::{ClassInfo, EntryPointType}; use starknet_api::core::calculate_contract_address; use starknet_api::data_availability::DataAvailabilityMode; -use starknet_api::transaction::fields::{Fee, Tip}; +use starknet_api::transaction::fields::{AllResourceBounds, Fee, Tip}; use starknet_api::transaction::{signed_tx_version, TransactionHasher, TransactionOptions}; use starknet_rs_core::types::{ BlockId, ExecutionResult, Felt, ResourceBounds, ResourceBoundsMapping, @@ -332,10 +332,28 @@ fn convert_resource_bounds_from_starknet_rs_to_starknet_api( impl From<&ResourceBoundsWrapper> for starknet_api::transaction::fields::ValidResourceBounds { fn from(value: &ResourceBoundsWrapper) -> Self { - // TODO l1_data_gas? l2_gas? - starknet_api::transaction::fields::ValidResourceBounds::L1Gas( - convert_resource_bounds_from_starknet_rs_to_starknet_api(value.inner.l1_gas.clone()), - ) + if value.inner.l2_gas.max_amount == 0 { + starknet_api::transaction::fields::ValidResourceBounds::L1Gas( + convert_resource_bounds_from_starknet_rs_to_starknet_api( + value.inner.l1_gas.clone(), + ), + ) + } else { + starknet_api::transaction::fields::ValidResourceBounds::AllResources( + AllResourceBounds { + l1_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( + value.inner.l1_gas.clone(), + ), + l2_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( + value.inner.l2_gas.clone(), + ), + l1_data_gas: convert_resource_bounds_from_starknet_rs_to_starknet_api( + // TODO gas + ResourceBounds { max_amount: 0, max_price_per_unit: 0 }, + ), + }, + ) + } } } From 7d7e204f8ed86e4b14caf62d9a9968864e166756 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Tue, 11 Feb 2025 12:49:12 +0100 Subject: [PATCH 38/41] Remove redundant has_entrypoint method --- .../src/rpc/contract_class.rs | 40 ------------------- 1 file changed, 40 deletions(-) diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index b7870576b..963d76e85 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -55,46 +55,6 @@ impl ContractClass { Ok(sierra_contract_class) } - - pub fn has_entrypoint(&self, selector: Felt) -> bool { - match self { - ContractClass::Cairo0(class) => match class { - Cairo0ContractClass::RawJson(class) => { - #[allow(clippy::unwrap_used)] - let entry_points = - class.inner["entry_points_by_type"]["EXTERNAL"].as_array().unwrap(); - for entry_point in entry_points { - #[allow(clippy::unwrap_used)] - let candidate_selector: Felt = - serde_json::from_value(entry_point["selector"].clone()).unwrap(); - if candidate_selector == selector { - return true; - } - } - - false - } - Cairo0ContractClass::Rpc(class) => { - for candidate_entrypoint in &class.entry_points_by_type.external { - if candidate_entrypoint.selector == selector { - return true; - } - } - - false - } - }, - ContractClass::Cairo1(class) => { - for candidate_entrypoint in &class.entry_points_by_type.external { - if candidate_entrypoint.selector == selector.to_biguint() { - return true; - } - } - - false - } - } - } } impl From for ContractClass { From 0380d0acdf15d01e5a4e811c445ed590df154c22 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Tue, 11 Feb 2025 13:14:43 +0100 Subject: [PATCH 39/41] Extract common logic: json sierra -> casm --- crates/starknet-devnet-core/src/error.rs | 4 +- .../src/rpc/contract_class.rs | 44 +++++++++---------- 2 files changed, 22 insertions(+), 26 deletions(-) diff --git a/crates/starknet-devnet-core/src/error.rs b/crates/starknet-devnet-core/src/error.rs index 3b1ad9932..97f55bcc3 100644 --- a/crates/starknet-devnet-core/src/error.rs +++ b/crates/starknet-devnet-core/src/error.rs @@ -21,8 +21,8 @@ pub enum Error { #[error(transparent)] BlockifierExecutionError(#[from] blockifier::execution::errors::EntryPointExecutionError), #[error("{execution_error}")] - ExecutionError { execution_error: String, index: usize }, /* TODO change type of - * execution_error */ + // TODO change type of execution_error + ExecutionError { execution_error: String, index: usize }, #[error("Types error: {0}")] TypesError(#[from] starknet_types::error::Error), #[error("I/O error: {0}")] diff --git a/crates/starknet-devnet-types/src/rpc/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index 963d76e85..8f83a3957 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -226,20 +226,8 @@ impl TryFrom for RunnableCompiledClass { Ok(match value { ContractClass::Cairo0(class) => class.try_into()?, ContractClass::Cairo1(class) => { - // TODO extract this as common logic let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; - let casm_json = usc::compile_contract(json_value) - .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; - - let casm = serde_json::from_value::(casm_json) - .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; - - let versioned_casm = - (casm, SierraVersion::from_str(&class.contract_class_version)?); - let compiled = versioned_casm.try_into().map_err(|e: ProgramError| { - Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) - })?; - RunnableCompiledClass::V1(compiled) + jsonified_sierra_to_runnable_casm(json_value, &class.contract_class_version)? } }) } @@ -324,23 +312,31 @@ fn convert_sierra_to_codegen( }) } +fn jsonified_sierra_to_runnable_casm( + jsonified_sierra: serde_json::Value, + sierra_version: &str, +) -> Result { + let casm_json = usc::compile_contract(jsonified_sierra) + .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; + + let casm = serde_json::from_value::(casm_json) + .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; + + let versioned_casm = (casm, SierraVersion::from_str(sierra_version)?); + let compiled = versioned_casm.try_into().map_err(|e: ProgramError| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + })?; + + Ok(RunnableCompiledClass::V1(compiled)) +} + pub fn convert_codegen_to_blockifier_compiled_class( class: CodegenContractClass, ) -> Result { Ok(match &class { CodegenContractClass::Sierra(sierra) => { let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; - let casm_json = usc::compile_contract(json_value) - .map_err(|err| Error::SierraCompilationError { reason: err.to_string() })?; - - let casm = serde_json::from_value::(casm_json) - .map_err(|err| Error::JsonError(JsonError::Custom { msg: err.to_string() }))?; - - let versioned_casm = (casm, SierraVersion::from_str(&sierra.contract_class_version)?); - let compiled = versioned_casm.try_into().map_err(|e: ProgramError| { - Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) - })?; - RunnableCompiledClass::V1(compiled) + jsonified_sierra_to_runnable_casm(json_value, &sierra.contract_class_version)? } CodegenContractClass::Legacy(_) => { let class_jsonified = From 71887ad11425250109353f6f8f9bba1355b0a762 Mon Sep 17 00:00:00 2001 From: FabijanC Date: Wed, 12 Feb 2025 17:26:42 +0100 Subject: [PATCH 40/41] Adapt tests to new account version --- tests/integration/test_estimate_fee.rs | 10 ++-------- tests/integration/test_gas_modification.rs | 4 ++-- .../integration/test_simulate_transactions.rs | 20 ++----------------- 3 files changed, 6 insertions(+), 28 deletions(-) diff --git a/tests/integration/test_estimate_fee.rs b/tests/integration/test_estimate_fee.rs index 6d4e3b88f..d9f90a494 100644 --- a/tests/integration/test_estimate_fee.rs +++ b/tests/integration/test_estimate_fee.rs @@ -407,11 +407,7 @@ async fn message_available_if_estimation_reverts() { execution_error, .. }), - )) => { - // TODO temporarily replace assert_contains(&execution_error, panic_reason) - assert_contains(&execution_error, "0x526573756c743a3a756e77726170206661696c65642e"); - assert_contains(&execution_error, "('Result::unwrap failed.')"); - } + )) => assert_contains(&execution_error, panic_reason), other => panic!("Invalid err: {other:?}"), }; } @@ -653,9 +649,7 @@ async fn estimate_fee_of_declare_and_deploy_via_udc_returns_index_of_second_tran TransactionExecutionErrorData { transaction_index, execution_error }, )) => { assert_eq!(transaction_index, 1); - // TODO temporarily replace assert_contains(&execution_error, "not found in contract") - assert_contains(&execution_error, "0x526573756c743a3a756e77726170206661696c65642e"); - assert_contains(&execution_error, "('Result::unwrap failed.')"); + assert_contains(&execution_error, "ENTRYPOINT_NOT_FOUND") } other => panic!("Unexpected error: {:?}", other), } diff --git a/tests/integration/test_gas_modification.rs b/tests/integration/test_gas_modification.rs index 1b469e96c..48e4824a6 100644 --- a/tests/integration/test_gas_modification.rs +++ b/tests/integration/test_gas_modification.rs @@ -112,7 +112,7 @@ async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { resp_no_flags["fee_estimation"]["data_gas_price"], to_hex_felt(&DEVNET_DEFAULT_GAS_PRICE) ); - assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x7398c659d800"); + assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x73b00ed0c000"); let params_skip_validation_and_fee_charge = get_params(&["SKIP_VALIDATE", "SKIP_FEE_CHARGE"]); let resp_skip_validation = &devnet @@ -161,7 +161,7 @@ async fn set_gas_scenario(devnet: BackgroundDevnet, expected_chain_id: Felt) { assert_eq!(resp_no_flags["fee_estimation"]["gas_price"], to_hex_felt(&wei_price)); assert_eq!(resp_no_flags["fee_estimation"]["data_gas_price"], to_hex_felt(&wei_price_data)); - assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x261b37abed7125c0000"); + assert_eq!(resp_no_flags["fee_estimation"]["overall_fee"], "0x26230612b27f4e00000"); let resp_skip_validation = &devnet .send_custom_rpc("starknet_simulateTransactions", params_skip_validation_and_fee_charge) diff --git a/tests/integration/test_simulate_transactions.rs b/tests/integration/test_simulate_transactions.rs index 3524535ec..bb7692a94 100644 --- a/tests/integration/test_simulate_transactions.rs +++ b/tests/integration/test_simulate_transactions.rs @@ -534,15 +534,7 @@ async fn simulate_of_multiple_txs_shouldnt_return_an_error_if_invoke_transaction TransactionTrace::Invoke(InvokeTransactionTrace { execute_invocation: ExecuteInvocation::Reverted(reverted_invocation), .. - }) => { - // TODO replacement for assert_contains(&reverted_invocation.revert_reason, "not found - // in contract") - assert_contains( - &reverted_invocation.revert_reason, - "0x526573756c743a3a756e77726170206661696c65642e", - ); - assert_contains(&reverted_invocation.revert_reason, "('Result::unwrap failed.')"); - } + }) => assert_contains(&reverted_invocation.revert_reason, "ENTRYPOINT_NOT_FOUND"), other_trace => panic!("Unexpected trace {:?}", other_trace), } } @@ -1067,15 +1059,7 @@ async fn simulate_invoke_v3_with_failing_execution_should_return_a_trace_of_reve TransactionTrace::Invoke(InvokeTransactionTrace { execute_invocation: ExecuteInvocation::Reverted(reverted_invocation), .. - }) => { - // TODO replacement for assert_contains(&reverted_invocation.revert_reason, - // panic_reason) - assert_contains( - &reverted_invocation.revert_reason, - "0x526573756c743a3a756e77726170206661696c65642e", - ); - assert_contains(&reverted_invocation.revert_reason, "('Result::unwrap failed.')"); - } + }) => assert_contains(&reverted_invocation.revert_reason, panic_reason), other => panic!("Unexpected trace {other:?}"), } } From febf11e9c20fa14511a54d157805ac4a7be62d4d Mon Sep 17 00:00:00 2001 From: FabijanC Date: Thu, 13 Feb 2025 11:07:40 +0100 Subject: [PATCH 41/41] Reduce line count in estimations.rs --- .../src/starknet/estimations.rs | 29 ++++++++----------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/crates/starknet-devnet-core/src/starknet/estimations.rs b/crates/starknet-devnet-core/src/starknet/estimations.rs index 8f9821d17..e36d80320 100644 --- a/crates/starknet-devnet-core/src/starknet/estimations.rs +++ b/crates/starknet-devnet-core/src/starknet/estimations.rs @@ -5,7 +5,6 @@ use blockifier::transaction::account_transaction::ExecutionFlags; use blockifier::transaction::objects::HasRelatedFeeType; use blockifier::transaction::transaction_execution::Transaction; use blockifier::transaction::transactions::ExecutableTransaction; -use starknet_api::block::FeeType; use starknet_api::transaction::fields::GasVectorComputationMode; use starknet_rs_core::types::{BlockId, Felt, MsgFromL1, PriceUnit}; use starknet_types::contract_address::ContractAddress; @@ -116,11 +115,6 @@ fn estimate_transaction_fee( transaction: Transaction, return_error_on_reverted_execution: bool, ) -> DevnetResult { - let fee_type = match &transaction { - Transaction::Account(tx) => tx.fee_type(), - Transaction::L1Handler(tx) => tx.fee_type(), - }; - let transaction_execution_info = transaction.execute(transactional_state, block_context)?; // reverted transactions can only be Invoke transactions @@ -135,20 +129,21 @@ fn estimate_transaction_fee( block_context.block_info().use_kzg_da, &GasVectorComputationMode::NoL2Gas, // TODO gas ); + + let fee_type = match &transaction { + Transaction::Account(tx) => tx.fee_type(), + Transaction::L1Handler(tx) => tx.fee_type(), + }; + let total_fee = fee_utils::get_fee_by_gas_vector(block_context.block_info(), gas_vector, &fee_type); - let (gas_price, data_gas_price, unit) = match fee_type { - starknet_api::block::FeeType::Strk => ( - block_context.block_info().gas_prices.l1_gas_price(&FeeType::Strk).get(), - block_context.block_info().gas_prices.l1_data_gas_price(&FeeType::Strk).get(), - PriceUnit::Fri, - ), - starknet_api::block::FeeType::Eth => ( - block_context.block_info().gas_prices.l1_gas_price(&FeeType::Eth).get(), - block_context.block_info().gas_prices.l1_data_gas_price(&FeeType::Eth).get(), - PriceUnit::Wei, - ), + let gas_price = block_context.block_info().gas_prices.l1_gas_price(&fee_type).get(); + let data_gas_price = block_context.block_info().gas_prices.l1_data_gas_price(&fee_type).get(); + + let unit = match fee_type { + starknet_api::block::FeeType::Strk => PriceUnit::Fri, + starknet_api::block::FeeType::Eth => PriceUnit::Wei, }; Ok(FeeEstimateWrapper {