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..f231066fb 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", @@ -5819,7 +5923,6 @@ dependencies = [ "serde", "serde_json", "starknet-core", - "starknet-crypto 0.7.4", "starknet-types-core", "starknet_api", "thiserror", @@ -5893,28 +5996,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 +6085,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 +6100,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 +6639,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 +6746,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 +6758,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 +6817,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 +6852,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..ad8930eee 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -71,37 +71,36 @@ 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" } 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 -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/crates/starknet-devnet-core/src/account.rs b/crates/starknet-devnet-core/src/account.rs index 11370427a..94f7e1e38 100644 --- a/crates/starknet-devnet-core/src/account.rs +++ b/crates/starknet-devnet-core/src/account.rs @@ -1,14 +1,13 @@ 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::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; @@ -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 total_supply_storage_address_low = + let storage_var_address_high = storage_var_address_low.next_storage_key()?; + + 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..b1a0ed045 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}; @@ -68,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.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 +184,38 @@ 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 +231,38 @@ 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 +285,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 +305,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 +323,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,20 +335,23 @@ 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::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.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!(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.parent_hash.0, // parent_block_hash + self.header.block_header_without_hash.parent_hash.0, // parent_block_hash ]); Ok(hash) @@ -303,7 +360,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 +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_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 +431,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 +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_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 +724,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 +760,52 @@ 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 +815,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()); @@ -743,7 +831,10 @@ mod tests { assert_eq!( block.header, BlockHeader { - l1_da_mode: starknet_api::data_availability::L1DataAvailabilityMode::Blob, + block_header_without_hash: BlockHeaderWithoutHash { + l1_da_mode: L1DataAvailabilityMode::Blob, + ..Default::default() + }, ..Default::default() } ); diff --git a/crates/starknet-devnet-core/src/constants.rs b/crates/starknet-devnet-core/src/constants.rs index a15d912cf..2238369bb 100644 --- a/crates/starknet-devnet-core/src/constants.rs +++ b/crates/starknet-devnet-core/src/constants.rs @@ -92,3 +92,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/contract_class_choice.rs b/crates/starknet-devnet-core/src/contract_class_choice.rs index 3cf39b1a5..40452dfd9 100644 --- a/crates/starknet-devnet-core/src/contract_class_choice.rs +++ b/crates/starknet-devnet-core/src/contract_class_choice.rs @@ -2,7 +2,8 @@ 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::deprecated::json_contract_class::Cairo0Json; +use starknet_types::contract_class::{Cairo0ContractClass, ContractClass}; use starknet_types::traits::HashProducer; use crate::constants::{CAIRO_0_ACCOUNT_CONTRACT, CAIRO_1_ACCOUNT_CONTRACT_SIERRA}; @@ -20,6 +21,7 @@ impl AccountContractClassChoice { AccountContractClassChoice::Cairo0 => { 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/error.rs b/crates/starknet-devnet-core/src/error.rs index 4f9db613b..97f55bcc3 100644 --- a/crates/starknet-devnet-core/src/error.rs +++ b/crates/starknet-devnet-core/src/error.rs @@ -21,6 +21,7 @@ pub enum Error { #[error(transparent)] BlockifierExecutionError(#[from] blockifier::execution::errors::EntryPointExecutionError), #[error("{execution_error}")] + // TODO change type of execution_error ExecutionError { execution_error: String, index: usize }, #[error("Types error: {0}")] TypesError(#[from] starknet_types::error::Error), @@ -72,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 { @@ -123,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), } } @@ -131,7 +138,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 +153,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..8599d320c 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,19 @@ 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, - ) - .execute( - &mut starknet.pending_state.state, - &starknet.block_context, - true, - validate, - )?; + 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 !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,7 +130,7 @@ 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, }; @@ -167,7 +163,7 @@ mod tests { Fee(10000), &Vec::new(), Felt::ZERO, - &contract_class.into(), + &contract_class, Felt::ONE, ))) } @@ -371,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_deploy_account_transaction.rs b/crates/starknet-devnet-core/src/starknet/add_deploy_account_transaction.rs index ae1be0a24..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 @@ -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, }; @@ -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..986160cdc 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,22 @@ 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,12 +69,12 @@ 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; 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; @@ -430,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), @@ -485,17 +486,15 @@ 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 increase_balance_selector = get_selector_from_name("increase_balance").unwrap(); + let dummy_contract = dummy_cairo_0_contract_class(); // check if increase_balance function is present in the contract class - blockifier + 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::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..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 @@ -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) @@ -42,14 +33,14 @@ 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}; 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; @@ -58,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; @@ -134,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:?}"), } @@ -207,27 +200,26 @@ mod tests { account.deploy(&mut starknet.pending_state).unwrap(); // 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 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 - blockifier + sn_api_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 + sn_api_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 88f20ff9d..60b3ae255 100644 --- a/crates/starknet-devnet-core/src/starknet/defaulter.rs +++ b/crates/starknet-devnet-core/src/starknet/defaulter.rs @@ -1,6 +1,6 @@ use std::io::Read; -use blockifier::execution::contract_class::ContractClass; +use blockifier::execution::contract_class::RunnableCompiledClass; use blockifier::state::errors::StateError; use blockifier::state::state_api::StateResult; use starknet_api::core::{ClassHash, ContractAddress, Nonce, PatriciaKey}; @@ -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!({ @@ -227,6 +227,7 @@ 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) .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..e36d80320 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,33 @@ 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 }), + // 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 }) + } } }) .collect() @@ -93,11 +104,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,52 +112,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(), - }; - - 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 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 { - blockifier::transaction::objects::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 => ( - 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, - ), + 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 { diff --git a/crates/starknet-devnet-core/src/starknet/mod.rs b/crates/starknet-devnet-core/src/starknet/mod.rs index 4fd283cea..6f03daeb7 100644 --- a/crates/starknet-devnet-core/src/starknet/mod.rs +++ b/crates/starknet-devnet-core/src/starknet/mod.rs @@ -1,19 +1,20 @@ 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::{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::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, @@ -62,12 +63,13 @@ 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}; 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; @@ -112,6 +114,8 @@ pub struct Starknet { impl Default for Starknet { fn default() -> Self { + #[allow(clippy::unwrap_used)] + 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 +137,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 +297,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 +331,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 +347,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 +428,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 +439,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 +461,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 +497,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,24 +543,38 @@ 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 { - 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(), - ), + 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: 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.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(), - ), + block.header.block_header_without_hash.l1_data_gas_price = GasPricePerToken { + 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.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 +648,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() }; @@ -637,15 +669,19 @@ impl Starknet { ), }), blockifier::execution::common_hints::ExecutionMode::Execute, - true, - )?; + false, + 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)?; + + if res.execution.failed + && res.execution.retdata.0.first() == Some(&ENTRYPOINT_NOT_FOUND_ERROR_ENCODED) + { + return Err(Error::EntrypointNotFound); + } Ok(res.execution.retdata.0) } @@ -1110,7 +1146,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 +1163,24 @@ 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 +1188,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, @@ -1355,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, GasPrice}; - use starknet_api::core::EntryPointSelector; + use starknet_api::block::{BlockHash, BlockNumber, BlockStatus, BlockTimestamp, FeeType}; use starknet_rs_core::types::{BlockId, BlockTag, Felt}; use starknet_rs_core::utils::get_selector_from_name; use starknet_types::contract_address::ContractAddress; @@ -1463,7 +1501,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 @@ -1478,7 +1516,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() ); } @@ -1516,13 +1554,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; @@ -1541,26 +1580,48 @@ 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, - GasPrice(initial_gas_price_wei.get()) + 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, + initial_gas_price_wei.get() + ); + assert_eq!( + starknet.pending_block().header.block_header_without_hash.l1_gas_price.price_in_fri, + initial_gas_price_fri.get() ); assert_eq!( - starknet.pending_block().header.l1_gas_price.price_in_fri, - GasPrice(initial_gas_price_fri.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.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_fri, + initial_data_gas_price_fri.get() ); assert_eq!( - starknet.pending_block().header.l1_data_gas_price.price_in_fri, - GasPrice(initial_data_gas_price_fri.get()) + starknet.pending_block().header.block_header_without_hash.sequencer.0, + initial_sequencer ); - assert_eq!(starknet.pending_block().header.sequencer.0, initial_sequencer); } #[test] @@ -1669,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:?}"), } } @@ -1725,7 +1784,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 +1792,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 +1907,15 @@ 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..4acdfd520 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( @@ -442,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}; @@ -460,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())); @@ -503,14 +494,14 @@ 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); } 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(); @@ -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..7728aad2a 100644 --- a/crates/starknet-devnet-core/src/state/state_diff.rs +++ b/crates/starknet-devnet-core/src/state/state_diff.rs @@ -52,12 +52,14 @@ impl StateDiff { // extract differences of class_hash -> compile_class_hash mapping let class_hash_to_compiled_class_hash = diff + .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 .iter() .map(|(address, class_hash)| { @@ -67,7 +69,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,6 +82,7 @@ impl StateDiff { } let address_to_nonce = diff + .state_maps .nonces .iter() .map(|(address, nonce)| { @@ -90,7 +93,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,7 +182,7 @@ 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; @@ -223,7 +226,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(); @@ -245,10 +248,10 @@ 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_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; 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..12a22361c 100644 --- a/crates/starknet-devnet-core/src/system_contract.rs +++ b/crates/starknet-devnet-core/src/system_contract.rs @@ -1,7 +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::{Cairo0Json, 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-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/transactions.rs b/crates/starknet-devnet-core/src/transactions.rs index 929df3c64..ccfbcb133 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,9 @@ 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 +167,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..80f37173f 100644 --- a/crates/starknet-devnet-core/src/utils.rs +++ b/crates/starknet-devnet-core/src/utils.rs @@ -1,6 +1,7 @@ use blockifier::bouncer::{BouncerConfig, BouncerWeights, BuiltinCount}; -use blockifier::versioned_constants::{StarknetVersion, VersionedConstants}; +use blockifier::versioned_constants::VersionedConstants; use serde_json::Value; +use starknet_api::block::StarknetVersion; use starknet_rs_core::types::contract::CompiledClass; use starknet_rs_core::types::Felt; use starknet_types::patricia_key::{PatriciaKey, StorageKey}; @@ -39,18 +40,22 @@ 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 { - VersionedConstants::get(StarknetVersion::V0_13_2).clone() + #[allow(clippy::unwrap_used)] + 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: +/// 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 { block_max_capacity: BouncerWeights { n_steps: 40_000_000, - gas: 4_950_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 { @@ -80,13 +85,22 @@ 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::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; use starknet_types::rpc::transactions::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; @@ -129,7 +143,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(); @@ -205,21 +219,37 @@ 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_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 { + let json_str = + std::fs::read_to_string("../../contracts/test_artifacts/cairo0/l1l2.json").unwrap(); + + Cairo0Json::raw_json_from_json_str(&json_str).unwrap().into() + } - pub fn dummy_cairo_l1l2_contract() -> Cairo0Json { + pub fn dummy_cairo_l1l2_contract_codegen() -> LegacyContractClass { 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() + Cairo0Json::raw_json_from_json_str(&json_str).unwrap().into() + } + + 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() } } @@ -231,7 +261,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,7 +272,7 @@ mod tests { #[test] fn correct_complex_storage_var_address_generated() { - let expected_storage_var_address = blockifier::abi::abi_utils::get_storage_var_address( + let expected_storage_var_address = starknet_api::abi::abi_utils::get_storage_var_address( "complex", &[test_utils::dummy_felt()], ); 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 c4e4ee884..e021c6e98 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-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-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/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/contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class.rs index c003bc0f4..8f83a3957 100644 --- a/crates/starknet-devnet-types/src/rpc/contract_class.rs +++ b/crates/starknet-devnet-types/src/rpc/contract_class.rs @@ -1,13 +1,23 @@ use core::fmt::Debug; +use std::collections::HashMap; +use std::str::FromStr; +use std::sync::Arc; -use blockifier::execution::contract_class::ClassInfo; +use blockifier::execution::contract_class::{ + deserialize_program, CompiledClassV0, CompiledClassV0Inner, 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, EntryPointType, SierraVersion}; +use starknet_api::deprecated_contract_class::{EntryPointOffset, EntryPointV0}; use starknet_rs_core::types::contract::{SierraClass, SierraClassDebugInfo}; use starknet_rs_core::types::{ ContractClass as CodegenContractClass, FlattenedSierraClass as CodegenSierraContractClass, + LegacyContractEntryPoint, }; use starknet_types_core::felt::Felt; @@ -16,12 +26,11 @@ use crate::serde_helpers::rpc_sierra_contract_class_to_sierra_contract_class::de use crate::traits::HashProducer; pub mod deprecated; -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))] +#[allow(clippy::large_enum_variant)] pub enum ContractClass { Cairo0(Cairo0ContractClass), Cairo1(SierraContractClass), @@ -54,9 +63,9 @@ impl From for ContractClass { } } -impl From for ContractClass { - fn from(value: DeprecatedContractClass) -> Self { - ContractClass::Cairo0(value.into()) +impl From for ContractClass { + fn from(value: SierraContractClass) -> Self { + ContractClass::Cairo1(value) } } @@ -66,12 +75,6 @@ impl From for ContractClass { } } -impl From for ContractClass { - fn from(value: SierraContractClass) -> Self { - ContractClass::Cairo1(value) - } -} - impl TryFrom for SierraContractClass { type Error = Error; fn try_from(value: ContractClass) -> Result { @@ -92,27 +95,18 @@ 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 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) => { + // 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() }), @@ -122,18 +116,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,20 +134,19 @@ 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( - err.to_string(), - )) + .map_err(|e| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) }) } - 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 +158,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(), - )) - }) + let sierra_version = + SierraVersion::from_str(&sierra_contract_class.contract_class_version)?; + ClassInfo::new( + &ContractClass::Cairo1(sierra_contract_class).try_into()?, + sierra_program_length, + abi_length, + sierra_version, + ) + .map_err(|e| { + Error::ConversionError(ConversionError::InvalidInternalStructure(e.to_string())) + }) } } } @@ -225,6 +219,75 @@ impl TryInto for CodegenContractClass { } } +impl TryFrom for RunnableCompiledClass { + type Error = Error; + + fn try_from(value: ContractClass) -> Result { + Ok(match value { + ContractClass::Cairo0(class) => class.try_into()?, + ContractClass::Cairo1(class) => { + let json_value = serde_json::to_value(&class).map_err(JsonError::SerdeJsonError)?; + jsonified_sierra_to_runnable_casm(json_value, &class.contract_class_version)? + } + }) + } +} + +impl TryFrom for RunnableCompiledClass { + type Error = Error; + + 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) => { + 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 })) + } + })) + } +} + fn convert_sierra_to_codegen( contract_class: &SierraContractClass, ) -> DevnetResult { @@ -249,28 +312,42 @@ fn convert_sierra_to_codegen( }) } -pub fn convert_codegen_to_blockifier_compiled_class( - class: CodegenContractClass, -) -> Result { - Ok(match class { - CodegenContractClass::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() })?; +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 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())) + })?; - let blockifier_contract_class: blockifier::execution::contract_class::ContractClassV1 = - casm.try_into().map_err(|_| Error::ProgramError)?; + Ok(RunnableCompiledClass::V1(compiled)) +} - blockifier::execution::contract_class::ContractClass::V1(blockifier_contract_class) +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)?; + jsonified_sierra_to_runnable_casm(json_value, &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()?) + 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) } }) } @@ -306,10 +383,11 @@ mod tests { use serde_json::Deserializer; use starknet_rs_core::types::LegacyEntryPointsByType; - use crate::contract_class::deprecated::rpc_contract_class::ContractClassAbiEntryWithType; - use crate::contract_class::{ - convert_sierra_to_codegen, Cairo0Json, ContractClass, DeprecatedContractClass, + 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; 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..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 @@ -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 { @@ -253,7 +254,7 @@ pub fn json_into_raw_program(json_data: &Value) -> DevnetResult> { mod tests { use starknet_rs_core::types::CompressedLegacyContractClass; - use crate::contract_class::Cairo0Json; + use crate::contract_class::deprecated::Cairo0Json; use crate::utils::test_utils::CAIRO_0_ACCOUNT_CONTRACT_PATH; #[test] 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..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::json_contract_class::Cairo0Json; use crate::contract_class::deprecated::rpc_contract_class::DeprecatedContractClass; -use crate::contract_class::Cairo0Json; use crate::error::{DevnetResult, Error}; use crate::traits::HashProducer; @@ -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/contract_class/deprecated/rpc_contract_class.rs b/crates/starknet-devnet-types/src/rpc/contract_class/deprecated/rpc_contract_class.rs index 0a75339d1..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 @@ -3,7 +3,7 @@ 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::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, @@ -84,7 +84,7 @@ impl TryInto for DeprecatedContractClass { } } -impl TryFrom for blockifier::execution::contract_class::ContractClassV0 { +impl TryFrom for starknet_api::deprecated_contract_class::ContractClass { type Error = Error; fn try_from(value: DeprecatedContractClass) -> Result { @@ -97,7 +97,7 @@ impl TryFrom for blockifier::execution::contract_class: mod tests { use starknet_rs_core::types::CompressedLegacyContractClass; - use crate::contract_class::DeprecatedContractClass; + use crate::contract_class::deprecated::DeprecatedContractClass; use crate::utils::test_utils::CAIRO_0_RPC_CONTRACT_PATH; #[test] 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..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,9 +1,9 @@ use std::sync::Arc; -use blockifier::transaction::transactions::L1HandlerTransaction; use serde::Serialize; use starknet_api::core::EntryPointSelector; -use starknet_api::transaction::Calldata; +use starknet_api::executable_transaction::L1HandlerTransaction; +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..0d8f68a5a 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, + l1_data_gas: execution_info.receipt.da_gas.l1_data_gas.0, }, } } @@ -230,8 +203,9 @@ impl ComputationResources { resource_name: &BuiltinName, ) -> Option { execution_info - .transaction_receipt + .receipt .resources + .computation .vm_resources .builtin_instance_counter .get(resource_name) diff --git a/crates/starknet-devnet-types/src/rpc/transactions.rs b/crates/starknet-devnet-types/src/rpc/transactions.rs index 12527e83b..f0cb8a778 100644 --- a/crates/starknet-devnet-types/src/rpc/transactions.rs +++ b/crates/starknet-devnet-types/src/rpc/transactions.rs @@ -1,9 +1,7 @@ -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::account_transaction::ExecutionFlags; use blockifier::transaction::objects::TransactionExecutionInfo; use broadcasted_declare_transaction_v1::BroadcastedDeclareTransactionV1; use broadcasted_declare_transaction_v2::BroadcastedDeclareTransactionV2; @@ -12,17 +10,17 @@ 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::{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::deprecated_contract_class::EntryPointType; -use starknet_api::transaction::{Fee, Resource, Tip}; -use starknet_rs_core::crypto::compute_hash_on_elements; +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, TransactionFinalityStatus, }; -use starknet_rs_crypto::poseidon_hash_many; +use starknet_rs_core::utils::parse_cairo_short_string; use self::broadcasted_declare_transaction_v3::BroadcastedDeclareTransactionV3; use self::broadcasted_deploy_account_transaction_v1::BroadcastedDeployAccountTransactionV1; @@ -40,13 +38,11 @@ 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::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, @@ -71,9 +67,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)] @@ -278,6 +271,12 @@ impl BroadcastedTransactionCommon { } } +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 #[derive(Debug, Clone, Deserialize, Serialize)] pub struct BroadcastedTransactionCommonV3 { @@ -322,24 +321,39 @@ 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, + 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 }, + ), }, - ), - ])) + ) + } } } @@ -360,96 +374,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)] @@ -464,23 +388,38 @@ impl BroadcastedTransaction { pub fn to_blockifier_account_transaction( &self, chain_id: &Felt, - only_query: bool, + execution_flags: ExecutionFlags, ) -> 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)?, - ), + 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, + ) -> 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 { @@ -535,15 +474,15 @@ 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 { + ) -> DevnetResult { + 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()?; - let transaction_hash = v1.calculate_transaction_hash(chain_id, &class_hash)?; let sn_api_declare = starknet_api::transaction::DeclareTransaction::V1( starknet_api::transaction::DeclareTransactionV0V1 { @@ -551,7 +490,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(), ), }, @@ -560,7 +499,10 @@ impl BroadcastedDeclareTransaction { let class_info: ClassInfo = ContractClass::Cairo0(v1.contract_class.clone()).try_into()?; - (transaction_hash, 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)?; @@ -568,7 +510,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), @@ -580,33 +522,27 @@ 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) + 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)?; - 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 { 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,35 +553,36 @@ 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(), + ), }, ); let class_info: ClassInfo = ContractClass::Cairo1(v3.contract_class.clone()).try_into()?; - (transaction_hash, 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) } }; - if only_query { - Ok(blockifier::transaction::transactions::DeclareTransaction::new_for_query( - sn_api_transaction, - starknet_api::transaction::TransactionHash(transaction_hash), - class_info, - )?) - } else { - Ok(blockifier::transaction::transactions::DeclareTransaction::new( - sn_api_transaction, - starknet_api::transaction::TransactionHash(transaction_hash), - class_info, - )?) - } + Ok(starknet_api::executable_transaction::DeclareTransaction { + tx: sn_api_transaction, + tx_hash, + class_info, + }) } } @@ -677,99 +614,74 @@ 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 { + ) -> DevnetResult { + let sn_api_transaction = match self { BroadcastedDeployAccountTransaction::V1(v1) => { - let contract_address = calculate_contract_address( - starknet_api::transaction::ContractAddressSalt(v1.contract_address_salt), - starknet_api::core::ClassHash(v1.class_hash), - &starknet_api::transaction::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::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(), )), }; - ( - 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, - 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(), )), }; - ( - transaction_hash, - starknet_api::transaction::DeployAccountTransaction::V3(sn_api_transaction), - contract_address.try_into()?, - ) + starknet_api::transaction::DeployAccountTransaction::V3(sn_api_transaction) } }; - Ok(blockifier::transaction::transactions::DeployAccountTransaction { + 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: starknet_api::transaction::TransactionHash(transaction_hash), + tx_hash, contract_address, - only_query, }) } } @@ -800,66 +712,63 @@ 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 { + ) -> DevnetResult { + 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::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)) + 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, - 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)) + starknet_api::transaction::InvokeTransaction::V3(sn_api_transaction) } }; - Ok(blockifier::transaction::transactions::InvokeTransaction { + 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: starknet_api::transaction::TransactionHash(transaction_hash), - only_query, + tx_hash, }) } } @@ -1009,12 +918,13 @@ 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)] #[cfg_attr(feature = "testing", derive(serde::Deserialize))] #[serde(untagged)] +#[allow(clippy::large_enum_variant)] pub enum ExecutionInvocation { Succeeded(FunctionInvocation), Reverted(Reversion), @@ -1120,53 +1030,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_declare_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_declare_transaction_v1.rs index d47bc0f93..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 @@ -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,12 +66,13 @@ 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::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; use crate::rpc::transactions::BroadcastedDeclareTransaction; @@ -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 = Cairo0Json::raw_json_from_json_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!( @@ -110,18 +112,18 @@ 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, ); 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!( 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..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 @@ -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; @@ -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!( @@ -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..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 - 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::{ResourceBoundsMapping, 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_resource_bounds_mapping, 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: ResourceBoundsMapping, - 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_resource_bounds_mapping( - 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/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..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 @@ -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; @@ -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 11bc9990e..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,135 +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::ContractAddressSalt(*contract_address_salt), - starknet_api::core::ClassHash(*class_hash), - &starknet_api::transaction::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::{ResourceBoundsMapping, 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_resource_bounds_mapping, 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: ResourceBoundsMapping, - 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_resource_bounds_mapping( - 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/rpc/transactions/broadcasted_invoke_transaction_v1.rs b/crates/starknet-devnet-types/src/rpc/transactions/broadcasted_invoke_transaction_v1.rs index f801d01ae..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 @@ -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; @@ -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 03d7d1a78..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,108 +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::{ResourceBoundsMapping, 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_resource_bounds_mapping, 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: ResourceBoundsMapping, - 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_resource_bounds_mapping( - 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/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..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 @@ -1,13 +1,13 @@ 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::fields::{Calldata as ApiCalldata, Fee as ApiFee}; use starknet_api::transaction::{ - Calldata as ApiCalldata, Fee as ApiFee, L1HandlerTransaction as ApiL1HandlerTransaction, TransactionHash as ApiTransactionHash, TransactionVersion as ApiTransactionVersion, }; use starknet_rs_core::crypto::compute_hash_on_elements; @@ -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 eab4eba12..0efc4b5bb 100644 --- a/crates/starknet-devnet-types/src/utils.rs +++ b/crates/starknet-devnet-types/src/utils.rs @@ -85,20 +85,15 @@ impl Formatter for StarknetFormatter { #[cfg(test)] pub(crate) mod test_utils { - use starknet_api::data_availability::DataAvailabilityMode; - use starknet_api::transaction::{ResourceBounds, ResourceBoundsMapping}; - - 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"); + 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 = @@ -106,41 +101,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_resource_bounds_mapping( - resource_bounds: ResourceBoundsMapping, - ) -> ResourceBoundsWrapper { - let l1_resource_bounds = resource_bounds - .0 - .get(&starknet_api::transaction::Resource::L1Gas) - .cloned() - .unwrap_or(ResourceBounds { max_amount: 0, max_price_per_unit: 0 }); - - let l2_resource_bounds = resource_bounds - .0 - .get(&starknet_api::transaction::Resource::L2Gas) - .cloned() - .unwrap_or(ResourceBounds { max_amount: 0, max_price_per_unit: 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, - ) - } } #[cfg(test)] mod tests { @@ -199,9 +159,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/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 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 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 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" 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, 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_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_call.rs b/tests/integration/test_call.rs index fd8731033..b23d61fd7 100644 --- a/tests/integration/test_call.rs +++ b/tests/integration/test_call.rs @@ -1,3 +1,4 @@ +use server::test_utils::assert_contains; use starknet_rs_core::types::{BlockId, BlockTag, Felt, FunctionCall, StarknetError}; use starknet_rs_providers::{Provider, ProviderError}; @@ -53,10 +54,7 @@ async fn calling_nonexistent_cairo0_contract_method() { .await .expect_err("Should have failed"); - match err { - ProviderError::StarknetError(StarknetError::ContractError(_)) => (), - _ => panic!("Invalid error: {err:?}"), - } + assert_contains(&err.to_string(), "Requested entrypoint does not exist in the contract"); } #[tokio::test] @@ -79,8 +77,5 @@ async fn calling_nonexistent_cairo1_contract_method() { .await .expect_err("Should have failed"); - match err { - ProviderError::StarknetError(StarknetError::ContractError(_)) => (), - _ => panic!("Invalid error: {err:?}"), - } + assert_contains(&err.to_string(), "Requested entrypoint does not exist in the contract"); } diff --git a/tests/integration/test_estimate_fee.rs b/tests/integration/test_estimate_fee.rs index eac7c7a46..d9f90a494 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 @@ -655,7 +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); - assert_contains(&execution_error, "not found in contract"); + assert_contains(&execution_error, "ENTRYPOINT_NOT_FOUND") } other => panic!("Unexpected error: {:?}", other), } 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 2eded2f9e..c2bab9bee 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_gas_modification.rs b/tests/integration/test_gas_modification.rs index 924614e2a..48e4824a6 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 @@ -111,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"], "0x73b00ed0c000"); let params_skip_validation_and_fee_charge = get_params(&["SKIP_VALIDATE", "SKIP_FEE_CHARGE"]); let resp_skip_validation = &devnet @@ -129,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, @@ -160,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"], "0x26230612b27f4e00000"); let resp_skip_validation = &devnet .send_custom_rpc("starknet_simulateTransactions", params_skip_validation_and_fee_charge) @@ -171,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, diff --git a/tests/integration/test_restart.rs b/tests/integration/test_restart.rs index 0639bf0bb..866eff133 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}; @@ -15,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] @@ -91,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) @@ -134,9 +135,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..bb7692a94 100644 --- a/tests/integration/test_simulate_transactions.rs +++ b/tests/integration/test_simulate_transactions.rs @@ -1,15 +1,13 @@ use std::sync::Arc; -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 +51,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 +293,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 @@ -541,9 +534,7 @@ async fn simulate_of_multiple_txs_shouldnt_return_an_error_if_invoke_transaction TransactionTrace::Invoke(InvokeTransactionTrace { execute_invocation: ExecuteInvocation::Reverted(reverted_invocation), .. - }) => { - assert_contains(&reverted_invocation.revert_reason, "not found in contract"); - } + }) => assert_contains(&reverted_invocation.revert_reason, "ENTRYPOINT_NOT_FOUND"), other_trace => panic!("Unexpected trace {:?}", other_trace), } } 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( 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), }