diff --git a/.github/workflows/rust-tests.yml b/.github/workflows/rust-tests.yml index fde4a85c3..06d346647 100644 --- a/.github/workflows/rust-tests.yml +++ b/.github/workflows/rust-tests.yml @@ -19,7 +19,6 @@ jobs: uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ env.RUST_TOOLCHAIN }} - override: true components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 with: @@ -41,7 +40,6 @@ jobs: uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ env.RUST_TOOLCHAIN }} - override: true components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 with: @@ -65,7 +63,6 @@ jobs: uses: dtolnay/rust-toolchain@stable with: toolchain: ${{ env.RUST_TOOLCHAIN }} - override: true components: rustfmt, clippy - uses: Swatinem/rust-cache@v2 with: diff --git a/.gitignore b/.gitignore index 1fe1466c9..ab29945f4 100644 --- a/.gitignore +++ b/.gitignore @@ -5,8 +5,7 @@ # will have compiled files and executables debug/ target/ -cairo1/ -cairo2/ + # Remove Cargo.lock from gitignore if creating an executable, leave it for libraries # More information here https://doc.rust-lang.org/cargo/guide/cargo-toml-vs-cargo-lock.html #Cargo.lock @@ -38,6 +37,8 @@ cairo2/ # END AUTOGENERATED +cairo1 +cairo2 starknet-venv/ **/*.json cairo_programs/cairo_1_contracts/*.sierra @@ -54,3 +55,4 @@ __pycache__/ lcov.info .rusty-hook.toml !starknet_programs/raw_contract_classes/*.json +cairo-*.tar diff --git a/Cargo.lock b/Cargo.lock index 00a492f91..727871fe4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -568,18 +568,6 @@ dependencies = [ "alloc-stdlib", ] -[[package]] -name = "bstr" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a246e68bb43f6cd9db24bea052a53e40405417c5fb372e3d1a8a7f770a564ef5" -dependencies = [ - "memchr", - "once_cell", - "regex-automata", - "serde", -] - [[package]] name = "bumpalo" version = "3.13.0" @@ -641,9 +629,9 @@ dependencies = [ [[package]] name = "cairo-lang-casm" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30d9c1d513381e7767ec1b3729da03ba4368e443c141445914c408a69ff52a46" +checksum = "ffe86abd9f988018b39e1e41b467608ad9596ff466f141d41ffecc29a483c2f4" dependencies = [ "cairo-lang-utils", "indoc", @@ -658,9 +646,9 @@ dependencies = [ [[package]] name = "cairo-lang-compiler" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68267d727fa1d975f3d783dec5feef579c11136c265541e29cdb9b126c1d9df9" +checksum = "220a48cb861ea7dac60f50e7aea044d7c0936ea602f64479e9577d4c4bed5c9e" dependencies = [ "anyhow", "cairo-lang-defs", @@ -683,18 +671,18 @@ dependencies = [ [[package]] name = "cairo-lang-debug" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e09edbfb23561cff6c11e150abf78669731160b84260e7187d1f03f0e3588dc" +checksum = "4bd06a99f5ac52f466a64fbdd0615baddb078b9e0cb97fdc7575faea916a66b5" dependencies = [ "cairo-lang-utils", ] [[package]] name = "cairo-lang-defs" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5f966d9791bc36a61ae264a2415cf325ea9308ed46942d7f57aba926c5dcb42" +checksum = "6b8512ee5f8b3a2a18c7ffbaa23a815e56d9f8737ba0d3a0d5dcbf9b2fcbe96b" dependencies = [ "cairo-lang-debug", "cairo-lang-diagnostics", @@ -710,9 +698,9 @@ dependencies = [ [[package]] name = "cairo-lang-diagnostics" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcc36a010131655216738e0a9038024bed617b6539a9ef0aeeca642ccd296696" +checksum = "e0a351f6441a55ce70b7ba62814670d0c154b2fdc4a7453387b71027a8440da2" dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", @@ -722,9 +710,9 @@ dependencies = [ [[package]] name = "cairo-lang-eq-solver" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5d6d7dae38d80ff4b5b4eaf1583cc9ea7da9589ae98261103c14dc12250d6aa0" +checksum = "824ee8e225355e09ac57f537a9612049e4367b2bd3934d0591559bf87337cdbe" dependencies = [ "cairo-lang-utils", "good_lp", @@ -734,9 +722,9 @@ dependencies = [ [[package]] name = "cairo-lang-filesystem" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3e9fa18ca0def4c7c21af46501404f93b25abb1729790da545e8d7da579d99" +checksum = "1da7ceb69b84fb8b0d6e4d4648c4f2218feddcf0b9929094358b2bd3b2603ef0" dependencies = [ "cairo-lang-debug", "cairo-lang-utils", @@ -748,9 +736,9 @@ dependencies = [ [[package]] name = "cairo-lang-lowering" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3c4fb0d99a34dc6e8712f918cd90d14d3f23d9495198664871ff809905f10c" +checksum = "a70fb2960cc39ceee250090109f9df05b26f781dab8c0ba48b6fd6f663858587" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -773,9 +761,9 @@ dependencies = [ [[package]] name = "cairo-lang-parser" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13c029f7642d9a7fff17c91f8a0bbb743f6ce78bd52dd60694e43f26f691ca1e" +checksum = "48c44c66f5aeb3d80189f4f2fd0bc6872b4c6f5cc25002402dc6e85561d2cc53" dependencies = [ "cairo-lang-diagnostics", "cairo-lang-filesystem", @@ -794,9 +782,9 @@ dependencies = [ [[package]] name = "cairo-lang-plugins" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c70ce576000a76fc351dbcf4a57d47fa8115986eaeaf5163f891d80cad1e39" +checksum = "d0acfa9aca2811c5df6d72a160c4168fd6cc53eb3c3f966c933e791b0f91ce01" dependencies = [ "cairo-lang-defs", "cairo-lang-diagnostics", @@ -813,9 +801,9 @@ dependencies = [ [[package]] name = "cairo-lang-proc-macros" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e4e9f31eed6ff73b9b7a7d52aa134b0ce408640de940d405bdfa56020bd767" +checksum = "0e5ce4ad906f6491bc82eaae14eea6a96755d651a8809fc1adb53feb99bcc55a" dependencies = [ "cairo-lang-debug", "quote", @@ -824,23 +812,23 @@ dependencies = [ [[package]] name = "cairo-lang-project" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d4b80bc30e40dceda9f821be62a802425e298bbb7ad148320984f946357d080" +checksum = "46f7c638a2a30010071a176396c29bc065701f353f2c3205b96f03463b54721c" dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", "serde", "smol_str", "thiserror", - "toml 0.4.10", + "toml", ] [[package]] name = "cairo-lang-semantic" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0409e2d4a8da0d4744d1428665bb5ce9e50788d7381620b34d121d23c5be3b86" +checksum = "bb3e68af88e60a1e30776877b0a3a346a21a3d15c54c9f8ace844e0652b1036f" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -861,9 +849,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e7446acce78880d8e395afcfdd089672b457a80004765163c6c52380f2a2c8f" +checksum = "3e4ccc934f2d4a063f7f72554d422e724134925c981cd0e592b4defb73ca103a" dependencies = [ "cairo-lang-utils", "const-fnv1a-hash", @@ -884,9 +872,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-ap-change" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "660774303d76a4e18f8a8020ee6c19396864654d00ee7c0f8d87dd095f1ebac1" +checksum = "ad6e742ec576f773c9d6c4f1e4be6fbe9f1e5b470cd374f27f5c82e15c151b85" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -897,9 +885,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-gas" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dffb496c72156a7f49a99e7ecee75327377323a5b3bf69f94c7c791cb1a4df0" +checksum = "2dc4e1b3793f639724f59f34eb4007253a91d5179de8b2ab2c511c6c5d56155c" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", @@ -910,9 +898,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-generator" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528c8d1b365b65a425c752de1a5c48933b73c43b38cdbd8cb694cdd8d65852c4" +checksum = "20c323c6f656398254f9404126c4a60e0a5234214255590288783eb323f6f187" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -936,9 +924,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-to-casm" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a55fcdbdc3aad7cfbf6b906be6211190044bc062e9ee3b2d8ab9a17f57b306" +checksum = "b26fffdbf578f9aaf00d74001ac93cad4a713b510642161a0594f1403a59c543" dependencies = [ "assert_matches", "cairo-felt 0.6.1", @@ -957,9 +945,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31585a2a9c9bcb75403429ae02e9d5d5f3e8e71e331188b0caf8762b3fdf17e0" +checksum = "c63e026127221a7bb5b5081b631eeef552a99cbdae76414dced7a224694afeaa" dependencies = [ "anyhow", "cairo-felt 0.6.1", @@ -997,9 +985,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ca713a8918464d80cc687cc56db090fc634532d663a2af10e1f89f49ba104a5" +checksum = "d6b48a1c67679bc19165c2ce45b38e7bc7ce5a4fbb004a07f60361f99b618e73" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -1014,9 +1002,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax-codegen" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "198d5aaa5a6a211bceacb582fb4e90030e924c573c7f4ba16b30d01feac229b8" +checksum = "8b2102b91819a7638f1efb39379351578a296d042de53f7492684eeb47c3a844" dependencies = [ "genco", "xshell", @@ -1024,9 +1012,9 @@ dependencies = [ [[package]] name = "cairo-lang-utils" -version = "2.0.0-rc6" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d146575a3ec1c997dea454e58dd510852a66ee6becc3b18917089a18ec24caff" +checksum = "25d0873d45a7f6020fa39ebda1386a20d328bf5e448056d5a507641d0bfde0cf" dependencies = [ "indexmap 1.9.3", "itertools", @@ -1074,80 +1062,6 @@ dependencies = [ "thiserror-no-std", ] -[[package]] -name = "camino" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c530edf18f37068ac2d977409ed5cd50d53d73bc653c7647b48eb78976ac9ae2" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo-config2" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ee1e7a7c5bc8f3389f125fb3da214c86d8e21c2b7259923079e0142ac47ffe4" -dependencies = [ - "cfg-expr", - "home", - "once_cell", - "serde", - "shell-escape", - "toml 0.7.5", -] - -[[package]] -name = "cargo-llvm-cov" -version = "0.5.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53207ce278e21f2a8f856e8b18c9b43db5ffc93bb1f12e01ed65aa3149ac52ec" -dependencies = [ - "anyhow", - "camino", - "cargo-config2", - "cargo_metadata", - "duct", - "fs-err", - "glob", - "home", - "is-terminal", - "is_executable", - "lcov2cobertura", - "lexopt", - "opener", - "regex", - "rustc-demangle", - "serde", - "serde_json", - "shell-escape", - "termcolor", - "walkdir", -] - -[[package]] -name = "cargo-platform" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbdb825da8a5df079a43676dbe042702f1707b1109f713a01420fbb4cc71fa27" -dependencies = [ - "serde", -] - -[[package]] -name = "cargo_metadata" -version = "0.15.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee4243f1f26fc7a42710e7439c149e2b10b05472f88090acce52632f231a73a" -dependencies = [ - "camino", - "cargo-platform", - "semver", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "cc" version = "1.0.79" @@ -1157,15 +1071,6 @@ dependencies = [ "jobserver", ] -[[package]] -name = "cfg-expr" -version = "0.15.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "215c0072ecc28f92eeb0eea38ba63ddfcb65c2828c46311d646f1a3ff5f9841c" -dependencies = [ - "smallvec", -] - [[package]] name = "cfg-if" version = "1.0.0" @@ -1204,7 +1109,7 @@ dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -1221,9 +1126,9 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd" +checksum = "17bfac9400fe632590700de801b5dfbdca8b6944073832d1284bdbeef7f00e45" dependencies = [ "atty", "lazy_static", @@ -1384,18 +1289,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "duct" -version = "0.13.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37ae3fc31835f74c2a7ceda3aeede378b0ae2e74c8f1c36559fcc9ae2a4e7d3e" -dependencies = [ - "libc", - "once_cell", - "os_pipe", - "shared_child", -] - [[package]] name = "dyn-clone" version = "1.0.11" @@ -1505,12 +1398,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fs-err" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0845fa252299212f0389d64ba26f34fa32cfe41588355f21ed507c59a0f64541" - [[package]] name = "funty" version = "2.0.0" @@ -1550,13 +1437,12 @@ dependencies = [ [[package]] name = "fuzzer" -version = "0.2.0" +version = "0.3.0" dependencies = [ "cairo-vm", "honggfuzz", "num-traits 0.2.15", "serde_json", - "starknet-contract-class", "starknet_api", "starknet_in_rust", "tempfile", @@ -1625,12 +1511,6 @@ version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "good_lp" version = "1.4.0" @@ -1711,9 +1591,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -1730,15 +1610,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" -dependencies = [ - "windows-sys", -] - [[package]] name = "honggfuzz" version = "0.5.55" @@ -1842,9 +1713,9 @@ dependencies = [ [[package]] name = "indoc" -version = "2.0.1" +version = "2.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2cb48b81b1dc9f39676bf99f5499babfec7cd8fe14307f7b3d747208fb5690" +checksum = "761cde40c27e2a9877f8c928fd248b7eec9dd48623dd514b256858ca593fbba7" [[package]] name = "instant" @@ -1861,7 +1732,7 @@ version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", "windows-sys", ] @@ -1872,20 +1743,11 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "24fddda5af7e54bf7da53067d6e802dbcc381d0a8eef629df528e3ebf68755cb" dependencies = [ - "hermit-abi 0.3.1", - "rustix 0.38.1", + "hermit-abi 0.3.2", + "rustix 0.38.2", "windows-sys", ] -[[package]] -name = "is_executable" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9acdc6d67b75e626ad644734e8bc6df893d9cd2a834129065d3dd6158ea9c8" -dependencies = [ - "winapi", -] - [[package]] name = "itertools" version = "0.10.5" @@ -1897,9 +1759,9 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.6" +version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +checksum = "62b02a5381cc465bd3041d84623d0fa3b66738b52b8e2fc3bab8ad63ab032f4a" [[package]] name = "jobserver" @@ -1974,24 +1836,6 @@ dependencies = [ "spin", ] -[[package]] -name = "lcov2cobertura" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf88eb39b4cae8a9c79b5052613fa2489e7bd0fb2a4e46c9d6c908b4c2de162d" -dependencies = [ - "anyhow", - "quick-xml", - "regex", - "rustc-demangle", -] - -[[package]] -name = "lexopt" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baff4b617f7df3d896f97fe922b64817f6cd9a756bb81d40f8883f2f66dcb401" - [[package]] name = "libc" version = "0.2.147" @@ -2168,15 +2012,6 @@ dependencies = [ "minimal-lexical", ] -[[package]] -name = "normpath" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec60c60a693226186f5d6edf073232bfb6464ed97eb22cf3b01c1e8198fd97f5" -dependencies = [ - "windows-sys", -] - [[package]] name = "num-bigint" version = "0.4.3" @@ -2261,7 +2096,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.1", + "hermit-abi 0.3.2", "libc", ] @@ -2286,32 +2121,11 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" -[[package]] -name = "opener" -version = "0.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c62dcb6174f9cb326eac248f07e955d5d559c272730b6c03e396b443b562788" -dependencies = [ - "bstr", - "normpath", - "winapi", -] - -[[package]] -name = "os_pipe" -version = "1.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" -dependencies = [ - "libc", - "windows-sys", -] - [[package]] name = "parity-scale-codec" -version = "3.6.2" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7467bc45fea3d77e829a4df331b9e969e2ec6a4dcd4e126e660f8509b40a475" +checksum = "756d439303e94fae44f288ba881ad29670c65b0c4b0e05674ca81061bb65f2c5" dependencies = [ "arrayvec", "bitvec", @@ -2323,9 +2137,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.2" +version = "3.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c9de611934c78014c455793552d0bf7d65a58211179c49996fde925aa667c38" +checksum = "9d884d78fcf214d70b1e239fcd1c6e5e95aa3be1881918da2e488cc946c7a476" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -2383,9 +2197,9 @@ dependencies = [ [[package]] name = "paste" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f746c4065a8fa3fe23974dd82f15431cc8d40779821001404d10d2e79ca7d79" +checksum = "b4b27ab7be369122c218afc2079489cdcb4b517c0a3fc386ff11e1fedfcc2b35" [[package]] name = "path-clean" @@ -2420,9 +2234,9 @@ dependencies = [ [[package]] name = "pin-project-lite" -version = "0.2.9" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" +checksum = "4c40d25201921e5ff0c862a505c6557ea88568a4e3ace775ab55e93f2f4f9d57" [[package]] name = "pin-utils" @@ -2503,15 +2317,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "quick-xml" -version = "0.26.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f50b1c63b38611e7d4d7f68b82d3ad0cc71a2ad2e7f61fc10f1328d917c93cd" -dependencies = [ - "memchr", -] - [[package]] name = "quote" version = "1.0.29" @@ -2603,12 +2408,6 @@ dependencies = [ "regex-syntax 0.7.2", ] -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" - [[package]] name = "regex-syntax" version = "0.6.29" @@ -2666,9 +2465,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.37.21" +version = "0.37.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62f25693a73057a1b4cb56179dd3c7ea21a7c6c5ee7d85781f5749b46f34b79c" +checksum = "8818fa822adcc98b18fedbb3632a6a33213c070556b5aa7c4c8cc21cff565c4c" dependencies = [ "bitflags 1.3.2", "errno", @@ -2680,9 +2479,9 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.1" +version = "0.38.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbc6396159432b5c8490d4e301d8c705f61860b8b6c863bf79942ce5401968f3" +checksum = "aabcb0461ebd01d6b79945797c27f8529082226cb630a9865a71870ff63532a4" dependencies = [ "bitflags 2.3.3", "errno", @@ -2693,15 +2492,15 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.12" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" +checksum = "dc31bd9b61a32c31f9650d18add92aa83a49ba979c143eefd27fe7177b05bd5f" [[package]] name = "ryu" -version = "1.0.13" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" +checksum = "fe232bdf6be8c8de797b22184ee71118d63780ea42ac85b61d1baa6d3b782ae9" [[package]] name = "salsa" @@ -2732,15 +2531,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "same-file" -version = "1.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" -dependencies = [ - "winapi-util", -] - [[package]] name = "schemars" version = "0.8.12" @@ -2777,37 +2567,34 @@ name = "semver" version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bebd363326d05ec3e2f532ab7660680f3b02130d780c299bca73469d521bc0ed" -dependencies = [ - "serde", -] [[package]] name = "serde" -version = "1.0.164" +version = "1.0.166" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" +checksum = "d01b7404f9d441d3ad40e6a636a7782c377d2abdbe4fa2440e2edcc2f4f10db8" dependencies = [ "serde_derive", ] [[package]] name = "serde_bytes" -version = "0.11.9" +version = "0.11.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "416bda436f9aab92e02c8e10d49a15ddd339cea90b6e340fe51ed97abb548294" +checksum = "f3c5113243e4a3a1c96587342d067f3e6b0f50790b6cf40d2868eb647a3eef0e" dependencies = [ "serde", ] [[package]] name = "serde_derive" -version = "1.0.164" +version = "1.0.166" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" +checksum = "5dd83d6dde2b6b2d466e14d9d1acce8816dedee94f735eac6395808b3483c6d6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -2823,24 +2610,15 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.99" +version = "1.0.100" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46266871c240a00b8f503b877622fe33430b3c7d963bdc0f2adc511e54a1eae3" +checksum = "0f1e14e89be7aa4c4b78bdbdc9eb5bf8517829a600ae8eaa39a6e1d960b5185c" dependencies = [ "itoa", "ryu", "serde", ] -[[package]] -name = "serde_spanned" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96426c9936fd7a0124915f9185ea1d20aa9445cc9821142f0a73bc9207a2e186" -dependencies = [ - "serde", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -2885,22 +2663,6 @@ dependencies = [ "keccak", ] -[[package]] -name = "shared_child" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0d94659ad3c2137fef23ae75b03d5241d633f8acded53d672decfa0e6e0caef" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "shell-escape" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f" - [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -2967,17 +2729,6 @@ dependencies = [ "num-traits 0.1.43", ] -[[package]] -name = "starknet-contract-class" -version = "0.2.0" -dependencies = [ - "cairo-vm", - "getset", - "serde", - "serde_json", - "starknet_api", -] - [[package]] name = "starknet-crypto" version = "0.5.1" @@ -2993,20 +2744,20 @@ dependencies = [ "rfc6979", "sha2", "starknet-crypto-codegen", - "starknet-curve", + "starknet-curve 0.3.0", "starknet-ff", "zeroize", ] [[package]] name = "starknet-crypto-codegen" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6dc88f1f470d9de1001ffbb90d2344c9dd1a615f5467daf0574e2975dfd9ebd" +checksum = "af6527b845423542c8a16e060ea1bc43f67229848e7cd4c4d80be994a84220ce" dependencies = [ - "starknet-curve", + "starknet-curve 0.4.0", "starknet-ff", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -3018,6 +2769,15 @@ dependencies = [ "starknet-ff", ] +[[package]] +name = "starknet-curve" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68a0d87ae56572abf83ddbfd44259a7c90dbeeee1629a1ffe223e7f9a8f3052" +dependencies = [ + "starknet-ff", +] + [[package]] name = "starknet-ff" version = "0.3.4" @@ -3032,7 +2792,7 @@ dependencies = [ [[package]] name = "starknet-rs-cli" -version = "0.2.0" +version = "0.3.0" dependencies = [ "actix-web", "assert_matches", @@ -3066,15 +2826,13 @@ dependencies = [ [[package]] name = "starknet_in_rust" -version = "0.2.0" +version = "0.3.0" dependencies = [ "anyhow", "assert_matches", - "awc", "cairo-lang-casm", "cairo-lang-starknet", "cairo-vm", - "cargo-llvm-cov", "coverage-helper", "getset", "hex", @@ -3087,7 +2845,6 @@ dependencies = [ "serde", "serde_json", "sha3", - "starknet-contract-class", "starknet-crypto", "starknet_api", "thiserror", @@ -3137,9 +2894,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.22" +version = "2.0.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2efbeae7acf4eabd6bcdcbd11c92f45231ddda7539edc7806bd1a04a03b24616" +checksum = "59fb7d6d8281a51045d62b8eb3a7d1ce347b76f312af50cd3dc0af39c87c1737" dependencies = [ "proc-macro2", "quote", @@ -3162,7 +2919,7 @@ dependencies = [ "cfg-if", "fastrand", "redox_syscall 0.3.5", - "rustix 0.37.21", + "rustix 0.37.22", "windows-sys", ] @@ -3177,33 +2934,24 @@ dependencies = [ "winapi", ] -[[package]] -name = "termcolor" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" -dependencies = [ - "winapi-util", -] - [[package]] name = "thiserror" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +checksum = "c16a64ba9387ef3fdae4f9c1a7f07a0997fce91985c0336f1ddc1822b3b37802" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +checksum = "d14928354b01c4d6a4f0e549069adef399a284e7995c7ccca94e8a07a5346c59" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] @@ -3318,26 +3066,11 @@ dependencies = [ "serde", ] -[[package]] -name = "toml" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ebafdf5ad1220cb59e7d17cf4d2c72015297b75b19a10472f99b89225089240" -dependencies = [ - "serde", - "serde_spanned", - "toml_datetime", - "toml_edit", -] - [[package]] name = "toml_datetime" version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" -dependencies = [ - "serde", -] [[package]] name = "toml_edit" @@ -3346,8 +3079,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "266f016b7f039eec8a1a80dfe6156b633d208b9fccca5e4db1d6775b0c4e34a7" dependencies = [ "indexmap 2.0.0", - "serde", - "serde_spanned", "toml_datetime", "winnow", ] @@ -3408,9 +3139,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" +checksum = "22049a19f4a68748a168c0fc439f9516686aa045927ff767eca0a85101fb6e73" [[package]] name = "unicode-normalization" @@ -3456,16 +3187,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "walkdir" -version = "2.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" -dependencies = [ - "same-file", - "winapi-util", -] - [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -3493,7 +3214,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", "wasm-bindgen-shared", ] @@ -3515,7 +3236,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3542,15 +3263,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" @@ -3673,7 +3385,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.22", + "syn 2.0.23", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 8e4bc2dc7..7d4224a83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "starknet_in_rust" -version = "0.2.0" +version = "0.3.0" edition = "2021" description = "A Rust implementation of Starknet execution logic" license = "Apache-2.0" @@ -11,34 +11,34 @@ with_mimalloc = ["mimalloc"] cairo_1_tests = [] [workspace] -members = ["crates/starknet-contract-class", "cli", "fuzzer"] +members = ["cli", "fuzzer"] [workspace.dependencies] -cairo-vm = { version = "0.8.1", features = ["cairo-1-hints"]} +cairo-vm = { version = "0.8.1", features = ["cairo-1-hints"] } starknet_api = "0.1.0" num-traits = "0.2.15" [dependencies] -cairo-lang-starknet = "2.0.0-rc6" -cairo-lang-casm = "2.0.0-rc6" -cairo-vm = { workspace=true, features = ["cairo-1-hints"]} +cairo-lang-starknet = "2.0.0" +cairo-lang-casm = "2.0.0" +cairo-vm = { workspace = true, features = ["cairo-1-hints"] } getset = "0.1.2" lazy_static = "1.4.0" num-bigint = { version = "0.4", features = ["serde"] } num-integer = "0.1.45" num-traits = { workspace = true } serde = { version = "1.0.152", features = ["derive"] } -serde_json = { version = "1.0", features = ["arbitrary_precision", "raw_value"] } +serde_json = { version = "1.0", features = [ + "arbitrary_precision", + "raw_value", +] } sha3 = "0.10.1" starknet_api = { workspace = true } starknet-crypto = "0.5.1" thiserror = "1.0.32" -awc = "3.1.1" mimalloc = { version = "0.1.29", default-features = false, optional = true } hex = "0.4.3" -cargo-llvm-cov = "0.5.14" anyhow = "1.0.66" -starknet-contract-class = { path = "./crates/starknet-contract-class", version = "0.2.0" } once_cell = "1.17.1" [dev-dependencies] diff --git a/Makefile b/Makefile index 310928944..cd1a82ed9 100644 --- a/Makefile +++ b/Makefile @@ -70,7 +70,7 @@ $(CAIRO_1_CONTRACTS_TEST_DIR)/%.sierra: $(CAIRO_1_CONTRACTS_TEST_DIR)/%.cairo $(STARKNET_COMPILE_CAIRO_1) --allowed-libfuncs-list-name experimental_v0.1.0 $< $@ $(CAIRO_1_CONTRACTS_TEST_DIR)/%.casm: $(CAIRO_1_CONTRACTS_TEST_DIR)/%.sierra - $(STARKNET_SIERRA_COMPILE_CAIRO_1) --allowed-libfuncs-list-name experimental_v0.1.0 $< $@ + $(STARKNET_SIERRA_COMPILE_CAIRO_1) --allowed-libfuncs-list-name experimental_v0.1.0 --add-pythonic-hints $< $@ cairo-repo-1-dir = cairo1 @@ -103,7 +103,7 @@ $(CAIRO_2_CONTRACTS_TEST_DIR)/%.sierra: $(CAIRO_2_CONTRACTS_TEST_DIR)/%.cairo $(STARKNET_COMPILE_CAIRO_2) $< $@ $(CAIRO_2_CONTRACTS_TEST_DIR)/%.casm: $(CAIRO_2_CONTRACTS_TEST_DIR)/%.sierra - $(STARKNET_SIERRA_COMPILE_CAIRO_2) $< $@ + $(STARKNET_SIERRA_COMPILE_CAIRO_2) --add-pythonic-hints $< $@ cairo-repo-2-dir = cairo2 @@ -112,14 +112,14 @@ cairo-repo-2-dir-macos = cairo2-macos build-cairo-2-compiler-macos: | $(cairo-repo-2-dir-macos) $(cairo-repo-2-dir-macos): - curl -L -o cairo-2.0.0.tar https://github.com/starkware-libs/cairo/releases/download/v2.0.0-rc6/release-aarch64-apple-darwin.tar \ + curl -L -o cairo-2.0.0.tar https://github.com/starkware-libs/cairo/releases/download/v2.0.0/release-aarch64-apple-darwin.tar \ && tar -xzvf cairo-2.0.0.tar \ && mv cairo/ cairo2/ build-cairo-2-compiler: | $(cairo-repo-2-dir) $(cairo-repo-2-dir): - curl -L -o cairo-2.0.0.tar https://github.com/starkware-libs/cairo/releases/download/v2.0.0-rc6/release-x86_64-unknown-linux-musl.tar.gz \ + curl -L -o cairo-2.0.0.tar https://github.com/starkware-libs/cairo/releases/download/v2.0.0/release-x86_64-unknown-linux-musl.tar.gz \ && tar -xzvf cairo-2.0.0.tar \ && mv cairo/ cairo2/ diff --git a/bench/internals.rs b/bench/internals.rs index db6a0fb35..075f216a2 100644 --- a/bench/internals.rs +++ b/bench/internals.rs @@ -17,14 +17,13 @@ use starknet_in_rust::{ transaction::{declare::Declare, Deploy, DeployAccount, InvokeFunction}, utils::Address, }; -use std::{fs::File, hint::black_box, io::BufReader}; +use std::{hint::black_box, sync::Arc}; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(BufReader::new(File::open( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/account_without_validation.json", - ).unwrap())) - .unwrap(); + ).unwrap(); static ref CLASS_HASH: Felt252 = compute_deprecated_class_hash(&CONTRACT_CLASS).unwrap(); static ref CLASS_HASH_BYTES: [u8; 32] = CLASS_HASH.clone().to_be_bytes(); static ref SALT: Felt252 = felt_str!( @@ -61,7 +60,7 @@ fn main() { fn deploy_account() { const RUNS: usize = 500; - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -85,7 +84,6 @@ fn deploy_account() { signature, SALT.clone(), StarknetChainId::TestNet.to_felt(), - None, ) .unwrap(); internal_deploy_account.execute(&mut state_copy, block_context) @@ -98,7 +96,7 @@ fn deploy_account() { fn declare() { const RUNS: usize = 5; - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let state = CachedState::new(state_reader, Some(Default::default()), None); let block_context = &Default::default(); @@ -117,7 +115,6 @@ fn declare() { 0.into(), vec![], Felt252::zero(), - None, ) .expect("couldn't create transaction"); @@ -131,7 +128,7 @@ fn declare() { fn deploy() { const RUNS: usize = 8; - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -154,7 +151,6 @@ fn deploy() { vec![], StarknetChainId::TestNet.to_felt(), 0.into(), - None, ) .unwrap(); internal_deploy.execute(&mut state_copy, block_context) @@ -167,7 +163,7 @@ fn deploy() { fn invoke() { const RUNS: usize = 100; - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -185,7 +181,6 @@ fn invoke() { vec![], StarknetChainId::TestNet.to_felt(), 0.into(), - None, ) .unwrap(); @@ -208,7 +203,6 @@ fn invoke() { signature, StarknetChainId::TestNet.to_felt(), Some(Felt252::zero()), - None, ) .unwrap(); internal_invoke.execute(&mut state_copy, block_context, 2_000_000) diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 6ee2b8166..ab4e52e88 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "starknet-rs-cli" -version = "0.2.0" +version = "0.3.0" edition = "2021" [features] @@ -8,7 +8,7 @@ default = ["with_mimalloc"] with_mimalloc = ["mimalloc"] [dependencies] -starknet_in_rust = { path = "../", version = "0.2.0" } +starknet_in_rust = { path = "../", version = "0.3.0" } num-traits = "0.2.15" serde = { version = "1.0.152", features = ["derive"] } cairo-vm = { workspace=true, features = ["cairo-1-hints"]} diff --git a/cli/src/main.rs b/cli/src/main.rs index affdbb8ca..f37bdf544 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -16,20 +16,24 @@ use starknet_in_rust::{ block_context::BlockContext, constants::{DECLARE_VERSION, TRANSACTION_VERSION}, }, - execution::{execution_entry_point::ExecutionEntryPoint, TransactionExecutionContext}, + execution::{ + execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, + TransactionExecutionContext, + }, hash_utils::calculate_contract_address, parser_errors::ParserError, serde_structs::read_abi, services::api::contract_classes::deprecated_contract_class::ContractClass, - state::{ - cached_state::CachedState, - state_api::{State, StateReader}, - }, + state::{cached_state::CachedState, state_api::State}, state::{in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager}, - transaction::InvokeFunction, + transaction::{error::TransactionError, InvokeFunction}, utils::{felt_to_hash, string_to_hash, Address}, }; -use std::{collections::HashMap, path::PathBuf, sync::Mutex}; +use std::{ + collections::HashMap, + path::PathBuf, + sync::{Arc, Mutex}, +}; #[derive(Parser)] struct Cli { @@ -104,7 +108,7 @@ fn declare_parser( args: &DeclareArgs, ) -> Result<(Felt252, Felt252), ParserError> { let contract_class = - ContractClass::try_from(&args.contract).map_err(ContractAddressError::Program)?; + ContractClass::from_path(&args.contract).map_err(ContractAddressError::Program)?; let class_hash = compute_deprecated_class_hash(&contract_class)?; cached_state.set_contract_class(&felt_to_hash(&class_hash), &contract_class)?; @@ -181,16 +185,15 @@ fn invoke_parser( Some(vec) => vec.iter().map(|&n| n.into()).collect(), None => Vec::new(), }; - let internal_invoke = InvokeFunction::new( + let internal_invoke = InvokeFunction::new_with_tx_hash( contract_address.clone(), entrypoint_selector.clone(), 0, TRANSACTION_VERSION.clone(), calldata.clone(), vec![], - Felt252::zero(), Some(Felt252::zero()), - transaction_hash, + transaction_hash.unwrap(), )?; let _tx_info = internal_invoke.apply(cached_state, &BlockContext::default(), 0)?; @@ -249,13 +252,18 @@ fn call_parser( None, 0, ); - let call_info = execution_entry_point.execute( + let block_context = BlockContext::default(); + let ExecutionResult { call_info, .. } = execution_entry_point.execute( cached_state, - &BlockContext::default(), + &block_context, &mut ExecutionResourcesManager::default(), &mut TransactionExecutionContext::default(), false, + block_context.invoke_tx_max_n_steps(), )?; + + let call_info = call_info.ok_or(TransactionError::CallInfoIsNone)?; + Ok(call_info.retdata) } @@ -304,7 +312,7 @@ async fn call_req(data: web::Data, args: web::Json) -> HttpR pub async fn start_devnet(port: u16) -> Result<(), std::io::Error> { let cached_state = web::Data::new(AppState { cached_state: Mutex::new(CachedState::::new( - InMemoryStateReader::default(), + Arc::new(InMemoryStateReader::default()), Some(HashMap::new()), None, )), diff --git a/crates/starknet-contract-class/Cargo.toml b/crates/starknet-contract-class/Cargo.toml deleted file mode 100644 index c46ed063b..000000000 --- a/crates/starknet-contract-class/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "starknet-contract-class" -version = "0.2.0" -edition = "2021" -description = "Crate that parses a Starknet contract class from API" -license = "Apache-2.0" - -[dependencies] -serde = "1.0.156" -serde_json = "1.0.94" -getset = "0.1.2" -cairo-vm = { workspace=true, features = ["cairo-1-hints"]} -starknet_api = { workspace = true } diff --git a/crates/starknet-contract-class/src/lib.rs b/crates/starknet-contract-class/src/lib.rs deleted file mode 100644 index a19f4f107..000000000 --- a/crates/starknet-contract-class/src/lib.rs +++ /dev/null @@ -1,325 +0,0 @@ -#![deny(warnings)] - -use cairo_vm::felt::{Felt252, PRIME_STR}; -use cairo_vm::{ - serde::deserialize_program::{ - deserialize_array_of_bigint_hex, Attribute, BuiltinName, HintParams, Identifier, - ReferenceManager, - }, - types::{ - errors::program_errors::ProgramError, program::Program, relocatable::MaybeRelocatable, - }, -}; -use getset::{CopyGetters, Getters}; -use serde::Deserialize; -use starknet_api::deprecated_contract_class::{ContractClassAbiEntry, EntryPoint}; -use std::{collections::HashMap, fs::File, io::BufReader, path::PathBuf}; - -pub type AbiType = Vec; - -#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] -pub enum EntryPointType { - External, - L1Handler, - Constructor, -} - -#[derive(Clone, CopyGetters, Debug, Default, Eq, Getters, Hash, PartialEq)] -pub struct ContractEntryPoint { - #[getset(get = "pub")] - pub selector: Felt252, - #[getset(get_copy = "pub")] - pub offset: usize, -} - -impl ContractEntryPoint { - pub fn new(selector: Felt252, offset: usize) -> ContractEntryPoint { - ContractEntryPoint { selector, offset } - } -} - -// ------------------------------- -// Contract Class -// ------------------------------- - -#[derive(Clone, Debug, Eq, PartialEq, Deserialize)] -#[serde(try_from = "starknet_api::deprecated_contract_class::ContractClass")] -pub struct ParsedContractClass { - pub program: Program, - pub entry_points_by_type: HashMap>, - pub abi: Option, -} - -// ------------------------------- -// From traits -// ------------------------------- - -impl From<&ContractEntryPoint> for Vec { - fn from(entry_point: &ContractEntryPoint) -> Self { - vec![ - MaybeRelocatable::from(entry_point.selector.clone()), - MaybeRelocatable::from(entry_point.offset), - ] - } -} - -impl From for EntryPointType { - fn from(entry_type: starknet_api::deprecated_contract_class::EntryPointType) -> Self { - type ApiEPT = starknet_api::deprecated_contract_class::EntryPointType; - type StarknetEPT = EntryPointType; - - match entry_type { - ApiEPT::Constructor => StarknetEPT::Constructor, - ApiEPT::External => StarknetEPT::External, - ApiEPT::L1Handler => StarknetEPT::L1Handler, - } - } -} - -impl TryFrom for ParsedContractClass { - type Error = ProgramError; - - fn try_from( - contract_class: starknet_api::deprecated_contract_class::ContractClass, - ) -> Result { - let program = to_cairo_runner_program(&contract_class.program)?; - let entry_points_by_type = convert_entry_points(contract_class.entry_points_by_type); - Ok(Self { - program, - entry_points_by_type, - abi: contract_class.abi, - }) - } -} - -// ------------------- -// Helper Functions -// ------------------- - -impl TryFrom<&str> for ParsedContractClass { - type Error = ProgramError; - - fn try_from(s: &str) -> Result { - let raw_contract_class: starknet_api::deprecated_contract_class::ContractClass = - serde_json::from_str(s)?; - - Self::try_from(raw_contract_class) - } -} - -impl TryFrom for ParsedContractClass { - type Error = ProgramError; - - fn try_from(path: PathBuf) -> Result { - Self::try_from(&path) - } -} - -impl TryFrom<&PathBuf> for ParsedContractClass { - type Error = ProgramError; - - fn try_from(path: &PathBuf) -> Result { - let file = File::open(path)?; - let reader = BufReader::new(file); - let raw_contract_class: starknet_api::deprecated_contract_class::ContractClass = - serde_json::from_reader(reader)?; - Self::try_from(raw_contract_class) - } -} - -fn convert_entry_points( - entry_points: HashMap>, -) -> HashMap> { - let mut converted_entries: HashMap> = HashMap::new(); - for (entry_type, vec) in entry_points { - let en_type = entry_type.into(); - - let contracts_entry_points = vec - .into_iter() - .map(|e| { - let selector = Felt252::from_bytes_be(e.selector.0.bytes()); - let offset = e.offset.0; - ContractEntryPoint { selector, offset } - }) - .collect::>(); - - converted_entries.insert(en_type, contracts_entry_points); - } - - converted_entries -} - -pub fn to_cairo_runner_program( - program: &starknet_api::deprecated_contract_class::Program, -) -> Result { - let program = program.clone(); - let identifiers = serde_json::from_value::>(program.identifiers)?; - - if program.prime != *PRIME_STR { - return Err(ProgramError::PrimeDiffers(program.prime.to_string())); - }; - - let error_message_attributes = serde_json::from_value::>(program.attributes) - .unwrap_or(Vec::new()) - .into_iter() - .filter(|attr| attr.name == "error_message") - .collect(); - - let program = Program::new( - serde_json::from_value::>(program.builtins)?, - deserialize_array_of_bigint_hex(program.data)?, - None, - serde_json::from_value::>>(program.hints)?, - serde_json::from_value::(program.reference_manager)?, - identifiers, - error_message_attributes, - None, - )?; - - Ok(program) -} - -#[cfg(test)] -mod tests { - use super::*; - use cairo_vm::felt::felt_str; - use starknet_api::deprecated_contract_class::{ - ContractClassAbiEntry, FunctionAbiEntry, FunctionAbiEntryType, FunctionAbiEntryWithType, - TypedParameter, - }; - use std::io::Read; - - #[test] - fn try_from_string_abi() { - let mut serialized = String::new(); - - // This specific contract compiles with --no_debug_info - File::open(PathBuf::from("../../starknet_programs/fibonacci.json")) - .and_then(|mut f| f.read_to_string(&mut serialized)) - .expect("should be able to read file"); - - let res = ParsedContractClass::try_from(serialized.as_str()); - - let contract_class = res.unwrap(); - - let expected_abi = Some(vec![ContractClassAbiEntry::Function( - FunctionAbiEntryWithType { - r#type: FunctionAbiEntryType::Function, - entry: FunctionAbiEntry { - name: "fib".to_string(), - inputs: vec![ - TypedParameter { - name: "first_element".to_string(), - r#type: "felt".to_string(), - }, - TypedParameter { - name: "second_element".to_string(), - r#type: "felt".to_string(), - }, - TypedParameter { - name: "n".to_string(), - r#type: "felt".to_string(), - }, - ], - outputs: vec![TypedParameter { - name: "res".to_string(), - r#type: "felt".to_string(), - }], - }, - }, - )]); - assert_eq!(contract_class.abi, expected_abi); - } - - #[test] - fn try_from_string() { - let mut serialized = String::new(); - - // This specific contract compiles with --no_debug_info - File::open(PathBuf::from("../../starknet_programs/AccountPreset.json")) - .and_then(|mut f| f.read_to_string(&mut serialized)) - .expect("should be able to read file"); - - let res = ParsedContractClass::try_from(serialized.as_str()); - - let contract_class = res.unwrap(); - - let program_builtins: Vec = - contract_class.program.iter_builtins().cloned().collect(); - assert_eq!( - program_builtins, - vec![ - BuiltinName::pedersen, - BuiltinName::range_check, - BuiltinName::ecdsa, - BuiltinName::bitwise - ] - ); - assert_eq!( - contract_class - .entry_points_by_type - .get(&EntryPointType::L1Handler) - .unwrap(), - &vec![] - ); - assert_eq!( - contract_class - .entry_points_by_type - .get(&EntryPointType::Constructor) - .unwrap(), - &vec![ContractEntryPoint { - selector: felt_str!( - "1159040026212278395030414237414753050475174923702621880048416706425641521556" - ), - offset: 366 - }] - ); - } - - #[test] - fn try_from_string_without_program_attributes() { - let mut serialized = String::new(); - - // This specific contract was extracted from: https://testnet.starkscan.co/class/0x068dd0dd8a54ebdaa10563fbe193e6be1e0f7c423c0c3ce1e91c0b682a86b5f9 - File::open(PathBuf::from( - "../../starknet_programs/raw_contract_classes/program_without_attributes.json", - )) - .and_then(|mut f| f.read_to_string(&mut serialized)) - .expect("should be able to read file"); - - let res = ParsedContractClass::try_from(serialized.as_str()); - - res.unwrap(); - } - - #[test] - fn try_from_string_without_program_attributes_2() { - let mut serialized = String::new(); - - // This specific contract was extracted from: https://testnet.starkscan.co/class/0x071b7f73b5e2b4f81f7cf01d4d1569ccba2921b3fa3170cf11cff3720dfe918e - File::open(PathBuf::from( - "../../starknet_programs/raw_contract_classes/program_without_attributes_2.json", - )) - .and_then(|mut f| f.read_to_string(&mut serialized)) - .expect("should be able to read file"); - - let res = ParsedContractClass::try_from(serialized.as_str()); - - res.unwrap(); - } - - #[test] - fn deserialize_equals_try_from() { - let mut serialized = String::new(); - - // This specific contract compiles with --no_debug_info - File::open(PathBuf::from("../../starknet_programs/AccountPreset.json")) - .and_then(|mut f| f.read_to_string(&mut serialized)) - .expect("should be able to read file"); - - let result_try_from = ParsedContractClass::try_from(serialized.as_str()).unwrap(); - let result_deserialize = serde_json::from_str(&serialized).unwrap(); - - assert_eq!(result_try_from, result_deserialize); - } -} diff --git a/examples/contract_execution/main.rs b/examples/contract_execution/main.rs index f395421f5..b735362d4 100644 --- a/examples/contract_execution/main.rs +++ b/examples/contract_execution/main.rs @@ -52,14 +52,14 @@ fn test_contract( //* -------------------------------------------- //* Read contract from file //* -------------------------------------------- - let contract_class = ContractClass::try_from(contract_path.as_ref().to_path_buf()) - .expect("Could not load contract from JSON"); + let contract_class = + ContractClass::from_path(contract_path).expect("Could not load contract from JSON"); //* -------------------------------------------- //* Declare new contract class //* -------------------------------------------- state - .declare(contract_class.clone(), None) + .declare(contract_class.clone()) .expect("Could not declare the contract class"); //* -------------------------------------------- diff --git a/fuzzer/Cargo.toml b/fuzzer/Cargo.toml index a2061d803..00e19b737 100644 --- a/fuzzer/Cargo.toml +++ b/fuzzer/Cargo.toml @@ -1,16 +1,15 @@ [package] name = "fuzzer" -version = "0.2.0" +version = "0.3.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] honggfuzz = "0.5.55" -starknet_in_rust = { path = "../", version = "0.2.0" } +starknet_in_rust = { path = "../", version = "0.3.0" } num-traits = { workspace = true } starknet_api = { workspace = true } serde_json = { version = "1.0", features = ["arbitrary_precision"] } tempfile = "3.2.0" -cairo-vm = { workspace=true, features = ["cairo-1-hints"]} -starknet-contract-class = { path = "../crates/starknet-contract-class/", version = "0.2.0" } +cairo-vm = { workspace = true, features = ["cairo-1-hints"] } diff --git a/fuzzer/src/main.rs b/fuzzer/src/main.rs index 000f71c82..edbfb1cf5 100644 --- a/fuzzer/src/main.rs +++ b/fuzzer/src/main.rs @@ -6,7 +6,8 @@ extern crate honggfuzz; use cairo_vm::felt::Felt252; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use num_traits::Zero; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::execution::execution_entry_point::ExecutionResult; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -18,6 +19,7 @@ use starknet_in_rust::{ utils::{calculate_sn_keccak, Address}, }; +use std::sync::Arc; use std::{ collections::{HashMap, HashSet}, path::PathBuf, @@ -88,7 +90,7 @@ fn main() { // --------------------------------------------------------- let path = PathBuf::from(&json_file_name); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let storage_entrypoint_selector = contract_class .entry_points_by_type() @@ -124,7 +126,8 @@ fn main() { //* Create state with previous data //* --------------------------------------- - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = + CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* ------------------------------------ //* Create execution entry point @@ -180,18 +183,17 @@ fn main() { ..Default::default() }; - assert_eq!( - exec_entry_point - .execute( - &mut state, - &block_context, - &mut resources_manager, - &mut tx_execution_context, - false, - ) - .unwrap(), - expected_call_info - ); + let ExecutionResult { call_info, .. } = exec_entry_point + .execute( + &mut state, + &block_context, + &mut resources_manager, + &mut tx_execution_context, + false, + block_context.invoke_tx_max_n_steps(), + ) + .unwrap(); + assert_eq!(call_info.unwrap(), expected_call_info); assert!(!state.cache().storage_writes().is_empty()); assert_eq!( diff --git a/src/bin/deploy.rs b/src/bin/deploy.rs index 74e258bc7..1b58d386a 100644 --- a/src/bin/deploy.rs +++ b/src/bin/deploy.rs @@ -1,5 +1,3 @@ -use std::path::PathBuf; - use lazy_static::lazy_static; use starknet_in_rust::{ services::api::contract_classes::deprecated_contract_class::ContractClass, @@ -15,9 +13,9 @@ static ALLOC: MiMalloc = MiMalloc; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(PathBuf::from( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/first_contract.json", - )).unwrap(); + ).unwrap(); } fn main() { diff --git a/src/bin/deploy_invoke.rs b/src/bin/deploy_invoke.rs index 9a1fb2b84..1036a6496 100644 --- a/src/bin/deploy_invoke.rs +++ b/src/bin/deploy_invoke.rs @@ -19,9 +19,9 @@ static ALLOC: MiMalloc = MiMalloc; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(PathBuf::from( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/first_contract.json", - )).unwrap(); + ).unwrap(); static ref CONTRACT_PATH: PathBuf = PathBuf::from("starknet_programs/first_contract.json"); diff --git a/src/bin/fibonacci.rs b/src/bin/fibonacci.rs index 6d7dc2767..b14be188a 100644 --- a/src/bin/fibonacci.rs +++ b/src/bin/fibonacci.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, path::PathBuf}; +use std::{collections::HashMap, path::PathBuf, sync::Arc}; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::Zero; @@ -19,9 +19,9 @@ static ALLOC: MiMalloc = MiMalloc; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(PathBuf::from( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/fibonacci.json", - )).unwrap(); + ).unwrap(); static ref CONTRACT_PATH: PathBuf = PathBuf::from("starknet_programs/fibonacci.json"); @@ -85,7 +85,7 @@ fn create_initial_state() -> CachedState { state_reader .address_to_storage_mut() .insert((CONTRACT_ADDRESS.clone(), [0; 32]), Felt252::zero()); - state_reader + Arc::new(state_reader) }, Some(HashMap::new()), None, diff --git a/src/bin/invoke.rs b/src/bin/invoke.rs index 4bdf5468c..afec929fa 100644 --- a/src/bin/invoke.rs +++ b/src/bin/invoke.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, path::PathBuf}; +use std::{collections::HashMap, path::PathBuf, sync::Arc}; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::Zero; @@ -20,9 +20,9 @@ static ALLOC: MiMalloc = MiMalloc; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(PathBuf::from( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/first_contract.json", - )).unwrap(); + ).unwrap(); static ref CONTRACT_PATH: PathBuf = PathBuf::from("starknet_programs/first_contract.json"); @@ -99,7 +99,7 @@ fn create_initial_state() -> CachedState { state_reader .address_to_storage_mut() .insert((CONTRACT_ADDRESS.clone(), [0; 32]), Felt252::zero()); - state_reader + Arc::new(state_reader) }, Some(HashMap::new()), None, diff --git a/src/bin/invoke_with_cachedstate.rs b/src/bin/invoke_with_cachedstate.rs index a191fb387..ebfe9202e 100644 --- a/src/bin/invoke_with_cachedstate.rs +++ b/src/bin/invoke_with_cachedstate.rs @@ -1,4 +1,4 @@ -use std::{collections::HashMap, path::PathBuf}; +use std::{collections::HashMap, path::PathBuf, sync::Arc}; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::Zero; @@ -26,9 +26,9 @@ static ALLOC: MiMalloc = MiMalloc; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(PathBuf::from( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/first_contract.json", - )).unwrap(); + ).unwrap(); static ref CONTRACT_PATH: PathBuf = PathBuf::from("starknet_programs/first_contract.json"); @@ -62,7 +62,6 @@ fn main() { vec![], StarknetChainId::TestNet.to_felt(), Some(Felt252::from(i * 2)), - None, ) .unwrap() .execute(&mut cached_state, &block_context, 0) @@ -77,7 +76,6 @@ fn main() { vec![], StarknetChainId::TestNet.to_felt(), Some(Felt252::from((i * 2) + 1)), - None, ) .unwrap() .execute(&mut cached_state, &block_context, 0) @@ -108,7 +106,7 @@ fn create_initial_state() -> CachedState { state_reader .address_to_storage_mut() .insert((CONTRACT_ADDRESS.clone(), [0; 32]), Felt252::zero()); - state_reader + Arc::new(state_reader) }, Some(HashMap::new()), None, diff --git a/src/core/block_hash/starknet_block_hash.rs b/src/core/block_hash/starknet_block_hash.rs index 6fe2b307d..451efd444 100644 --- a/src/core/block_hash/starknet_block_hash.rs +++ b/src/core/block_hash/starknet_block_hash.rs @@ -5,12 +5,8 @@ use cairo_vm::felt::Felt252; use starknet_crypto::{pedersen_hash, FieldElement}; use std::iter::zip; -// -------------------------------------------------------------- -// TODO: -// * calculate_block_hash -// * calculate_patricia_root -// there are missing structures to implement this functions yet -// ------------------------------------------------------------- +/// Hashes the signatures with the given transaction hashes, to get hashes that take into account the +/// entire transactions, as the original hashes do not include the signatures. pub fn calculate_tx_hashes_with_signatures( tx_hashes: Vec, diff --git a/src/core/contract_address/casm_contract_address.rs b/src/core/contract_address/casm_contract_address.rs new file mode 100644 index 000000000..ebea2a482 --- /dev/null +++ b/src/core/contract_address/casm_contract_address.rs @@ -0,0 +1,268 @@ +use crate::core::errors::contract_address_errors::ContractAddressError; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use cairo_lang_starknet::casm_contract_class::{CasmContractClass, CasmContractEntryPoint}; +use cairo_vm::felt::Felt252; +use starknet_crypto::{poseidon_hash_many, FieldElement}; + +const CONTRACT_CLASS_VERSION: &[u8] = b"COMPILED_CLASS_V1"; + +fn get_contract_entry_points_hashed( + contract_class: &CasmContractClass, + entry_point_type: &EntryPointType, +) -> Result { + let contract_entry_points = get_contract_entry_points(contract_class, entry_point_type); + + // for each entry_point, we need to store 3 FieldElements: [selector, offset, poseidon_hash_many(builtin_list)]. + let mut entry_points_flatted = Vec::with_capacity(contract_entry_points.len() * 3); + + for entry_point in contract_entry_points { + entry_points_flatted.push( + // fix this conversion later + FieldElement::from_bytes_be(&Felt252::from(entry_point.selector).to_be_bytes()) + .map_err(|_err| { + ContractAddressError::Cast("Felt252".to_string(), "FieldElement".to_string()) + })?, + ); + entry_points_flatted.push(FieldElement::from(entry_point.offset)); + let builtins_flatted = entry_point + .builtins + .iter() + .map(|builtin| FieldElement::from_byte_slice_be(builtin.as_bytes())) + .collect::, _>>() + .map_err(|_err| { + ContractAddressError::Cast("Felt252".to_string(), "FieldElement".to_string()) + })?; + entry_points_flatted.push(poseidon_hash_many(&builtins_flatted)); + } + + Ok(poseidon_hash_many(&entry_points_flatted)) +} + +pub fn compute_casm_class_hash( + contract_class: &CasmContractClass, +) -> Result { + let api_version = + FieldElement::from_bytes_be(&Felt252::from_bytes_be(CONTRACT_CLASS_VERSION).to_be_bytes()) + .map_err(|_err| { + ContractAddressError::Cast("Felt252".to_string(), "FieldElement".to_string()) + })?; + + // Entrypoints by type, hashed. + let external_functions = + get_contract_entry_points_hashed(contract_class, &EntryPointType::External)?; + let l1_handlers = get_contract_entry_points_hashed(contract_class, &EntryPointType::L1Handler)?; + let constructors = + get_contract_entry_points_hashed(contract_class, &EntryPointType::Constructor)?; + + let mut casm_program_vector = Vec::with_capacity(contract_class.bytecode.len()); + for number in &contract_class.bytecode { + casm_program_vector.push( + FieldElement::from_bytes_be(&Felt252::from(number.value.clone()).to_be_bytes()) + .map_err(|_err| { + ContractAddressError::Cast("Felt252".to_string(), "FieldElement".to_string()) + })?, + ); + } + + // Hash casm program. + let casm_program_ptr = poseidon_hash_many(&casm_program_vector); + + let flatted_contract_class = vec![ + api_version, + external_functions, + l1_handlers, + constructors, + casm_program_ptr, + ]; + + Ok(Felt252::from_bytes_be( + &poseidon_hash_many(&flatted_contract_class).to_bytes_be(), + )) +} + +fn get_contract_entry_points( + contract_class: &CasmContractClass, + entry_point_type: &EntryPointType, +) -> Vec { + match entry_point_type { + EntryPointType::Constructor => contract_class.entry_points_by_type.constructor.clone(), + EntryPointType::External => contract_class.entry_points_by_type.external.clone(), + EntryPointType::L1Handler => contract_class.entry_points_by_type.l1_handler.clone(), + } +} + +#[cfg(test)] +mod tests { + /// THE VALUES IN THIS TESTS WERE TAKEN FROM THE CONTRACTS IN THE STARKNET_PROGRAMS FOLDER. + /// AND WE USE A [TOOL FOUND IN CAIRO-LANG](https://github.com/starkware-libs/cairo-lang/blob/master/src/starkware/starknet/cli/compiled_class_hash.py) + /// TO GET THE RIGHT HASH VALUE. + use std::{fs::File, io::BufReader}; + + use super::*; + use cairo_vm::felt::felt_str; + use coverage_helper::test; + + #[test] + fn test_compute_casm_class_hash_contract_a() { + // Open the file in read-only mode with buffer. + let file; + let expected_result; + #[cfg(not(feature = "cairo_1_tests"))] + { + file = File::open("starknet_programs/cairo2/contract_a.casm").unwrap(); + expected_result = felt_str!( + "321aadcf42b0a4ad905616598d16c42fa9b87c812dc398e49b57bf77930629f", + 16 + ); + } + #[cfg(feature = "cairo_1_tests")] + { + file = File::open("starknet_programs/cairo1/contract_a.casm").unwrap(); + expected_result = felt_str!( + "3a4f00bf75ba3b9230a94f104c7a4605a1901c4bd475beb59eeeeb7aceb9795", + 16 + ); + } + let reader = BufReader::new(file); + + // Read the JSON contents of the file as an instance of `CasmContractClass`. + let contract_class: CasmContractClass = serde_json::from_reader(reader).unwrap(); + + assert_eq!( + compute_casm_class_hash(&contract_class).unwrap(), + expected_result + ); + } + + #[test] + fn test_compute_casm_class_hash_deploy() { + // Open the file in read-only mode with buffer. + let file; + let expected_result; + #[cfg(not(feature = "cairo_1_tests"))] + { + file = File::open("starknet_programs/cairo2/deploy.casm").unwrap(); + expected_result = felt_str!( + "53ad3bfb13f39cf1a9940108be4f9c6a8d9cc48a59d5f9b3c73432f877f8cf0", + 16 + ); + } + + #[cfg(feature = "cairo_1_tests")] + { + file = File::open("starknet_programs/cairo1/deploy.casm").unwrap(); + expected_result = felt_str!( + "3bd56f1c3c1c595ac2ee6d07bdedc027d09df56235e20374649f0b3535c1f15", + 16 + ); + } + let reader = BufReader::new(file); + + // Read the JSON contents of the file as an instance of `CasmContractClass`. + let contract_class: CasmContractClass = serde_json::from_reader(reader).unwrap(); + + assert_eq!( + compute_casm_class_hash(&contract_class).unwrap(), + expected_result + ); + } + + #[test] + fn test_compute_casm_class_hash_fibonacci() { + // Open the file in read-only mode with buffer. + let file; + let expected_result; + #[cfg(not(feature = "cairo_1_tests"))] + { + file = File::open("starknet_programs/cairo2/fibonacci.casm").unwrap(); + expected_result = felt_str!( + "6638ce6c9bf336d1781a388668fa2206d928df5d1fa6b92e4cb41004c7e3f89", + 16 + ); + } + + #[cfg(feature = "cairo_1_tests")] + { + file = File::open("starknet_programs/cairo1/fibonacci.casm").unwrap(); + expected_result = felt_str!( + "44f12e6e59232e9909d7428b913b3cc8d9059458e5027740a3ccdbdc4b1ffd2", + 16 + ); + } + let reader = BufReader::new(file); + + // Read the JSON contents of the file as an instance of `CasmContractClass`. + let contract_class: CasmContractClass = serde_json::from_reader(reader).unwrap(); + + assert_eq!( + compute_casm_class_hash(&contract_class).unwrap(), + expected_result + ); + } + + #[test] + fn test_compute_casm_class_hash_factorial() { + // Open the file in read-only mode with buffer. + let file; + let expected_result; + #[cfg(not(feature = "cairo_1_tests"))] + { + file = File::open("starknet_programs/cairo2/factorial.casm").unwrap(); + expected_result = felt_str!( + "7c48d040ceb3183837a0aff2adf33d879f790e202eb2c4b8622005c12252641", + 16 + ); + } + + #[cfg(feature = "cairo_1_tests")] + { + file = File::open("starknet_programs/cairo1/factorial.casm").unwrap(); + expected_result = felt_str!( + "189a9b8b852aedbb225aa28dce9cfc3133145dd623e2d2ca5e962b7d4e61e15", + 16 + ); + } + let reader = BufReader::new(file); + + // Read the JSON contents of the file as an instance of `CasmContractClass`. + let contract_class: CasmContractClass = serde_json::from_reader(reader).unwrap(); + + assert_eq!( + compute_casm_class_hash(&contract_class).unwrap(), + expected_result + ); + } + + #[test] + fn test_compute_casm_class_hash_emit_event() { + // Open the file in read-only mode with buffer. + let file; + let expected_result; + #[cfg(not(feature = "cairo_1_tests"))] + { + file = File::open("starknet_programs/cairo2/emit_event.casm").unwrap(); + expected_result = felt_str!( + "3010533bd60cb0e70ac1bf776e171713f0e5229a084989d3894c171c160ace2", + 16 + ); + } + + #[cfg(feature = "cairo_1_tests")] + { + file = File::open("starknet_programs/cairo1/emit_event.casm").unwrap(); + expected_result = felt_str!( + "3335fe731ceda1116eda8bbc2e282953ce54618309ad474189e627c59328fff", + 16 + ); + } + let reader = BufReader::new(file); + + // Read the JSON contents of the file as an instance of `CasmContractClass`. + let contract_class: CasmContractClass = serde_json::from_reader(reader).unwrap(); + + assert_eq!( + compute_casm_class_hash(&contract_class).unwrap(), + expected_result + ); + } +} diff --git a/src/core/contract_address/deprecated_contract_address.rs b/src/core/contract_address/deprecated_contract_address.rs index a8f1ee34a..3324fef81 100644 --- a/src/core/contract_address/deprecated_contract_address.rs +++ b/src/core/contract_address/deprecated_contract_address.rs @@ -1,3 +1,6 @@ +use crate::services::api::contract_classes::deprecated_contract_class::{ + ContractEntryPoint, EntryPointType, +}; /// Contains functionality for computing class hashes for deprecated Declare transactions /// (ie, declarations that do not correspond to Cairo 1 contracts) /// The code used for hinted class hash computation was extracted from the Pathfinder and xJonathanLEI implementations @@ -13,7 +16,6 @@ use cairo_vm::felt::Felt252; use num_traits::Zero; use serde::Serialize; use sha3::Digest; -use starknet_contract_class::{ContractEntryPoint, EntryPointType}; use std::{borrow::Cow, collections::BTreeMap, io}; /// Instead of doing a Mask with 250 bits, we are only masking the most significant byte. @@ -23,14 +25,13 @@ fn get_contract_entry_points( contract_class: &ContractClass, entry_point_type: &EntryPointType, ) -> Result, ContractAddressError> { - let program_length = contract_class.program().iter_data().count(); - let entry_points = contract_class .entry_points_by_type() .get(entry_point_type) .ok_or(ContractAddressError::NoneExistingEntryPointType)?; - let program_len = program_length; + let program_len = contract_class.program().iter_data().count(); + for entry_point in entry_points { if entry_point.offset() > program_len { return Err(ContractAddressError::InvalidOffset(entry_point.offset())); @@ -211,10 +212,10 @@ pub struct CairoProgramToHash<'a> { /// Computes the hash of the contract class, including hints. /// We are not supporting backward compatibility now. -fn compute_hinted_class_hash( - contract_class: &ContractClass, +pub(crate) fn compute_hinted_class_hash( + contract_class: &serde_json::Value, ) -> Result { - let program_as_string = contract_class.program_json.to_string(); + let program_as_string = contract_class.to_string(); let mut cairo_program_hash: CairoContractDefinition = serde_json::from_str(&program_as_string) .map_err(|err| ContractAddressError::InvalidProgramJson(err.to_string()))?; @@ -320,7 +321,7 @@ pub fn compute_deprecated_class_hash( let builtin_list = compute_hash_on_elements(&builtin_list_vec)?; - let hinted_class_hash = compute_hinted_class_hash(contract_class)?; + let hinted_class_hash = contract_class.hinted_class_hash(); let mut bytecode_vector = Vec::new(); @@ -340,7 +341,7 @@ pub fn compute_deprecated_class_hash( l1_handlers, constructors, builtin_list, - hinted_class_hash, + hinted_class_hash.clone(), bytecode, ]; @@ -349,29 +350,20 @@ pub fn compute_deprecated_class_hash( #[cfg(test)] mod tests { - use std::{fs, str::FromStr}; - use super::*; use cairo_vm::felt::{felt_str, Felt252}; use coverage_helper::test; use num_traits::Num; - use starknet_contract_class::ParsedContractClass; #[test] fn test_compute_hinted_class_hash_with_abi() { - let contract_str = - fs::read_to_string("starknet_programs/raw_contract_classes/class_with_abi.json") + let contract_class = + ContractClass::from_path("starknet_programs/raw_contract_classes/class_with_abi.json") .unwrap(); - let parsed_contract_class = ParsedContractClass::try_from(contract_str.as_str()).unwrap(); - let contract_class = ContractClass { - program_json: serde_json::Value::from_str(&contract_str).unwrap(), - program: parsed_contract_class.program, - entry_points_by_type: parsed_contract_class.entry_points_by_type, - abi: parsed_contract_class.abi, - }; + assert_eq!( - compute_hinted_class_hash(&contract_class).unwrap(), - Felt252::from_str_radix( + contract_class.hinted_class_hash(), + &Felt252::from_str_radix( "1164033593603051336816641706326288678020608687718343927364853957751413025239", 10 ) @@ -381,14 +373,7 @@ mod tests { #[test] fn test_compute_class_hash_1354433237b0039baa138bf95b98fe4a8ae3df7ac4fd4d4845f0b41cd11bec4() { - let contract_str = fs::read_to_string("starknet_programs/raw_contract_classes/0x1354433237b0039baa138bf95b98fe4a8ae3df7ac4fd4d4845f0b41cd11bec4.json").unwrap(); - let parsed_contract_class = ParsedContractClass::try_from(contract_str.as_str()).unwrap(); - let contract_class = ContractClass { - program_json: serde_json::Value::from_str(&contract_str).unwrap(), - program: parsed_contract_class.program, - entry_points_by_type: parsed_contract_class.entry_points_by_type, - abi: parsed_contract_class.abi, - }; + let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/0x1354433237b0039baa138bf95b98fe4a8ae3df7ac4fd4d4845f0b41cd11bec4.json").unwrap(); assert_eq!( compute_deprecated_class_hash(&contract_class).unwrap(), @@ -403,14 +388,7 @@ mod tests { #[test] fn test_compute_class_hash_0x03131fa018d520a037686ce3efddeab8f28895662f019ca3ca18a626650f7d1e() { - let contract_str = fs::read_to_string("starknet_programs/raw_contract_classes/0x03131fa018d520a037686ce3efddeab8f28895662f019ca3ca18a626650f7d1e.json").unwrap(); - let parsed_contract_class = ParsedContractClass::try_from(contract_str.as_str()).unwrap(); - let contract_class = ContractClass { - program_json: serde_json::Value::from_str(&contract_str).unwrap(), - program: parsed_contract_class.program, - entry_points_by_type: parsed_contract_class.entry_points_by_type, - abi: parsed_contract_class.abi, - }; + let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/0x03131fa018d520a037686ce3efddeab8f28895662f019ca3ca18a626650f7d1e.json").unwrap(); assert_eq!( compute_deprecated_class_hash(&contract_class).unwrap(), @@ -425,14 +403,7 @@ mod tests { #[test] fn test_compute_class_hash_0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918() { - let contract_str = fs::read_to_string("starknet_programs/raw_contract_classes/0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918.json").unwrap(); - let parsed_contract_class = ParsedContractClass::try_from(contract_str.as_str()).unwrap(); - let contract_class = ContractClass { - program_json: serde_json::Value::from_str(&contract_str).unwrap(), - program: parsed_contract_class.program, - entry_points_by_type: parsed_contract_class.entry_points_by_type, - abi: parsed_contract_class.abi, - }; + let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/0x025ec026985a3bf9d0cc1fe17326b245dfdc3ff89b8fde106542a3ea56c5a918.json").unwrap(); assert_eq!( compute_deprecated_class_hash(&contract_class).unwrap(), @@ -447,14 +418,7 @@ mod tests { #[test] fn test_compute_class_hash_0x02c3348ad109f7f3967df6494b3c48741d61675d9a7915b265aa7101a631dc33() { - let contract_str = fs::read_to_string("starknet_programs/raw_contract_classes/0x02c3348ad109f7f3967df6494b3c48741d61675d9a7915b265aa7101a631dc33.json").unwrap(); - let parsed_contract_class = ParsedContractClass::try_from(contract_str.as_str()).unwrap(); - let contract_class = ContractClass { - program_json: serde_json::Value::from_str(&contract_str).unwrap(), - program: parsed_contract_class.program, - entry_points_by_type: parsed_contract_class.entry_points_by_type, - abi: parsed_contract_class.abi, - }; + let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/0x02c3348ad109f7f3967df6494b3c48741d61675d9a7915b265aa7101a631dc33.json").unwrap(); assert_eq!( compute_deprecated_class_hash(&contract_class).unwrap(), @@ -471,14 +435,7 @@ mod tests { #[test] fn test_compute_class_hash_0x00801ad5dc7c995addf7fbce1c4c74413586acb44f9ff44ba903a08a6153fa80() { - let contract_str = fs::read_to_string("starknet_programs/raw_contract_classes/0x00801ad5dc7c995addf7fbce1c4c74413586acb44f9ff44ba903a08a6153fa80.json").unwrap(); - let parsed_contract_class = ParsedContractClass::try_from(contract_str.as_str()).unwrap(); - let contract_class = ContractClass { - program_json: serde_json::Value::from_str(&contract_str).unwrap(), - program: parsed_contract_class.program, - entry_points_by_type: parsed_contract_class.entry_points_by_type, - abi: parsed_contract_class.abi, - }; + let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/0x00801ad5dc7c995addf7fbce1c4c74413586acb44f9ff44ba903a08a6153fa80.json").unwrap(); assert_eq!( compute_deprecated_class_hash(&contract_class).unwrap(), @@ -487,4 +444,36 @@ mod tests { ) ); } + + #[test] + fn test_compute_class_hash_0x4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_mainnet( + ) { + let contract_class = ContractClass::from_path( + "starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_mainnet.json" + ).unwrap(); + + assert_eq!( + compute_deprecated_class_hash(&contract_class).unwrap(), + felt_str!( + "4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f", + 16 + ) + ); + } + + #[test] + fn test_compute_class_hash_0x4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_goerli( + ) { + let contract_class = ContractClass::from_path( + "starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_goerli.json" + ).unwrap(); + + assert_eq!( + compute_deprecated_class_hash(&contract_class).unwrap(), + felt_str!( + "4d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f", + 16 + ) + ); + } } diff --git a/src/core/contract_address/mod.rs b/src/core/contract_address/mod.rs index 8ee499e9d..40641fb27 100644 --- a/src/core/contract_address/mod.rs +++ b/src/core/contract_address/mod.rs @@ -1,5 +1,8 @@ +mod casm_contract_address; mod deprecated_contract_address; mod sierra_contract_address; +pub use casm_contract_address::compute_casm_class_hash; pub use deprecated_contract_address::compute_deprecated_class_hash; +pub(crate) use deprecated_contract_address::compute_hinted_class_hash; pub use sierra_contract_address::compute_sierra_class_hash; diff --git a/src/core/contract_address/sierra_contract_address.rs b/src/core/contract_address/sierra_contract_address.rs index eb8a84353..b9b9666cd 100644 --- a/src/core/contract_address/sierra_contract_address.rs +++ b/src/core/contract_address/sierra_contract_address.rs @@ -1,9 +1,11 @@ use crate::core::errors::contract_address_errors::ContractAddressError; +use crate::services::api::contract_classes::deprecated_contract_class::{ + ContractEntryPoint, EntryPointType, +}; use cairo_lang_starknet::{ contract::starknet_keccak, contract_class::ContractClass as SierraContractClass, }; use cairo_vm::felt::Felt252; -use starknet_contract_class::{ContractEntryPoint, EntryPointType}; use starknet_crypto::{poseidon_hash_many, FieldElement}; const CONTRACT_CLASS_VERSION: &[u8] = b"CONTRACT_CLASS_V0.1.0"; diff --git a/src/core/errors/contract_address_errors.rs b/src/core/errors/contract_address_errors.rs index f8482d570..16e26003b 100644 --- a/src/core/errors/contract_address_errors.rs +++ b/src/core/errors/contract_address_errors.rs @@ -1,3 +1,4 @@ +use crate::core::errors::hash_errors::HashError; use cairo_vm::{ types::errors::program_errors::ProgramError, vm::errors::{ @@ -43,4 +44,12 @@ pub enum ContractAddressError { NoneIntMaybeRelocatable, #[error("Invalid program JSON, message: {0}")] InvalidProgramJson(String), + #[error("Couldn't compute hash: {0}")] + HashError(HashError), +} + +impl From for ContractAddressError { + fn from(error: HashError) -> Self { + ContractAddressError::HashError(error) + } } diff --git a/src/core/errors/hash_errors.rs b/src/core/errors/hash_errors.rs new file mode 100644 index 000000000..f63399893 --- /dev/null +++ b/src/core/errors/hash_errors.rs @@ -0,0 +1,7 @@ +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum HashError { + #[error("Failed to compute hash {0}")] + FailedToComputeHash(String), +} diff --git a/src/core/errors/mod.rs b/src/core/errors/mod.rs index 98aef9b92..50f9f9a1a 100644 --- a/src/core/errors/mod.rs +++ b/src/core/errors/mod.rs @@ -1,2 +1,3 @@ pub mod contract_address_errors; +pub mod hash_errors; pub mod state_errors; diff --git a/src/core/errors/state_errors.rs b/src/core/errors/state_errors.rs index 4abcc1d24..29e03846d 100644 --- a/src/core/errors/state_errors.rs +++ b/src/core/errors/state_errors.rs @@ -1,7 +1,6 @@ use crate::{ services::api::contract_class_errors::ContractClassError, state::state_cache::StorageEntry, - storage::errors::storage_errors::StorageError, utils::{Address, ClassHash}, }; use thiserror::Error; @@ -33,8 +32,6 @@ pub enum StateError { #[error("Requested contract address {} is unavailable for deployment", (.0).0)] ContractAddressUnavailable(Address), #[error(transparent)] - Storage(#[from] StorageError), - #[error(transparent)] ContractClass(#[from] ContractClassError), #[error("Missing CasmClassCache")] MissingCasmClassCache, diff --git a/src/core/transaction_hash/mod.rs b/src/core/transaction_hash/mod.rs index 6c3e36b14..c5452109b 100644 --- a/src/core/transaction_hash/mod.rs +++ b/src/core/transaction_hash/mod.rs @@ -1,12 +1,10 @@ +use crate::core::errors::hash_errors::HashError; use crate::{ - core::contract_address::{compute_deprecated_class_hash, compute_sierra_class_hash}, - definitions::constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, - hash_utils::compute_hash_on_elements, + core::contract_address::compute_deprecated_class_hash, + definitions::constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, hash_utils::compute_hash_on_elements, services::api::contract_classes::deprecated_contract_class::ContractClass, - syscalls::syscall_handler_errors::SyscallHandlerError, - utils::Address, + syscalls::syscall_handler_errors::SyscallHandlerError, utils::Address, }; -use cairo_lang_starknet::contract_class::ContractClass as SierraContractClass; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::Zero; @@ -71,7 +69,7 @@ pub fn calculate_transaction_hash_common( data_to_hash.extend(additional_data.iter().cloned()); - compute_hash_on_elements(&data_to_hash) + Ok(compute_hash_on_elements(&data_to_hash)?) } pub fn calculate_deploy_transaction_hash( @@ -126,10 +124,11 @@ pub fn calculate_declare_transaction_hash( version: Felt252, nonce: Felt252, ) -> Result { - let class_hash = compute_deprecated_class_hash(contract_class) - .map_err(|_| SyscallHandlerError::FailToComputeHash)?; + let class_hash = compute_deprecated_class_hash(contract_class).map_err(|e| { + SyscallHandlerError::HashError(HashError::FailedToComputeHash(e.to_string())) + })?; - let (calldata, additional_data) = if version.is_zero() { + let (calldata, additional_data) = if !version.is_zero() { (vec![class_hash], vec![nonce]) } else { (Vec::new(), vec![class_hash]) @@ -152,7 +151,7 @@ pub fn calculate_declare_transaction_hash( // ---------------------------- pub fn calculate_declare_v2_transaction_hash( - contract_class: &SierraContractClass, + sierra_class_hash: Felt252, compiled_class_hash: Felt252, chain_id: Felt252, sender_address: &Address, @@ -160,10 +159,7 @@ pub fn calculate_declare_v2_transaction_hash( version: Felt252, nonce: Felt252, ) -> Result { - let class_hash = compute_sierra_class_hash(contract_class) - .map_err(|_| SyscallHandlerError::FailToComputeHash)?; - - let calldata = [class_hash].to_vec(); + let calldata = [sierra_class_hash].to_vec(); let additional_data = [nonce, compiled_class_hash].to_vec(); calculate_transaction_hash_common( @@ -183,6 +179,8 @@ mod tests { use cairo_vm::felt::felt_str; use coverage_helper::test; + use crate::definitions::block_context::StarknetChainId; + use super::*; #[test] @@ -215,4 +213,39 @@ mod tests { assert_eq!(result, expected); } + + #[test] + fn calculate_declare_hash_test() { + let chain_id = StarknetChainId::MainNet; + let sender_address = Address(felt_str!( + "78963962122521774108119849325604561253807220406669671815499681746608877924" + )); + let max_fee = 30580718124600; + let version = 1.into(); + let nonce = 3746.into(); + let class_hash = felt_str!( + "1935775813346111469198021973672033051732472907985289186515250543849860001197" + ); + + let (calldata, additional_data) = (vec![class_hash], vec![nonce]); + + let tx = calculate_transaction_hash_common( + TransactionHashPrefix::Declare, + version, + &sender_address, + Felt252::zero(), + &calldata, + max_fee, + chain_id.to_felt(), + &additional_data, + ) + .unwrap(); + + assert_eq!( + tx, + felt_str!( + "446404108171603570739811156347043235876209711235222547918688109133687877504" + ) + ) + } } diff --git a/src/definitions/constants.rs b/src/definitions/constants.rs index 4e9b4fe4a..d72e8ccd7 100644 --- a/src/definitions/constants.rs +++ b/src/definitions/constants.rs @@ -14,15 +14,35 @@ pub(crate) const N_DEFAULT_TOPICS: usize = 1; // Events have one default topic. pub(crate) const CONSUMED_MSG_TO_L2_ENCODED_DATA_SIZE: usize = (L1_TO_L2_MSG_HEADER_SIZE + 1) - CONSUMED_MSG_TO_L2_N_TOPICS; +lazy_static! { + pub(crate) static ref QUERY_VERSION_BASE: Felt252 = + felt_str!("340282366920938463463374607431768211456"); +} + pub(crate) const LOG_MSG_TO_L1_ENCODED_DATA_SIZE: usize = (L2_TO_L1_MSG_HEADER_SIZE + 1) - LOG_MSG_TO_L1_N_TOPICS; +/// Fee factor used for the final fee calculation: +/// actual_fee = min(max_fee, consumed_resources) * FEE_FACTOR +pub(crate) const FEE_FACTOR: u128 = 1; + /// The (empirical) L1 gas cost of each Cairo step. pub(crate) const N_STEPS_FEE_WEIGHT: f64 = 0.01; /// The version is considered 0 for L1-Handler transaction hash calculation purposes. pub(crate) const L1_HANDLER_VERSION: u64 = 0; +lazy_static! { + pub static ref SUPPORTED_VERSIONS: [Felt252; 6] = [ + 0.into(), + 1.into(), + 2.into(), + &0.into() | &QUERY_VERSION_BASE.clone(), + &1.into() | &QUERY_VERSION_BASE.clone(), + &2.into() | &QUERY_VERSION_BASE.clone(), + ]; +} + lazy_static! { // Ratios are taken from the `starknet_instance` CairoLayout object in cairo-lang. pub static ref DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS: HashMap = diff --git a/src/execution/execution_entry_point.rs b/src/execution/execution_entry_point.rs index b7e4a4ee7..b7116d1f1 100644 --- a/src/execution/execution_entry_point.rs +++ b/src/execution/execution_entry_point.rs @@ -1,3 +1,8 @@ +use crate::services::api::contract_classes::deprecated_contract_class::{ + ContractEntryPoint, EntryPointType, +}; +use crate::state::cached_state::CachedState; +use crate::state::StateDiff; use crate::{ definitions::{block_context::BlockContext, constants::DEFAULT_ENTRY_POINT_SELECTOR}, runner::StarknetRunner, @@ -31,12 +36,18 @@ use cairo_vm::{ vm_core::VirtualMachine, }, }; -use starknet_contract_class::{ContractEntryPoint, EntryPointType}; use super::{ CallInfo, CallResult, CallType, OrderedEvent, OrderedL2ToL1Message, TransactionExecutionContext, }; +#[derive(Debug, Default)] +pub struct ExecutionResult { + pub call_info: Option, + pub revert_error: Option, + pub n_reverted_steps: usize, +} + /// Represents a Cairo entry point execution of a StarkNet contract. // TODO:initial_gas is a new field added in the current changes, it should be checked if we delete it once the new execution entry point is done @@ -83,14 +94,15 @@ impl ExecutionEntryPoint { /// Returns a CallInfo object that represents the execution. pub fn execute( &self, - state: &mut T, + state: &mut CachedState, block_context: &BlockContext, resources_manager: &mut ExecutionResourcesManager, tx_execution_context: &mut TransactionExecutionContext, support_reverted: bool, - ) -> Result + max_steps: u64, + ) -> Result where - T: State + StateReader, + T: StateReader, { // lookup the compiled class from the state. let class_hash = self.get_code_class_hash(state)?; @@ -98,23 +110,62 @@ impl ExecutionEntryPoint { .get_contract_class(&class_hash) .map_err(|_| TransactionError::MissingCompiledClass)?; match contract_class { - CompiledClass::Deprecated(contract_class) => self._execute_version0_class( - state, - resources_manager, - block_context, - tx_execution_context, - contract_class, - class_hash, - ), - CompiledClass::Casm(contract_class) => self._execute( - state, - resources_manager, - block_context, - tx_execution_context, - contract_class, - class_hash, - support_reverted, - ), + CompiledClass::Deprecated(contract_class) => { + let call_info = self._execute_version0_class( + state, + resources_manager, + block_context, + tx_execution_context, + contract_class, + class_hash, + )?; + Ok(ExecutionResult { + call_info: Some(call_info), + revert_error: None, + n_reverted_steps: 0, + }) + } + CompiledClass::Casm(contract_class) => { + let mut tmp_state = CachedState::new( + state.state_reader.clone(), + state.contract_classes.clone(), + state.casm_contract_classes.clone(), + ); + tmp_state.cache = state.cache.clone(); + + match self._execute( + &mut tmp_state, + resources_manager, + block_context, + tx_execution_context, + contract_class, + class_hash, + support_reverted, + ) { + Ok(call_info) => { + let state_diff = StateDiff::from_cached_state(tmp_state)?; + state.apply_state_update(&state_diff)?; + Ok(ExecutionResult { + call_info: Some(call_info), + revert_error: None, + n_reverted_steps: 0, + }) + } + Err(e) => { + if !support_reverted { + return Err(e); + } + + let n_reverted_steps = + (max_steps as usize) - resources_manager.cairo_usage.n_steps; + Ok(ExecutionResult { + call_info: None, + revert_error: Some(e.to_string()), + n_reverted_steps, + }) + } + } + } } } @@ -182,7 +233,7 @@ impl ExecutionEntryPoint { .ok_or(TransactionError::EntryPointNotFound) } - fn build_call_info_deprecated( + fn build_call_info_deprecated( &self, previous_cairo_usage: ExecutionResources, resources_manager: &ExecutionResourcesManager, @@ -191,10 +242,7 @@ impl ExecutionEntryPoint { l2_to_l1_messages: Vec, internal_calls: Vec, retdata: Vec, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let execution_resources = &resources_manager.cairo_usage - &previous_cairo_usage; Ok(CallInfo { @@ -218,7 +266,7 @@ impl ExecutionEntryPoint { }) } - fn build_call_info( + fn build_call_info( &self, previous_cairo_usage: ExecutionResources, resources_manager: &ExecutionResourcesManager, @@ -227,10 +275,7 @@ impl ExecutionEntryPoint { l2_to_l1_messages: Vec, internal_calls: Vec, call_result: CallResult, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let execution_resources = &resources_manager.cairo_usage - &previous_cairo_usage; Ok(CallInfo { @@ -259,10 +304,7 @@ impl ExecutionEntryPoint { } /// Returns the hash of the executed contract class. - fn get_code_class_hash( - &self, - state: &mut S, - ) -> Result<[u8; 32], TransactionError> { + fn get_code_class_hash(&self, state: &mut S) -> Result<[u8; 32], TransactionError> { if self.class_hash.is_some() { match self.call_type { CallType::Delegate => return Ok(self.class_hash.unwrap()), @@ -283,18 +325,15 @@ impl ExecutionEntryPoint { get_deployed_address_class_hash_at_address(state, &code_address.unwrap()) } - fn _execute_version0_class( + fn _execute_version0_class( &self, - state: &mut T, + state: &mut CachedState, resources_manager: &mut ExecutionResourcesManager, block_context: &BlockContext, tx_execution_context: &mut TransactionExecutionContext, contract_class: Box, class_hash: [u8; 32], - ) -> Result - where - T: State + StateReader, - { + ) -> Result { let previous_cairo_usage = resources_manager.cairo_usage.clone(); // fetch selected entry point let entry_point = self.get_selected_entry_point_v0(&contract_class, class_hash)?; @@ -309,7 +348,7 @@ impl ExecutionEntryPoint { // prepare OS context //let os_context = runner.prepare_os_context(); let os_context = - StarknetRunner::>::prepare_os_context_cairo0( + StarknetRunner::>::prepare_os_context_cairo0( &cairo_runner, &mut vm, ); @@ -380,7 +419,7 @@ impl ExecutionEntryPoint { let retdata = runner.get_return_values()?; - self.build_call_info_deprecated::( + self.build_call_info_deprecated::( previous_cairo_usage, resources_manager, runner.hint_processor.syscall_handler.starknet_storage_state, @@ -391,19 +430,16 @@ impl ExecutionEntryPoint { ) } - fn _execute( + fn _execute( &self, - state: &mut T, + state: &mut CachedState, resources_manager: &mut ExecutionResourcesManager, block_context: &BlockContext, tx_execution_context: &mut TransactionExecutionContext, contract_class: Box, class_hash: [u8; 32], support_reverted: bool, - ) -> Result - where - T: State + StateReader, - { + ) -> Result { let previous_cairo_usage = resources_manager.cairo_usage.clone(); // fetch selected entry point @@ -422,7 +458,7 @@ impl ExecutionEntryPoint { )?; validate_contract_deployed(state, &self.contract_address)?; // prepare OS context - let os_context = StarknetRunner::>::prepare_os_context_cairo1( + let os_context = StarknetRunner::>::prepare_os_context_cairo1( &cairo_runner, &mut vm, self.initial_gas.into(), @@ -499,6 +535,10 @@ impl ExecutionEntryPoint { Some(program.data_len() + program_extra_data.len()), )?; + runner + .vm + .mark_address_range_as_accessed(core_program_end_ptr, program_extra_data.len())?; + runner.validate_and_process_os_context(os_context)?; // When execution starts the stack holds entry_points_args + [ret_fp, ret_pc]. @@ -529,7 +569,7 @@ impl ExecutionEntryPoint { resources_manager.cairo_usage += &runner.get_execution_resources()?; let call_result = runner.get_call_result(self.initial_gas)?; - self.build_call_info::( + self.build_call_info::( previous_cairo_usage, resources_manager, runner.hint_processor.syscall_handler.starknet_storage_state, diff --git a/src/execution/gas_usage.rs b/src/execution/gas_usage.rs index ecffe083b..b61419c48 100644 --- a/src/execution/gas_usage.rs +++ b/src/execution/gas_usage.rs @@ -2,16 +2,21 @@ use crate::definitions::constants::*; use crate::execution::L2toL1MessageInfo; use crate::services::eth_definitions::eth_gas_constants::*; -/// Returns an estimation of the L1 gas amount that will be used (by StarkNet's update state and -/// the verifier) following the addition of a transaction with the given parameters to a batch; -/// e.g., a message from L2 to L1 is followed by a storage write operation in StarkNet L1 contract -/// which requires gas. -/// Arguments: -/// l1_handler_payload_size should be an int if and only if we calculate the gas usage of an -/// InternalInvokeFunction of type L1 handler. Otherwise the payload size is irrelevant, and should -/// be None. -/// n_deployments is the number of the contracts deployed by the transaction. - +/// Estimates L1 gas usage by Starknet's update state and the verifier +/// +/// For information about the fee calculation visit the [starknet documentation](https://docs.starknet.io/documentation/architecture_and_concepts/Fees/fee-mechanism/). +/// +/// # Parameters: +/// - `l2_to_l1_messages`: A vector of [`L2toL1MessageInfo`] objects representing the messages from L2 to L1. +/// - `n_modified_contracts`: The number of contracts modified by the transaction. +/// - `n_storage_changes`: The number of storage changes made by the transaction. +/// - `l1_handler_payload_size`: The payload size of the L1 to L2 message if and only if the gas usage is being +/// calculated for an InvokeFunction of type L1 handler. Otherwise, it should be `None`. +/// - `n_deployments`: The number of contracts deployed by the transaction. +/// +/// # Returns: +/// +/// The estimation of L1 gas usage as a `usize` value. pub fn calculate_tx_gas_usage( l2_to_l1_messages: Vec, n_modified_contracts: usize, @@ -66,10 +71,15 @@ fn starknet_gas_usage( + l1_log_emissions_cost } -/// Returns the number of felts added to the output messages segment as a result of adding -/// a transaction with the given parameters to a batch. Note that constant cells - such as the one -/// that holds the segment size - are not counted. - +/// Calculates the amount of `felt252` added to the output message's segment by the given messages. +/// +/// # Parameters: +/// - `l2_to_l1_messages`: A slice of [`L2toL1MessageInfo`] objects representing the messages from L2 to L1. +/// - `l1_handler_payload_size`: The payload size of the L1 to L2 message if and only if the gas usage is being +/// calculated for an `InvokeFunction` of type L1 handler. Otherwise, it should be `None`. +/// +/// # Returns: +/// The length of the message segment. pub fn get_message_segment_lenght( l2_to_l1_messages: &[L2toL1MessageInfo], l1_handler_payload_size: Option, @@ -84,12 +94,17 @@ pub fn get_message_segment_lenght( } } -/// Returns the number of felts added to the output data availability segment as a result of adding -/// a transaction to a batch. Note that constant cells - such as the one that holds the number of -/// modified contracts - are not counted. -/// This segment consists of deployment info (of contracts deployed by the transaction) and -/// storage updates. - +/// Calculates the amount of `felt252` added to the output message's segment by the given operations. +/// +/// # Parameters: +/// +/// - `n_modified_contracts`: The number of contracts modified by the transaction. +/// - `n_storage_changes`: The number of storage changes made by the transaction. +/// - `n_deployments`: The number of contracts deployed by the transaction. +/// +/// # Returns: +/// +/// The on-chain data segment length pub fn get_onchain_data_segment_length( n_modified_contracts: usize, n_storage_changes: usize, @@ -98,8 +113,16 @@ pub fn get_onchain_data_segment_length( n_modified_contracts * 2 + n_storage_changes * 2 + n_deployments * DEPLOYMENT_INFO_SIZE } -/// Returns the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given +/// Calculates the cost of ConsumedMessageToL2 event emissions caused by an L1 handler with the given /// payload size. +/// +/// # Parameters: +/// - `l1_handler_payload_size`: The payload size of the L1 to L2 message if and only if the gas usage is being +/// calculated for an InvokeFunction of type L1 handler. Otherwise, it should be `None`. +/// +/// # Returns: +/// +/// The cost of ConsumedMessageToL2 event emissions. pub fn get_consumed_message_to_l2_emissions_cost(l1_handler: Option) -> usize { match l1_handler { None => 0, @@ -110,7 +133,14 @@ pub fn get_consumed_message_to_l2_emissions_cost(l1_handler: Option) -> u } } -/// Returns the cost of LogMessageToL1 event emissions caused by the given messages. +/// Calculates the cost of LogMessageToL1 event emissions caused by the given messages. +/// +/// # Parameters: +/// - `l2_to_l1_messages`: A slice of [`L2toL1MessageInfo`] objects representing the messages from L2 to L1. +/// +/// # Returns: +/// +/// The cost of LogMessageToL1 event emissions. pub fn get_log_message_to_l1_emissions_cost(l2_to_l1_messages: &[L2toL1MessageInfo]) -> usize { l2_to_l1_messages.iter().fold(0, |acc, msg| { acc + get_event_emission_cost( @@ -120,6 +150,15 @@ pub fn get_log_message_to_l1_emissions_cost(l2_to_l1_messages: &[L2toL1MessageIn }) } +/// Calculates the cost of event emissions. +/// +/// # Parameters: +/// - `topics`: The number of topics in the event. +/// - `l1_handler_payload_size`: The payload size of the L1 to L2 message. +/// +/// # Returns: +/// +/// The cost of event emissions. pub fn get_event_emission_cost(topics: usize, l1_handler_payload_size: usize) -> usize { GAS_PER_LOG + (topics + N_DEFAULT_TOPICS) * GAS_PER_LOG_TOPIC diff --git a/src/execution/mod.rs b/src/execution/mod.rs index bb959088b..a86df2146 100644 --- a/src/execution/mod.rs +++ b/src/execution/mod.rs @@ -2,6 +2,8 @@ pub mod execution_entry_point; pub mod gas_usage; pub mod os_usage; +use crate::definitions::constants::QUERY_VERSION_BASE; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::{ definitions::{ block_context::StarknetChainId, constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, @@ -19,7 +21,6 @@ use cairo_vm::{ }; use getset::Getters; use num_traits::{ToPrimitive, Zero}; -use starknet_contract_class::EntryPointType; use std::collections::{HashMap, HashSet}; #[derive(Debug, Clone, PartialEq, Eq)] @@ -313,6 +314,12 @@ impl TransactionExecutionContext { n_steps: u64, version: Felt252, ) -> Self { + let nonce = if version == 0.into() || version == *QUERY_VERSION_BASE { + 0.into() + } else { + nonce + }; + TransactionExecutionContext { n_emitted_events: 0, account_contract_address, @@ -427,6 +434,7 @@ impl TxInfoStruct { pub struct TransactionExecutionInfo { pub validate_info: Option, pub call_info: Option, + pub revert_error: Option, pub fee_transfer_info: Option, pub actual_fee: u128, pub actual_resources: HashMap, @@ -437,6 +445,7 @@ impl TransactionExecutionInfo { pub fn new( validate_info: Option, call_info: Option, + revert_error: Option, fee_transfer_info: Option, actual_fee: u128, actual_resources: HashMap, @@ -445,6 +454,7 @@ impl TransactionExecutionInfo { TransactionExecutionInfo { validate_info, call_info, + revert_error, fee_transfer_info, actual_fee, actual_resources, @@ -483,6 +493,7 @@ impl TransactionExecutionInfo { TransactionExecutionInfo { validate_info, call_info: execute_call_info, + revert_error: None, fee_transfer_info, actual_fee: 0, actual_resources: HashMap::new(), @@ -493,12 +504,14 @@ impl TransactionExecutionInfo { pub fn new_without_fee_info( validate_info: Option, call_info: Option, + revert_error: Option, actual_resources: HashMap, tx_type: Option, ) -> Self { TransactionExecutionInfo { validate_info, call_info, + revert_error, fee_transfer_info: None, actual_fee: 0, actual_resources, diff --git a/src/hash_utils.rs b/src/hash_utils.rs index c1e8223ad..034646546 100644 --- a/src/hash_utils.rs +++ b/src/hash_utils.rs @@ -1,3 +1,4 @@ +use crate::core::errors::hash_errors::HashError; use crate::{syscalls::syscall_handler_errors::SyscallHandlerError, utils::Address}; use cairo_vm::felt::Felt252; use num_integer::Integer; @@ -5,6 +6,54 @@ use num_traits::Pow; use starknet_crypto::{pedersen_hash, FieldElement}; use std::vec; +/// Computes the contract address. +/// +/// It is calculated using the following formula: +/// ```text +/// contract_address := pedersen( +/// “STARKNET_CONTRACT_ADDRESS”, +/// caller_address, +/// salt, +/// class_hash, +/// pedersen(constructor_calldata)) +///``` +/// +/// # Arguments +/// +/// * `salt` - Part of the deploy transaction +/// * `class_hash` - The hash value of the contract class. +/// * `constructor_calldata` - A slice of `Felt252` elements representing the constructor calldata. +/// * `deployer_address` - The address of the deployer/caller of the contract. +/// +/// # Returns +/// +/// Returns a `Result` containing the computed contract address. +/// If any errors occur during the hash computation or other operations, an `Err` variant containing +/// a `SyscallHandlerError` is returned. +/// +/// # Examples +/// +/// ``` +/// use starknet_in_rust::{hash_utils::calculate_contract_address, utils::Address, Felt252}; +/// +/// let salt = Felt252::from(123_u16); +/// let class_hash = Felt252::from(456_u16); +/// let constructor_calldata = vec![ +/// Felt252::from(10_u16), +/// Felt252::from(20_u16), +/// Felt252::from(30_u16), +/// ]; +/// let deployer_address = Address(Felt252::from(789_u16)); +/// +/// match calculate_contract_address(&salt, &class_hash, &constructor_calldata, deployer_address) { +/// Ok(contract_address) => { +/// println!("Computed contract address: {:?}", contract_address); +/// } +/// Err(err) => { +/// println!("Error occurred: {:?}", err); +/// } +/// } +/// ``` pub fn calculate_contract_address( salt: &Felt252, class_hash: &Felt252, @@ -28,14 +77,47 @@ pub fn calculate_contract_address( Ok(raw_address.mod_floor(&l2_address_upper_bound)) } -pub(crate) fn compute_hash_on_elements(vec: &[Felt252]) -> Result { +/// Computes Pedersen hash for a slice of `Felt252` elements. +/// +/// # Arguments +/// +/// * `vec` - A slice of `Felt252` elements representing the input vector. +/// +/// # Returns +/// +/// Returns a `Result` containing the computed Pedersen hash value as `Felt252`. +/// If any errors occur during the conversion or hash computation, an `Err` variant containing a `SyscallHandlerError` +/// is returned. +/// +/// # Examples +/// +/// ``` +/// use starknet_in_rust::Felt252; +/// use starknet_in_rust::hash_utils::compute_hash_on_elements; +/// +/// let input_vec = vec![ +/// Felt252::from(10_u16), +/// Felt252::from(20_u16), +/// Felt252::from(30_u16), +/// ]; +/// +/// match compute_hash_on_elements(&input_vec) { +/// Ok(hash_value) => { +/// println!("Computed hash value: {:?}", hash_value); +/// } +/// Err(err) => { +/// println!("Error occurred: {:?}", err); +/// } +/// } +/// ``` +pub fn compute_hash_on_elements(vec: &[Felt252]) -> Result { let mut felt_vec = vec .iter() .map(|num| { FieldElement::from_dec_str(&num.to_str_radix(10)) - .map_err(|_| SyscallHandlerError::FailToComputeHash) + .map_err(|e| HashError::FailedToComputeHash(e.to_string())) }) - .collect::, SyscallHandlerError>>()?; + .collect::, HashError>>()?; felt_vec.push(FieldElement::from(felt_vec.len())); felt_vec.insert(0, FieldElement::from(0_u16)); @@ -43,7 +125,9 @@ pub(crate) fn compute_hash_on_elements(vec: &[Felt252]) -> Result( skip_execute: bool, skip_fee_transfer: bool, ) -> Result, TransactionError> { - let mut cache_state = CachedState::new(state, None, Some(HashMap::new())); + let mut cache_state = CachedState::new(Arc::new(state), None, Some(HashMap::new())); let mut result = Vec::with_capacity(transactions.len()); for transaction in transactions { let tx_for_simulation = @@ -78,7 +81,7 @@ where T: StateReader, { // This is used as a copy of the original state, we can update this cached state freely. - let mut cached_state = CachedState::::new(state, None, None); + let mut cached_state = CachedState::::new(Arc::new(state), None, None); let mut result = Vec::with_capacity(transactions.len()); for transaction in transactions { @@ -101,12 +104,13 @@ where Ok(result) } -pub fn call_contract( +pub fn call_contract( contract_address: Felt252, entrypoint_selector: Felt252, calldata: Vec, - state: &mut T, + state: &mut CachedState, block_context: BlockContext, + caller_address: Address, ) -> Result, TransactionError> { let contract_address = Address(contract_address); let class_hash = state.get_class_hash_at(&contract_address)?; @@ -117,7 +121,6 @@ pub fn call_contract( let signature = vec![]; let max_fee = 1000000000; let initial_gas = 1000000000; - let caller_address = Address(0.into()); let version = 0; let execution_entrypoint = ExecutionEntryPoint::new( @@ -141,14 +144,16 @@ pub fn call_contract( version.into(), ); - let call_info = execution_entrypoint.execute( + let ExecutionResult { call_info, .. } = execution_entrypoint.execute( state, &block_context, &mut ExecutionResourcesManager::default(), &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps, )?; + let call_info = call_info.ok_or(TransactionError::CallInfoIsNone)?; Ok(call_info.retdata) } @@ -162,24 +167,28 @@ where T: StateReader, { // This is used as a copy of the original state, we can update this cached state freely. - let mut cached_state = CachedState::::new(state, None, None); + let mut cached_state = CachedState::::new(Arc::new(state), None, None); // Check if the contract is deployed. cached_state.get_class_hash_at(l1_handler.contract_address())?; // execute the transaction with the fake state. let transaction_result = l1_handler.execute(&mut cached_state, block_context, 1_000_000)?; + let tx_fee = calculate_tx_fee( + &transaction_result.actual_resources, + block_context.starknet_os_config.gas_price, + block_context, + )?; if let Some(gas_usage) = transaction_result.actual_resources.get("l1_gas_usage") { - let actual_fee = transaction_result.actual_fee; - Ok((actual_fee, *gas_usage)) + Ok((tx_fee, *gas_usage)) } else { Err(TransactionError::ResourcesError) } } -pub fn execute_transaction( +pub fn execute_transaction( tx: Transaction, - state: &mut T, + state: &mut CachedState, block_context: BlockContext, remaining_gas: u128, ) -> Result { @@ -189,11 +198,11 @@ pub fn execute_transaction( #[cfg(test)] mod test { use std::collections::HashMap; - use std::fs::File; - use std::io::BufReader; use std::path::PathBuf; + use std::sync::Arc; - use crate::core::contract_address::compute_deprecated_class_hash; + use crate::core::contract_address::{compute_deprecated_class_hash, compute_sierra_class_hash}; + use crate::definitions::constants::INITIAL_GAS_COST; use crate::definitions::{ block_context::StarknetChainId, constants::{ @@ -206,6 +215,7 @@ mod test { use crate::estimate_message_fee; use crate::hash_utils::calculate_contract_address; use crate::services::api::contract_classes::deprecated_contract_class::ContractClass; + use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::state::state_api::State; use crate::testing::{ create_account_tx_test_state, TEST_ACCOUNT_CONTRACT_ADDRESS, TEST_CONTRACT_ADDRESS, @@ -219,7 +229,6 @@ mod test { use cairo_lang_starknet::contract_class::ContractClass as SierraContractClass; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::{Num, One, Zero}; - use starknet_contract_class::EntryPointType; use crate::{ call_contract, @@ -236,9 +245,9 @@ mod test { lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(BufReader::new(File::open( + static ref CONTRACT_CLASS: ContractClass = ContractClass::from_path( "starknet_programs/account_without_validation.json", - ).unwrap())) + ) .unwrap(); static ref CLASS_HASH: Felt252 = compute_deprecated_class_hash(&CONTRACT_CLASS).unwrap(); static ref CLASS_HASH_BYTES: [u8; 32] = CLASS_HASH.clone().to_be_bytes(); @@ -255,11 +264,10 @@ mod test { #[test] fn estimate_fee_test() { - let contract_class: ContractClass = - ContractClass::try_from(PathBuf::from(TEST_CONTRACT_PATH)).unwrap(); + let contract_class: ContractClass = ContractClass::from_path(TEST_CONTRACT_PATH).unwrap(); let entrypoints = contract_class.entry_points_by_type; - let entrypoint_selector = &entrypoints.get(&EntryPointType::External).unwrap()[0].selector; + let entrypoint_selector = entrypoints.get(&EntryPointType::External).unwrap()[0].selector(); let (block_context, state) = create_account_tx_test_state().unwrap(); @@ -274,13 +282,12 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), Some(0.into()), - None, ) .unwrap(); let transaction = Transaction::InvokeFunction(invoke_function); let estimated_fee = estimate_fee(&[transaction], state, &block_context).unwrap(); - assert_eq!(estimated_fee[0], (12, 0)); + assert_eq!(estimated_fee[0], (30, 0)); } #[test] @@ -309,7 +316,7 @@ mod test { .address_to_nonce_mut() .insert(address.clone(), nonce); - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let calldata = [1.into(), 1.into(), 10.into()].to_vec(); let retdata = call_contract( @@ -318,6 +325,7 @@ mod test { calldata, &mut state, BlockContext::default(), + Address(0.into()), ) .unwrap(); @@ -348,8 +356,7 @@ mod test { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/l1l2.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/l1l2.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -361,22 +368,17 @@ mod test { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes let contract_classes = HashMap::from([(class_hash, contract_class)]); state.set_contract_classes(contract_classes).unwrap(); let mut block_context = BlockContext::default(); - block_context.cairo_resource_fee_weights = HashMap::from([ - (String::from("l1_gas_usage"), 0.into()), - (String::from("pedersen_builtin"), 16.into()), - (String::from("range_check_builtin"), 70.into()), - ]); block_context.starknet_os_config.gas_price = 1; let estimated_fee = estimate_message_fee(&l1_handler, state, &block_context).unwrap(); - assert_eq!(estimated_fee, (0, 18471)); + assert_eq!(estimated_fee, (18484, 18471)); } #[test] @@ -404,7 +406,7 @@ mod test { .address_to_nonce_mut() .insert(address.clone(), nonce); - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let calldata = [1.into(), 1.into(), 10.into()].to_vec(); let invoke = InvokeFunction::new( @@ -416,7 +418,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), None, - None, ) .unwrap(); @@ -440,7 +441,7 @@ mod test { #[test] fn test_skip_execute_flag() { let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // ------------ contract data -------------------- // hack store account contract @@ -507,7 +508,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), Some(1.into()), - None, ) .unwrap(), ); @@ -522,7 +522,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), Some(2.into()), - None, ) .unwrap(), ); @@ -537,7 +536,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), Some(3.into()), - None, ) .unwrap(), ); @@ -568,7 +566,7 @@ mod test { #[test] fn test_skip_execute_and_validate_flags() { let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // ------------ contract data -------------------- // hack store account contract @@ -635,7 +633,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), Some(1.into()), - None, ) .unwrap(), ); @@ -660,7 +657,7 @@ mod test { #[test] fn test_simulate_deploy() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -679,7 +676,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), 0.into(), - None, ) .unwrap(), ); @@ -698,7 +694,7 @@ mod test { #[test] fn test_simulate_declare() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let state = CachedState::new(state_reader, Some(Default::default()), None); let block_context = &Default::default(); @@ -715,7 +711,6 @@ mod test { 0.into(), vec![], Felt252::zero(), - None, ) .expect("couldn't create transaction"), ); @@ -734,7 +729,7 @@ mod test { #[test] fn test_simulate_invoke() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -753,7 +748,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), 0.into(), - None, ) .unwrap(); @@ -776,7 +770,6 @@ mod test { SIGNATURE.clone(), StarknetChainId::TestNet.to_felt(), Some(Felt252::zero()), - None, ) .unwrap(), ); @@ -795,7 +788,7 @@ mod test { #[test] fn test_simulate_deploy_account() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -815,7 +808,6 @@ mod test { SIGNATURE.clone(), SALT.clone(), StarknetChainId::TestNet.to_felt(), - None, ) .unwrap(), ); @@ -837,17 +829,20 @@ mod test { let sierra_contract_class: SierraContractClass = serde_json::from_slice(program_data).unwrap(); + let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); + DeclareV2 { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), tx_type: TransactionType::Declare, validate_entry_point_selector: VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(), version: 1.into(), - max_fee: 2, + max_fee: INITIAL_GAS_COST, signature: vec![], nonce: 0.into(), hash_value: 0.into(), compiled_class_hash: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), sierra_contract_class, + sierra_class_hash, casm_class: Default::default(), skip_execute: false, skip_fee_transfer: false, @@ -899,8 +894,7 @@ mod test { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/l1l2.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/l1l2.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -912,7 +906,7 @@ mod test { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -922,11 +916,6 @@ mod test { .unwrap(); let mut block_context = BlockContext::default(); - block_context.cairo_resource_fee_weights = HashMap::from([ - (String::from("l1_gas_usage"), 0.into()), - (String::from("pedersen_builtin"), 16.into()), - (String::from("range_check_builtin"), 70.into()), - ]); block_context.starknet_os_config.gas_price = 1; simulate_transaction( @@ -943,7 +932,7 @@ mod test { #[test] fn test_deploy_and_invoke_simulation() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); state @@ -963,7 +952,6 @@ mod test { vec![], StarknetChainId::TestNet.to_felt(), 0.into(), - None, ) .unwrap(), ); @@ -985,7 +973,6 @@ mod test { SIGNATURE.clone(), StarknetChainId::TestNet.to_felt(), Some(Felt252::zero()), - None, ) .unwrap(), ); @@ -1006,4 +993,26 @@ mod test { [(0, 1224), (0, 0)] ); } + + #[test] + fn test_declare_v2_with_invalid_compiled_class_hash() { + let (block_context, mut state) = create_account_tx_test_state().unwrap(); + let mut declare_v2 = declarev2_tx(); + let real_casm_class_hash = declare_v2.compiled_class_hash; + let wrong_casm_class_hash = Felt252::from(1); + declare_v2.compiled_class_hash = wrong_casm_class_hash.clone(); + let declare_tx = Transaction::DeclareV2(Box::new(declare_v2)); + + let err = declare_tx + .execute(&mut state, &block_context, INITIAL_GAS_COST) + .unwrap_err(); + + assert_eq!( + err.to_string(), + format!( + "Invalid compiled class, expected class hash: {}, but received: {}", + real_casm_class_hash, wrong_casm_class_hash + ) + ); + } } diff --git a/src/parser_errors.rs b/src/parser_errors.rs index e5aadcbcb..552c8c42d 100644 --- a/src/parser_errors.rs +++ b/src/parser_errors.rs @@ -1,9 +1,9 @@ +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::{ core::errors::{contract_address_errors::ContractAddressError, state_errors::StateError}, syscalls::syscall_handler_errors::SyscallHandlerError, transaction::error::TransactionError, }; -use starknet_contract_class::EntryPointType; use thiserror::Error; #[derive(Debug, Error)] diff --git a/src/runner/mod.rs b/src/runner/mod.rs index 729ade949..4788a49f5 100644 --- a/src/runner/mod.rs +++ b/src/runner/mod.rs @@ -19,6 +19,10 @@ use cairo_vm::{ use num_traits::{ToPrimitive, Zero}; use std::{borrow::Cow, collections::HashMap}; +/// Returns a vector that holds the names of the builtins that a contract class uses +/// ## Parameters +/// - contract_class: A casm Contract Class generated by cairo 1 compiler of the contract to be executed. +/// - entrypoint_offset: offset of the function that will be executed. pub fn get_casm_contract_builtins( contract_class: &CasmContractClass, entrypoint_offset: usize, @@ -51,6 +55,7 @@ pub fn get_casm_contract_builtins( .collect() } +/// Creates a wrapper over CairoRunner, the CairoVM and a Hint Processor pub(crate) struct StarknetRunner where H: HintProcessor + HintProcessorPostRun, @@ -72,6 +77,11 @@ where } } + /// Executes the entry point in the cairo vm. + /// ## Parameters + /// - entrypoint: the offset of the function that will be executed. + /// - args: arguments of the function. + /// - program_segment_size: the size of the segment that stores the program pub fn run_from_entrypoint( &mut self, entrypoint: usize, @@ -92,6 +102,11 @@ where Ok(()) } + /// Creates the data structures required to execute the call on the cairo vm according to the entry_point_offset provided + /// ## Parameters: + /// - contract_class: A casm Contract Class generated by cairo 1 compiler of the contract to be executed. + /// - entrypoint_offset: offset of the function that will be executed. + /// - args: paramenters of the entry point that will be executed. #[allow(dead_code)] pub fn run_from_cairo1_entrypoint( &mut self, @@ -147,10 +162,12 @@ where Ok(()) } + /// Returns and ExecutionResources struct that contains the resources used by the contract being execute. pub fn get_execution_resources(&self) -> Result { Ok(self.cairo_runner.get_execution_resources(&self.vm)?) } + /// Return a vector that holds the data and pointers used to build the CallResult pub fn get_return_values(&self) -> Result, TransactionError> { let ret_data = self.vm.get_return_values(2)?; @@ -171,6 +188,9 @@ where Ok(ret_data.into_iter().map(Cow::into_owned).collect()) } + /// returns a CallResult that holds the gas consumed, if the execution was succesfull and the retdata of the call. + /// ## Parameters + /// - initial_gas: The amount of gas the caller has available. pub fn get_call_result(&self, initial_gas: u128) -> Result { let return_values = self.vm.get_return_values(5)?; let remaining_gas = return_values[0] @@ -201,6 +221,11 @@ where }) } + /// Returns a vector of pointers to the initial stack of the builtins invoked by the contract besides the gas and the syscall_segment pointer. + /// ## Parameters + /// - CairoRunner: An instance of a cairo runner that will execute the contract. + /// - vm: An instance of the cairo virutal machine that will execute the contract. + /// - gas: The amount of gas that the caller has available. pub fn prepare_os_context_cairo1( cairo_runner: &CairoRunner, vm: &mut VirtualMachine, @@ -234,6 +259,10 @@ where os_context } + /// Returns a vector of pointers to the initial stack of the builtins invoked by the contract + /// ## Parameters + /// - CairoRunner: An instance of a cairo runner that will execute the contract. + /// - vm: An instance of the cairo virutal machine that will execute the contract. pub fn prepare_os_context_cairo0( cairo_runner: &CairoRunner, vm: &mut VirtualMachine, @@ -260,6 +289,9 @@ where } /// Returns the base and stop ptr of the OS-designated segment that starts at ptr_offset. + /// ## Parameters + /// - ptr_offset: A pointer that points where the base pointer is stored in memory. + /// - os_context: The Os context used to fetch the stop pointer segment from memory. pub(crate) fn get_os_segment_ptr_range( &self, ptr_offset: usize, @@ -357,6 +389,8 @@ where Ok(()) } + /// Validates and processes an OS context that was returned by a transaction. + /// Returns the syscall processor object containing the accumulated syscall information. pub(crate) fn validate_and_process_os_context_for_version0_class( &mut self, initial_os_context: Vec, diff --git a/src/serde_structs/mod.rs b/src/serde_structs/mod.rs index 47628e9c3..db4adb862 100644 --- a/src/serde_structs/mod.rs +++ b/src/serde_structs/mod.rs @@ -1,6 +1,6 @@ +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use serde::Deserialize; use serde_json::Value; -use starknet_contract_class::EntryPointType; use std::{collections::HashMap, fs::File, path::PathBuf}; #[allow(dead_code)] diff --git a/src/services/api/contract_class_errors.rs b/src/services/api/contract_class_errors.rs index b22b749bb..fff199688 100644 --- a/src/services/api/contract_class_errors.rs +++ b/src/services/api/contract_class_errors.rs @@ -1,4 +1,4 @@ -use starknet_contract_class::ContractEntryPoint; +use crate::services::api::contract_classes::deprecated_contract_class::ContractEntryPoint; use thiserror::Error; #[derive(Debug, PartialEq, Eq, Error)] diff --git a/src/services/api/contract_classes/deprecated_contract_class.rs b/src/services/api/contract_classes/deprecated_contract_class.rs index 277380eaf..9f475c42e 100644 --- a/src/services/api/contract_classes/deprecated_contract_class.rs +++ b/src/services/api/contract_classes/deprecated_contract_class.rs @@ -1,13 +1,71 @@ +use crate::core::contract_address::compute_hinted_class_hash; use crate::services::api::contract_class_errors::ContractClassError; -use cairo_vm::felt::Felt252; +use cairo_vm::felt::{Felt252, PRIME_STR}; +use cairo_vm::serde::deserialize_program::{ + deserialize_array_of_bigint_hex, Attribute, BuiltinName, HintParams, Identifier, + ReferenceManager, +}; +use cairo_vm::types::relocatable::MaybeRelocatable; use cairo_vm::types::{errors::program_errors::ProgramError, program::Program}; -use getset::Getters; +use core::str::FromStr; +use getset::{CopyGetters, Getters}; use serde_json::Value; -use starknet_api::deprecated_contract_class::EntryPoint; -pub use starknet_contract_class::to_cairo_runner_program; -use starknet_contract_class::AbiType; -use starknet_contract_class::{ContractEntryPoint, EntryPointType}; -use std::{collections::HashMap, fs::File, io::BufReader, path::PathBuf}; +use starknet_api::deprecated_contract_class::{ContractClassAbiEntry, EntryPoint}; +use std::collections::HashMap; +use std::path::Path; + +pub type AbiType = Vec; + +// ------------------------------- +// Entry Point types +// ------------------------------- + +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum EntryPointType { + External, + L1Handler, + Constructor, +} + +#[derive(Clone, CopyGetters, Debug, Default, Eq, Getters, Hash, PartialEq)] +pub struct ContractEntryPoint { + #[getset(get = "pub")] + selector: Felt252, + #[getset(get_copy = "pub")] + offset: usize, +} + +impl ContractEntryPoint { + pub fn new(selector: Felt252, offset: usize) -> ContractEntryPoint { + ContractEntryPoint { selector, offset } + } +} + +// ------------------------------- +// From traits +// ------------------------------- + +impl From<&ContractEntryPoint> for Vec { + fn from(entry_point: &ContractEntryPoint) -> Self { + vec![ + MaybeRelocatable::from(entry_point.selector.clone()), + MaybeRelocatable::from(entry_point.offset), + ] + } +} + +impl From for EntryPointType { + fn from(entry_type: starknet_api::deprecated_contract_class::EntryPointType) -> Self { + type ApiEPT = starknet_api::deprecated_contract_class::EntryPointType; + type StarknetEPT = EntryPointType; + + match entry_type { + ApiEPT::Constructor => StarknetEPT::Constructor, + ApiEPT::External => StarknetEPT::External, + ApiEPT::L1Handler => StarknetEPT::L1Handler, + } + } +} // ------------------------------- // Contract Class @@ -18,7 +76,7 @@ pub struct ContractClass { #[getset(get = "pub")] pub(crate) program: Program, #[getset(get = "pub")] - pub(crate) program_json: serde_json::Value, + pub(crate) hinted_class_hash: Felt252, #[getset(get = "pub")] pub(crate) entry_points_by_type: HashMap>, #[getset(get = "pub")] @@ -33,39 +91,81 @@ impl ContractClass { abi: Option, ) -> Result { for entry_points in entry_points_by_type.values() { - let mut index = 1; - while let Some(entry_point) = entry_points.get(index) { - if entry_point.selector() > entry_points[index - 1].selector() { + for i in 1..entry_points.len() { + if entry_points[i - 1].selector() > entry_points[i].selector() { + return Err(ContractClassError::EntrypointError(entry_points.clone())); + } + } + } + let hinted_class_hash = compute_hinted_class_hash(&program_json).unwrap(); + Ok(ContractClass { + hinted_class_hash, + program, + entry_points_by_type, + abi, + }) + } + + pub fn new_with_hinted_class_hash( + hinted_class_hash: Felt252, + program: Program, + entry_points_by_type: HashMap>, + abi: Option, + ) -> Result { + for entry_points in entry_points_by_type.values() { + for i in 1..entry_points.len() { + if entry_points[i - 1].selector() > entry_points[i].selector() { return Err(ContractClassError::EntrypointError(entry_points.clone())); } - index += 1; } } Ok(ContractClass { - program_json, + hinted_class_hash, program, entry_points_by_type, abi, }) } + + /// Parses a [`ContractClass`] from a compiled Cairo 0 program's JSON + /// at the given file path. + pub fn from_path(path: F) -> Result + where + F: AsRef, + { + Self::from_str(std::fs::read_to_string(path)?.as_str()) + } + + /// Parses a [`ContractClass`] from a compiled Cairo 0 program's JSON + /// given by a reader. + pub fn from_reader(mut reader: R) -> Result + where + R: std::io::Read, + { + let mut s = String::new(); + reader.read_to_string(&mut s)?; + Self::from_str(s.as_str()) + } } // ------------------------------- // From traits // ------------------------------- -impl TryFrom for ContractClass { - type Error = ProgramError; - - fn try_from( - contract_class: starknet_api::deprecated_contract_class::ContractClass, - ) -> Result { - let program = to_cairo_runner_program(&contract_class.program)?; - let entry_points_by_type = - convert_entry_points(contract_class.clone().entry_points_by_type); - let program_json = serde_json::to_value(&contract_class)?; + +impl FromStr for ContractClass { + type Err = ProgramError; + + /// Parses a [`ContractClass`] from a compiled Cairo 0 program's JSON. + fn from_str(program_json: &str) -> Result { + let contract_class: starknet_api::deprecated_contract_class::ContractClass = + serde_json::from_str(program_json)?; + let program = to_cairo_runner_program(contract_class.program)?; + let entry_points_by_type = convert_entry_points(contract_class.entry_points_by_type); + let hinted_class_hash = + compute_hinted_class_hash(&serde_json::from_str(program_json)?).unwrap(); Ok(ContractClass { - program_json, + hinted_class_hash, program, entry_points_by_type, abi: contract_class.abi, @@ -77,54 +177,14 @@ impl TryFrom for Contrac // Helper Functions // ------------------- -impl TryFrom<&str> for ContractClass { - type Error = ProgramError; - - fn try_from(s: &str) -> Result { - let raw_contract_class: starknet_api::deprecated_contract_class::ContractClass = - serde_json::from_str(s)?; - ContractClass::try_from(raw_contract_class) - } -} - -impl TryFrom for ContractClass { - type Error = ProgramError; - - fn try_from(path: PathBuf) -> Result { - ContractClass::try_from(&path) - } -} - -impl TryFrom<&PathBuf> for ContractClass { - type Error = ProgramError; - - fn try_from(path: &PathBuf) -> Result { - let file = File::open(path)?; - let reader = BufReader::new(file); - let raw_contract_class: starknet_api::deprecated_contract_class::ContractClass = - serde_json::from_reader(reader)?; - ContractClass::try_from(raw_contract_class) - } -} - -impl TryFrom> for ContractClass { - type Error = ProgramError; - - fn try_from(reader: BufReader) -> Result { - let raw_contract_class: starknet_api::deprecated_contract_class::ContractClass = - serde_json::from_reader(reader)?; - ContractClass::try_from(raw_contract_class) - } -} - -fn convert_entry_points( +pub(crate) fn convert_entry_points( entry_points: HashMap>, ) -> HashMap> { let mut converted_entries: HashMap> = HashMap::new(); - for (entry_type, vec) in entry_points { + for (entry_type, entry_points) in entry_points { let en_type = entry_type.into(); - let contracts_entry_points = vec + let contracts_entry_points = entry_points .into_iter() .map(|e| { let selector = Felt252::from_bytes_be(e.selector.0.bytes()); @@ -139,30 +199,54 @@ fn convert_entry_points( converted_entries } +pub(crate) fn to_cairo_runner_program( + program: starknet_api::deprecated_contract_class::Program, +) -> Result { + let identifiers = serde_json::from_value::>(program.identifiers)?; + + if program.prime != *PRIME_STR { + return Err(ProgramError::PrimeDiffers(program.prime.to_string())); + }; + + let error_message_attributes = serde_json::from_value::>(program.attributes) + .unwrap_or(Vec::new()) + .into_iter() + .filter(|attr| attr.name == "error_message") + .collect(); + + let program = Program::new( + serde_json::from_value::>(program.builtins)?, + deserialize_array_of_bigint_hex(program.data)?, + None, + serde_json::from_value::>>(program.hints)?, + serde_json::from_value::(program.reference_manager)?, + identifiers, + error_message_attributes, + None, + )?; + + Ok(program) +} + #[cfg(test)] mod tests { + use crate::core::contract_address::compute_deprecated_class_hash; + use super::*; use cairo_vm::{ felt::{felt_str, PRIME_STR}, serde::deserialize_program::BuiltinName, }; - use std::io::Read; + use starknet_api::deprecated_contract_class::{ + FunctionAbiEntry, FunctionAbiEntryType, FunctionAbiEntryWithType, TypedParameter, + }; #[test] fn deserialize_contract_class() { - let mut serialized = String::new(); - // This specific contract compiles with --no_debug_info - File::open(PathBuf::from("starknet_programs/AccountPreset.json")) - .and_then(|mut f| f.read_to_string(&mut serialized)) + let contract_class = ContractClass::from_path("starknet_programs/AccountPreset.json") .expect("should be able to read file"); - let res = ContractClass::try_from(serialized.as_str()); - - assert!(res.is_ok()); - - let contract_class = res.unwrap(); - // We check only some of the attributes. Ideally we would serialize // and compare with original // TODO: add abi. @@ -201,4 +285,112 @@ mod tests { )] ); } + + #[test] + fn test_compute_class_hash_0x4479c3b883b34f1eafa5065418225d78a11ee7957c371e1b285e4b77afc6dad_try_from( + ) { + let contract_class = ContractClass::from_path("starknet_programs/raw_contract_classes/0x4479c3b883b34f1eafa5065418225d78a11ee7957c371e1b285e4b77afc6dad.json").expect("should be able to read file"); + + assert_eq!( + compute_deprecated_class_hash(&contract_class).unwrap(), + felt_str!( + "4479c3b883b34f1eafa5065418225d78a11ee7957c371e1b285e4b77afc6dad", + 16 + ) + ); + } + + #[test] + fn parse_abi_is_correct() { + // This specific contract compiles with --no_debug_info + let res = ContractClass::from_path("starknet_programs/fibonacci.json"); + let contract_class = res.expect("should be able to read file"); + + let expected_abi = Some(vec![ContractClassAbiEntry::Function( + FunctionAbiEntryWithType { + r#type: FunctionAbiEntryType::Function, + entry: FunctionAbiEntry { + name: "fib".to_string(), + inputs: vec![ + TypedParameter { + name: "first_element".to_string(), + r#type: "felt".to_string(), + }, + TypedParameter { + name: "second_element".to_string(), + r#type: "felt".to_string(), + }, + TypedParameter { + name: "n".to_string(), + r#type: "felt".to_string(), + }, + ], + outputs: vec![TypedParameter { + name: "res".to_string(), + r#type: "felt".to_string(), + }], + }, + }, + )]); + assert_eq!(contract_class.abi, expected_abi); + } + + #[test] + fn parse_without_debug_info() { + // This specific contract compiles with --no_debug_info + let res = ContractClass::from_path("starknet_programs/AccountPreset.json"); + + let contract_class = res.expect("should be able to read file"); + + let program_builtins: Vec = + contract_class.program.iter_builtins().cloned().collect(); + assert_eq!( + program_builtins, + vec![ + BuiltinName::pedersen, + BuiltinName::range_check, + BuiltinName::ecdsa, + BuiltinName::bitwise + ] + ); + assert_eq!( + contract_class + .entry_points_by_type + .get(&EntryPointType::L1Handler) + .unwrap(), + &vec![] + ); + assert_eq!( + contract_class + .entry_points_by_type + .get(&EntryPointType::Constructor) + .unwrap(), + &vec![ContractEntryPoint { + selector: felt_str!( + "1159040026212278395030414237414753050475174923702621880048416706425641521556" + ), + offset: 366 + }] + ); + } + + #[test] + fn parse_without_program_attributes() { + // This specific contract was extracted from: https://testnet.starkscan.co/class/0x068dd0dd8a54ebdaa10563fbe193e6be1e0f7c423c0c3ce1e91c0b682a86b5f9 + let res = ContractClass::from_path( + "starknet_programs/raw_contract_classes/program_without_attributes.json", + ); + + res.expect("should be able to read file"); + } + + #[test] + fn parse_without_program_attributes_2() { + // This specific contract was extracted from: https://testnet.starkscan.co/class/0x071b7f73b5e2b4f81f7cf01d4d1569ccba2921b3fa3170cf11cff3720dfe918e + let res = ContractClass::from_path( + "starknet_programs/raw_contract_classes/program_without_attributes_2.json", + ); + + res.expect("should be able to read file"); + } } diff --git a/src/state/cached_state.rs b/src/state/cached_state.rs index fa3e943f5..53cbc1905 100644 --- a/src/state/cached_state.rs +++ b/src/state/cached_state.rs @@ -8,14 +8,13 @@ use crate::{ compiled_class::CompiledClass, deprecated_contract_class::ContractClass, }, state::StateDiff, - storage::errors::storage_errors::StorageError, utils::{subtract_mappings, to_cache_state_storage_mapping, Address, ClassHash}, }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use cairo_vm::felt::Felt252; use getset::{Getters, MutGetters}; use num_traits::Zero; -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; // K: class_hash V: ContractClass pub type ContractClassCache = HashMap; @@ -25,8 +24,7 @@ pub const UNINITIALIZED_CLASS_HASH: &ClassHash = b"\x00\x00\x00\x00\x00\x00\x00\ #[derive(Default, Clone, Debug, Eq, Getters, MutGetters, PartialEq)] pub struct CachedState { - #[get = "pub"] - pub(crate) state_reader: T, + pub state_reader: Arc, #[getset(get = "pub", get_mut = "pub")] pub(crate) cache: StateCache, #[get = "pub"] @@ -37,7 +35,7 @@ pub struct CachedState { impl CachedState { pub fn new( - state_reader: T, + state_reader: Arc, contract_class_cache: Option, casm_class_cache: Option, ) -> Self { @@ -50,7 +48,7 @@ impl CachedState { } pub fn new_for_testing( - state_reader: T, + state_reader: Arc, contract_classes: Option, cache: StateCache, casm_contract_classes: Option, @@ -83,16 +81,19 @@ impl CachedState { } impl StateReader for CachedState { - fn get_class_hash_at(&mut self, contract_address: &Address) -> Result { + fn get_class_hash_at(&self, contract_address: &Address) -> Result { if self.cache.get_class_hash(contract_address).is_none() { - let class_hash = match self.state_reader.get_class_hash_at(contract_address) { - Ok(x) => x, - Err(StateError::NoneContractState(_)) => [0; 32], - Err(e) => return Err(e), - }; - self.cache - .class_hash_initial_values - .insert(contract_address.clone(), class_hash); + match self.state_reader.get_class_hash_at(contract_address) { + Ok(class_hash) => { + return Ok(class_hash); + } + Err(StateError::NoneContractState(_)) => { + return Ok([0; 32]); + } + Err(e) => { + return Err(e); + } + } } self.cache @@ -101,12 +102,9 @@ impl StateReader for CachedState { .cloned() } - fn get_nonce_at(&mut self, contract_address: &Address) -> Result { + fn get_nonce_at(&self, contract_address: &Address) -> Result { if self.cache.get_nonce(contract_address).is_none() { - let nonce = self.state_reader.get_nonce_at(contract_address)?; - self.cache - .nonce_initial_values - .insert(contract_address.clone(), nonce); + return self.state_reader.get_nonce_at(contract_address); } self.cache .get_nonce(contract_address) @@ -114,22 +112,22 @@ impl StateReader for CachedState { .cloned() } - fn get_storage_at(&mut self, storage_entry: &StorageEntry) -> Result { + fn get_storage_at(&self, storage_entry: &StorageEntry) -> Result { if self.cache.get_storage(storage_entry).is_none() { - let value = match self.state_reader.get_storage_at(storage_entry) { - Ok(x) => x, + match self.state_reader.get_storage_at(storage_entry) { + Ok(storage) => { + return Ok(storage); + } Err( - StateError::Storage(StorageError::ErrorFetchingData) - | StateError::EmptyKeyInStorage + StateError::EmptyKeyInStorage | StateError::NoneStoragLeaf(_) | StateError::NoneStorage(_) | StateError::NoneContractState(_), - ) => Felt252::zero(), - Err(e) => return Err(e), - }; - self.cache - .storage_initial_values - .insert(storage_entry.clone(), value); + ) => return Ok(Felt252::zero()), + Err(e) => { + return Err(e); + } + } } self.cache @@ -139,21 +137,23 @@ impl StateReader for CachedState { } // TODO: check if that the proper way to store it (converting hash to address) - fn get_compiled_class_hash(&mut self, class_hash: &ClassHash) -> Result { - let hash = self.cache.class_hash_to_compiled_class_hash.get(class_hash); - if let Some(hash) = hash { - Ok(*hash) - } else { - let compiled_class_hash = self.state_reader.get_compiled_class_hash(class_hash)?; - let address = Address(Felt252::from_bytes_be(&compiled_class_hash)); - self.cache - .class_hash_initial_values - .insert(address, compiled_class_hash); - Ok(compiled_class_hash) + fn get_compiled_class_hash(&self, class_hash: &ClassHash) -> Result { + if self + .cache + .class_hash_to_compiled_class_hash + .get(class_hash) + .is_none() + { + return self.state_reader.get_compiled_class_hash(class_hash); } + self.cache + .class_hash_to_compiled_class_hash + .get(class_hash) + .ok_or_else(|| StateError::NoneCompiledClass(*class_hash)) + .cloned() } - fn get_contract_class(&mut self, class_hash: &ClassHash) -> Result { + fn get_contract_class(&self, class_hash: &ClassHash) -> Result { // This method can receive both compiled_class_hash & class_hash and return both casm and deprecated contract classes //, which can be on the cache or on the state_reader, different cases will be described below: if class_hash == UNINITIALIZED_CLASS_HASH { @@ -190,20 +190,7 @@ impl StateReader for CachedState { } } // II: FETCHING FROM STATE_READER - let contract = self.state_reader.get_contract_class(class_hash)?; - match contract { - CompiledClass::Casm(ref class) => { - // We call this method instead of state_reader's in order to update the cache's class_hash_initial_values map - let compiled_class_hash = self.get_compiled_class_hash(class_hash)?; - self.casm_contract_classes - .as_mut() - .and_then(|m| m.insert(compiled_class_hash, *class.clone())); - } - CompiledClass::Deprecated(ref contract) => { - self.set_contract_class(class_hash, &contract.clone())? - } - } - Ok(contract) + self.state_reader.get_contract_class(class_hash) } } @@ -334,15 +321,137 @@ impl State for CachedState { let modified_contracts = storage_updates.keys().map(|k| k.0.clone()).len(); (modified_contracts, storage_updates.len()) } + + fn get_class_hash_at(&mut self, contract_address: &Address) -> Result { + if self.cache.get_class_hash(contract_address).is_none() { + let class_hash = match self.state_reader.get_class_hash_at(contract_address) { + Ok(class_hash) => class_hash, + Err(StateError::NoneContractState(_)) => [0; 32], + Err(e) => return Err(e), + }; + self.cache + .class_hash_initial_values + .insert(contract_address.clone(), class_hash); + } + + self.cache + .get_class_hash(contract_address) + .ok_or_else(|| StateError::NoneClassHash(contract_address.clone())) + .cloned() + } + + fn get_nonce_at(&mut self, contract_address: &Address) -> Result { + if self.cache.get_nonce(contract_address).is_none() { + let nonce = self.state_reader.get_nonce_at(contract_address)?; + self.cache + .nonce_initial_values + .insert(contract_address.clone(), nonce); + } + self.cache + .get_nonce(contract_address) + .ok_or_else(|| StateError::NoneNonce(contract_address.clone())) + .cloned() + } + + fn get_storage_at(&mut self, storage_entry: &StorageEntry) -> Result { + if self.cache.get_storage(storage_entry).is_none() { + let value = match self.state_reader.get_storage_at(storage_entry) { + Ok(value) => value, + Err( + StateError::EmptyKeyInStorage + | StateError::NoneStoragLeaf(_) + | StateError::NoneStorage(_) + | StateError::NoneContractState(_), + ) => Felt252::zero(), + Err(e) => return Err(e), + }; + self.cache + .storage_initial_values + .insert(storage_entry.clone(), value); + } + + self.cache + .get_storage(storage_entry) + .ok_or_else(|| StateError::NoneStorage(storage_entry.clone())) + .cloned() + } + + // TODO: check if that the proper way to store it (converting hash to address) + fn get_compiled_class_hash(&mut self, class_hash: &ClassHash) -> Result { + let hash = self.cache.class_hash_to_compiled_class_hash.get(class_hash); + if let Some(hash) = hash { + Ok(*hash) + } else { + let compiled_class_hash = self.state_reader.get_compiled_class_hash(class_hash)?; + let address = Address(Felt252::from_bytes_be(&compiled_class_hash)); + self.cache + .class_hash_initial_values + .insert(address, compiled_class_hash); + Ok(compiled_class_hash) + } + } + + fn get_contract_class(&mut self, class_hash: &ClassHash) -> Result { + // This method can receive both compiled_class_hash & class_hash and return both casm and deprecated contract classes + //, which can be on the cache or on the state_reader, different cases will be described below: + if class_hash == UNINITIALIZED_CLASS_HASH { + return Err(StateError::UninitiaizedClassHash); + } + // I: FETCHING FROM CACHE + // I: DEPRECATED CONTRACT CLASS + // deprecated contract classes dont have compiled class hashes, so we only have one case + if let Some(compiled_class) = self + .contract_classes + .as_ref() + .and_then(|x| x.get(class_hash)) + { + return Ok(CompiledClass::Deprecated(Box::new(compiled_class.clone()))); + } + // I: CASM CONTRACT CLASS : COMPILED_CLASS_HASH + if let Some(compiled_class) = self + .casm_contract_classes + .as_ref() + .and_then(|x| x.get(class_hash)) + { + return Ok(CompiledClass::Casm(Box::new(compiled_class.clone()))); + } + // I: CASM CONTRACT CLASS : CLASS_HASH + if let Some(compiled_class_hash) = + self.cache.class_hash_to_compiled_class_hash.get(class_hash) + { + if let Some(casm_class) = &mut self + .casm_contract_classes + .as_ref() + .and_then(|m| m.get(compiled_class_hash)) + { + return Ok(CompiledClass::Casm(Box::new(casm_class.clone()))); + } + } + // II: FETCHING FROM STATE_READER + let contract = self.state_reader.get_contract_class(class_hash)?; + match contract { + CompiledClass::Casm(ref class) => { + // We call this method instead of state_reader's in order to update the cache's class_hash_initial_values map + let compiled_class_hash = self.get_compiled_class_hash(class_hash)?; + self.casm_contract_classes + .as_mut() + .and_then(|m| m.insert(compiled_class_hash, *class.clone())); + } + CompiledClass::Deprecated(ref contract) => { + self.set_contract_class(class_hash, &contract.clone())? + } + } + Ok(contract) + } } #[cfg(test)] mod tests { use super::*; + use crate::state::in_memory_state_reader::InMemoryStateReader; - use cairo_vm::types::program::Program; + use num_traits::One; - use starknet_contract_class::{ContractEntryPoint, EntryPointType}; #[test] fn get_class_hash_and_nonce_from_state_reader() { @@ -371,7 +480,7 @@ mod tests { .address_to_storage_mut() .insert(storage_entry, storage_value); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); assert_eq!( cached_state.get_class_hash_at(&contract_address).unwrap(), @@ -395,24 +504,15 @@ mod tests { HashMap::new(), HashMap::new(), ); - - let program_json: serde_json::Value = serde_json::Value::from("{}"); - let contract_class = ContractClass::new( - program_json, - Program::default(), - HashMap::from([( - EntryPointType::Constructor, - vec![ContractEntryPoint::default()], - )]), - None, - ) - .expect("Error creating contract class"); + let contract_class = + ContractClass::from_path("starknet_programs/raw_contract_classes/class_with_abi.json") + .unwrap(); state_reader .class_hash_to_contract_class .insert([1; 32], contract_class); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); cached_state.set_contract_classes(HashMap::new()).unwrap(); assert!(cached_state.contract_classes.is_some()); @@ -428,18 +528,8 @@ mod tests { #[test] fn cached_state_storage_test() { - let mut cached_state = CachedState::new( - InMemoryStateReader::new( - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - ), - None, - None, - ); + let mut cached_state = + CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let storage_entry: StorageEntry = (Address(31.into()), [0; 32]); let value = Felt252::new(10); @@ -456,14 +546,7 @@ mod tests { #[test] fn cached_state_deploy_contract_test() { - let state_reader = InMemoryStateReader::new( - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - ); + let state_reader = Arc::new(InMemoryStateReader::default()); let contract_address = Address(32123.into()); @@ -476,14 +559,7 @@ mod tests { #[test] fn get_and_set_storage() { - let state_reader = InMemoryStateReader::new( - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - HashMap::new(), - ); + let state_reader = Arc::new(InMemoryStateReader::default()); let contract_address = Address(31.into()); let storage_key = [18; 32]; @@ -517,7 +593,7 @@ mod tests { HashMap::new(), HashMap::new(), ); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); cached_state.set_contract_classes(HashMap::new()).unwrap(); let result = cached_state @@ -540,7 +616,7 @@ mod tests { let contract_address = Address(0.into()); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); let result = cached_state .deploy_contract(contract_address.clone(), [10; 32]) @@ -565,7 +641,7 @@ mod tests { let contract_address = Address(42.into()); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); cached_state .deploy_contract(contract_address.clone(), [10; 32]) @@ -593,7 +669,7 @@ mod tests { let contract_address = Address(32123.into()); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); cached_state .deploy_contract(contract_address.clone(), [10; 32]) @@ -622,7 +698,7 @@ mod tests { let address_one = Address(Felt252::one()); - let mut cached_state = CachedState::new(state_reader, None, None); + let mut cached_state = CachedState::new(Arc::new(state_reader), None, None); let state_diff = StateDiff { address_to_class_hash: HashMap::from([( diff --git a/src/state/contract_storage_state.rs b/src/state/contract_storage_state.rs index a63c29f00..795bc339a 100644 --- a/src/state/contract_storage_state.rs +++ b/src/state/contract_storage_state.rs @@ -1,4 +1,7 @@ -use super::state_api::{State, StateReader}; +use super::{ + cached_state::CachedState, + state_api::{State, StateReader}, +}; use crate::{ core::errors::state_errors::StateError, utils::{Address, ClassHash}, @@ -7,16 +10,16 @@ use cairo_vm::felt::Felt252; use std::collections::HashSet; #[derive(Debug)] -pub(crate) struct ContractStorageState<'a, T: State + StateReader> { - pub(crate) state: &'a mut T, +pub(crate) struct ContractStorageState<'a, S: StateReader> { + pub(crate) state: &'a mut CachedState, pub(crate) contract_address: Address, /// Maintain all read request values in chronological order pub(crate) read_values: Vec, pub(crate) accessed_keys: HashSet, } -impl<'a, T: State + StateReader> ContractStorageState<'a, T> { - pub(crate) fn new(state: &'a mut T, contract_address: Address) -> Self { +impl<'a, S: StateReader> ContractStorageState<'a, S> { + pub(crate) fn new(state: &'a mut CachedState, contract_address: Address) -> Self { Self { state, contract_address, diff --git a/src/state/in_memory_state_reader.rs b/src/state/in_memory_state_reader.rs index 7fe784380..9a553f212 100644 --- a/src/state/in_memory_state_reader.rs +++ b/src/state/in_memory_state_reader.rs @@ -14,6 +14,10 @@ use cairo_vm::felt::Felt252; use getset::{Getters, MutGetters}; use std::collections::HashMap; +/// A [StateReader] that holds all the data in memory. +/// +/// This implementation is used for testing and debugging. +/// It uses HashMaps to store the data. #[derive(Debug, MutGetters, Getters, PartialEq, Clone, Default)] pub struct InMemoryStateReader { #[getset(get_mut = "pub")] @@ -31,6 +35,15 @@ pub struct InMemoryStateReader { } impl InMemoryStateReader { + /// Creates a new InMemoryStateReader. + /// + /// # Parameters + /// - `address_to_class_hash` - A HashMap from contract addresses to their class hashes. + /// - `address_to_nonce` - A HashMap from contract addresses to their nonces. + /// - `address_to_storage` - A HashMap from storage entries to their values. + /// - `class_hash_to_contract_class` - A HashMap from class hashes to their contract classes. + /// - `casm_contract_classes` - A [CasmClassCache]. + /// - `class_hash_to_compiled_class_hash` - A HashMap from class hashes to their compiled class hashes. pub fn new( address_to_class_hash: HashMap, address_to_nonce: HashMap, @@ -49,8 +62,20 @@ impl InMemoryStateReader { } } + /// Gets the [CompiledClass] with the given [CompiledClassHash]. + /// + /// It looks for the [CompiledClass] both in the cache and the storage. + /// + /// # Parameters + /// - `compiled_class_hash` - The [CompiledClassHash] of the [CompiledClass] to get. + /// + /// # Errors + /// - [StateError::NoneCompiledClass] - If the [CompiledClass] is not found. + /// + /// # Returns + /// The [CompiledClass] with the given [CompiledClassHash]. fn get_compiled_class( - &mut self, + &self, compiled_class_hash: &CompiledClassHash, ) -> Result { if let Some(compiled_class) = self.casm_contract_classes.get(compiled_class_hash) { @@ -64,7 +89,7 @@ impl InMemoryStateReader { } impl StateReader for InMemoryStateReader { - fn get_class_hash_at(&mut self, contract_address: &Address) -> Result { + fn get_class_hash_at(&self, contract_address: &Address) -> Result { let class_hash = self .address_to_class_hash .get(contract_address) @@ -72,7 +97,7 @@ impl StateReader for InMemoryStateReader { class_hash.cloned() } - fn get_nonce_at(&mut self, contract_address: &Address) -> Result { + fn get_nonce_at(&self, contract_address: &Address) -> Result { let nonce = self .address_to_nonce .get(contract_address) @@ -80,7 +105,7 @@ impl StateReader for InMemoryStateReader { nonce.cloned() } - fn get_storage_at(&mut self, storage_entry: &StorageEntry) -> Result { + fn get_storage_at(&self, storage_entry: &StorageEntry) -> Result { let storage = self .address_to_storage .get(storage_entry) @@ -89,7 +114,7 @@ impl StateReader for InMemoryStateReader { } fn get_compiled_class_hash( - &mut self, + &self, class_hash: &ClassHash, ) -> Result { self.class_hash_to_compiled_class_hash @@ -98,7 +123,7 @@ impl StateReader for InMemoryStateReader { .copied() } - fn get_contract_class(&mut self, class_hash: &ClassHash) -> Result { + fn get_contract_class(&self, class_hash: &ClassHash) -> Result { // Deprecated contract classes dont have a compiled_class_hash, we dont need to fetch it if let Some(compiled_class) = self.class_hash_to_contract_class.get(class_hash) { return Ok(CompiledClass::Deprecated(Box::new(compiled_class.clone()))); @@ -116,8 +141,6 @@ impl StateReader for InMemoryStateReader { #[cfg(test)] mod tests { use super::*; - use cairo_vm::types::program::Program; - use starknet_contract_class::{ContractEntryPoint, EntryPointType}; #[test] fn get_contract_state_test() { @@ -168,18 +191,10 @@ mod tests { HashMap::new(), ); - let program_json: serde_json::Value = serde_json::Value::from("{}"); let contract_class_key = [0; 32]; - let contract_class = ContractClass::new( - program_json, - Program::default(), - HashMap::from([( - EntryPointType::Constructor, - vec![ContractEntryPoint::default()], - )]), - None, - ) - .expect("Error creating contract class"); + let contract_class = + ContractClass::from_path("starknet_programs/raw_contract_classes/class_with_abi.json") + .unwrap(); state_reader .class_hash_to_contract_class diff --git a/src/state/mod.rs b/src/state/mod.rs index 9b29dfe29..7698c3bf9 100644 --- a/src/state/mod.rs +++ b/src/state/mod.rs @@ -13,7 +13,7 @@ use crate::{ }; use cairo_vm::{felt::Felt252, vm::runners::cairo_runner::ExecutionResources}; use getset::Getters; -use std::collections::HashMap; +use std::{collections::HashMap, sync::Arc}; use crate::{ transaction::error::TransactionError, @@ -116,6 +116,20 @@ pub struct StateDiff { } impl StateDiff { + pub fn new( + address_to_class_hash: HashMap, + address_to_nonce: HashMap, + class_hash_to_compiled_class: HashMap, + storage_updates: HashMap>, + ) -> Self { + StateDiff { + address_to_class_hash, + address_to_nonce, + class_hash_to_compiled_class, + storage_updates, + } + } + pub fn from_cached_state(cached_state: CachedState) -> Result where T: StateReader, @@ -152,7 +166,7 @@ impl StateDiff { }) } - pub fn to_cached_state(&self, state_reader: T) -> Result, StateError> + pub fn to_cached_state(&self, state_reader: Arc) -> Result, StateError> where T: StateReader + Clone, { @@ -224,7 +238,7 @@ fn test_validate_legal_progress() { #[cfg(test)] mod test { - use std::collections::HashMap; + use std::{collections::HashMap, sync::Arc}; use super::StateDiff; use crate::{ @@ -253,7 +267,7 @@ mod test { .address_to_nonce .insert(contract_address, nonce); - let cached_state = CachedState::new(state_reader, None, None); + let cached_state = CachedState::new(Arc::new(state_reader), None, None); let diff = StateDiff::from_cached_state(cached_state).unwrap(); @@ -313,11 +327,11 @@ mod test { .address_to_nonce .insert(contract_address.clone(), nonce); - let mut cached_state_original = CachedState::new(state_reader.clone(), None, None); + let cached_state_original = CachedState::new(Arc::new(state_reader.clone()), None, None); let diff = StateDiff::from_cached_state(cached_state_original.clone()).unwrap(); - let mut cached_state = diff.to_cached_state(state_reader).unwrap(); + let cached_state = diff.to_cached_state(Arc::new(state_reader)).unwrap(); assert_eq!( cached_state_original.contract_classes(), @@ -361,7 +375,7 @@ mod test { HashMap::new(), ); let cached_state = CachedState::new_for_testing( - state_reader, + Arc::new(state_reader), Some(ContractClassCache::new()), cache, None, diff --git a/src/state/state_api.rs b/src/state/state_api.rs index 873a3413c..2dbfbe8b3 100644 --- a/src/state/state_api.rs +++ b/src/state/state_api.rs @@ -12,16 +12,16 @@ use cairo_vm::felt::Felt252; pub trait StateReader { /// Returns the contract class of the given class hash or compiled class hash. - fn get_contract_class(&mut self, class_hash: &ClassHash) -> Result; + fn get_contract_class(&self, class_hash: &ClassHash) -> Result; /// Returns the class hash of the contract class at the given address. - fn get_class_hash_at(&mut self, contract_address: &Address) -> Result; + fn get_class_hash_at(&self, contract_address: &Address) -> Result; /// Returns the nonce of the given contract instance. - fn get_nonce_at(&mut self, contract_address: &Address) -> Result; + fn get_nonce_at(&self, contract_address: &Address) -> Result; /// Returns the storage value under the given key in the given contract instance. - fn get_storage_at(&mut self, storage_entry: &StorageEntry) -> Result; + fn get_storage_at(&self, storage_entry: &StorageEntry) -> Result; /// Return the class hash of the given casm contract class fn get_compiled_class_hash( - &mut self, + &self, class_hash: &ClassHash, ) -> Result; } @@ -32,29 +32,46 @@ pub trait State { class_hash: &ClassHash, contract_class: &ContractClass, ) -> Result<(), StateError>; + fn deploy_contract( &mut self, contract_address: Address, class_hash: ClassHash, ) -> Result<(), StateError>; + fn increment_nonce(&mut self, contract_address: &Address) -> Result<(), StateError>; + fn set_storage_at(&mut self, storage_entry: &StorageEntry, value: Felt252); + fn set_class_hash_at( &mut self, contract_address: Address, class_hash: ClassHash, ) -> Result<(), StateError>; + fn set_compiled_class( &mut self, compiled_class_hash: &Felt252, casm_class: CasmContractClass, ) -> Result<(), StateError>; + fn set_compiled_class_hash( &mut self, class_hash: &Felt252, compiled_class_hash: &Felt252, ) -> Result<(), StateError>; fn apply_state_update(&mut self, sate_updates: &StateDiff) -> Result<(), StateError>; + /// Counts the amount of modified contracts and the updates to the storage fn count_actual_storage_changes(&mut self) -> (usize, usize); + + fn get_class_hash_at(&mut self, contract_address: &Address) -> Result; + + fn get_nonce_at(&mut self, contract_address: &Address) -> Result; + + fn get_storage_at(&mut self, storage_entry: &StorageEntry) -> Result; + + fn get_compiled_class_hash(&mut self, class_hash: &ClassHash) -> Result; + + fn get_contract_class(&mut self, class_hash: &ClassHash) -> Result; } diff --git a/src/state/state_cache.rs b/src/state/state_cache.rs index 8fa5fd77c..446028aa4 100644 --- a/src/state/state_cache.rs +++ b/src/state/state_cache.rs @@ -182,9 +182,6 @@ impl StateCache { #[cfg(test)] mod tests { - - use cairo_vm::types::program::Program; - use crate::services::api::contract_classes::deprecated_contract_class::ContractClass; use super::*; @@ -193,10 +190,10 @@ mod tests { fn state_chache_set_initial_values() { let mut state_cache = StateCache::default(); let address_to_class_hash = HashMap::from([(Address(10.into()), [8; 32])]); - let program_json: serde_json::Value = serde_json::Value::from("{}"); - let compiled_class = CompiledClass::Deprecated(Box::new( - ContractClass::new(program_json, Program::default(), HashMap::new(), None).unwrap(), - )); + let contract_class = + ContractClass::from_path("starknet_programs/raw_contract_classes/class_with_abi.json") + .unwrap(); + let compiled_class = CompiledClass::Deprecated(Box::new(contract_class)); let class_hash_to_compiled_class_hash = HashMap::from([([8; 32], compiled_class)]); let address_to_nonce = HashMap::from([(Address(9.into()), 12.into())]); let storage_updates = HashMap::from([((Address(4.into()), [1; 32]), 18.into())]); diff --git a/src/storage/errors/mod.rs b/src/storage/errors/mod.rs deleted file mode 100644 index 2b0bbd554..000000000 --- a/src/storage/errors/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod storage_errors; diff --git a/src/storage/errors/storage_errors.rs b/src/storage/errors/storage_errors.rs deleted file mode 100644 index 29ebb2a7f..000000000 --- a/src/storage/errors/storage_errors.rs +++ /dev/null @@ -1,38 +0,0 @@ -use thiserror::Error; - -#[derive(Debug, PartialEq, Eq, Error)] -pub enum StorageError { - #[error("Data not available")] - ErrorFetchingData, - #[error("Slice with incorrect length")] - IncorrectDataSize, - #[error("Incorrect utf8 enconding")] - IncorrectUtf8Enconding, - #[error("Attempt to remove missing key")] - RemoveMissingKey, - #[error("Serde error: {0}")] - SerdeError(String), -} - -impl From for StorageError { - fn from(error: serde_json::Error) -> Self { - StorageError::SerdeError(error.to_string()) - } -} - -#[test] -fn test_from_serde_json_error_for_storage_error() { - let bugged_json: Result< - starknet_api::deprecated_contract_class::ContractClass, - serde_json::Error, - > = serde_json::from_str("{"); - let json_error = bugged_json.unwrap_err(); - let storage_error = StorageError::from(json_error); - - assert_eq!( - storage_error, - StorageError::SerdeError(String::from( - "EOF while parsing an object at line 1 column 1" - )) - ); -} diff --git a/src/storage/mod.rs b/src/storage/mod.rs deleted file mode 100644 index 629e98fbf..000000000 --- a/src/storage/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod errors; diff --git a/src/syscalls/business_logic_syscall_handler.rs b/src/syscalls/business_logic_syscall_handler.rs index 26f3bcef9..e0d9ab0bd 100644 --- a/src/syscalls/business_logic_syscall_handler.rs +++ b/src/syscalls/business_logic_syscall_handler.rs @@ -21,7 +21,9 @@ use super::{ }; use crate::definitions::block_context::BlockContext; use crate::definitions::constants::BLOCK_HASH_CONTRACT_ADDRESS; +use crate::execution::execution_entry_point::ExecutionResult; use crate::services::api::contract_classes::compiled_class::CompiledClass; +use crate::state::cached_state::CachedState; use crate::state::BlockInfo; use crate::transaction::error::TransactionError; use crate::utils::calculate_sn_keccak; @@ -51,8 +53,8 @@ use cairo_vm::{ }; use lazy_static::lazy_static; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use num_traits::{One, ToPrimitive, Zero}; -use starknet_contract_class::EntryPointType; const STEP: u128 = 100; const SYSCALL_BASE: u128 = 100 * STEP; @@ -113,7 +115,7 @@ lazy_static! { } #[derive(Debug)] -pub struct BusinessLogicSyscallHandler<'a, T: State + StateReader> { +pub struct BusinessLogicSyscallHandler<'a, S: StateReader> { pub(crate) events: Vec, pub(crate) expected_syscall_ptr: Relocatable, pub(crate) resources_manager: ExecutionResourcesManager, @@ -124,7 +126,7 @@ pub struct BusinessLogicSyscallHandler<'a, T: State + StateReader> { pub(crate) read_only_segments: Vec<(Relocatable, MaybeRelocatable)>, pub(crate) internal_calls: Vec, pub(crate) block_context: BlockContext, - pub(crate) starknet_storage_state: ContractStorageState<'a, T>, + pub(crate) starknet_storage_state: ContractStorageState<'a, S>, pub(crate) support_reverted: bool, pub(crate) entry_point_selector: Felt252, pub(crate) selector_to_syscall: &'a HashMap, @@ -132,11 +134,11 @@ pub struct BusinessLogicSyscallHandler<'a, T: State + StateReader> { // TODO: execution entry point may no be a parameter field, but there is no way to generate a default for now -impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { +impl<'a, S: StateReader> BusinessLogicSyscallHandler<'a, S> { #[allow(clippy::too_many_arguments)] pub fn new( tx_execution_context: TransactionExecutionContext, - state: &'a mut T, + state: &'a mut CachedState, resources_manager: ExecutionResourcesManager, caller_address: Address, contract_address: Address, @@ -168,7 +170,7 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { selector_to_syscall: &SELECTOR_TO_SYSCALL, } } - pub fn default_with_state(state: &'a mut T) -> Self { + pub fn default_with_state(state: &'a mut CachedState) -> Self { BusinessLogicSyscallHandler::new_for_testing( BlockInfo::default(), Default::default(), @@ -179,7 +181,7 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { pub fn new_for_testing( block_info: BlockInfo, _contract_address: Address, - state: &'a mut T, + state: &'a mut CachedState, ) -> Self { let syscalls = Vec::from([ "emit_event".to_string(), @@ -237,17 +239,26 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { remaining_gas: u128, execution_entry_point: ExecutionEntryPoint, ) -> Result { - let result = execution_entry_point + let ExecutionResult { + call_info, + revert_error, + .. + } = execution_entry_point .execute( self.starknet_storage_state.state, &self.block_context, &mut self.resources_manager, &mut self.tx_execution_context, - self.support_reverted, + false, + self.block_context.invoke_tx_max_n_steps, ) .map_err(|err| SyscallHandlerError::ExecutionError(err.to_string()))?; - let retdata_maybe_reloc = result + let call_info = call_info.ok_or(SyscallHandlerError::ExecutionError( + revert_error.unwrap_or("Execution error".to_string()), + ))?; + + let retdata_maybe_reloc = call_info .retdata .clone() .into_iter() @@ -255,12 +266,12 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { .collect::>(); let retdata_start = self.allocate_segment(vm, retdata_maybe_reloc)?; - let retdata_end = (retdata_start + result.retdata.len())?; + let retdata_end = (retdata_start + call_info.retdata.len())?; - let remaining_gas = remaining_gas.saturating_sub(result.gas_consumed); + let remaining_gas = remaining_gas.saturating_sub(call_info.gas_consumed); let gas = remaining_gas; - let body = if result.failure_flag { + let body = if call_info.failure_flag { Some(ResponseBody::Failure(FailureReason { retdata_start, retdata_end, @@ -272,7 +283,7 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { })) }; - self.internal_calls.push(result); + self.internal_calls.push(call_info); Ok(SyscallResponse { gas, body }) } @@ -338,16 +349,25 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { remainig_gas, ); - let call_info = call + let ExecutionResult { + call_info, + revert_error, + .. + } = call .execute( self.starknet_storage_state.state, &self.block_context, &mut self.resources_manager, &mut self.tx_execution_context, self.support_reverted, + self.block_context.invoke_tx_max_n_steps, ) .map_err(|_| StateError::ExecutionEntryPoint())?; + let call_info = call_info.ok_or(StateError::CustomError( + revert_error.unwrap_or("Execution error".to_string()), + ))?; + self.internal_calls.push(call_info.clone()); Ok(call_info.result()) @@ -521,10 +541,7 @@ impl<'a, T: State + StateReader> BusinessLogicSyscallHandler<'a, T> { } } -impl<'a, T> BusinessLogicSyscallHandler<'a, T> -where - T: State + StateReader, -{ +impl<'a, S: StateReader> BusinessLogicSyscallHandler<'a, S> { fn emit_event( &mut self, vm: &VirtualMachine, diff --git a/src/syscalls/deprecated_business_logic_syscall_handler.rs b/src/syscalls/deprecated_business_logic_syscall_handler.rs index 669e97af0..19c55b002 100644 --- a/src/syscalls/deprecated_business_logic_syscall_handler.rs +++ b/src/syscalls/deprecated_business_logic_syscall_handler.rs @@ -16,7 +16,10 @@ use crate::{ block_context::BlockContext, constants::{CONSTRUCTOR_ENTRY_POINT_SELECTOR, INITIAL_GAS_COST}, }, - execution::{execution_entry_point::ExecutionEntryPoint, *}, + execution::{ + execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, + *, + }, hash_utils::calculate_contract_address, services::api::{ contract_class_errors::ContractClassError, contract_classes::compiled_class::CompiledClass, @@ -30,21 +33,23 @@ use crate::{ transaction::error::TransactionError, utils::*, }; +use crate::{ + services::api::contract_classes::deprecated_contract_class::EntryPointType, + state::cached_state::CachedState, +}; use cairo_vm::felt::Felt252; use cairo_vm::{ types::relocatable::{MaybeRelocatable, Relocatable}, vm::vm_core::VirtualMachine, }; use num_traits::{One, ToPrimitive, Zero}; -use starknet_contract_class::EntryPointType; -use std::borrow::{Borrow, BorrowMut}; //* ----------------------------------- //* DeprecatedBLSyscallHandler implementation //* ----------------------------------- /// Deprecated version of BusinessLogicSyscallHandler. #[derive(Debug)] -pub struct DeprecatedBLSyscallHandler<'a, T: State + StateReader> { +pub struct DeprecatedBLSyscallHandler<'a, S: StateReader> { pub(crate) tx_execution_context: TransactionExecutionContext, /// Events emitted by the current contract call. pub(crate) events: Vec, @@ -56,15 +61,15 @@ pub struct DeprecatedBLSyscallHandler<'a, T: State + StateReader> { pub(crate) l2_to_l1_messages: Vec, pub(crate) block_context: BlockContext, pub(crate) tx_info_ptr: Option, - pub(crate) starknet_storage_state: ContractStorageState<'a, T>, + pub(crate) starknet_storage_state: ContractStorageState<'a, S>, pub(crate) internal_calls: Vec, pub(crate) expected_syscall_ptr: Relocatable, } -impl<'a, T: State + StateReader> DeprecatedBLSyscallHandler<'a, T> { +impl<'a, S: StateReader> DeprecatedBLSyscallHandler<'a, S> { pub fn new( tx_execution_context: TransactionExecutionContext, - state: &'a mut T, + state: &'a mut CachedState, resources_manager: ExecutionResourcesManager, caller_address: Address, contract_address: Address, @@ -95,7 +100,7 @@ impl<'a, T: State + StateReader> DeprecatedBLSyscallHandler<'a, T> { } } - pub fn default_with(state: &'a mut T) -> Self { + pub fn default_with(state: &'a mut CachedState) -> Self { DeprecatedBLSyscallHandler::new_for_testing(BlockInfo::default(), Default::default(), state) } @@ -108,7 +113,7 @@ impl<'a, T: State + StateReader> DeprecatedBLSyscallHandler<'a, T> { pub fn new_for_testing( block_info: BlockInfo, _contract_address: Address, - state: &'a mut T, + state: &'a mut CachedState, ) -> Self { let syscalls = Vec::from([ "emit_event".to_string(), @@ -234,34 +239,14 @@ impl<'a, T: State + StateReader> DeprecatedBLSyscallHandler<'a, T> { &mut self.resources_manager, &mut self.tx_execution_context, false, + self.block_context.invoke_tx_max_n_steps, ) .map_err(|_| StateError::ExecutionEntryPoint())?; Ok(()) } } -impl<'a, T> Borrow for DeprecatedBLSyscallHandler<'a, T> -where - T: State + StateReader, -{ - fn borrow(&self) -> &T { - self.starknet_storage_state.state - } -} - -impl<'a, T> BorrowMut for DeprecatedBLSyscallHandler<'a, T> -where - T: State + StateReader, -{ - fn borrow_mut(&mut self) -> &mut T { - self.starknet_storage_state.state - } -} - -impl<'a, T> DeprecatedBLSyscallHandler<'a, T> -where - T: State + StateReader, -{ +impl<'a, S: StateReader> DeprecatedBLSyscallHandler<'a, S> { pub(crate) fn emit_event( &mut self, vm: &VirtualMachine, @@ -451,21 +436,29 @@ where ); entry_point.code_address = code_address; - entry_point + let ExecutionResult { + call_info, + revert_error, + .. + } = entry_point .execute( self.starknet_storage_state.state, &self.block_context, &mut self.resources_manager, &mut self.tx_execution_context, false, + self.block_context.invoke_tx_max_n_steps, ) - .map(|x| { - let retdata = x.retdata.clone(); - self.internal_calls.push(x); + .map_err(|e| SyscallHandlerError::ExecutionError(e.to_string()))?; + + let call_info = call_info.ok_or(SyscallHandlerError::ExecutionError( + revert_error.unwrap_or("Execution error".to_string()), + ))?; + + let retdata = call_info.retdata.clone(); + self.internal_calls.push(call_info); - retdata - }) - .map_err(|e| SyscallHandlerError::ExecutionError(e.to_string())) + Ok(retdata) } pub(crate) fn get_block_info(&self) -> &BlockInfo { @@ -946,7 +939,7 @@ mod tests { use std::{any::Any, borrow::Cow, collections::HashMap}; type DeprecatedBLSyscallHandler<'a> = - super::DeprecatedBLSyscallHandler<'a, CachedState>; + super::DeprecatedBLSyscallHandler<'a, InMemoryStateReader>; #[test] fn run_alloc_hint_ap_is_not_empty() { diff --git a/src/syscalls/deprecated_syscall_handler.rs b/src/syscalls/deprecated_syscall_handler.rs index c126c4c25..ba10df2a8 100644 --- a/src/syscalls/deprecated_syscall_handler.rs +++ b/src/syscalls/deprecated_syscall_handler.rs @@ -2,10 +2,7 @@ use super::{ deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler, hint_code::*, other_syscalls, syscall_handler::HintProcessorPostRun, }; -use crate::{ - state::state_api::{State, StateReader}, - syscalls::syscall_handler_errors::SyscallHandlerError, -}; +use crate::{state::state_api::StateReader, syscalls::syscall_handler_errors::SyscallHandlerError}; use cairo_vm::{ felt::Felt252, hint_processor::hint_processor_definition::HintProcessorLogic, @@ -25,15 +22,15 @@ use cairo_vm::{ }; use std::{any::Any, collections::HashMap}; -pub(crate) struct DeprecatedSyscallHintProcessor<'a, T: State + StateReader> { +pub(crate) struct DeprecatedSyscallHintProcessor<'a, S: StateReader> { pub(crate) builtin_hint_processor: BuiltinHintProcessor, - pub(crate) syscall_handler: DeprecatedBLSyscallHandler<'a, T>, + pub(crate) syscall_handler: DeprecatedBLSyscallHandler<'a, S>, run_resources: RunResources, } -impl<'a, T: State + StateReader> DeprecatedSyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> DeprecatedSyscallHintProcessor<'a, S> { pub fn new( - syscall_handler: DeprecatedBLSyscallHandler<'a, T>, + syscall_handler: DeprecatedBLSyscallHandler<'a, S>, run_resources: RunResources, ) -> Self { DeprecatedSyscallHintProcessor { @@ -152,7 +149,7 @@ impl<'a, T: State + StateReader> DeprecatedSyscallHintProcessor<'a, T> { } } -impl<'a, T: State + StateReader> HintProcessorLogic for DeprecatedSyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> HintProcessorLogic for DeprecatedSyscallHintProcessor<'a, S> { fn execute_hint( &mut self, vm: &mut VirtualMachine, @@ -174,7 +171,7 @@ impl<'a, T: State + StateReader> HintProcessorLogic for DeprecatedSyscallHintPro } } -impl<'a, T: State + StateReader> ResourceTracker for DeprecatedSyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> ResourceTracker for DeprecatedSyscallHintProcessor<'a, S> { fn consumed(&self) -> bool { self.run_resources.consumed() } @@ -192,7 +189,7 @@ impl<'a, T: State + StateReader> ResourceTracker for DeprecatedSyscallHintProces } } -impl<'a, T: State + StateReader> HintProcessorPostRun for DeprecatedSyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> HintProcessorPostRun for DeprecatedSyscallHintProcessor<'a, S> { fn post_run( &self, runner: &mut VirtualMachine, @@ -214,7 +211,10 @@ fn get_syscall_ptr( #[cfg(test)] mod tests { + use std::sync::Arc; + use super::*; + use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::{ add_segments, allocate_selector, any_box, definitions::{ @@ -225,10 +225,7 @@ mod tests { memory_insert, services::api::contract_classes::deprecated_contract_class::ContractClass, state::in_memory_state_reader::InMemoryStateReader, - state::{ - cached_state::CachedState, - state_api::{State, StateReader}, - }, + state::{cached_state::CachedState, state_api::State}, syscalls::deprecated_syscall_request::{ DeprecatedDeployRequest, DeprecatedSendMessageToL1SysCallRequest, DeprecatedSyscallRequest, @@ -242,13 +239,11 @@ mod tests { }; use cairo_vm::relocatable; use num_traits::Num; - use starknet_contract_class::EntryPointType; - use std::path::PathBuf; type DeprecatedBLSyscallHandler<'a> = crate::syscalls::deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler< 'a, - CachedState, + InMemoryStateReader, >; type SyscallHintProcessor<'a, T> = super::DeprecatedSyscallHintProcessor<'a, T>; @@ -713,7 +708,7 @@ mod tests { ] ); - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -748,7 +743,7 @@ mod tests { let hint_data = HintProcessorData::new_default(GET_CONTRACT_ADDRESS.to_string(), ids_data); // invoke syscall - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -789,7 +784,7 @@ mod tests { let hint_data = HintProcessorData::new_default(GET_TX_SIGNATURE.to_string(), ids_data); // invoke syscall - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut syscall_handler_hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -856,7 +851,7 @@ mod tests { let hint_data = HintProcessorData::new_default(STORAGE_READ.to_string(), ids_data); - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut syscall_handler_hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -920,7 +915,7 @@ mod tests { let hint_data = HintProcessorData::new_default(STORAGE_WRITE.to_string(), ids_data); - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut syscall_handler_hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -993,7 +988,7 @@ mod tests { let hint_data = HintProcessorData::new_default(DEPLOY.to_string(), ids_data); // Create SyscallHintProcessor - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut syscall_handler_hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -1007,8 +1002,7 @@ mod tests { .unwrap(); // Set contract class - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); syscall_handler_hint_processor .syscall_handler .starknet_storage_state @@ -1091,7 +1085,7 @@ mod tests { ); // Create SyscallHintProcessor - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let mut syscall_handler_hint_processor = SyscallHintProcessor::new( DeprecatedBLSyscallHandler::default_with(&mut state), RunResources::default(), @@ -1105,10 +1099,8 @@ mod tests { .unwrap(); // Set contract class - let contract_class = ContractClass::try_from(PathBuf::from( - "starknet_programs/storage_var_and_constructor.json", - )) - .unwrap(); + let contract_class = + ContractClass::from_path("starknet_programs/storage_var_and_constructor.json").unwrap(); syscall_handler_hint_processor .syscall_handler .starknet_storage_state @@ -1165,7 +1157,6 @@ mod tests { Vec::new(), 0.into(), Some(0.into()), - None, ) .unwrap(); diff --git a/src/syscalls/deprecated_syscall_response.rs b/src/syscalls/deprecated_syscall_response.rs index 5456dccae..1851f25ef 100644 --- a/src/syscalls/deprecated_syscall_response.rs +++ b/src/syscalls/deprecated_syscall_response.rs @@ -300,6 +300,8 @@ impl DeprecatedWriteSyscallResponse for DeprecatedStorageReadResponse { #[cfg(test)] mod tests { + use std::sync::Arc; + use super::*; use crate::{ add_segments, @@ -312,12 +314,12 @@ mod tests { type DeprecatedBLSyscallHandler<'a> = crate::syscalls::deprecated_business_logic_syscall_handler::DeprecatedBLSyscallHandler< 'a, - CachedState, + InMemoryStateReader, >; #[test] fn write_get_caller_address_response() { - let mut state = CachedState::::default(); + let mut state = CachedState::new(Arc::new(InMemoryStateReader::default()), None, None); let syscall = DeprecatedBLSyscallHandler::default_with(&mut state); let mut vm = vm!(); diff --git a/src/syscalls/syscall_handler.rs b/src/syscalls/syscall_handler.rs index c1761362e..67db9ebad 100644 --- a/src/syscalls/syscall_handler.rs +++ b/src/syscalls/syscall_handler.rs @@ -1,5 +1,5 @@ use super::business_logic_syscall_handler::BusinessLogicSyscallHandler; -use crate::state::state_api::{State, StateReader}; +use crate::state::state_api::StateReader; use crate::transaction::error::TransactionError; use cairo_lang_casm::{ hints::{Hint, StarknetHint}, @@ -32,15 +32,15 @@ pub(crate) trait HintProcessorPostRun { } #[allow(unused)] -pub(crate) struct SyscallHintProcessor<'a, T: State + StateReader> { +pub(crate) struct SyscallHintProcessor<'a, S: StateReader> { pub(crate) cairo1_hint_processor: Cairo1HintProcessor, - pub(crate) syscall_handler: BusinessLogicSyscallHandler<'a, T>, + pub(crate) syscall_handler: BusinessLogicSyscallHandler<'a, S>, pub(crate) run_resources: RunResources, } -impl<'a, T: State + StateReader> SyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> SyscallHintProcessor<'a, S> { pub fn new( - syscall_handler: BusinessLogicSyscallHandler<'a, T>, + syscall_handler: BusinessLogicSyscallHandler<'a, S>, hints: &[(usize, Vec)], run_resources: RunResources, ) -> Self { @@ -52,7 +52,7 @@ impl<'a, T: State + StateReader> SyscallHintProcessor<'a, T> { } } -impl<'a, T: State + StateReader> HintProcessorLogic for SyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> HintProcessorLogic for SyscallHintProcessor<'a, S> { fn execute_hint( &mut self, vm: &mut VirtualMachine, @@ -111,7 +111,7 @@ impl<'a, T: State + StateReader> HintProcessorLogic for SyscallHintProcessor<'a, } } -impl<'a, T: State + StateReader> ResourceTracker for SyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> ResourceTracker for SyscallHintProcessor<'a, S> { fn consumed(&self) -> bool { self.run_resources.consumed() } @@ -129,7 +129,7 @@ impl<'a, T: State + StateReader> ResourceTracker for SyscallHintProcessor<'a, T> } } -impl<'a, T: State + StateReader> HintProcessorPostRun for SyscallHintProcessor<'a, T> { +impl<'a, S: StateReader> HintProcessorPostRun for SyscallHintProcessor<'a, S> { fn post_run( &self, runner: &mut VirtualMachine, diff --git a/src/syscalls/syscall_handler_errors.rs b/src/syscalls/syscall_handler_errors.rs index d4b201385..b2e46f3b5 100644 --- a/src/syscalls/syscall_handler_errors.rs +++ b/src/syscalls/syscall_handler_errors.rs @@ -1,3 +1,4 @@ +use crate::core::errors::hash_errors::HashError; use crate::core::errors::state_errors::StateError; use cairo_vm::felt::Felt252; use cairo_vm::{ @@ -20,8 +21,8 @@ pub enum SyscallHandlerError { ExecutionError(String), #[error("Couldn't convert from {0} to {1}")] Conversion(String, String), - #[error("Couldn't compute hash")] - FailToComputeHash, + #[error("Couldn't compute hash: {0}")] + HashError(#[from] HashError), #[error("Expected a struct of type: {0:?}, received: {1:?}")] ExpectedStruct(String, String), #[error("Unsopported address domain: {0}")] diff --git a/src/syscalls/syscall_request.rs b/src/syscalls/syscall_request.rs index e34d388b3..4219528b2 100644 --- a/src/syscalls/syscall_request.rs +++ b/src/syscalls/syscall_request.rs @@ -18,20 +18,33 @@ use crate::{ // } // ``` +/// Abstracts every request variant for each syscall. #[allow(unused)] #[derive(Debug, PartialEq)] pub(crate) enum SyscallRequest { + /// Emits an event with a given set of keys and data. EmitEvent(EmitEventRequest), + /// Calls the requested function in any previously declared class. LibraryCall(LibraryCallRequest), + /// Calls a given contract. CallContract(CallContractRequest), + /// Deploys a new instance of a previously declared class. Deploy(DeployRequest), + /// Gets the number of the block in which the transaction is executed. GetBlockNumber, + /// Gets information about the original transaction. GetExecutionInfo, + /// Gets the value of a key in the storage of the calling contract. StorageRead(StorageReadRequest), + /// Sets the value of a key in the storage of the calling contract. StorageWrite(StorageWriteRequest), + /// Sends a message to L1. SendMessageToL1(SendMessageToL1Request), + /// Gets the timestamp of the block in which the transaction is executed. GetBlockTimestamp(GetBlockTimestampRequest), + /// Gets the hash value of a block. GetBlockHash(GetBlockHashRequest), + /// Replaces the class of the calling contract. ReplaceClass(ReplaceClassRequest), } @@ -39,10 +52,12 @@ pub(crate) enum SyscallRequest { // SyscallRequest variants // ~~~~~~~~~~~~~~~~~~~~~~~~~ +/// Gets the timestamp of the block in which the transaction is executed. #[allow(unused)] #[derive(Clone, Debug, PartialEq)] pub(crate) struct GetBlockTimestampRequest {} +/// Deploys a new instance of a previously declared class. #[allow(unused)] #[derive(Clone, Debug, PartialEq)] pub(crate) struct DeployRequest { @@ -57,40 +72,71 @@ pub(crate) struct DeployRequest { pub(crate) deploy_from_zero: usize, } +/// Gets the value of a key in the storage of the calling contract. +/// +/// This system call provides direct access to any possible key in storage, in contrast +/// with `balance.read()`, which enables you to read storage variables that are defined +/// explicitly in the contract. #[derive(Clone, Debug, PartialEq)] pub(crate) struct StorageReadRequest { + /// The key associated with the requested storage value. pub(crate) key: [u8; 32], pub(crate) reserved: Felt252, } +/// Emits an event with a given set of keys and data. #[derive(Clone, Debug, PartialEq)] pub(crate) struct EmitEventRequest { + /// The event's key segment start. pub(crate) keys_start: Relocatable, + /// The event's key segment end. pub(crate) keys_end: Relocatable, + /// The event's data segment start. pub(crate) data_start: Relocatable, + /// The event's data segment end. pub(crate) data_end: Relocatable, } +/// Calls a given contract. #[derive(Clone, Debug, PartialEq)] pub(crate) struct CallContractRequest { + /// A selector for a function within that contract. pub(crate) selector: Felt252, + /// The address of the contract you want to call. pub(crate) contract_address: Address, + /// The calldata segment start. pub(crate) calldata_start: Relocatable, + /// The calldata segment end. pub(crate) calldata_end: Relocatable, } +/// Calls the requested function in any previously declared class. +/// +/// This system call replaces the known delegate call functionality from Ethereum, +/// with the important difference that there is only one contract involved. #[derive(Clone, Debug, PartialEq)] pub(crate) struct LibraryCallRequest { + /// The hash of the class you want to use. pub(crate) class_hash: Felt252, + /// A selector for a function within that class. pub(crate) selector: Felt252, + /// The calldata segment start. pub(crate) calldata_start: Relocatable, + /// The calldata segment end. pub(crate) calldata_end: Relocatable, } +/// Sets the value of a key in the storage of the calling contract. +/// +/// This system call provides direct access to any possible key in storage, +/// in contrast with balance.write(), which enables you to write to storage variables +/// that are defined explicitly in the contract. #[derive(Clone, Debug, PartialEq)] pub(crate) struct StorageWriteRequest { pub(crate) reserved: Felt252, + /// The key associated with the requested storage value. pub(crate) key: Felt252, + /// The value to write to the key. pub(crate) value: Felt252, } @@ -101,21 +147,36 @@ pub(crate) struct StorageWriteRequest { // payload // The array containing the message payload -> relocatable + +/// Sends a message to L1. +/// +/// This system call includes the message parameters as part of the proof’s output, +/// and exposes these parameters to the Starknet Core contract on L1 once the state update, +/// including the transaction, is received. #[derive(Clone, Debug, PartialEq)] pub(crate) struct SendMessageToL1Request { + /// The recipient’s L1 address. pub(crate) to_address: Address, + /// The payload segment start. pub(crate) payload_start: Relocatable, + /// The payload segment end. pub(crate) payload_end: Relocatable, } +/// Gets the hash value of a block. #[derive(Clone, Debug, PartialEq)] pub(crate) struct GetBlockHashRequest { + /// The block's number pub(crate) block_number: u64, } +/// Replaces the class of the calling contract (i.e. the contract whose address is +/// returned by `get_contract_address` at the time the syscall is called) by the class +/// of the given hash. #[allow(unused)] #[derive(Clone, Debug, PartialEq)] pub(crate) struct ReplaceClassRequest { + /// The hash of the class that will replace the calling contract one. pub(crate) class_hash: Felt252, } diff --git a/src/testing/bench_integration.rs b/src/testing/bench_integration.rs index 7ef38b76e..dcdbf6479 100644 --- a/src/testing/bench_integration.rs +++ b/src/testing/bench_integration.rs @@ -4,18 +4,18 @@ use felt::{felt_str, Felt}; use num_traits::Zero; use crate::{ - state::in_memory_state_reader::InMemoryStateReader, state::cached_state::CachedState, services::api::contract_classes::deprecated_contract_class::ContractClass, - utils::Address, testing::starknet_state::StarknetState, + state::cached_state::CachedState, state::in_memory_state_reader::InMemoryStateReader, + testing::starknet_state::StarknetState, utils::Address, }; use lazy_static::lazy_static; lazy_static! { // include_str! doesn't seem to work in CI - static ref CONTRACT_CLASS: ContractClass = ContractClass::try_from(PathBuf::from( + static ref CONTRACT_CLASS: ContractClass = ContractClass::new_from_path( "starknet_programs/first_contract.json", - )).unwrap(); + ).unwrap(); static ref CONTRACT_PATH: PathBuf = PathBuf::from("starknet_programs/first_contract.json"); @@ -52,7 +52,7 @@ fn main() { vec![1000.into()], 0, Some(Vec::new()), - Some(Felt::from(i*2)), + Some(Felt::from(i * 2)), ) .unwrap(); @@ -63,14 +63,14 @@ fn main() { vec![], 0, Some(Vec::new()), - Some(Felt::from((i*2) + 1)), + Some(Felt::from((i * 2) + 1)), ) .unwrap(); - assert_eq!( - tx_exec_info.call_info.unwrap().retdata, - vec![((1000 * i) + 1000).into()] - ); + assert_eq!( + tx_exec_info.call_info.unwrap().retdata, + vec![((1000 * i) + 1000).into()] + ); } } diff --git a/src/testing/erc20.rs b/src/testing/erc20.rs new file mode 100644 index 000000000..eab540352 --- /dev/null +++ b/src/testing/erc20.rs @@ -0,0 +1,253 @@ +#![allow(unused_imports)] +use std::{collections::HashMap, io::Bytes, path::Path, sync::Arc}; + +use crate::{ + call_contract, + definitions::{ + block_context::{BlockContext, StarknetChainId}, + constants::CONSTRUCTOR_ENTRY_POINT_SELECTOR, + }, + execution::{ + execution_entry_point::ExecutionEntryPoint, CallType, TransactionExecutionContext, + }, + services::api::contract_classes::deprecated_contract_class::ContractClass, + state::{ + cached_state::CachedState, + in_memory_state_reader::InMemoryStateReader, + state_api::{State, StateReader}, + ExecutionResourcesManager, + }, + transaction::{error::TransactionError, DeployAccount, InvokeFunction}, + utils::calculate_sn_keccak, + EntryPointType, Felt252, +}; +use cairo_lang_starknet::casm_contract_class::CasmContractClass; +use cairo_vm::felt::felt_str; +use lazy_static::lazy_static; +use num_traits::Zero; +pub const ERC20_CONTRACT_PATH: &str = "starknet_programs/cairo2/ERC20.casm"; +use crate::{ + state::state_cache::StorageEntry, + utils::{felt_to_hash, Address, ClassHash}, +}; + +use super::{ + new_starknet_block_context_for_testing, ACCOUNT_CONTRACT_PATH, ACTUAL_FEE, + TEST_ACCOUNT_CONTRACT_ADDRESS, TEST_ACCOUNT_CONTRACT_CLASS_HASH, TEST_CLASS_HASH, + TEST_CONTRACT_ADDRESS, TEST_CONTRACT_PATH, TEST_ERC20_ACCOUNT_BALANCE_KEY, + TEST_ERC20_CONTRACT_CLASS_HASH, +}; + +#[test] +fn test_erc20_cairo2() { + // data to deploy + let erc20_class_hash: ClassHash = [2; 32]; + let test_data = include_bytes!("../../starknet_programs/cairo2/erc20.casm"); + let test_contract_class: CasmContractClass = serde_json::from_slice(test_data).unwrap(); + + // Create the deploy contract class + let program_data = include_bytes!("../../starknet_programs/cairo2/deploy_erc20.casm"); + let contract_class: CasmContractClass = serde_json::from_slice(program_data).unwrap(); + let entrypoints = contract_class.clone().entry_points_by_type; + let entrypoint_selector = &entrypoints.external.get(0).unwrap().selector; + + // Create state reader with class hash data + let mut contract_class_cache = HashMap::new(); + + let address = Address(1111.into()); + let class_hash: ClassHash = [1; 32]; + let nonce = Felt252::zero(); + + contract_class_cache.insert(class_hash, contract_class); + contract_class_cache.insert(erc20_class_hash, test_contract_class); + + let mut state_reader = InMemoryStateReader::default(); + state_reader + .address_to_class_hash_mut() + .insert(address.clone(), class_hash); + state_reader + .address_to_nonce_mut() + .insert(address.clone(), nonce); + + // Create state from the state_reader and contract cache. + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); + + let name_ = Felt252::from_bytes_be(b"some-token"); + let symbol_ = Felt252::from_bytes_be(b"my-super-awesome-token"); + let decimals_ = Felt252::from(24); + let initial_supply = Felt252::from(1000); + let recipient = + felt_str!("397149464972449753182583229366244826403270781177748543857889179957856017275"); + let erc20_salt = felt_str!("1234"); + // arguments of deploy contract + let calldata = vec![ + Felt252::from_bytes_be(&erc20_class_hash), + erc20_salt, + recipient, + name_, + decimals_, + initial_supply, + symbol_, + ]; + // set up remaining structures + + let caller_address = Address(0000.into()); + let entry_point_type = EntryPointType::External; + + let exec_entry_point = ExecutionEntryPoint::new( + address, + calldata, + Felt252::new(entrypoint_selector.clone()), + caller_address, + entry_point_type, + Some(CallType::Delegate), + Some(class_hash), + 100_000_000_000, + ); + + // Execute the entrypoint + let block_context = BlockContext::default(); + let mut tx_execution_context = TransactionExecutionContext::new( + Address(0.into()), + Felt252::zero(), + Vec::new(), + 0, + 10.into(), + block_context.invoke_tx_max_n_steps(), + 1.into(), + ); + let mut resources_manager = ExecutionResourcesManager::default(); + + let call_info = exec_entry_point + .execute( + &mut state, + &block_context, + &mut resources_manager, + &mut tx_execution_context, + false, + block_context.invoke_tx_max_n_steps, + ) + .unwrap(); + let erc20_address = call_info.call_info.unwrap().retdata.get(0).unwrap().clone(); + + // ACCOUNT 1 + let program_data_account = + include_bytes!("../../starknet_programs/cairo2/hello_world_account.casm"); + let contract_class_account: CasmContractClass = + serde_json::from_slice(program_data_account).unwrap(); + + state + .set_compiled_class(&felt_str!("1"), contract_class_account) + .unwrap(); + + let contract_address_salt = + felt_str!("2669425616857739096022668060305620640217901643963991674344872184515580705509"); + + let internal_deploy_account = DeployAccount::new( + felt_str!("1").to_be_bytes(), + 0, + 1.into(), + Felt252::zero(), + vec![2.into()], + vec![ + felt_str!( + "3233776396904427614006684968846859029149676045084089832563834729503047027074" + ), + felt_str!( + "707039245213420890976709143988743108543645298941971188668773816813012281203" + ), + ], + contract_address_salt, + StarknetChainId::TestNet.to_felt(), + ) + .unwrap(); + + let account_address_1 = internal_deploy_account + .execute(&mut state, &Default::default()) + .unwrap() + .validate_info + .unwrap() + .contract_address; + + // ACCOUNT 2 + let program_data_account = + include_bytes!("../../starknet_programs/cairo2/hello_world_account.casm"); + let contract_class_account: CasmContractClass = + serde_json::from_slice(program_data_account).unwrap(); + + state + .set_compiled_class(&felt_str!("1"), contract_class_account) + .unwrap(); + + let contract_address_salt = felt_str!("123123123123123"); + + let internal_deploy_account = DeployAccount::new( + felt_str!("1").to_be_bytes(), + 0, + 1.into(), + Felt252::zero(), + vec![2.into()], + vec![ + felt_str!( + "3233776396904427614006684968846859029149676045084089832563834729503047027074" + ), + felt_str!( + "707039245213420890976709143988743108543645298941971188668773816813012281203" + ), + ], + contract_address_salt, + StarknetChainId::TestNet.to_felt(), + ) + .unwrap(); + + let account_address_2 = internal_deploy_account + .execute(&mut state, &Default::default()) + .unwrap() + .validate_info + .unwrap() + .contract_address; + + // TRANSFER + let entrypoint_selector = Felt252::from_bytes_be(&calculate_sn_keccak(b"transfer")); + let calldata = vec![account_address_2.clone().0, Felt252::from(123)]; + + let retdata = call_contract( + erc20_address.clone(), + entrypoint_selector, + calldata, + &mut state, + BlockContext::default(), + account_address_1.clone(), + ) + .unwrap(); + + assert!(retdata.is_empty()); + + // GET BALANCE ACCOUNT 1 + let entrypoint_selector = Felt252::from_bytes_be(&calculate_sn_keccak(b"balance_of")); + let retdata = call_contract( + erc20_address.clone(), + entrypoint_selector, + vec![account_address_1.clone().0], + &mut state, + BlockContext::default(), + account_address_1.clone(), + ) + .unwrap(); + + assert_eq!(retdata, vec![877.into()]); + + // GET BALANCE ACCOUNT 2 + let entrypoint_selector = Felt252::from_bytes_be(&calculate_sn_keccak(b"balance_of")); + let retdata = call_contract( + erc20_address, + entrypoint_selector, + vec![account_address_2.0], + &mut state, + BlockContext::default(), + account_address_1, + ) + .unwrap(); + + assert_eq!(retdata, vec![123.into()]); +} diff --git a/src/testing/mod.rs b/src/testing/mod.rs index 60bda230d..6d784bab6 100644 --- a/src/testing/mod.rs +++ b/src/testing/mod.rs @@ -1,8 +1,9 @@ +pub mod erc20; pub mod state; pub mod state_error; pub mod type_utils; -use std::{collections::HashMap, path::PathBuf}; +use std::{collections::HashMap, sync::Arc}; use cairo_vm::felt::{felt_str, Felt252}; use lazy_static::lazy_static; @@ -40,7 +41,7 @@ lazy_static! { pub static ref TEST_CLASS_HASH: Felt252 = felt_str!("272"); pub static ref TEST_EMPTY_CONTRACT_CLASS_HASH: Felt252 = felt_str!("274"); pub static ref TEST_ERC20_CONTRACT_CLASS_HASH: Felt252 = felt_str!("4112"); - pub static ref TEST_FIB_COMPILED_CONTRACT_CLASS_HASH: Felt252 = felt_str!("27727"); + pub static ref TEST_FIB_COMPILED_CONTRACT_CLASS_HASH: Felt252 = felt_str!("1948962768849191111780391610229754715773924969841143100991524171924131413970"); // Storage keys. pub static ref TEST_ERC20_ACCOUNT_BALANCE_KEY: Felt252 = @@ -78,13 +79,6 @@ pub fn new_starknet_block_context_for_testing() -> BlockContext { ) } -pub fn get_contract_class

(path: P) -> Result> -where - P: Into, -{ - Ok(ContractClass::try_from(path.into())?) -} - pub fn create_account_tx_test_state( ) -> Result<(BlockContext, CachedState), Box> { let block_context = new_starknet_block_context_for_testing(); @@ -95,15 +89,15 @@ pub fn create_account_tx_test_state( let class_hash_to_class = HashMap::from([ ( test_account_contract_class_hash, - get_contract_class(ACCOUNT_CONTRACT_PATH)?, + ContractClass::from_path(ACCOUNT_CONTRACT_PATH)?, ), ( test_contract_class_hash, - get_contract_class(TEST_CONTRACT_PATH)?, + ContractClass::from_path(TEST_CONTRACT_PATH)?, ), ( test_erc20_class_hash, - get_contract_class(ERC20_CONTRACT_PATH)?, + ContractClass::from_path(ERC20_CONTRACT_PATH)?, ), ]); @@ -159,7 +153,7 @@ pub fn create_account_tx_test_state( .class_hash_to_contract_class_mut() .insert(class_hash, contract_class); } - state_reader + Arc::new(state_reader) }, Some(HashMap::new()), Some(HashMap::new()), diff --git a/src/testing/state.rs b/src/testing/state.rs index a28d8d04d..1d8b16097 100644 --- a/src/testing/state.rs +++ b/src/testing/state.rs @@ -1,4 +1,6 @@ use super::{state_error::StarknetStateError, type_utils::ExecutionInfo}; +use crate::execution::execution_entry_point::ExecutionResult; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use crate::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -20,8 +22,8 @@ use crate::{ }; use cairo_vm::felt::Felt252; use num_traits::{One, Zero}; -use starknet_contract_class::EntryPointType; use std::collections::HashMap; +use std::sync::Arc; // --------------------------------------------------------------------- /// StarkNet testing object. Represents a state of a StarkNet network. @@ -36,7 +38,7 @@ pub struct StarknetState { impl StarknetState { pub fn new(context: Option) -> Self { let block_context = context.unwrap_or_default(); - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let state = CachedState::new(state_reader, Some(HashMap::new()), Some(HashMap::new())); @@ -79,7 +81,6 @@ impl StarknetState { pub fn declare( &mut self, contract_class: ContractClass, - hash_value: Option, ) -> Result<(ClassHash, TransactionExecutionInfo), TransactionError> { let tx = Declare::new( contract_class, @@ -89,7 +90,6 @@ impl StarknetState { 0.into(), Vec::new(), 0.into(), - hash_value, )?; let tx_execution_info = tx.execute(&mut self.state, &self.block_context)?; @@ -148,14 +148,19 @@ impl StarknetState { let mut resources_manager = ExecutionResourcesManager::default(); let mut tx_execution_context = TransactionExecutionContext::default(); - let call_info = call.execute( + let ExecutionResult { call_info, .. } = call.execute( &mut self.state, &self.block_context, &mut resources_manager, &mut tx_execution_context, false, + self.block_context.invoke_tx_max_n_steps, )?; + let call_info = call_info.ok_or(StarknetStateError::Transaction( + TransactionError::CallInfoIsNone, + ))?; + let exec_info = ExecutionInfo::Call(Box::new(call_info.clone())); self.add_messages_and_events(&exec_info)?; @@ -176,14 +181,22 @@ impl StarknetState { remaining_gas: u128, ) -> Result<(Address, TransactionExecutionInfo), StarknetStateError> { let chain_id = self.block_context.starknet_os_config.chain_id.to_felt(); - let deploy = Deploy::new( - contract_address_salt, - contract_class.clone(), - constructor_calldata, - chain_id, - TRANSACTION_VERSION.clone(), - hash_value, - )?; + let deploy = match hash_value { + None => Deploy::new( + contract_address_salt, + contract_class.clone(), + constructor_calldata, + chain_id, + TRANSACTION_VERSION.clone(), + )?, + Some(hash_value) => Deploy::new_with_tx_hash( + contract_address_salt, + contract_class.clone(), + constructor_calldata, + TRANSACTION_VERSION.clone(), + hash_value, + )?, + }; let contract_address = deploy.contract_address.clone(); let contract_hash = deploy.contract_hash; let mut tx = Transaction::Deploy(deploy); @@ -277,23 +290,34 @@ impl StarknetState { None => self.state.get_nonce_at(&contract_address)?, }; - InvokeFunction::new( - contract_address, - entry_point_selector, - max_fee, - TRANSACTION_VERSION.clone(), - calldata, - signature, - self.chain_id(), - Some(nonce), - hash_value, - ) + match hash_value { + None => InvokeFunction::new( + contract_address, + entry_point_selector, + max_fee, + TRANSACTION_VERSION.clone(), + calldata, + signature, + self.chain_id(), + Some(nonce), + ), + Some(hash_value) => InvokeFunction::new_with_tx_hash( + contract_address, + entry_point_selector, + max_fee, + TRANSACTION_VERSION.clone(), + calldata, + signature, + Some(nonce), + hash_value, + ), + } } } #[cfg(test)] mod tests { - use std::{fs::File, io::BufReader, path::PathBuf}; + use std::path::PathBuf; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use num_traits::Num; @@ -314,9 +338,7 @@ mod tests { fn test_deploy() { let mut starknet_state = StarknetState::new(None); - let contract_reader = - BufReader::new(File::open("starknet_programs/fibonacci.json").unwrap()); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let contract_address_salt: Felt252 = 1.into(); @@ -336,6 +358,7 @@ mod tests { let mut actual_resources = HashMap::new(); actual_resources.insert("l1_gas_usage".to_string(), 1224); + actual_resources.insert("n_steps".to_string(), 0); let transaction_exec_info = TransactionExecutionInfo { validate_info: None, @@ -349,6 +372,7 @@ mod tests { entry_point_type: Some(EntryPointType::Constructor), ..Default::default() }), + revert_error: None, fee_transfer_info: None, actual_fee: 0, actual_resources, @@ -386,7 +410,7 @@ mod tests { #[test] fn test_declare() { let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -420,7 +444,7 @@ mod tests { .class_hash_to_contract_class_mut() .insert(class_hash, contract_class.clone()); - let state = CachedState::new(state_reader, Some(contract_class_cache), None); + let state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* -------------------------------------------- //* Create starknet state with previous data @@ -431,35 +455,30 @@ mod tests { starknet_state.state = state; starknet_state .state - .state_reader - .address_to_class_hash_mut() - .insert(sender_address.clone(), class_hash); + .set_class_hash_at(sender_address.clone(), class_hash) + .unwrap(); starknet_state .state - .state_reader - .address_to_nonce_mut() + .cache + .nonce_writes .insert(sender_address.clone(), nonce); + + starknet_state.state.set_storage_at(&storage_entry, storage); + starknet_state .state - .state_reader - .address_to_storage_mut() - .insert(storage_entry, storage); - starknet_state - .state - .state_reader - .class_hash_to_contract_class_mut() - .insert(class_hash, contract_class); + .set_contract_class(&class_hash, &contract_class) + .unwrap(); // -------------------------------------------- // Test declare with starknet state // -------------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); - let (ret_class_hash, _exec_info) = starknet_state - .declare(fib_contract_class.clone(), None) - .unwrap(); + let (ret_class_hash, _exec_info) = + starknet_state.declare(fib_contract_class.clone()).unwrap(); //* --------------------------------------- // Expected result @@ -500,9 +519,7 @@ mod tests { // 2) invoke call over fibonacci let mut starknet_state = StarknetState::new(None); - let contract_reader = - BufReader::new(File::open("starknet_programs/fibonacci.json").unwrap()); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let calldata = [1.into(), 1.into(), 10.into()].to_vec(); let contract_address_salt: Felt252 = 1.into(); @@ -556,6 +573,7 @@ mod tests { ) .unwrap(); let actual_resources = HashMap::from([ + ("n_steps".to_string(), 2933), ("l1_gas_usage".to_string(), 0), ("range_check_builtin".to_string(), 70), ("pedersen_builtin".to_string(), 16), @@ -592,7 +610,7 @@ mod tests { fn test_execute_entry_point_raw() { let mut starknet_state = StarknetState::new(None); let path = PathBuf::from("starknet_programs/fibonacci.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let contract_address_salt = 1.into(); let (contract_address, _exec_info) = starknet_state diff --git a/src/transaction/declare.rs b/src/transaction/declare.rs index ca077d423..cc832e071 100644 --- a/src/transaction/declare.rs +++ b/src/transaction/declare.rs @@ -1,6 +1,10 @@ +use crate::definitions::constants::QUERY_VERSION_BASE; +use crate::execution::execution_entry_point::ExecutionResult; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use crate::state::cached_state::CachedState; use crate::{ core::{ - contract_address::compute_deprecated_class_hash, errors::state_errors::StateError, + contract_address::compute_deprecated_class_hash, transaction_hash::calculate_declare_transaction_hash, }, definitions::{ @@ -14,10 +18,7 @@ use crate::{ services::api::contract_classes::deprecated_contract_class::ContractClass, state::state_api::{State, StateReader}, state::ExecutionResourcesManager, - transaction::{ - error::TransactionError, - fee::{calculate_tx_fee, execute_fee_transfer, FeeInfo}, - }, + transaction::error::TransactionError, utils::{ calculate_tx_resources, felt_to_hash, verify_no_calls_to_other_contracts, Address, ClassHash, @@ -25,10 +26,9 @@ use crate::{ }; use cairo_vm::felt::Felt252; use num_traits::Zero; -use starknet_contract_class::EntryPointType; -use std::collections::HashMap; -use super::Transaction; +use super::fee::charge_fee; +use super::{verify_version, Transaction}; // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ /// Represents an internal transaction in the StarkNet network that is a declaration of a Cairo @@ -63,23 +63,60 @@ impl Declare { version: Felt252, signature: Vec, nonce: Felt252, - hash_value: Option, ) -> Result { let hash = compute_deprecated_class_hash(&contract_class)?; let class_hash = felt_to_hash(&hash); - let hash_value = match hash_value { - Some(hash) => hash, - None => calculate_declare_transaction_hash( - &contract_class, - chain_id, - &sender_address, - max_fee, - version.clone(), - nonce.clone(), - )?, + let hash_value = calculate_declare_transaction_hash( + &contract_class, + chain_id, + &sender_address, + max_fee, + version.clone(), + nonce.clone(), + )?; + + let validate_entry_point_selector = VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(); + + let internal_declare = Declare { + class_hash, + sender_address, + tx_type: TransactionType::Declare, + validate_entry_point_selector, + version, + max_fee, + signature, + nonce, + hash_value, + contract_class, + skip_execute: false, + skip_validate: false, + skip_fee_transfer: false, }; + verify_version( + &internal_declare.version, + internal_declare.max_fee, + &internal_declare.nonce, + &internal_declare.signature, + )?; + + Ok(internal_declare) + } + + #[allow(clippy::too_many_arguments)] + pub fn new_with_tx_hash( + contract_class: ContractClass, + sender_address: Address, + max_fee: u128, + version: Felt252, + signature: Vec, + nonce: Felt252, + hash_value: Felt252, + ) -> Result { + let hash = compute_deprecated_class_hash(&contract_class)?; + let class_hash = felt_to_hash(&hash); + let validate_entry_point_selector = VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(); let internal_declare = Declare { @@ -98,7 +135,12 @@ impl Declare { skip_fee_transfer: false, }; - internal_declare.verify_version()?; + verify_version( + &internal_declare.version, + internal_declare.max_fee, + &internal_declare.nonce, + &internal_declare.signature, + )?; Ok(internal_declare) } @@ -108,31 +150,14 @@ impl Declare { Vec::from([bytes]) } - pub fn verify_version(&self) -> Result<(), TransactionError> { - if self.version.is_zero() { - if !self.max_fee.is_zero() { - return Err(TransactionError::InvalidMaxFee); - } - - if !self.nonce.is_zero() { - return Err(TransactionError::InvalidNonce); - } - } - - if self.version.is_zero() && !self.signature.len().is_zero() { - return Err(TransactionError::InvalidSignature); - } - Ok(()) - } - /// Executes a call to the cairo-vm using the accounts_validation.cairo contract to validate /// the contract that is being declared. Then it returns the transaction execution info of the run. - pub fn apply( + pub fn apply( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, ) -> Result { - self.verify_version()?; + verify_version(&self.version, self.max_fee, &self.nonce, &self.signature)?; // validate transaction let mut resources_manager = ExecutionResourcesManager::default(); @@ -148,12 +173,14 @@ impl Declare { TransactionType::Declare, changes, None, + 0, ) .map_err(|_| TransactionError::ResourcesCalculation)?; Ok(TransactionExecutionInfo::new_without_fee_info( validate_info, None, + None, actual_resources, Some(self.tx_type), )) @@ -174,13 +201,13 @@ impl Declare { ) } - pub fn run_validate_entrypoint( + pub fn run_validate_entrypoint( &self, - state: &mut S, + state: &mut CachedState, resources_manager: &mut ExecutionResourcesManager, block_context: &BlockContext, ) -> Result, TransactionError> { - if self.version.is_zero() { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(None); } @@ -197,54 +224,25 @@ impl Declare { 0, ); - let call_info = entry_point.execute( + let ExecutionResult { call_info, .. } = entry_point.execute( state, block_context, resources_manager, &mut self.get_execution_context(block_context.invoke_tx_max_n_steps), false, + block_context.validate_max_n_steps, )?; + let call_info = call_info.ok_or(TransactionError::CallInfoIsNone)?; + verify_no_calls_to_other_contracts(&call_info) .map_err(|_| TransactionError::UnauthorizedActionOnValidate)?; Ok(Some(call_info)) } - /// Calculates and charges the actual fee. - pub fn charge_fee( - &self, - state: &mut S, - resources: &HashMap, - block_context: &BlockContext, - ) -> Result { - if self.max_fee.is_zero() { - return Ok((None, 0)); - } - - let actual_fee = calculate_tx_fee( - resources, - block_context.starknet_os_config.gas_price, - block_context, - )?; - - let mut tx_execution_context = - self.get_execution_context(block_context.invoke_tx_max_n_steps); - let fee_transfer_info = if self.skip_fee_transfer { - None - } else { - Some(execute_fee_transfer( - state, - block_context, - &mut tx_execution_context, - actual_fee, - )?) - }; - Ok((fee_transfer_info, actual_fee)) - } - fn handle_nonce(&self, state: &mut S) -> Result<(), TransactionError> { - if self.version.is_zero() { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(()); } @@ -264,28 +262,27 @@ impl Declare { /// Calculates actual fee used by the transaction using the execution /// info returned by apply(), then updates the transaction execution info with the data of the fee. - pub fn execute( + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, ) -> Result { let mut tx_exec_info = self.apply(state, block_context)?; self.handle_nonce(state)?; - // Set contract class - match state.get_contract_class(&self.class_hash) { - Err(StateError::NoneCompiledHash(_)) => { - // Class is undeclared; declare it. - state.set_contract_class(&self.class_hash, &self.contract_class)?; - } - Err(error) => return Err(error.into()), - Ok(_) => { - // Class is already declared; cannot redeclare. - return Err(TransactionError::ClassAlreadyDeclared(self.class_hash)); - } - } - let (fee_transfer_info, actual_fee) = - self.charge_fee(state, &tx_exec_info.actual_resources, block_context)?; + let mut tx_execution_context = + self.get_execution_context(block_context.invoke_tx_max_n_steps); + let (fee_transfer_info, actual_fee) = charge_fee( + state, + &tx_exec_info.actual_resources, + block_context, + self.max_fee, + &mut tx_execution_context, + self.skip_fee_transfer, + )?; + + state.set_contract_class(&self.class_hash, &self.contract_class)?; + tx_exec_info.set_fee_info(actual_fee, fee_transfer_info); Ok(tx_exec_info) @@ -320,7 +317,7 @@ mod tests { vm::runners::cairo_runner::ExecutionResources, }; use num_traits::{One, Zero}; - use std::{collections::HashMap, fs::File, io::BufReader, path::PathBuf}; + use std::{collections::HashMap, path::PathBuf, sync::Arc}; use crate::{ definitions::{ @@ -340,10 +337,8 @@ mod tests { #[test] fn declare_fibonacci() { // accounts contract class must be stored before running declaration of fibonacci - let contract_reader = BufReader::new( - File::open("starknet_programs/account_without_validation.json").unwrap(), - ); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); + let contract_class = + ContractClass::from_path("starknet_programs/account_without_validation.json").unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -368,14 +363,14 @@ mod tests { .address_to_nonce_mut() .insert(sender_address, Felt252::new(1)); - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_reader = BufReader::new(File::open("starknet_programs/fibonacci.json").unwrap()); - let fib_contract_class = ContractClass::try_from(fib_reader).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); @@ -388,7 +383,6 @@ mod tests { 1.into(), Vec::new(), Felt252::zero(), - None, ) .unwrap(); @@ -424,6 +418,7 @@ mod tests { }); let actual_resources = HashMap::from([ + ("n_steps".to_string(), 2348), ("l1_gas_usage".to_string(), 0), ("range_check_builtin".to_string(), 57), ("pedersen_builtin".to_string(), 15), @@ -431,6 +426,7 @@ mod tests { let transaction_exec_info = TransactionExecutionInfo { validate_info, call_info: None, + revert_error: None, fee_transfer_info: None, actual_fee: 0, actual_resources, @@ -452,7 +448,7 @@ mod tests { fn verify_version_zero_should_fail_max_fee() { // accounts contract class must be stored before running declaration of fibonacci let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -463,28 +459,12 @@ mod tests { contract_class_cache.insert(class_hash, contract_class); - // store sender_address - let sender_address = Address(1.into()); - // this is not conceptually correct as the sender address would be an - // Account contract (not the contract that we are currently declaring) - // but for testing reasons its ok - - let mut state_reader = InMemoryStateReader::default(); - state_reader - .address_to_class_hash_mut() - .insert(sender_address.clone(), class_hash); - state_reader - .address_to_nonce_mut() - .insert(sender_address, Felt252::new(1)); - - let _state = CachedState::new(state_reader, Some(contract_class_cache), None); - //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); let max_fee = 1000; @@ -499,7 +479,6 @@ mod tests { version, Vec::new(), Felt252::from(max_fee), - None, ); // --------------------- @@ -516,7 +495,7 @@ mod tests { fn verify_version_zero_should_fail_nonce() { // accounts contract class must be stored before running declaration of fibonacci let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -541,14 +520,14 @@ mod tests { .address_to_nonce_mut() .insert(sender_address, Felt252::new(1)); - let _state = CachedState::new(state_reader, Some(contract_class_cache), None); + let _state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); let nonce = Felt252::from(148); @@ -563,7 +542,6 @@ mod tests { version, Vec::new(), nonce, - None, ); // --------------------- @@ -580,7 +558,7 @@ mod tests { fn verify_signature_should_fail_not_empty_list() { // accounts contract class must be stored before running declaration of fibonacci let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -605,14 +583,14 @@ mod tests { .address_to_nonce_mut() .insert(sender_address, Felt252::new(1)); - let _state = CachedState::new(state_reader, Some(contract_class_cache), None); + let _state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); let signature = vec![1.into(), 2.into()]; @@ -626,7 +604,6 @@ mod tests { 0.into(), signature, Felt252::zero(), - None, ); // --------------------- @@ -640,10 +617,10 @@ mod tests { } #[test] - fn execute_class_already_declared_should_fail() { + fn execute_class_already_declared_should_redeclare() { // accounts contract class must be stored before running declaration of fibonacci let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -668,14 +645,14 @@ mod tests { .address_to_nonce_mut() .insert(sender_address, Felt252::zero()); - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); @@ -688,11 +665,10 @@ mod tests { 1.into(), Vec::new(), Felt252::zero(), - None, ) .unwrap(); - let internal_declare_error = Declare::new( + let second_internal_declare = Declare::new( fib_contract_class, chain_id, Address(Felt252::one()), @@ -700,7 +676,6 @@ mod tests { 1.into(), Vec::new(), Felt252::one(), - None, ) .unwrap(); @@ -708,23 +683,20 @@ mod tests { .execute(&mut state, &BlockContext::default()) .unwrap(); - let expected_error = internal_declare_error.execute(&mut state, &BlockContext::default()); + assert!(state.get_contract_class(&class_hash).is_ok()); - // --------------------- - // Comparison - // --------------------- - assert!(expected_error.is_err()); - assert_matches!( - expected_error.unwrap_err(), - TransactionError::ClassAlreadyDeclared(..) - ); + second_internal_declare + .execute(&mut state, &BlockContext::default()) + .unwrap(); + + assert!(state.get_contract_class(&class_hash).is_ok()); } #[test] fn execute_transaction_twice_should_fail() { // accounts contract class must be stored before running declaration of fibonacci let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -749,14 +721,14 @@ mod tests { .address_to_nonce_mut() .insert(sender_address, Felt252::zero()); - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); @@ -769,7 +741,6 @@ mod tests { 1.into(), Vec::new(), Felt252::zero(), - None, ) .unwrap(); @@ -795,13 +766,13 @@ mod tests { // Instantiate CachedState let contract_class_cache = HashMap::new(); - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); // There are no account contracts in the state, so the transaction should fail - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); @@ -813,7 +784,6 @@ mod tests { 1.into(), Vec::new(), Felt252::zero(), - None, ) .unwrap(); @@ -830,7 +800,7 @@ mod tests { fn execute_transaction_charge_fee_should_fail() { // accounts contract class must be stored before running declaration of fibonacci let path = PathBuf::from("starknet_programs/account_without_validation.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // Instantiate CachedState let mut contract_class_cache = HashMap::new(); @@ -855,14 +825,14 @@ mod tests { .address_to_nonce_mut() .insert(sender_address, Felt252::zero()); - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* --------------------------------------- //* Test declare with previous data //* --------------------------------------- - let fib_path = PathBuf::from("starknet_programs/fibonacci.json"); - let fib_contract_class = ContractClass::try_from(fib_path).unwrap(); + let fib_contract_class = + ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); let chain_id = StarknetChainId::TestNet.to_felt(); @@ -875,14 +845,13 @@ mod tests { 1.into(), Vec::new(), Felt252::zero(), - None, ) .unwrap(); // We expect a fee transfer failure because the fee token contract is not set up assert_matches!( internal_declare.execute(&mut state, &BlockContext::default()), - Err(TransactionError::FeeError(e)) if e == "Fee transfer failure" + Err(TransactionError::FeeTransferError(_)) ); } } diff --git a/src/transaction/declare_v2.rs b/src/transaction/declare_v2.rs index 910cdcd8c..88594ef30 100644 --- a/src/transaction/declare_v2.rs +++ b/src/transaction/declare_v2.rs @@ -1,3 +1,11 @@ +use super::fee::charge_fee; +use super::{verify_version, Transaction}; +use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_class_hash}; +use crate::definitions::constants::QUERY_VERSION_BASE; +use crate::execution::execution_entry_point::ExecutionResult; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; + +use crate::state::cached_state::CachedState; use crate::{ core::transaction_hash::calculate_declare_v2_transaction_hash, definitions::{ @@ -6,26 +14,22 @@ use crate::{ transaction_type::TransactionType, }, execution::{ - execution_entry_point::ExecutionEntryPoint, CallInfo, CallType, - TransactionExecutionContext, TransactionExecutionInfo, + execution_entry_point::ExecutionEntryPoint, CallType, TransactionExecutionContext, + TransactionExecutionInfo, }, state::state_api::{State, StateReader}, state::ExecutionResourcesManager, - transaction::{ - error::TransactionError, - fee::{calculate_tx_fee, execute_fee_transfer, FeeInfo}, - invoke_function::verify_no_calls_to_other_contracts, - }, + transaction::{error::TransactionError, invoke_function::verify_no_calls_to_other_contracts}, utils::{calculate_tx_resources, Address}, }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use cairo_lang_starknet::contract_class::ContractClass as SierraContractClass; use cairo_vm::felt::Felt252; use num_traits::Zero; -use starknet_contract_class::EntryPointType; -use std::collections::HashMap; -use super::Transaction; +/// Represents a declare transaction in the starknet network. +/// Declare creates a blueprint of a contract class that is used to deploy instances of the contract +/// DeclareV2 is meant to be used with the new cairo contract sintax, starting from Cairo1. #[derive(Debug, Clone)] pub struct DeclareV2 { pub sender_address: Address, @@ -37,17 +41,31 @@ pub struct DeclareV2 { pub nonce: Felt252, pub compiled_class_hash: Felt252, pub sierra_contract_class: SierraContractClass, + pub sierra_class_hash: Felt252, pub hash_value: Felt252, - pub casm_class: once_cell::unsync::OnceCell, + pub casm_class: Option, pub skip_validate: bool, pub skip_execute: bool, pub skip_fee_transfer: bool, } impl DeclareV2 { + /// Creates a new instance of a [DeclareV2]. + /// It will calculate the sierra class hash and the transaction hash. + /// ## Parameters: + /// - sierra_contract_class: The sierra contract class of the contract to declare + /// - casm_contract_class: The casm contract class of the contract to declare. This is optional. + /// - compiled_class_hash: the class hash of the contract compiled with Cairo1 or newer. + /// - chain_id: Id of the network where is going to be declare, those can be: Mainnet, Testnet. + /// - sender_address: The address of the account declaring the contract. + /// - max_fee: refers to max amount of fee that a declare takes. + /// - version: The version of cairo contract being declare. + /// - signature: Array of felts with the signatures of the contract. + /// - nonce: The nonce of the contract. #[allow(clippy::too_many_arguments)] pub fn new( sierra_contract_class: &SierraContractClass, + casm_contract_class: Option, compiled_class_hash: Felt252, chain_id: Felt252, sender_address: Address, @@ -55,25 +73,65 @@ impl DeclareV2 { version: Felt252, signature: Vec, nonce: Felt252, - hash_value: Option, ) -> Result { - let validate_entry_point_selector = VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(); + let sierra_class_hash = compute_sierra_class_hash(sierra_contract_class)?; - let hash_value = match hash_value { - Some(hash) => hash, - None => calculate_declare_v2_transaction_hash( - sierra_contract_class, - compiled_class_hash.clone(), - chain_id, - &sender_address, - max_fee, - version.clone(), - nonce.clone(), - )?, - }; + let hash_value = calculate_declare_v2_transaction_hash( + sierra_class_hash.clone(), + compiled_class_hash.clone(), + chain_id, + &sender_address, + max_fee, + version.clone(), + nonce.clone(), + )?; + + Self::new_with_sierra_class_hash_and_tx_hash( + sierra_contract_class, + sierra_class_hash, + casm_contract_class, + compiled_class_hash, + sender_address, + max_fee, + version, + signature, + nonce, + hash_value, + ) + } + + /// Creates a new instance of a declare with a precomputed sierra class hash and transaction hash. + /// ## Parameters: + /// - sierra_contract_class: The sierra contract class of the contract to declare + /// - sierra_class_hash: The precomputed hash for the sierra contract + /// - casm_contract_class: The casm contract class of the contract to declare. This is optional. + /// - compiled_class_hash: the class hash of the contract compiled with Cairo1 or newer. + /// - sender_address: The address of the account declaring the contract. + /// - max_fee: refers to max amount of fee that a declare takes. + /// - version: The version of cairo contract being declare. + /// - signature: Array of felts with the signatures of the contract. + /// - nonce: The nonce of the contract. + /// - hash_value: The transaction hash_value. + /// SAFETY: if `sierra_class_hash` doesn't correspond to the `sierra_contract_class` invariants + /// may not hold. + #[allow(clippy::too_many_arguments)] + pub fn new_with_sierra_class_hash_and_tx_hash( + sierra_contract_class: &SierraContractClass, + sierra_class_hash: Felt252, + casm_contract_class: Option, + compiled_class_hash: Felt252, + sender_address: Address, + max_fee: u128, + version: Felt252, + signature: Vec, + nonce: Felt252, + hash_value: Felt252, + ) -> Result { + let validate_entry_point_selector = VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(); let internal_declare = DeclareV2 { sierra_contract_class: sierra_contract_class.to_owned(), + sierra_class_hash, sender_address, tx_type: TransactionType::Declare, validate_entry_point_selector, @@ -83,42 +141,117 @@ impl DeclareV2 { nonce, compiled_class_hash, hash_value, - casm_class: Default::default(), + casm_class: casm_contract_class, skip_execute: false, skip_validate: false, skip_fee_transfer: false, }; - internal_declare.verify_version()?; + verify_version( + &internal_declare.version, + internal_declare.max_fee, + &internal_declare.nonce, + &internal_declare.signature, + )?; Ok(internal_declare) } - pub fn verify_version(&self) -> Result<(), TransactionError> { - if self.version.is_zero() { - if self.sender_address != Address(1.into()) { - return Err(TransactionError::InvalidSenderAddress); - } - - if self.max_fee != 0 { - return Err(TransactionError::InvalidMaxFee); - } + // creates a new instance of a declare but without the computation of the transaction hash. + /// ## Parameters: + /// - sierra_contract_class: The sierra contract class of the contract to declare. + /// - casm_contract_class: The casm contract class of the contract to declare. This is optional. + /// - compiled_class_hash: the class hash of the contract compiled with Cairo1 or newer. + /// - sender_address: The address of the account declaring the contract. + /// - max_fee: refers to max amount of fee that a declare takes. + /// - version: The version of cairo contract being declare. + /// - signature: Array of felts with the signatures of the contract. + /// - nonce: The nonce of the contract. + /// - hash_value: The transaction hash. + #[allow(clippy::too_many_arguments)] + pub fn new_with_tx_hash( + sierra_contract_class: &SierraContractClass, + casm_contract_class: Option, + compiled_class_hash: Felt252, + sender_address: Address, + max_fee: u128, + version: Felt252, + signature: Vec, + nonce: Felt252, + hash_value: Felt252, + ) -> Result { + let sierra_class_hash = compute_sierra_class_hash(sierra_contract_class)?; - if self.nonce != 0.into() { - return Err(TransactionError::InvalidNonce); - } + Self::new_with_sierra_class_hash_and_tx_hash( + sierra_contract_class, + sierra_class_hash, + casm_contract_class, + compiled_class_hash, + sender_address, + max_fee, + version, + signature, + nonce, + hash_value, + ) + } - if self.signature.is_empty() { - return Err(TransactionError::InvalidSignature); - } - } + /// Creates a new instance of a [DeclareV2] but without the computation of the sierra class hash. + /// ## Parameters: + /// - sierra_contract_class: The sierra contract class of the contract to declare + /// - sierra_class_hash: The precomputed hash for the sierra contract + /// - casm_contract_class: The casm contract class of the contract to declare. This is optional. + /// - compiled_class_hash: the class hash of the contract compiled with Cairo1 or newer. + /// - chain_id: Id of the network where is going to be declare, those can be: Mainnet, Testnet. + /// - sender_address: The address of the account declaring the contract. + /// - max_fee: refers to max amount of fee that a declare takes. + /// - version: The version of cairo contract being declare. + /// - signature: Array of felts with the signatures of the contract. + /// - nonce: The nonce of the contract. + #[allow(clippy::too_many_arguments)] + pub fn new_with_sierra_class_hash( + sierra_contract_class: &SierraContractClass, + sierra_class_hash: Felt252, + casm_contract_class: Option, + compiled_class_hash: Felt252, + chain_id: Felt252, + sender_address: Address, + max_fee: u128, + version: Felt252, + signature: Vec, + nonce: Felt252, + ) -> Result { + let hash_value = calculate_declare_v2_transaction_hash( + sierra_class_hash.clone(), + compiled_class_hash.clone(), + chain_id, + &sender_address, + max_fee, + version.clone(), + nonce.clone(), + )?; - Ok(()) + Self::new_with_sierra_class_hash_and_tx_hash( + sierra_contract_class, + sierra_class_hash, + casm_contract_class, + compiled_class_hash, + sender_address, + max_fee, + version, + signature, + nonce, + hash_value, + ) } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ // Account Functions // ~~~~~~~~~~~~~~~~~~~~~~~~~~~ + + /// creates the a new TransactionExecutionContexts which represent the state of the net after executing the contract. + /// ## Parameter: + /// n_steps: the number of steps that are required to execute the contract. pub fn get_execution_context(&self, n_steps: u64) -> TransactionExecutionContext { TransactionExecutionContext::new( self.sender_address.clone(), @@ -131,48 +264,16 @@ impl DeclareV2 { ) } + /// returns the calldata with which the contract is executed pub fn get_calldata(&self) -> Vec { let bytes = self.compiled_class_hash.clone(); Vec::from([bytes]) } - /// Calculates and charges the actual fee. - pub fn charge_fee( - &self, - state: &mut S, - resources: &HashMap, - block_context: &BlockContext, - ) -> Result { - if self.max_fee.is_zero() { - return Ok((None, 0)); - } - - let actual_fee = calculate_tx_fee( - resources, - block_context.starknet_os_config.gas_price, - block_context, - )?; - - let mut tx_execution_context = - self.get_execution_context(block_context.invoke_tx_max_n_steps); - let fee_transfer_info = if self.skip_fee_transfer { - None - } else { - Some(execute_fee_transfer( - state, - block_context, - &mut tx_execution_context, - actual_fee, - )?) - }; - - Ok((fee_transfer_info, actual_fee)) - } - // TODO: delete once used #[allow(dead_code)] fn handle_nonce(&self, state: &mut S) -> Result<(), TransactionError> { - if self.version.is_zero() { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(()); } @@ -190,19 +291,23 @@ impl DeclareV2 { Ok(()) } - pub fn execute( + /// Execute the validation of the contract in the cairo-vm. Returns a TransactionExecutionInfo if succesful. + /// ## Parameter: + /// - state: An state that implements the State and StateReader traits. + /// - block_context: The block that contains the execution context + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, ) -> Result { - self.verify_version()?; + verify_version(&self.version, self.max_fee, &self.nonce, &self.signature)?; let initial_gas = INITIAL_GAS_COST; let mut resources_manager = ExecutionResourcesManager::default(); - let (validate_info, _remaining_gas) = if self.skip_validate { - (None, 0) + let (execution_result, _remaining_gas) = if self.skip_validate { + (ExecutionResult::default(), 0) } else { let (info, gas) = self.run_validate_entrypoint( initial_gas, @@ -210,25 +315,34 @@ impl DeclareV2 { &mut resources_manager, block_context, )?; - (Some(info), gas) + (info, gas) }; let storage_changes = state.count_actual_storage_changes(); let actual_resources = calculate_tx_resources( resources_manager, - &[validate_info.clone()], + &[execution_result.call_info.clone()], self.tx_type, storage_changes, None, + execution_result.n_reverted_steps, )?; + let mut tx_execution_context = + self.get_execution_context(block_context.invoke_tx_max_n_steps); + let (fee_transfer_info, actual_fee) = charge_fee( + state, + &actual_resources, + block_context, + self.max_fee, + &mut tx_execution_context, + self.skip_fee_transfer, + )?; self.compile_and_store_casm_class(state)?; - let (fee_transfer_info, actual_fee) = - self.charge_fee(state, &actual_resources, block_context)?; - let mut tx_exec_info = TransactionExecutionInfo::new_without_fee_info( - validate_info, + execution_result.call_info, + None, None, actual_resources, Some(self.tx_type), @@ -242,26 +356,34 @@ impl DeclareV2 { &self, state: &mut S, ) -> Result<(), TransactionError> { - let casm_class = self - .casm_class - .get_or_try_init(|| { + let casm_class = match &self.casm_class { + None => { CasmContractClass::from_contract_class(self.sierra_contract_class.clone(), true) - }) - .map_err(|e| TransactionError::SierraCompileError(e.to_string()))?; + .map_err(|e| TransactionError::SierraCompileError(e.to_string()))? + } + Some(casm_contract_class) => casm_contract_class.clone(), + }; - state.set_compiled_class_hash(&self.hash_value, &self.compiled_class_hash)?; - state.set_compiled_class(&self.compiled_class_hash, casm_class.clone())?; + let casm_class_hash = compute_casm_class_hash(&casm_class)?; + if casm_class_hash != self.compiled_class_hash { + return Err(TransactionError::InvalidCompiledClassHash( + casm_class_hash.to_string(), + self.compiled_class_hash.to_string(), + )); + } + state.set_compiled_class_hash(&self.sierra_class_hash, &self.compiled_class_hash)?; + state.set_compiled_class(&self.compiled_class_hash, casm_class)?; Ok(()) } - fn run_validate_entrypoint( + fn run_validate_entrypoint( &self, mut remaining_gas: u128, - state: &mut S, + state: &mut CachedState, resources_manager: &mut ExecutionResourcesManager, block_context: &BlockContext, - ) -> Result<(CallInfo, u128), TransactionError> { + ) -> Result<(ExecutionResult, u128), TransactionError> { let calldata = [self.compiled_class_hash.clone()].to_vec(); let entry_point = ExecutionEntryPoint { @@ -279,21 +401,25 @@ impl DeclareV2 { let mut tx_execution_context = self.get_execution_context(block_context.validate_max_n_steps); - let call_info = if self.skip_execute { - None + let execution_result = if self.skip_execute { + ExecutionResult::default() } else { - Some(entry_point.execute( + entry_point.execute( state, block_context, resources_manager, &mut tx_execution_context, - false, - )?) + true, + block_context.validate_max_n_steps, + )? }; - let call_info = verify_no_calls_to_other_contracts(&call_info)?; - remaining_gas -= call_info.gas_consumed; - Ok((call_info, remaining_gas)) + if execution_result.call_info.is_some() { + verify_no_calls_to_other_contracts(&execution_result.call_info)?; + remaining_gas -= execution_result.call_info.clone().unwrap().gas_consumed; + } + + Ok((execution_result, remaining_gas)) } // --------------- @@ -318,54 +444,275 @@ impl DeclareV2 { #[cfg(test)] mod tests { + use std::sync::Arc; use std::{collections::HashMap, fs::File, io::BufReader, path::PathBuf}; use super::DeclareV2; + use crate::core::contract_address::{compute_casm_class_hash, compute_sierra_class_hash}; + use crate::definitions::constants::QUERY_VERSION_BASE; use crate::services::api::contract_classes::compiled_class::CompiledClass; use crate::state::state_api::StateReader; use crate::{ - definitions::block_context::StarknetChainId, state::cached_state::CachedState, - state::in_memory_state_reader::InMemoryStateReader, utils::Address, + state::cached_state::CachedState, state::in_memory_state_reader::InMemoryStateReader, + utils::Address, }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; use cairo_vm::felt::Felt252; use num_traits::{One, Zero}; #[test] - fn create_declare_v2_test() { + fn create_declare_v2_without_casm_contract_class_test() { // read file to create sierra contract class + let version; + let path; #[cfg(not(feature = "cairo_1_tests"))] - let path = PathBuf::from("starknet_programs/cairo2/fibonacci.sierra"); + { + version = Felt252::from(2); + path = PathBuf::from("starknet_programs/cairo2/fibonacci.sierra"); + } #[cfg(feature = "cairo_1_tests")] - let path = PathBuf::from("starknet_programs/cairo1/fibonacci.sierra"); + { + version = Felt252::from(1); + path = PathBuf::from("starknet_programs/cairo1/fibonacci.sierra"); + } let file = File::open(path).unwrap(); let reader = BufReader::new(file); let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass = serde_json::from_reader(reader).unwrap(); - let chain_id = StarknetChainId::TestNet.to_felt(); + let sender_address = Address(1.into()); + let casm_class = + CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); + let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); + + // create internal declare v2 + + let internal_declare = DeclareV2::new_with_tx_hash( + &sierra_contract_class, + None, + casm_class_hash, + sender_address, + 0, + version, + [1.into()].to_vec(), + Felt252::zero(), + Felt252::one(), + ) + .unwrap(); + + // crate state to store casm contract class + let casm_contract_class_cache = HashMap::new(); + let state_reader = Arc::new(InMemoryStateReader::default()); + let mut state = CachedState::new(state_reader, None, Some(casm_contract_class_cache)); + + // call compile and store + assert!(internal_declare + .compile_and_store_casm_class(&mut state) + .is_ok()); + + // test we can retreive the data + let expected_casm_class = CasmContractClass::from_contract_class( + internal_declare.sierra_contract_class.clone(), + true, + ) + .unwrap(); + + let casm_class = match state + .get_contract_class(&internal_declare.compiled_class_hash.to_be_bytes()) + .unwrap() + { + CompiledClass::Casm(casm) => *casm, + _ => unreachable!(), + }; + + assert_eq!(expected_casm_class, casm_class); + } + + #[test] + fn create_declare_v2_with_casm_contract_class_test() { + // read file to create sierra contract class + let version; + let path; + #[cfg(not(feature = "cairo_1_tests"))] + { + version = Felt252::from(2); + path = PathBuf::from("starknet_programs/cairo2/fibonacci.sierra"); + } + + #[cfg(feature = "cairo_1_tests")] + { + version = Felt252::from(1); + path = PathBuf::from("starknet_programs/cairo1/fibonacci.sierra"); + } + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass = + serde_json::from_reader(reader).unwrap(); let sender_address = Address(1.into()); + let casm_class = + CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); + let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); // create internal declare v2 - let internal_declare = DeclareV2::new( + let internal_declare = DeclareV2::new_with_tx_hash( &sierra_contract_class, + Some(casm_class), + casm_class_hash, + sender_address, + 0, + version, + [1.into()].to_vec(), + Felt252::zero(), Felt252::one(), - chain_id, + ) + .unwrap(); + + // crate state to store casm contract class + let casm_contract_class_cache = HashMap::new(); + let state_reader = Arc::new(InMemoryStateReader::default()); + let mut state = CachedState::new(state_reader, None, Some(casm_contract_class_cache)); + + // call compile and store + assert!(internal_declare + .compile_and_store_casm_class(&mut state) + .is_ok()); + + // test we can retreive the data + let expected_casm_class = CasmContractClass::from_contract_class( + internal_declare.sierra_contract_class.clone(), + true, + ) + .unwrap(); + + let casm_class = match state + .get_contract_class(&internal_declare.compiled_class_hash.to_be_bytes()) + .unwrap() + { + CompiledClass::Casm(casm) => *casm, + _ => unreachable!(), + }; + + assert_eq!(expected_casm_class, casm_class); + } + + #[test] + fn create_declare_v2_test_with_version_query() { + // read file to create sierra contract class + let version; + let path; + #[cfg(not(feature = "cairo_1_tests"))] + { + version = &2.into() | &QUERY_VERSION_BASE.clone(); + path = PathBuf::from("starknet_programs/cairo2/fibonacci.sierra"); + } + + #[cfg(feature = "cairo_1_tests")] + { + version = &1.into() | &QUERY_VERSION_BASE.clone(); + path = PathBuf::from("starknet_programs/cairo1/fibonacci.sierra"); + } + + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass = + serde_json::from_reader(reader).unwrap(); + let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); + let sender_address = Address(1.into()); + let casm_class = + CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); + let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); + + // create internal declare v2 + + let internal_declare = DeclareV2::new_with_sierra_class_hash_and_tx_hash( + &sierra_contract_class, + sierra_class_hash, + Some(casm_class), + casm_class_hash, + sender_address, + 0, + version, + vec![], + Felt252::zero(), + Felt252::zero(), + ) + .unwrap(); + + // crate state to store casm contract class + let casm_contract_class_cache = HashMap::new(); + let state_reader = Arc::new(InMemoryStateReader::default()); + let mut state = CachedState::new(state_reader, None, Some(casm_contract_class_cache)); + + // call compile and store + assert!(internal_declare + .compile_and_store_casm_class(&mut state) + .is_ok()); + + // test we can retreive the data + let expected_casm_class = CasmContractClass::from_contract_class( + internal_declare.sierra_contract_class.clone(), + true, + ) + .unwrap(); + + let casm_class = match state + .get_contract_class(&internal_declare.compiled_class_hash.to_be_bytes()) + .unwrap() + { + CompiledClass::Casm(casm) => *casm, + _ => unreachable!(), + }; + + assert_eq!(expected_casm_class, casm_class); + } + + #[test] + fn create_declare_v2_with_casm_contract_class_none_test() { + // read file to create sierra contract class + let version; + let path; + #[cfg(not(feature = "cairo_1_tests"))] + { + version = Felt252::from(2); + path = PathBuf::from("starknet_programs/cairo2/fibonacci.sierra"); + } + + #[cfg(feature = "cairo_1_tests")] + { + version = Felt252::from(1); + path = PathBuf::from("starknet_programs/cairo1/fibonacci.sierra"); + } + + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass = + serde_json::from_reader(reader).unwrap(); + let sender_address = Address(1.into()); + let casm_class = + CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); + let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); + + // create internal declare v2 + + let internal_declare = DeclareV2::new_with_tx_hash( + &sierra_contract_class, + None, + casm_class_hash, sender_address, 0, - 0.into(), + version, [1.into()].to_vec(), Felt252::zero(), - Some(Felt252::one()), + Felt252::one(), ) .unwrap(); // crate state to store casm contract class let casm_contract_class_cache = HashMap::new(); - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, None, Some(casm_contract_class_cache)); // call compile and store @@ -390,4 +737,64 @@ mod tests { assert_eq!(expected_casm_class, casm_class); } + + #[test] + fn create_declare_v2_wrong_casm_class_hash_test() { + // read file to create sierra contract class + let version; + let path; + #[cfg(not(feature = "cairo_1_tests"))] + { + version = Felt252::from(2); + path = PathBuf::from("starknet_programs/cairo2/fibonacci.sierra"); + } + + #[cfg(feature = "cairo_1_tests")] + { + version = Felt252::from(1); + path = PathBuf::from("starknet_programs/cairo1/fibonacci.sierra"); + } + + let file = File::open(path).unwrap(); + let reader = BufReader::new(file); + let sierra_contract_class: cairo_lang_starknet::contract_class::ContractClass = + serde_json::from_reader(reader).unwrap(); + let sender_address = Address(1.into()); + let casm_class = + CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); + let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); + + let sended_class_hash = Felt252::from(5); + // create internal declare v2 + + let internal_declare = DeclareV2::new_with_tx_hash( + &sierra_contract_class, + None, + sended_class_hash.clone(), + sender_address, + 0, + version, + [1.into()].to_vec(), + Felt252::zero(), + Felt252::one(), + ) + .unwrap(); + + // crate state to store casm contract class + let casm_contract_class_cache = HashMap::new(); + let state_reader = Arc::new(InMemoryStateReader::default()); + let mut state = CachedState::new(state_reader, None, Some(casm_contract_class_cache)); + + let expected_err = format!( + "Invalid compiled class, expected class hash: {}, but received: {}", + casm_class_hash, sended_class_hash + ); + assert_eq!( + internal_declare + .compile_and_store_casm_class(&mut state) + .unwrap_err() + .to_string(), + expected_err + ); + } } diff --git a/src/transaction/deploy.rs b/src/transaction/deploy.rs index f6655756d..35b0ef779 100644 --- a/src/transaction/deploy.rs +++ b/src/transaction/deploy.rs @@ -1,3 +1,6 @@ +use crate::execution::execution_entry_point::ExecutionResult; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use crate::state::cached_state::CachedState; use crate::{ core::{ contract_address::compute_deprecated_class_hash, errors::state_errors::StateError, @@ -26,10 +29,10 @@ use crate::{ }; use cairo_vm::felt::Felt252; use num_traits::Zero; -use starknet_contract_class::EntryPointType; use super::Transaction; +/// Represents a Deploy Transaction in the starknet network #[derive(Debug, Clone)] pub struct Deploy { pub hash_value: Felt252, @@ -51,7 +54,6 @@ impl Deploy { constructor_calldata: Vec, chain_id: Felt252, version: Felt252, - hash_value: Option, ) -> Result { let class_hash = compute_deprecated_class_hash(&contract_class) .map_err(|_| SyscallHandlerError::ErrorComputingHash)?; @@ -64,15 +66,12 @@ impl Deploy { Address(Felt252::zero()), )?); - let hash_value = match hash_value { - Some(hash) => hash, - None => calculate_deploy_transaction_hash( - version.clone(), - &contract_address, - &constructor_calldata, - chain_id, - )?, - }; + let hash_value = calculate_deploy_transaction_hash( + version.clone(), + &contract_address, + &constructor_calldata, + chain_id, + )?; Ok(Deploy { hash_value, @@ -88,6 +87,39 @@ impl Deploy { }) } + pub fn new_with_tx_hash( + contract_address_salt: Felt252, + contract_class: ContractClass, + constructor_calldata: Vec, + version: Felt252, + hash_value: Felt252, + ) -> Result { + let class_hash = compute_deprecated_class_hash(&contract_class) + .map_err(|_| SyscallHandlerError::ErrorComputingHash)?; + + let contract_hash: ClassHash = felt_to_hash(&class_hash); + let contract_address = Address(calculate_contract_address( + &contract_address_salt, + &class_hash, + &constructor_calldata, + Address(Felt252::zero()), + )?); + + Ok(Deploy { + hash_value, + version, + contract_address, + contract_address_salt, + contract_hash, + constructor_calldata, + tx_type: TransactionType::Deploy, + skip_validate: false, + skip_execute: false, + skip_fee_transfer: false, + }) + } + + /// Returns the class hash of the deployed contract pub fn class_hash(&self) -> ClassHash { self.contract_hash } @@ -105,10 +137,13 @@ impl Deploy { CompiledClass::Casm(class) => Ok(class.entry_points_by_type.constructor.is_empty()), } } - - pub fn apply( + /// Deploys the contract in the starknet network and calls its constructor if it has one. + /// ## Parameters + /// - state: A state that implements the [`State`] and [`StateReader`] traits. + /// - block_context: The block's execution context. + pub fn apply( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, ) -> Result { state.deploy_contract(self.contract_address.clone(), self.contract_hash)?; @@ -122,6 +157,9 @@ impl Deploy { self.invoke_constructor(state, block_context) } } + /// Executes the contract without constructor + /// ## Parameters + /// - state: A state that implements the [`State`] and [`StateReader`] traits. pub fn handle_empty_constructor( &self, @@ -147,19 +185,25 @@ impl Deploy { self.tx_type, changes, None, + 0, )?; Ok(TransactionExecutionInfo::new_without_fee_info( None, Some(call_info), + None, actual_resources, Some(self.tx_type), )) } - pub fn invoke_constructor( + /// Execute the contract using its constructor + /// ## Parameters + /// - state: A state that implements the [`State`] and [`StateReader`] traits. + /// - block_context: The block's execution context. + pub fn invoke_constructor( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, ) -> Result { let call = ExecutionEntryPoint::new( @@ -184,26 +228,33 @@ impl Deploy { ); let mut resources_manager = ExecutionResourcesManager::default(); - let call_info = call.execute( + let ExecutionResult { + call_info, + revert_error, + n_reverted_steps, + } = call.execute( state, block_context, &mut resources_manager, &mut tx_execution_context, - false, + true, + block_context.validate_max_n_steps, )?; let changes = state.count_actual_storage_changes(); let actual_resources = calculate_tx_resources( resources_manager, - &[Some(call_info.clone())], + &[call_info.clone()], self.tx_type, changes, None, + n_reverted_steps, )?; Ok(TransactionExecutionInfo::new_without_fee_info( None, - Some(call_info), + call_info, + revert_error, actual_resources, Some(self.tx_type), )) @@ -211,9 +262,12 @@ impl Deploy { /// Calculates actual fee used by the transaction using the execution /// info returned by apply(), then updates the transaction execution info with the data of the fee. - pub fn execute( + /// ## Parameters + /// - state: A state that implements the [`State`] and [`StateReader`] traits. + /// - block_context: The block's execution context. + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, ) -> Result { let mut tx_exec_info = self.apply(state, block_context)?; @@ -226,6 +280,8 @@ impl Deploy { // --------------- // Simulation // --------------- + + /// Creates a Deploy transaction for simulate a deploy pub(crate) fn create_for_simulation( &self, skip_validate: bool, @@ -245,7 +301,7 @@ impl Deploy { #[cfg(test)] mod tests { - use std::{collections::HashMap, fs::File, io::BufReader}; + use std::{collections::HashMap, sync::Arc}; use super::*; use crate::{ @@ -256,13 +312,12 @@ mod tests { #[test] fn invoke_constructor_test() { // Instantiate CachedState - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); // Set contract_class - let contract_reader = - BufReader::new(File::open("starknet_programs/constructor.json").unwrap()); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); + let contract_class = + ContractClass::from_path("starknet_programs/constructor.json").unwrap(); let class_hash: Felt252 = compute_deprecated_class_hash(&contract_class).unwrap(); //transform class_hash to [u8; 32] let class_hash_bytes = class_hash.to_be_bytes(); @@ -277,7 +332,6 @@ mod tests { vec![10.into()], 0.into(), 0.into(), - None, ) .unwrap(); @@ -305,13 +359,11 @@ mod tests { #[test] fn invoke_constructor_no_calldata_should_fail() { // Instantiate CachedState - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); - // Set contract_class - let contract_reader = - BufReader::new(File::open("starknet_programs/constructor.json").unwrap()); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); + let contract_class = + ContractClass::from_path("starknet_programs/constructor.json").unwrap(); let class_hash: Felt252 = compute_deprecated_class_hash(&contract_class).unwrap(); //transform class_hash to [u8; 32] @@ -321,15 +373,8 @@ mod tests { .set_contract_class(&class_hash_bytes, &contract_class) .unwrap(); - let internal_deploy = Deploy::new( - 0.into(), - contract_class, - Vec::new(), - 0.into(), - 0.into(), - None, - ) - .unwrap(); + let internal_deploy = + Deploy::new(0.into(), contract_class, Vec::new(), 0.into(), 0.into()).unwrap(); let block_context = Default::default(); @@ -340,11 +385,11 @@ mod tests { #[test] fn deploy_contract_without_constructor_should_fail() { // Instantiate CachedState - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, Some(Default::default()), None); - let contract_reader = BufReader::new(File::open("starknet_programs/amm.json").unwrap()); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); + let contract_path = "starknet_programs/amm.json"; + let contract_class = ContractClass::from_path(contract_path).unwrap(); let class_hash: Felt252 = compute_deprecated_class_hash(&contract_class).unwrap(); //transform class_hash to [u8; 32] @@ -361,7 +406,6 @@ mod tests { vec![10.into()], 0.into(), 0.into(), - None, ) .unwrap(); @@ -376,13 +420,13 @@ mod tests { #[test] fn internal_deploy_computing_classhash_should_fail() { - let contract_json = BufReader::new(File::open("starknet_programs/amm.json").unwrap()); + let contract_path = "starknet_programs/amm.json"; // Take a contrat class to copy the program - let contract_class = ContractClass::try_from(contract_json).unwrap(); + let contract_class = ContractClass::from_path(contract_path).unwrap(); // Make a new contract class with the same program but with errors let error_contract_class = ContractClass { - program_json: contract_class.program_json, + hinted_class_hash: contract_class.hinted_class_hash, program: contract_class.program, entry_points_by_type: HashMap::new(), abi: None, @@ -395,7 +439,6 @@ mod tests { Vec::new(), 0.into(), 1.into(), - None, ); assert_matches!( internal_deploy_error.unwrap_err(), diff --git a/src/transaction/deploy_account.rs b/src/transaction/deploy_account.rs index 78abe2518..d182589aa 100644 --- a/src/transaction/deploy_account.rs +++ b/src/transaction/deploy_account.rs @@ -1,4 +1,9 @@ +use super::fee::charge_fee; use super::{invoke_function::verify_no_calls_to_other_contracts, Transaction}; +use crate::definitions::constants::QUERY_VERSION_BASE; +use crate::execution::execution_entry_point::ExecutionResult; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use crate::state::cached_state::CachedState; use crate::{ core::{ errors::state_errors::StateError, @@ -23,17 +28,12 @@ use crate::{ state::state_api::{State, StateReader}, state::ExecutionResourcesManager, syscalls::syscall_handler_errors::SyscallHandlerError, - transaction::{ - error::TransactionError, - fee::{calculate_tx_fee, execute_fee_transfer, FeeInfo}, - }, + transaction::error::TransactionError, utils::{calculate_tx_resources, Address, ClassHash}, }; use cairo_vm::felt::Felt252; use getset::Getters; use num_traits::Zero; -use starknet_contract_class::EntryPointType; -use std::collections::HashMap; #[derive(Clone, Debug, PartialEq, Eq)] pub struct StateSelector { @@ -74,7 +74,6 @@ impl DeployAccount { signature: Vec, contract_address_salt: Felt252, chain_id: Felt252, - hash_value: Option, ) -> Result { let contract_address = Address(calculate_contract_address( &contract_address_salt, @@ -83,19 +82,50 @@ impl DeployAccount { Address(Felt252::zero()), )?); - let hash_value = match hash_value { - Some(hash) => hash, - None => calculate_deploy_account_transaction_hash( - version.clone(), - &contract_address, - Felt252::from_bytes_be(&class_hash), - &constructor_calldata, - max_fee, - nonce.clone(), - contract_address_salt.clone(), - chain_id, - )?, - }; + let hash_value = calculate_deploy_account_transaction_hash( + version.clone(), + &contract_address, + Felt252::from_bytes_be(&class_hash), + &constructor_calldata, + max_fee, + nonce.clone(), + contract_address_salt.clone(), + chain_id, + )?; + + Ok(Self { + contract_address, + contract_address_salt, + class_hash, + constructor_calldata, + version, + nonce, + max_fee, + hash_value, + signature, + skip_execute: false, + skip_validate: false, + skip_fee_transfer: false, + }) + } + + #[allow(clippy::too_many_arguments)] + pub fn new_with_tx_hash( + class_hash: ClassHash, + max_fee: u128, + version: Felt252, + nonce: Felt252, + constructor_calldata: Vec, + signature: Vec, + contract_address_salt: Felt252, + hash_value: Felt252, + ) -> Result { + let contract_address = Address(calculate_contract_address( + &contract_address_salt, + &Felt252::from_bytes_be(&class_hash), + &constructor_calldata, + Address(Felt252::zero()), + )?); Ok(Self { contract_address, @@ -120,19 +150,26 @@ impl DeployAccount { } } - pub fn execute( + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let mut tx_info = self.apply(state, block_context)?; self.handle_nonce(state)?; - let (fee_transfer_info, actual_fee) = - self.charge_fee(state, &tx_info.actual_resources, block_context)?; + + let mut tx_execution_context = + self.get_execution_context(block_context.invoke_tx_max_n_steps); + let (fee_transfer_info, actual_fee) = charge_fee( + state, + &tx_info.actual_resources, + block_context, + self.max_fee, + &mut tx_execution_context, + self.skip_fee_transfer, + )?; + tx_info.set_fee_info(actual_fee, fee_transfer_info); Ok(tx_info) @@ -154,14 +191,11 @@ impl DeployAccount { /// Execute a call to the cairo-vm using the accounts_validation.cairo contract to validate /// the contract that is being declared. Then it returns the transaction execution info of the run. - fn apply( + fn apply( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let contract_class = state.get_contract_class(&self.class_hash)?; state.deploy_contract(self.contract_address.clone(), self.class_hash)?; @@ -182,27 +216,26 @@ impl DeployAccount { TransactionType::DeployAccount, state.count_actual_storage_changes(), None, + 0, ) .map_err::(|_| TransactionError::ResourcesCalculation)?; Ok(TransactionExecutionInfo::new_without_fee_info( validate_info, Some(constructor_call_info), + None, actual_resources, Some(TransactionType::DeployAccount), )) } - pub fn handle_constructor( + pub fn handle_constructor( &self, contract_class: CompiledClass, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, resources_manager: &mut ExecutionResourcesManager, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { if self.constructor_entry_points_empty(contract_class)? { if !self.constructor_calldata.is_empty() { return Err(TransactionError::EmptyConstructorCalldata); @@ -219,7 +252,7 @@ impl DeployAccount { } fn handle_nonce(&self, state: &mut S) -> Result<(), TransactionError> { - if self.version.is_zero() { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(()); } @@ -236,15 +269,12 @@ impl DeployAccount { Ok(()) } - pub fn run_constructor_entrypoint( + pub fn run_constructor_entrypoint( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, resources_manager: &mut ExecutionResourcesManager, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let entry_point = ExecutionEntryPoint::new( self.contract_address.clone(), self.constructor_calldata.clone(), @@ -256,16 +286,17 @@ impl DeployAccount { INITIAL_GAS_COST, ); - let call_info = if self.skip_execute { - None + let ExecutionResult { call_info, .. } = if self.skip_execute { + ExecutionResult::default() } else { - Some(entry_point.execute( + entry_point.execute( state, block_context, resources_manager, &mut self.get_execution_context(block_context.validate_max_n_steps), false, - )?) + block_context.validate_max_n_steps, + )? }; let call_info = verify_no_calls_to_other_contracts(&call_info) @@ -285,16 +316,13 @@ impl DeployAccount { ) } - pub fn run_validate_entrypoint( + pub fn run_validate_entrypoint( &self, - state: &mut S, + state: &mut CachedState, resources_manager: &mut ExecutionResourcesManager, block_context: &BlockContext, - ) -> Result, TransactionError> - where - S: State + StateReader, - { - if self.version.is_zero() { + ) -> Result, TransactionError> { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(None); } @@ -315,16 +343,17 @@ impl DeployAccount { INITIAL_GAS_COST, ); - let call_info = if self.skip_execute { - None + let ExecutionResult { call_info, .. } = if self.skip_execute { + ExecutionResult::default() } else { - Some(call.execute( + call.execute( state, block_context, resources_manager, &mut self.get_execution_context(block_context.validate_max_n_steps), false, - )?) + block_context.validate_max_n_steps, + )? }; verify_no_calls_to_other_contracts(&call_info) @@ -333,41 +362,6 @@ impl DeployAccount { Ok(call_info) } - fn charge_fee( - &self, - state: &mut S, - resources: &HashMap, - block_context: &BlockContext, - ) -> Result - where - S: State + StateReader, - { - if self.max_fee.is_zero() { - return Ok((None, 0)); - } - - let actual_fee = calculate_tx_fee( - resources, - block_context.starknet_os_config.gas_price, - block_context, - )?; - - let mut tx_execution_context = - self.get_execution_context(block_context.invoke_tx_max_n_steps); - let fee_transfer_info = if self.skip_fee_transfer { - None - } else { - Some(execute_fee_transfer( - state, - block_context, - &mut tx_execution_context, - actual_fee, - )?) - }; - - Ok((fee_transfer_info, actual_fee)) - } - pub(crate) fn create_for_simulation( &self, skip_validate: bool, @@ -387,7 +381,7 @@ impl DeployAccount { #[cfg(test)] mod tests { - use std::path::PathBuf; + use std::{path::PathBuf, sync::Arc}; use super::*; use crate::{ @@ -402,14 +396,14 @@ mod tests { #[test] fn get_state_selector() { let path = PathBuf::from("starknet_programs/constructor.json"); - let contract = ContractClass::try_from(path).unwrap(); + let contract = ContractClass::from_path(path).unwrap(); let hash = compute_deprecated_class_hash(&contract).unwrap(); let class_hash = felt_to_hash(&hash); let block_context = BlockContext::default(); let mut _state = CachedState::new( - InMemoryStateReader::default(), + Arc::new(InMemoryStateReader::default()), Some(Default::default()), None, ); @@ -423,7 +417,6 @@ mod tests { Vec::new(), 0.into(), StarknetChainId::TestNet2.to_felt(), - None, ) .unwrap(); @@ -439,14 +432,14 @@ mod tests { #[test] fn deploy_account_twice_should_fail() { let path = PathBuf::from("starknet_programs/constructor.json"); - let contract = ContractClass::try_from(path).unwrap(); + let contract = ContractClass::from_path(path).unwrap(); let hash = compute_deprecated_class_hash(&contract).unwrap(); let class_hash = felt_to_hash(&hash); let block_context = BlockContext::default(); let mut state = CachedState::new( - InMemoryStateReader::default(), + Arc::new(InMemoryStateReader::default()), Some(Default::default()), None, ); @@ -460,7 +453,6 @@ mod tests { Vec::new(), 0.into(), StarknetChainId::TestNet2.to_felt(), - None, ) .unwrap(); @@ -473,7 +465,6 @@ mod tests { Vec::new(), 0.into(), StarknetChainId::TestNet2.to_felt(), - None, ) .unwrap(); @@ -493,14 +484,14 @@ mod tests { // Should panic at no calldata for constructor. Error managment not implemented yet. fn deploy_account_constructor_should_fail() { let path = PathBuf::from("starknet_programs/constructor.json"); - let contract = ContractClass::try_from(path).unwrap(); + let contract = ContractClass::from_path(path).unwrap(); let hash = compute_deprecated_class_hash(&contract).unwrap(); let class_hash = felt_to_hash(&hash); let block_context = BlockContext::default(); let mut state = CachedState::new( - InMemoryStateReader::default(), + Arc::new(InMemoryStateReader::default()), Some(Default::default()), None, ); @@ -514,7 +505,6 @@ mod tests { Vec::new(), 0.into(), StarknetChainId::TestNet2.to_felt(), - None, ) .unwrap(); diff --git a/src/transaction/error.rs b/src/transaction/error.rs index c330e3878..e7acd92cc 100644 --- a/src/transaction/error.rs +++ b/src/transaction/error.rs @@ -25,7 +25,7 @@ pub enum TransactionError { InvalidMaxFee, #[error("The nonce field in Declare transactions of version 0 must be 0.")] InvalidNonce, - #[error("The signature field in Declare transactions must be an empty list.")] + #[error("The signature field in Declare transactions of version 0 must be an empty list.")] InvalidSignature, #[error("An InvokeFunction transaction (version != 0) must have a nonce.")] InvokeFunctionNonZeroMissingNonce, @@ -33,6 +33,10 @@ pub enum TransactionError { InvokeFunctionZeroHasNonce, #[error("Invalid transaction nonce. Expected: {0} got {1}")] InvalidTransactionNonce(String, String), + #[error("Actual fee exceeds max fee. Actual: {0}, Max: {1}")] + ActualFeeExceedsMaxFee(u128, u128), + #[error("Fee transfer failure: {0}")] + FeeTransferError(Box), #[error("{0}")] FeeError(String), #[error("Cairo resource names must be contained in fee weights dict")] @@ -129,4 +133,8 @@ pub enum TransactionError { CustomError(String), #[error("call info is None")] CallInfoIsNone, + #[error("Unsupported version {0:?}")] + UnsupportedVersion(String), + #[error("Invalid compiled class, expected class hash: {0}, but received: {1}")] + InvalidCompiledClassHash(String, String), } diff --git a/src/transaction/fee.rs b/src/transaction/fee.rs index 2928dc8a9..ef1b4de93 100644 --- a/src/transaction/fee.rs +++ b/src/transaction/fee.rs @@ -1,4 +1,8 @@ use super::error::TransactionError; +use crate::definitions::constants::FEE_FACTOR; +use crate::execution::execution_entry_point::ExecutionResult; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use crate::state::cached_state::CachedState; use crate::{ definitions::{ block_context::BlockContext, @@ -7,12 +11,12 @@ use crate::{ execution::{ execution_entry_point::ExecutionEntryPoint, CallInfo, TransactionExecutionContext, }, - state::state_api::{State, StateReader}, + state::state_api::StateReader, state::ExecutionResourcesManager, }; use cairo_vm::felt::Felt252; -use num_traits::ToPrimitive; -use starknet_contract_class::EntryPointType; +use num_traits::{ToPrimitive, Zero}; +use std::cmp::min; use std::collections::HashMap; // second element is the actual fee that the transaction uses @@ -20,15 +24,16 @@ pub type FeeInfo = (Option, u128); /// Transfers the amount actual_fee from the caller account to the sequencer. /// Returns the resulting CallInfo of the transfer call. -pub(crate) fn execute_fee_transfer( - state: &mut S, +pub(crate) fn execute_fee_transfer( + state: &mut CachedState, block_context: &BlockContext, tx_execution_context: &mut TransactionExecutionContext, actual_fee: u128, ) -> Result { if actual_fee > tx_execution_context.max_fee { - return Err(TransactionError::FeeError( - "Actual fee exceeded max fee.".to_string(), + return Err(TransactionError::ActualFeeExceedsMaxFee( + actual_fee, + tx_execution_context.max_fee, )); } @@ -36,8 +41,8 @@ pub(crate) fn execute_fee_transfer( let calldata = [ block_context.block_info.sequencer_address.0.clone(), - 0.into(), - Felt252::from(actual_fee), + Felt252::from(actual_fee), // U256.low + 0.into(), // U256.high ] .to_vec(); @@ -53,15 +58,18 @@ pub(crate) fn execute_fee_transfer( ); let mut resources_manager = ExecutionResourcesManager::default(); - let fee_transfer_exec = fee_transfer_call.execute( - state, - block_context, - &mut resources_manager, - tx_execution_context, - false, - ); - // TODO: Avoid masking the error from the fee transfer. - fee_transfer_exec.map_err(|_| TransactionError::FeeError("Fee transfer failure".to_string())) + let ExecutionResult { call_info, .. } = fee_transfer_call + .execute( + state, + block_context, + &mut resources_manager, + tx_execution_context, + false, + block_context.invoke_tx_max_n_steps, + ) + .map_err(|e| TransactionError::FeeTransferError(Box::new(e)))?; + + call_info.ok_or(TransactionError::CallInfoIsNone) } // ---------------------------------------------------------------------------------------- @@ -116,3 +124,45 @@ fn max_of_keys(cairo_rsc: &HashMap, weights: &HashMap( + state: &mut CachedState, + resources: &HashMap, + block_context: &BlockContext, + max_fee: u128, + tx_execution_context: &mut TransactionExecutionContext, + skip_fee_transfer: bool, +) -> Result { + if max_fee.is_zero() { + return Ok((None, 0)); + } + + let actual_fee = calculate_tx_fee( + resources, + block_context.starknet_os_config.gas_price, + block_context, + )?; + let actual_fee = min(actual_fee, max_fee) * FEE_FACTOR; + + let fee_transfer_info = if skip_fee_transfer { + None + } else { + Some(execute_fee_transfer( + state, + block_context, + tx_execution_context, + actual_fee, + )?) + }; + Ok((fee_transfer_info, actual_fee)) +} diff --git a/src/transaction/invoke_function.rs b/src/transaction/invoke_function.rs index 785d96cd8..3703fef7d 100644 --- a/src/transaction/invoke_function.rs +++ b/src/transaction/invoke_function.rs @@ -1,32 +1,30 @@ -use std::collections::HashMap; - use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, definitions::{ block_context::BlockContext, - constants::{EXECUTE_ENTRY_POINT_SELECTOR, VALIDATE_ENTRY_POINT_SELECTOR}, + constants::{ + EXECUTE_ENTRY_POINT_SELECTOR, QUERY_VERSION_BASE, VALIDATE_ENTRY_POINT_SELECTOR, + }, transaction_type::TransactionType, }, execution::{ - execution_entry_point::ExecutionEntryPoint, CallInfo, TransactionExecutionContext, - TransactionExecutionInfo, + execution_entry_point::{ExecutionEntryPoint, ExecutionResult}, + CallInfo, TransactionExecutionContext, TransactionExecutionInfo, }, state::state_api::{State, StateReader}, - state::ExecutionResourcesManager, - transaction::{ - error::TransactionError, - fee::{calculate_tx_fee, execute_fee_transfer, FeeInfo}, - }, + state::{cached_state::CachedState, ExecutionResourcesManager}, + transaction::error::TransactionError, utils::{calculate_tx_resources, Address}, }; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use cairo_vm::felt::Felt252; use getset::Getters; use num_traits::Zero; -use starknet_contract_class::EntryPointType; -use super::Transaction; +use super::{fee::charge_fee, Transaction}; +/// Represents an InvokeFunction transaction in the starknet network. #[derive(Debug, Getters, Clone)] pub struct InvokeFunction { #[getset(get = "pub")] @@ -60,26 +58,46 @@ impl InvokeFunction { signature: Vec, chain_id: Felt252, nonce: Option, - hash_value: Option, ) -> Result { let (entry_point_selector_field, additional_data) = preprocess_invoke_function_fields( entry_point_selector.clone(), nonce.clone(), version.clone(), )?; - let hash_value = match hash_value { - Some(hash) => hash, - None => calculate_transaction_hash_common( - TransactionHashPrefix::Invoke, - version.clone(), - &contract_address, - entry_point_selector_field, - &calldata, - max_fee, - chain_id, - &additional_data, - )?, - }; + let hash_value = calculate_transaction_hash_common( + TransactionHashPrefix::Invoke, + version.clone(), + &contract_address, + entry_point_selector_field, + &calldata, + max_fee, + chain_id, + &additional_data, + )?; + + InvokeFunction::new_with_tx_hash( + contract_address, + entry_point_selector, + max_fee, + version, + calldata, + signature, + nonce, + hash_value, + ) + } + + #[allow(clippy::too_many_arguments)] + pub fn new_with_tx_hash( + contract_address: Address, + entry_point_selector: Felt252, + max_fee: u128, + version: Felt252, + calldata: Vec, + signature: Vec, + nonce: Option, + hash_value: Felt252, + ) -> Result { let validate_entry_point_selector = VALIDATE_ENTRY_POINT_SELECTOR.clone(); Ok(InvokeFunction { @@ -119,19 +137,21 @@ impl InvokeFunction { )) } - pub(crate) fn run_validate_entrypoint( + /// Execute the validation entrypoint of the contract and returns the call info. + /// ## Parameters: + /// - state: A state that implements the [`State`] and [`StateReader`] traits. + /// - resources_manager: the resources that are in use by the contract + /// - block_context: The block's execution context + pub(crate) fn run_validate_entrypoint( &self, - state: &mut T, + state: &mut CachedState, resources_manager: &mut ExecutionResourcesManager, block_context: &BlockContext, - ) -> Result, TransactionError> - where - T: State + StateReader, - { + ) -> Result, TransactionError> { if self.entry_point_selector != *EXECUTE_ENTRY_POINT_SELECTOR { return Ok(None); } - if self.version.is_zero() { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(None); } if self.skip_validation { @@ -149,13 +169,14 @@ impl InvokeFunction { 0, ); - let call_info = Some(call.execute( + let ExecutionResult { call_info, .. } = call.execute( state, block_context, resources_manager, &mut self.get_execution_context(block_context.validate_max_n_steps)?, false, - )?); + block_context.validate_max_n_steps, + )?; let call_info = verify_no_calls_to_other_contracts(&call_info) .map_err(|_| TransactionError::InvalidContractCall)?; @@ -165,16 +186,13 @@ impl InvokeFunction { /// Builds the transaction execution context and executes the entry point. /// Returns the CallInfo. - fn run_execute_entrypoint( + fn run_execute_entrypoint( &self, - state: &mut T, + state: &mut CachedState, block_context: &BlockContext, resources_manager: &mut ExecutionResourcesManager, remaining_gas: u128, - ) -> Result - where - T: State + StateReader, - { + ) -> Result { let call = ExecutionEntryPoint::new( self.contract_address.clone(), self.calldata.clone(), @@ -190,34 +208,40 @@ impl InvokeFunction { block_context, resources_manager, &mut self.get_execution_context(block_context.invoke_tx_max_n_steps)?, - false, + true, + block_context.invoke_tx_max_n_steps, ) } /// Execute a call to the cairo-vm using the accounts_validation.cairo contract to validate /// the contract that is being declared. Then it returns the transaction execution info of the run. - pub fn apply( + /// ## Parameters + /// - state: A state that implements the [`State`] and [`StateReader`] traits. + /// - block_context: The block's execution context. + /// - remaining_gas: The amount of gas that the transaction disposes. + pub fn apply( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, remaining_gas: u128, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let mut resources_manager = ExecutionResourcesManager::default(); let validate_info = self.run_validate_entrypoint(state, &mut resources_manager, block_context)?; // Execute transaction - let call_info = if self.skip_execute { - None + let ExecutionResult { + call_info, + revert_error, + n_reverted_steps, + } = if self.skip_execute { + ExecutionResult::default() } else { - Some(self.run_execute_entrypoint( + self.run_execute_entrypoint( state, block_context, &mut resources_manager, remaining_gas, - )?) + )? }; let changes = state.count_actual_storage_changes(); let actual_resources = calculate_tx_resources( @@ -226,70 +250,51 @@ impl InvokeFunction { self.tx_type, changes, None, + n_reverted_steps, )?; let transaction_execution_info = TransactionExecutionInfo::new_without_fee_info( validate_info, call_info, + revert_error, actual_resources, Some(self.tx_type), ); Ok(transaction_execution_info) } - fn charge_fee( - &self, - state: &mut S, - resources: &HashMap, - block_context: &BlockContext, - ) -> Result - where - S: State + StateReader, - { - if self.max_fee.is_zero() { - return Ok((None, 0)); - } - let actual_fee = calculate_tx_fee( - resources, - block_context.starknet_os_config.gas_price, - block_context, - )?; - - let mut tx_execution_context = - self.get_execution_context(block_context.invoke_tx_max_n_steps)?; - let fee_transfer_info = if self.skip_fee_transfer { - None - } else { - Some(execute_fee_transfer( - state, - block_context, - &mut tx_execution_context, - actual_fee, - )?) - }; - - Ok((fee_transfer_info, actual_fee)) - } - /// Calculates actual fee used by the transaction using the execution info returned by apply(), /// then updates the transaction execution info with the data of the fee. - pub fn execute( + /// ## Parameters + /// - state: A state that implements the [`State`] and [`StateReader`] traits. + /// - block_context: The block's execution context. + /// - remaining_gas: The amount of gas that the transaction disposes. + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, remaining_gas: u128, ) -> Result { let mut tx_exec_info = self.apply(state, block_context, remaining_gas)?; self.handle_nonce(state)?; - let (fee_transfer_info, actual_fee) = - self.charge_fee(state, &tx_exec_info.actual_resources, block_context)?; + let mut tx_execution_context = + self.get_execution_context(block_context.invoke_tx_max_n_steps)?; + let (fee_transfer_info, actual_fee) = charge_fee( + state, + &tx_exec_info.actual_resources, + block_context, + self.max_fee, + &mut tx_execution_context, + self.skip_fee_transfer, + )?; + tx_exec_info.set_fee_info(actual_fee, fee_transfer_info); Ok(tx_exec_info) } fn handle_nonce(&self, state: &mut S) -> Result<(), TransactionError> { - if self.version.is_zero() { + if self.version.is_zero() || self.version == *QUERY_VERSION_BASE { return Ok(()); } @@ -359,7 +364,7 @@ pub(crate) fn preprocess_invoke_function_fields( nonce: Option, version: Felt252, ) -> Result<(Felt252, Vec), TransactionError> { - if version.is_zero() { + if version.is_zero() || version == *QUERY_VERSION_BASE { match nonce { Some(_) => Err(TransactionError::InvokeFunctionZeroHasNonce), None => { @@ -386,9 +391,11 @@ mod tests { use crate::{ services::api::contract_classes::deprecated_contract_class::ContractClass, state::cached_state::CachedState, state::in_memory_state_reader::InMemoryStateReader, + utils::calculate_sn_keccak, }; + use cairo_lang_starknet::casm_contract_class::CasmContractClass; use num_traits::Num; - use std::{collections::HashMap, path::PathBuf}; + use std::{collections::HashMap, sync::Arc}; #[test] fn test_invoke_apply_without_fees() { @@ -417,8 +424,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -430,7 +436,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -486,8 +492,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -499,7 +504,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -551,8 +556,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/amm.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/amm.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -564,7 +568,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -610,8 +614,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -623,7 +626,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -675,8 +678,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/amm.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/amm.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -688,7 +690,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -705,10 +707,28 @@ mod tests { } #[test] - // Test fee calculation is done correctly but payment to sequencer fails due to been WIP. - fn test_execute_invoke_fee_payment_to_sequencer_should_fail() { + // Test fee calculation is done correctly but payment to sequencer fails due + // to the token contract not being deployed + fn test_invoke_with_non_deployed_fee_token_should_fail() { + let contract_address = Address(0.into()); + + // Instantiate CachedState + let mut state_reader = InMemoryStateReader::default(); + // Set contract_class + let class_hash = [1; 32]; + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); + // Set contact_state + let nonce = Felt252::zero(); + + state_reader + .address_to_class_hash_mut() + .insert(contract_address.clone(), class_hash); + state_reader + .address_to_nonce + .insert(contract_address.clone(), nonce); + let internal_invoke_function = InvokeFunction { - contract_address: Address(0.into()), + contract_address, entry_point_selector: Felt252::from_str_radix( "112e35f48499939272000bd72eb840e502ca4c3aefa8800992e8defb746e0c9", 16, @@ -728,24 +748,7 @@ mod tests { skip_fee_transfer: false, }; - // Instantiate CachedState - let mut state_reader = InMemoryStateReader::default(); - // Set contract_class - let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); - // Set contact_state - let contract_address = Address(0.into()); - let nonce = Felt252::zero(); - - state_reader - .address_to_class_hash_mut() - .insert(contract_address.clone(), class_hash); - state_reader - .address_to_nonce - .insert(contract_address, nonce); - - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -754,21 +757,16 @@ mod tests { .set_contract_class(&class_hash, &contract_class) .unwrap(); - let mut block_context = BlockContext::default(); - block_context.cairo_resource_fee_weights = HashMap::from([ - (String::from("l1_gas_usage"), 0.into()), - (String::from("pedersen_builtin"), 16.into()), - (String::from("range_check_builtin"), 70.into()), - ]); - - let expected_error = internal_invoke_function.execute(&mut state, &block_context, 0); - let error_msg = "Fee transfer failure".to_string(); - assert!(expected_error.is_err()); - assert_matches!(expected_error.unwrap_err(), TransactionError::FeeError(msg) if msg == error_msg); + let block_context = BlockContext::default(); + + let result = internal_invoke_function.execute(&mut state, &block_context, 0); + assert!(result.is_err()); + assert_matches!(result.unwrap_err(), TransactionError::FeeTransferError(_)); } #[test] - fn test_execute_invoke_actual_fee_exceeded_max_fee_should_fail() { + fn test_execute_invoke_actual_fee_exceeded_max_fee_should_charge_max_fee() { + let max_fee = 5; let internal_invoke_function = InvokeFunction { contract_address: Address(0.into()), entry_point_selector: Felt252::from_str_radix( @@ -783,19 +781,18 @@ mod tests { validate_entry_point_selector: 0.into(), hash_value: 0.into(), signature: Vec::new(), - max_fee: 1000, + max_fee, nonce: Some(0.into()), skip_validation: false, skip_execute: false, - skip_fee_transfer: false, + skip_fee_transfer: true, }; // Instantiate CachedState let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -807,7 +804,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -817,17 +814,12 @@ mod tests { .unwrap(); let mut block_context = BlockContext::default(); - block_context.cairo_resource_fee_weights = HashMap::from([ - (String::from("l1_gas_usage"), 0.into()), - (String::from("pedersen_builtin"), 16.into()), - (String::from("range_check_builtin"), 70.into()), - ]); block_context.starknet_os_config.gas_price = 1; - let expected_error = internal_invoke_function.execute(&mut state, &block_context, 0); - let error_msg = "Actual fee exceeded max fee.".to_string(); - assert!(expected_error.is_err()); - assert_matches!(expected_error.unwrap_err(), TransactionError::FeeError(actual_error_msg) if actual_error_msg == error_msg); + let tx = internal_invoke_function + .execute(&mut state, &block_context, 0) + .unwrap(); + assert_eq!(tx.actual_fee, max_fee); } #[test] @@ -857,8 +849,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -870,7 +861,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -920,8 +911,7 @@ mod tests { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/fibonacci.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/fibonacci.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -933,7 +923,7 @@ mod tests { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -1023,4 +1013,98 @@ mod tests { TransactionError::InvokeFunctionNonZeroMissingNonce ) } + + #[test] + fn invoke_version_one_with_no_nonce_with_query_base_should_fail() { + let expected_error = preprocess_invoke_function_fields( + Felt252::from_str_radix( + "112e35f48499939272000bd72eb840e502ca4c3aefa8800992e8defb746e0c9", + 16, + ) + .unwrap(), + None, + &1.into() | &QUERY_VERSION_BASE.clone(), + ); + assert!(expected_error.is_err()); + } + + #[test] + fn test_reverted_transaction_wrong_entry_point() { + let internal_invoke_function = InvokeFunction { + contract_address: Address(0.into()), + entry_point_selector: Felt252::from_bytes_be(&calculate_sn_keccak( + "factorial_".as_bytes(), + )), + entry_point_type: EntryPointType::External, + calldata: vec![], + tx_type: TransactionType::InvokeFunction, + version: 0.into(), + validate_entry_point_selector: 0.into(), + hash_value: 0.into(), + signature: Vec::new(), + max_fee: 0, + nonce: Some(0.into()), + skip_validation: true, + skip_execute: false, + skip_fee_transfer: true, + }; + + let mut state_reader = InMemoryStateReader::default(); + let class_hash = [1; 32]; + let program_data = include_bytes!("../../starknet_programs/cairo1/factorial.casm"); + let contract_class: CasmContractClass = serde_json::from_slice(program_data).unwrap(); + let contract_address = Address(0.into()); + let nonce = Felt252::zero(); + + state_reader + .address_to_class_hash_mut() + .insert(contract_address.clone(), class_hash); + state_reader + .address_to_nonce + .insert(contract_address, nonce); + + let mut casm_contract_class_cache = HashMap::new(); + + casm_contract_class_cache.insert(class_hash, contract_class); + + let mut state = CachedState::new( + Arc::new(state_reader), + None, + Some(casm_contract_class_cache), + ); + + let state_before_execution = state.clone(); + + let result = internal_invoke_function + .execute(&mut state, &BlockContext::default(), 0) + .unwrap(); + + assert!(result.call_info.is_none()); + assert_eq!( + result.revert_error, + Some("Requested entry point was not found".to_string()) + ); + assert_eq!( + state.cache.class_hash_writes, + state_before_execution.cache.class_hash_writes + ); + assert_eq!( + state.cache.compiled_class_hash_writes, + state_before_execution.cache.compiled_class_hash_writes + ); + assert_eq!( + state.cache.nonce_writes, + state_before_execution.cache.nonce_writes + ); + assert_eq!( + state.cache.storage_writes, + state_before_execution.cache.storage_writes + ); + assert_eq!( + state.cache.class_hash_to_compiled_class_hash, + state_before_execution + .cache + .class_hash_to_compiled_class_hash + ); + } } diff --git a/src/transaction/l1_handler.rs b/src/transaction/l1_handler.rs index e1221e893..57e34d67a 100644 --- a/src/transaction/l1_handler.rs +++ b/src/transaction/l1_handler.rs @@ -1,7 +1,11 @@ +use crate::{ + execution::execution_entry_point::ExecutionResult, + services::api::contract_classes::deprecated_contract_class::EntryPointType, + state::cached_state::CachedState, +}; use cairo_vm::felt::Felt252; use getset::Getters; use num_traits::Zero; -use starknet_contract_class::EntryPointType; use crate::{ core::transaction_hash::{calculate_transaction_hash_common, TransactionHashPrefix}, @@ -58,8 +62,26 @@ impl L1Handler { &[nonce.clone()], )?; - Ok(L1Handler { + L1Handler::new_with_tx_hash( + contract_address, + entry_point_selector, + calldata, + nonce, + paid_fee_on_l1, hash_value, + ) + } + + pub fn new_with_tx_hash( + contract_address: Address, + entry_point_selector: Felt252, + calldata: Vec, + nonce: Felt252, + paid_fee_on_l1: Option, + tx_hash: Felt252, + ) -> Result { + Ok(L1Handler { + hash_value: tx_hash, contract_address, entry_point_selector, calldata, @@ -71,15 +93,12 @@ impl L1Handler { } /// Applies self to 'state' by executing the L1-handler entry point. - pub fn execute( + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, remaining_gas: u128, - ) -> Result - where - S: State + StateReader, - { + ) -> Result { let mut resources_manager = ExecutionResourcesManager::default(); let entrypoint = ExecutionEntryPoint::new( self.contract_address.clone(), @@ -92,16 +111,21 @@ impl L1Handler { remaining_gas, ); - let call_info = if self.skip_execute { - None + let ExecutionResult { + call_info, + revert_error, + n_reverted_steps, + } = if self.skip_execute { + ExecutionResult::default() } else { - Some(entrypoint.execute( + entrypoint.execute( state, block_context, &mut resources_manager, &mut self.get_execution_context(block_context.invoke_tx_max_n_steps)?, - false, - )?) + true, + block_context.invoke_tx_max_n_steps, + )? }; let changes = state.count_actual_storage_changes(); @@ -111,6 +135,7 @@ impl L1Handler { TransactionType::L1Handler, changes, Some(self.get_payload_size()), + n_reverted_steps, )?; // Enforce L1 fees. @@ -136,6 +161,7 @@ impl L1Handler { Ok(TransactionExecutionInfo::new_without_fee_info( None, call_info, + revert_error, actual_resources, Some(TransactionType::L1Handler), )) @@ -182,15 +208,15 @@ impl L1Handler { mod test { use std::{ collections::{HashMap, HashSet}, - path::PathBuf, + sync::Arc, }; + use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; use cairo_vm::{ felt::{felt_str, Felt252}, vm::runners::cairo_runner::ExecutionResources, }; use num_traits::{Num, Zero}; - use starknet_contract_class::EntryPointType; use crate::{ definitions::{block_context::BlockContext, transaction_type::TransactionType}, @@ -228,8 +254,7 @@ mod test { let mut state_reader = InMemoryStateReader::default(); // Set contract_class let class_hash = [1; 32]; - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/l1l2.json")).unwrap(); + let contract_class = ContractClass::from_path("starknet_programs/l1l2.json").unwrap(); // Set contact_state let contract_address = Address(0.into()); let nonce = Felt252::zero(); @@ -241,7 +266,7 @@ mod test { .address_to_nonce .insert(contract_address, nonce); - let mut state = CachedState::new(state_reader.clone(), None, None); + let mut state = CachedState::new(Arc::new(state_reader), None, None); // Initialize state.contract_classes state.set_contract_classes(HashMap::new()).unwrap(); @@ -251,11 +276,6 @@ mod test { .unwrap(); let mut block_context = BlockContext::default(); - block_context.cairo_resource_fee_weights = HashMap::from([ - (String::from("l1_gas_usage"), 0.into()), - (String::from("pedersen_builtin"), 16.into()), - (String::from("range_check_builtin"), 70.into()), - ]); block_context.starknet_os_config.gas_price = 1; let tx_exec = l1_handler @@ -307,9 +327,11 @@ mod test { gas_consumed: 0, failure_flag: false, }), + revert_error: None, fee_transfer_info: None, actual_fee: 0, actual_resources: HashMap::from([ + ("n_steps".to_string(), 1229), ("pedersen_builtin".to_string(), 13), ("range_check_builtin".to_string(), 23), ("l1_gas_usage".to_string(), 18471), diff --git a/src/transaction/mod.rs b/src/transaction/mod.rs index 7e1daf265..6729c40af 100644 --- a/src/transaction/mod.rs +++ b/src/transaction/mod.rs @@ -6,6 +6,7 @@ pub mod error; pub mod fee; pub mod invoke_function; pub mod l1_handler; +mod verify_version; pub use declare::Declare; pub use declare_v2::DeclareV2; @@ -13,15 +14,25 @@ pub use deploy::Deploy; pub use deploy_account::DeployAccount; pub use invoke_function::InvokeFunction; pub use l1_handler::L1Handler; +pub use verify_version::verify_version; use crate::{ definitions::block_context::BlockContext, execution::TransactionExecutionInfo, - state::state_api::{State, StateReader}, + state::{cached_state::CachedState, state_api::StateReader}, utils::Address, }; use error::TransactionError; +/// Represents a transaction inside the starknet network. +/// The transaction are actions that may modified the state of the network. +/// it can be one of: +/// - Declare +/// - DeclareV2 +/// - Deploy +/// - DeployAccount +/// - InvokeFunction +/// - L1Handler pub enum Transaction { /// A declare transaction. Declare(Declare), @@ -38,6 +49,7 @@ pub enum Transaction { } impl Transaction { + /// returns the contract address of the transaction. pub fn contract_address(&self) -> Address { match self { Transaction::Deploy(tx) => tx.contract_address.clone(), @@ -49,9 +61,14 @@ impl Transaction { } } - pub fn execute( + /// execute the transaction in cairo-vm and returns a TransactionExecutionInfo structure. + ///## Parameters: + ///- state: a structure that implements State and StateReader traits. + ///- block_context: The block context of the transaction that is about to be executed. + ///- remaining_gas: The gas supplied to execute the transaction. + pub fn execute( &self, - state: &mut S, + state: &mut CachedState, block_context: &BlockContext, remaining_gas: u128, ) -> Result { @@ -64,7 +81,11 @@ impl Transaction { Transaction::L1Handler(tx) => tx.execute(state, block_context, remaining_gas), } } - + /// It creates a new transaction structure modificating the skip flags. It is meant to be used only to run a simulation + ///## Parameters: + ///- skip_validate: the transaction will not be verified. + ///- skip_execute: the transaction will not be executed in the cairo vm. + ///- skip_fee_transfer: the transaction will not pay the fee. pub fn create_for_simulation( &self, skip_validate: bool, diff --git a/src/transaction/verify_version.rs b/src/transaction/verify_version.rs new file mode 100644 index 000000000..8787b09b9 --- /dev/null +++ b/src/transaction/verify_version.rs @@ -0,0 +1,139 @@ +use cairo_vm::felt::Felt252; + +use crate::definitions::constants::{QUERY_VERSION_BASE, SUPPORTED_VERSIONS}; + +use super::error::TransactionError; + +pub fn verify_version( + version: &Felt252, + max_fee: u128, + nonce: &Felt252, + signature: &Vec, +) -> Result<(), TransactionError> { + if !SUPPORTED_VERSIONS.contains(version) { + return Err(TransactionError::UnsupportedVersion(version.to_string())); + } + + if *version == 0.into() || *version == *QUERY_VERSION_BASE { + if max_fee != 0 { + return Err(TransactionError::InvalidMaxFee); + } + if nonce != &0.into() { + return Err(TransactionError::InvalidNonce); + } + if !signature.is_empty() { + return Err(TransactionError::InvalidSignature); + } + } + + Ok(()) +} + +#[cfg(test)] +mod test { + // TODO: fixture tests would be better here + use crate::{definitions::constants::QUERY_VERSION_BASE, transaction::error::TransactionError}; + + use super::verify_version; + + #[test] + fn version_0_with_max_fee_0_nonce_0_and_empty_signature_should_return_ok() { + let version = 0.into(); + let max_fee = 0; + let nonce = 0.into(); + let signature = vec![]; + let result = verify_version(&version, max_fee, &nonce, &signature); + assert!(result.is_ok()); + } + + #[test] + fn version_1_should_return_ok() { + let version = 1.into(); + let max_fee = 2; + let nonce = 3.into(); + let signature = vec![5.into()]; + let result = verify_version(&version, max_fee, &nonce, &signature); + assert!(result.is_ok()); + } + + #[test] + fn version_2_should_return_ok() { + let version = 2.into(); + let max_fee = 43; + let nonce = 4.into(); + let signature = vec![6.into()]; + let result = verify_version(&version, max_fee, &nonce, &signature); + assert!(result.is_ok()); + } + + #[test] + fn version_3_should_fail() { + let version = 3.into(); + let max_fee = 0; + let nonce = 0.into(); + let signature = vec![]; + let result = verify_version(&version, max_fee, &nonce, &signature).unwrap_err(); + assert_matches!(result, TransactionError::UnsupportedVersion(_)); + } + + #[test] + fn version_0_with_max_fee_greater_than_0_should_fail() { + let version = 0.into(); + let max_fee = 1; + let nonce = 0.into(); + let signature = vec![]; + let result = verify_version(&version, max_fee, &nonce, &signature).unwrap_err(); + assert_matches!(result, TransactionError::InvalidMaxFee); + } + + #[test] + fn version_0_with_nonce_greater_than_0_should_fail() { + let version = 0.into(); + let max_fee = 0; + let nonce = 1.into(); + let signature = vec![]; + let result = verify_version(&version, max_fee, &nonce, &signature).unwrap_err(); + assert_matches!(result, TransactionError::InvalidNonce); + } + + #[test] + fn version_0_with_non_empty_signature_should_fail() { + let version = 0.into(); + let max_fee = 0; + let nonce = 0.into(); + let signature = vec![2.into()]; + let result = verify_version(&version, max_fee, &nonce, &signature).unwrap_err(); + assert_matches!(result, TransactionError::InvalidSignature); + } + + #[test] + fn version_0_with_max_fee_0_nonce_0_and_empty_signature_and_query_version_set_should_return_ok() + { + let version = &0.into() | &QUERY_VERSION_BASE.clone(); + let max_fee = 0; + let nonce = 0.into(); + let signature = vec![]; + let result = verify_version(&version, max_fee, &nonce, &signature); + assert!(result.is_ok()); + } + + #[test] + fn version_1_with_query_version_set_should_return_ok() { + let version = &1.into() | &QUERY_VERSION_BASE.clone(); + let max_fee = 2; + let nonce = 3.into(); + let signature = vec![5.into()]; + let result = verify_version(&version, max_fee, &nonce, &signature); + assert!(result.is_ok()); + } + + #[test] + fn version_2_with_query_version_set_should_return_ok() { + let version = &2.into() | &QUERY_VERSION_BASE.clone(); + let max_fee = 43; + let nonce = 4.into(); + let signature = vec![6.into()]; + let result = verify_version(&version, max_fee, &nonce, &signature); + assert!(result.is_ok()); + } +} diff --git a/src/utils.rs b/src/utils.rs index c530d4297..5c6272740 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -1,15 +1,17 @@ +use crate::core::errors::hash_errors::HashError; +use crate::services::api::contract_classes::deprecated_contract_class::EntryPointType; +use crate::state::state_api::State; use crate::{ definitions::transaction_type::TransactionType, execution::{ gas_usage::calculate_tx_gas_usage, os_usage::get_additional_os_resources, CallInfo, }, state::ExecutionResourcesManager, - state::{ - cached_state::UNINITIALIZED_CLASS_HASH, state_api::StateReader, state_cache::StorageEntry, - }, + state::{cached_state::UNINITIALIZED_CLASS_HASH, state_cache::StorageEntry}, syscalls::syscall_handler_errors::SyscallHandlerError, transaction::error::TransactionError, }; +use cairo_vm::vm::runners::builtin_runner::SEGMENT_ARENA_BUILTIN_NAME; use cairo_vm::{ felt::Felt252, serde::deserialize_program::BuiltinName, vm::runners::builtin_runner, }; @@ -17,7 +19,6 @@ use cairo_vm::{types::relocatable::Relocatable, vm::vm_core::VirtualMachine}; use num_traits::{Num, ToPrimitive}; use serde::{Deserialize, Serialize}; use sha3::{Digest, Keccak256}; -use starknet_contract_class::EntryPointType; use starknet_crypto::FieldElement; use std::{ collections::{HashMap, HashSet}, @@ -96,7 +97,7 @@ pub fn get_felt_range( pub fn felt_to_field_element(value: &Felt252) -> Result { FieldElement::from_dec_str(&value.to_str_radix(10)) - .map_err(|_| SyscallHandlerError::FailToComputeHash) + .map_err(|e| SyscallHandlerError::HashError(HashError::FailedToComputeHash(e.to_string()))) } pub fn field_element_to_felt(felt: &FieldElement) -> Felt252 { @@ -166,6 +167,7 @@ pub fn calculate_tx_resources( tx_type: TransactionType, storage_changes: (usize, usize), l1_handler_payload_size: Option, + n_reverted_steps: usize, ) -> Result, TransactionError> { let (n_modified_contracts, n_storage_changes) = storage_changes; @@ -192,10 +194,21 @@ pub fn calculate_tx_resources( // Add additional Cairo resources needed for the OS to run the transaction. let additional_resources = get_additional_os_resources(tx_syscall_counter, &tx_type)?; let new_resources = &cairo_usage + &additional_resources; - let filtered_builtins = new_resources.filter_unused_builtins(); + let mut filtered_builtins = new_resources.filter_unused_builtins(); + + let n_steps = new_resources.n_steps + + n_reverted_steps + + 10 * filtered_builtins + .builtin_instance_counter + .remove(SEGMENT_ARENA_BUILTIN_NAME) + .unwrap_or(0); let mut resources: HashMap = HashMap::new(); resources.insert("l1_gas_usage".to_string(), l1_gas_usage); + resources.insert( + "n_steps".to_string(), + n_steps + filtered_builtins.n_memory_holes, + ); for (builtin, value) in filtered_builtins.builtin_instance_counter { resources.insert(builtin, value); } @@ -259,7 +272,7 @@ where //* Execution entry point utils //* ---------------------------- -pub fn get_deployed_address_class_hash_at_address( +pub fn get_deployed_address_class_hash_at_address( state: &mut S, contract_address: &Address, ) -> Result { @@ -269,12 +282,14 @@ pub fn get_deployed_address_class_hash_at_address( .to_owned(); if class_hash == *UNINITIALIZED_CLASS_HASH { - return Err(TransactionError::NotDeployedContract(class_hash)); + return Err(TransactionError::NotDeployedContract(felt_to_hash( + &contract_address.0, + ))); } Ok(class_hash) } -pub fn validate_contract_deployed( +pub fn validate_contract_deployed( state: &mut S, contract_address: &Address, ) -> Result { diff --git a/starknet_programs/cairo1/fibonacci_dispatcher.cairo b/starknet_programs/cairo1/fibonacci_dispatcher.cairo index fc70d4e7a..3ffea098c 100644 --- a/starknet_programs/cairo1/fibonacci_dispatcher.cairo +++ b/starknet_programs/cairo1/fibonacci_dispatcher.cairo @@ -42,7 +42,8 @@ mod Dispatcher { class_hash: felt252, selector: felt252, a: felt252, b: felt252, n: felt252 ) -> felt252 { FibonacciLibraryDispatcher { - class_hash: starknet::class_hash_const::<27727>(), + // THIS VALUE IS THE HASH OF THE FIBONACCI CASM CLASS HASH. THE SAME AS THE CONSTANT: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH + class_hash: starknet::class_hash_const::<1948962768849191111780391610229754715773924969841143100991524171924131413970>(), selector }.fib(a, b, n) } diff --git a/starknet_programs/cairo2/deploy_erc20.cairo b/starknet_programs/cairo2/deploy_erc20.cairo new file mode 100644 index 000000000..d62455c2c --- /dev/null +++ b/starknet_programs/cairo2/deploy_erc20.cairo @@ -0,0 +1,35 @@ +use starknet::contract_address::ContractAddress; +use starknet::class_hash::ClassHash; +#[starknet::interface] +trait IDeployTest { + fn deploy_test(self: @TContractState, class_hash: ClassHash, contract_address_salt: felt252, recipient: felt252, name: felt252, decimals: felt252, initial_supply: felt252, symbol: felt252) -> (core::starknet::contract_address::ContractAddress, core::array::Span::); +} + +#[starknet::contract] +mod DeployTest { + use core::result::ResultTrait; + use starknet::syscalls::deploy_syscall; + use starknet::class_hash::ClassHash; + use starknet::contract_address::ContractAddress; + use starknet::class_hash::Felt252TryIntoClassHash; + use option::OptionTrait; + use traits::TryInto; + use array::ArrayTrait; + + #[storage] + struct Storage { + } + + #[external(v0)] + impl DeployTest of super::IDeployTest { + fn deploy_test(self: @ContractState, class_hash: ClassHash, contract_address_salt: felt252, recipient: felt252, name: felt252, decimals: felt252, initial_supply: felt252, symbol: felt252) -> (core::starknet::contract_address::ContractAddress, core::array::Span::) { + let mut calldata = ArrayTrait::new(); + calldata.append(recipient); + calldata.append(name); + calldata.append(decimals); + calldata.append(initial_supply); + calldata.append(symbol); + deploy_syscall(class_hash, contract_address_salt, calldata.span(), false).unwrap() + } + } +} diff --git a/starknet_programs/cairo2/erc20.cairo b/starknet_programs/cairo2/erc20.cairo new file mode 100644 index 000000000..c17e9b2f3 --- /dev/null +++ b/starknet_programs/cairo2/erc20.cairo @@ -0,0 +1,188 @@ +use starknet::ContractAddress; + +#[starknet::interface] +trait IERC20 { + fn get_name(self: @TContractState) -> felt252; + fn get_symbol(self: @TContractState) -> felt252; + fn get_decimals(self: @TContractState) -> u8; + fn get_total_supply(self: @TContractState) -> felt252; + fn balance_of(self: @TContractState, account: ContractAddress) -> felt252; + fn allowance(self: @TContractState, owner: ContractAddress, spender: ContractAddress) -> felt252; + fn transfer(ref self: TContractState, recipient: ContractAddress, amount: felt252); + fn transfer_from( + ref self: TContractState, sender: ContractAddress, recipient: ContractAddress, amount: felt252 + ); + fn approve(ref self: TContractState, spender: ContractAddress, amount: felt252); + fn increase_allowance(ref self: TContractState, spender: ContractAddress, added_value: felt252); + fn decrease_allowance( + ref self: TContractState, spender: ContractAddress, subtracted_value: felt252 + ); +} + +#[starknet::contract] +mod erc_20 { + use zeroable::Zeroable; + use starknet::get_caller_address; + use starknet::contract_address_const; + use starknet::ContractAddress; + + #[storage] + struct Storage { + name: felt252, + symbol: felt252, + decimals: u8, + total_supply: felt252, + balances: LegacyMap::, + allowances: LegacyMap::<(ContractAddress, ContractAddress), felt252>, + } + + #[event] + #[derive(Drop, starknet::Event)] + enum Event { + Transfer: Transfer, + Approval: Approval, + } + #[derive(Drop, starknet::Event)] + struct Transfer { + from: ContractAddress, + to: ContractAddress, + value: felt252, + } + #[derive(Drop, starknet::Event)] + struct Approval { + owner: ContractAddress, + spender: ContractAddress, + value: felt252, + } + + #[constructor] + fn constructor( + ref self: ContractState, + recipient: ContractAddress, + name: felt252, + decimals: u8, + initial_supply: felt252, + symbol: felt252 + ) { + self.name.write(name); + self.symbol.write(symbol); + self.decimals.write(decimals); + assert(!recipient.is_zero(), 'ERC20: mint to the 0 address'); + self.total_supply.write(initial_supply); + self.balances.write(recipient, initial_supply); + self + .emit( + Event::Transfer( + Transfer { + from: contract_address_const::<0>(), to: recipient, value: initial_supply + } + ) + ); + } + + #[external(v0)] + impl IERC20Impl of super::IERC20 { + fn get_name(self: @ContractState) -> felt252 { + self.name.read() + } + + fn get_symbol(self: @ContractState) -> felt252 { + self.symbol.read() + } + + fn get_decimals(self: @ContractState) -> u8 { + self.decimals.read() + } + + fn get_total_supply(self: @ContractState) -> felt252 { + self.total_supply.read() + } + + fn balance_of(self: @ContractState, account: ContractAddress) -> felt252 { + self.balances.read(account) + } + + fn allowance( + self: @ContractState, owner: ContractAddress, spender: ContractAddress + ) -> felt252 { + self.allowances.read((owner, spender)) + } + + fn transfer(ref self: ContractState, recipient: ContractAddress, amount: felt252) { + let sender = get_caller_address(); + self.transfer_helper(sender, recipient, amount); + } + + fn transfer_from( + ref self: ContractState, + sender: ContractAddress, + recipient: ContractAddress, + amount: felt252 + ) { + let caller = get_caller_address(); + self.spend_allowance(sender, caller, amount); + self.transfer_helper(sender, recipient, amount); + } + + fn approve(ref self: ContractState, spender: ContractAddress, amount: felt252) { + let caller = get_caller_address(); + self.approve_helper(caller, spender, amount); + } + + fn increase_allowance( + ref self: ContractState, spender: ContractAddress, added_value: felt252 + ) { + let caller = get_caller_address(); + self + .approve_helper( + caller, spender, self.allowances.read((caller, spender)) + added_value + ); + } + + fn decrease_allowance( + ref self: ContractState, spender: ContractAddress, subtracted_value: felt252 + ) { + let caller = get_caller_address(); + self + .approve_helper( + caller, spender, self.allowances.read((caller, spender)) - subtracted_value + ); + } + } + + #[generate_trait] + impl StorageImpl of StorageTrait { + fn transfer_helper( + ref self: ContractState, + sender: ContractAddress, + recipient: ContractAddress, + amount: felt252 + ) { + assert(!sender.is_zero(), 'ERC20: transfer from 0'); + assert(!recipient.is_zero(), 'ERC20: transfer to 0'); + self.balances.write(sender, self.balances.read(sender) - amount); + self.balances.write(recipient, self.balances.read(recipient) + amount); + self.emit(Transfer { from: sender, to: recipient, value: amount }); + } + + fn spend_allowance( + ref self: ContractState, owner: ContractAddress, spender: ContractAddress, amount: felt252 + ) { + let current_allowance = self.allowances.read((owner, spender)); + let ONES_MASK = 0xffffffffffffffffffffffffffffffff_u128; + // let is_unlimited_allowance = current_allowance.low == ONES_MASK + // && current_allowance.high == ONES_MASK; + // if !is_unlimited_allowance { + // self.approve_helper(owner, spender, current_allowance - amount); + // } + } + + fn approve_helper( + ref self: ContractState, owner: ContractAddress, spender: ContractAddress, amount: felt252 + ) { + assert(!spender.is_zero(), 'ERC20: approve from 0'); + self.allowances.write((owner, spender), amount); + self.emit(Approval { owner, spender, value: amount }); + } + } +} diff --git a/starknet_programs/cairo2/fibonacci_dispatcher.cairo b/starknet_programs/cairo2/fibonacci_dispatcher.cairo index 3cbb12b14..5dfe9c6be 100644 --- a/starknet_programs/cairo2/fibonacci_dispatcher.cairo +++ b/starknet_programs/cairo2/fibonacci_dispatcher.cairo @@ -51,7 +51,8 @@ mod Dispatcher { self: @ContractState, class_hash: felt252, selector: felt252, a: felt252, b: felt252, n: felt252 ) -> felt252 { FibonacciLibraryDispatcher { - class_hash: starknet::class_hash_const::<27727>(), + // THIS VALUE IS THE HASH OF THE FIBONACCI CASM CLASS HASH. + class_hash: starknet::class_hash_const::<2889767417435368609058888822622483550637539736178264636938129582300971548553>(), selector }.fib(a, b, n) } diff --git a/starknet_programs/cairo2/hello_world_account.cairo b/starknet_programs/cairo2/hello_world_account.cairo index 117181cd0..c87651795 100644 --- a/starknet_programs/cairo2/hello_world_account.cairo +++ b/starknet_programs/cairo2/hello_world_account.cairo @@ -19,6 +19,7 @@ trait IAccount { fn __validate_declare__(self: @TContractState, class_hash: felt252) -> felt252; fn __validate__(self: @TContractState, contract_address: ContractAddress, entry_point_selector: felt252, calldata: Array) -> felt252; fn __execute__(ref self: TContractState, calls: Array) -> Span; + fn deploy(self: @TContractState, class_hash: felt252, contract_address_salt: felt252, name_: felt252, symbol_: felt252, decimals: felt252, initial_supply: felt252, recipient: felt252) -> (ContractAddress, core::array::Span::); } // Define the Account contract @@ -32,6 +33,11 @@ mod Account { use super::Call; use starknet::ContractAddress; use zeroable::Zeroable; + use starknet::syscalls::deploy_syscall; + use core::result::ResultTrait; + use starknet::class_hash::ClassHash; + use starknet::class_hash::Felt252TryIntoClassHash; + use traits::TryInto; // Define the contract's storage variables #[storage] @@ -58,6 +64,16 @@ mod Account { #[external(v0)] impl Account of super::IAccount { + fn deploy(self: @ContractState, class_hash: felt252, contract_address_salt: felt252, name_: felt252, symbol_: felt252, decimals: felt252, initial_supply: felt252, recipient: felt252) -> (ContractAddress, core::array::Span::) { + let mut calldata = ArrayTrait::new(); + calldata.append(name_); + calldata.append(symbol_); + calldata.append(decimals); + calldata.append(initial_supply); + calldata.append(recipient); + let (address0, something_else) = deploy_syscall(class_hash.try_into().unwrap(), contract_address_salt, calldata.span(), false).unwrap(); + (address0, something_else) + } // Validate contract deployment fn __validate_deploy__( self: @ContractState, class_hash: felt252, contract_address_salt: felt252, public_key_: felt252 diff --git a/starknet_programs/cairo2/simple_wallet.cairo b/starknet_programs/cairo2/simple_wallet.cairo index b77521230..f585b5b49 100644 --- a/starknet_programs/cairo2/simple_wallet.cairo +++ b/starknet_programs/cairo2/simple_wallet.cairo @@ -13,7 +13,7 @@ mod SimpleWallet { } #[constructor] - fn init(ref self: ContractState, initial_balance: felt252) { + fn constructor(ref self: ContractState, initial_balance: felt252) { self.balance.write(initial_balance); } diff --git a/starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_goerli.json b/starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_goerli.json new file mode 100644 index 000000000..0a9ef3fc1 --- /dev/null +++ b/starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_goerli.json @@ -0,0 +1 @@ +{"abi": [{"members": [{"name": "to", "offset": 0, "type": "felt"}, {"name": "selector", "offset": 1, "type": "felt"}, {"name": "data_offset", "offset": 2, "type": "felt"}, {"name": "data_len", "offset": 3, "type": "felt"}], "name": "AccountCallArray", "size": 4, "type": "struct"}, {"inputs": [{"name": "publicKey", "type": "felt"}], "name": "constructor", "outputs": [], "type": "constructor"}, {"inputs": [], "name": "getPublicKey", "outputs": [{"name": "publicKey", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "interfaceId", "type": "felt"}], "name": "supportsInterface", "outputs": [{"name": "success", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "newPublicKey", "type": "felt"}], "name": "setPublicKey", "outputs": [], "type": "function"}, {"inputs": [{"name": "hash", "type": "felt"}, {"name": "signature_len", "type": "felt"}, {"name": "signature", "type": "felt*"}], "name": "isValidSignature", "outputs": [{"name": "isValid", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "call_array_len", "type": "felt"}, {"name": "call_array", "type": "AccountCallArray*"}, {"name": "calldata_len", "type": "felt"}, {"name": "calldata", "type": "felt*"}], "name": "__validate__", "outputs": [], "type": "function"}, {"inputs": [{"name": "class_hash", "type": "felt"}], "name": "__validate_declare__", "outputs": [], "type": "function"}, {"inputs": [{"name": "class_hash", "type": "felt"}, {"name": "salt", "type": "felt"}, {"name": "publicKey", "type": "felt"}], "name": "__validate_deploy__", "outputs": [], "type": "function"}, {"inputs": [{"name": "call_array_len", "type": "felt"}, {"name": "call_array", "type": "AccountCallArray*"}, {"name": "calldata_len", "type": "felt"}, {"name": "calldata", "type": "felt*"}], "name": "__execute__", "outputs": [{"name": "response_len", "type": "felt"}, {"name": "response", "type": "felt*"}], "type": "function"}], "entry_points_by_type": {"CONSTRUCTOR": [{"offset": 366, "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}], "EXTERNAL": [{"offset": 461, "selector": "0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9"}, {"offset": 699, "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad"}, {"offset": 548, "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"}, {"offset": 401, "selector": "0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079"}, {"offset": 500, "selector": "0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e"}, {"offset": 607, "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3"}, {"offset": 434, "selector": "0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd"}, {"offset": 645, "selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895"}], "L1_HANDLER": []}, "program": {"reference_manager": {"references": [{"ap_tracking_data": {"group": 1, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 3}, {"ap_tracking_data": {"group": 1, "offset": 3}, "value": "[cast(ap, felt*)]", "pc": 10}, {"ap_tracking_data": {"group": 2, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 18}, {"ap_tracking_data": {"group": 2, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 18}, {"ap_tracking_data": {"group": 2, "offset": 0}, "value": "[cast(fp + (-5), felt*)]", "pc": 18}, {"ap_tracking_data": {"group": 3, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 63}, {"ap_tracking_data": {"group": 3, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 63}, {"ap_tracking_data": {"group": 4, "offset": 0}, "value": "[cast(fp + (-7), felt**)]", "pc": 74}, {"ap_tracking_data": {"group": 5, "offset": 0}, "value": "[cast(fp + (-3), felt**)]", "pc": 86}, {"ap_tracking_data": {"group": 6, "offset": 0}, "value": "[cast(fp + (-3), felt**)]", "pc": 93}, {"ap_tracking_data": {"group": 7, "offset": 0}, "value": "[cast(fp + (-4), felt**)]", "pc": 100}, {"ap_tracking_data": {"group": 8, "offset": 0}, "value": "[cast(fp + (-5), felt**)]", "pc": 108}, {"ap_tracking_data": {"group": 9, "offset": 0}, "value": "[cast(fp + (-3), felt**)]", "pc": 116}, {"ap_tracking_data": {"group": 10, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 123}, {"ap_tracking_data": {"group": 10, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 123}, {"ap_tracking_data": {"group": 10, "offset": 0}, "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]", "pc": 123}, {"ap_tracking_data": {"group": 11, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 128}, {"ap_tracking_data": {"group": 11, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 128}]}, "builtins": ["pedersen", "range_check", "ecdsa", "bitwise"], "debug_info": null, "hints": {"0": [{"flow_tracking_data": {"ap_tracking": {"group": 0, "offset": 0}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["starkware.cairo.common.alloc", "starkware.cairo.common.alloc.alloc"]}], "104": [{"flow_tracking_data": {"ap_tracking": {"group": 7, "offset": 1}, "reference_ids": {"starkware.starknet.common.syscalls.storage_read.syscall_ptr": 10}}, "code": "syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read"]}], "113": [{"flow_tracking_data": {"ap_tracking": {"group": 8, "offset": 1}, "reference_ids": {"starkware.starknet.common.syscalls.storage_write.syscall_ptr": 11}}, "code": "syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write"]}], "119": [{"flow_tracking_data": {"ap_tracking": {"group": 9, "offset": 1}, "reference_ids": {"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": 12}}, "code": "syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_tx_info"]}], "123": [{"flow_tracking_data": {"ap_tracking": {"group": 10, "offset": 0}, "reference_ids": {"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": 15, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": 13, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": 14}}, "code": "ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))", "accessible_scopes": ["starkware.cairo.common.signature", "starkware.cairo.common.signature.verify_ecdsa_signature"]}], "128": [{"flow_tracking_data": {"ap_tracking": {"group": 11, "offset": 0}, "reference_ids": {"starkware.cairo.common.math_cmp.is_le_felt.a": 16, "starkware.cairo.common.math_cmp.is_le_felt.b": 17}}, "code": "memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1", "accessible_scopes": ["starkware.cairo.common.math_cmp", "starkware.cairo.common.math_cmp.is_le_felt"]}], "14": [{"flow_tracking_data": {"ap_tracking": {"group": 1, "offset": 5}, "reference_ids": {"starkware.cairo.common.memcpy.memcpy.continue_copying": 1}}, "code": "n -= 1\nids.continue_copying = 1 if n > 0 else 0", "accessible_scopes": ["starkware.cairo.common.memcpy", "starkware.cairo.common.memcpy.memcpy"]}], "17": [{"flow_tracking_data": {"ap_tracking": {"group": 1, "offset": 6}, "reference_ids": {}}, "code": "vm_exit_scope()", "accessible_scopes": ["starkware.cairo.common.memcpy", "starkware.cairo.common.memcpy.memcpy"]}], "18": [{"flow_tracking_data": {"ap_tracking": {"group": 2, "offset": 0}, "reference_ids": {"starkware.cairo.common.math.assert_le_felt.a": 2, "starkware.cairo.common.math.assert_le_felt.b": 3, "starkware.cairo.common.math.assert_le_felt.range_check_ptr": 4}}, "code": "import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"]}], "28": [{"flow_tracking_data": {"ap_tracking": {"group": 2, "offset": 8}, "reference_ids": {}}, "code": "memory[ap] = 1 if excluded != 0 else 0", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"]}], "375": [{"flow_tracking_data": {"ap_tracking": {"group": 30, "offset": 35}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.constructor"]}], "392": [{"flow_tracking_data": {"ap_tracking": {"group": 32, "offset": 0}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.getPublicKey_encode_return"]}], "42": [{"flow_tracking_data": {"ap_tracking": {"group": 2, "offset": 9}, "reference_ids": {}}, "code": "memory[ap] = 1 if excluded != 1 else 0", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"]}], "425": [{"flow_tracking_data": {"ap_tracking": {"group": 36, "offset": 0}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.supportsInterface_encode_return"]}], "470": [{"flow_tracking_data": {"ap_tracking": {"group": 40, "offset": 50}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.setPublicKey"]}], "491": [{"flow_tracking_data": {"ap_tracking": {"group": 42, "offset": 0}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.isValidSignature_encode_return"]}], "54": [{"flow_tracking_data": {"ap_tracking": {"group": 2, "offset": 10}, "reference_ids": {}}, "code": "assert excluded == 2", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"]}], "579": [{"flow_tracking_data": {"ap_tracking": {"group": 45, "offset": 77}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__validate__"]}], "6": [{"flow_tracking_data": {"ap_tracking": {"group": 1, "offset": 0}, "reference_ids": {"starkware.cairo.common.memcpy.memcpy.len": 0}}, "code": "vm_enter_scope({'n': ids.len})", "accessible_scopes": ["starkware.cairo.common.memcpy", "starkware.cairo.common.memcpy.memcpy"]}], "617": [{"flow_tracking_data": {"ap_tracking": {"group": 47, "offset": 63}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__validate_declare__"]}], "63": [{"flow_tracking_data": {"ap_tracking": {"group": 3, "offset": 0}, "reference_ids": {"starkware.cairo.common.math.assert_lt_felt.a": 5, "starkware.cairo.common.math.assert_lt_felt.b": 6}}, "code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_lt_felt"]}], "657": [{"flow_tracking_data": {"ap_tracking": {"group": 49, "offset": 65}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__validate_deploy__"]}], "680": [{"flow_tracking_data": {"ap_tracking": {"group": 52, "offset": 0}, "reference_ids": {}}, "code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__execute___encode_return"]}], "81": [{"flow_tracking_data": {"ap_tracking": {"group": 4, "offset": 1}, "reference_ids": {"starkware.starknet.common.syscalls.call_contract.syscall_ptr": 7}}, "code": "syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.call_contract"]}], "89": [{"flow_tracking_data": {"ap_tracking": {"group": 5, "offset": 1}, "reference_ids": {"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": 8}}, "code": "syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_caller_address"]}], "96": [{"flow_tracking_data": {"ap_tracking": {"group": 6, "offset": 1}, "reference_ids": {"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": 9}}, "code": "syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_contract_address"]}]}, "data": ["0x40780017fff7fff", "0x1", "0x208b7fff7fff7ffe", "0x20780017fff7ffd", "0x3", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480080007fff8000", "0x400080007ffd7fff", "0x482480017ffd8001", "0x1", "0x482480017ffd8001", "0x1", "0xa0680017fff7ffe", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb", "0x402a7ffc7ffd7fff", "0x208b7fff7fff7ffe", "0x480280007ffb8000", "0x480280017ffb8000", "0x484480017fff8000", "0x2aaaaaaaaaaaab05555555555555556", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480280037ffb8000", "0x484480017fff8000", "0x4000000000000088000000000000001", "0x48307fff7ffd8000", "0xa0680017fff8000", "0xe", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48287ffc80007fff", "0x40307ffc7ff87fff", "0x48297ffd80007ffc", "0x482680017ffd8000", "0x1", "0x48507fff7ffe8000", "0x40507ff97ff57fff", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xc", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48287ffd80007fff", "0x48327fff7ffc8000", "0x40307ffa7ff67fff", "0x48527ffe7ffc8000", "0x40507ff97ff57fff", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0x40317ffd7ff97ffd", "0x48297ffc80007ffd", "0x48527fff7ffc8000", "0x40507ffb7ff77fff", "0x40780017fff7fff", "0x2", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0x48297ffd80007ffc", "0x20680017fff7fff", "0x4", "0x402780017ffc7ffc", "0x1", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ff97fff", "0x400380017ff97ffa", "0x400380027ff97ffb", "0x400380037ff97ffc", "0x400380047ff97ffd", "0x482680017ff98000", "0x7", "0x480280057ff98000", "0x480280067ff98000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x47657443616c6c657241646472657373", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x476574436f6e747261637441646472657373", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x53746f7261676552656164", "0x400280007ffc7fff", "0x400380017ffc7ffd", "0x482680017ffc8000", "0x3", "0x480280027ffc8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffb7fff", "0x400380017ffb7ffc", "0x400380027ffb7ffd", "0x482680017ffb8000", "0x3", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x4765745478496e666f", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x400380017ff97ffa", "0x400380007ff97ffb", "0x482680017ff98000", "0x2", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xc", "0x40780017fff7fff", "0x6", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffd7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x208b7fff7fff7ffe", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa4", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a", "0x40127fff7fff7ff9", "0x48127ffe7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a", "0x20680017fff7fff", "0x8", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffff59942a8c", "0x20680017fff7fff", "0x8", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbf", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffac", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x48127ffd7fff8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff87", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffd7fff8000", "0x48127ff37fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x3", "0x480a7ff57fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff74", "0x480a7ff97fff8000", "0x480680017fff8000", "0x1", "0x480080007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a", "0x480680017fff8000", "0x1", "0x40127fff7fff7ffe", "0x40137ffd7fff8000", "0x48127fdc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49", "0x400680017fff7fff", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef", "0x40137fff7fff8001", "0x48127ffb7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffd7fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x35", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee5", "0x40137fff7fff8002", "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x480a80017fff8000", "0x480a80027fff8000", "0x1104800180018000", "0xa", "0x48127ffe7fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a80007fff8000", "0x48127ffa7fff8000", "0x480a80027fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x3", "0x20780017fff7ffb", "0x6", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480280007ffc8000", "0x480280017ffc8000", "0x480280027ffc8000", "0x480280037ffc8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11", "0x40137ffe7fff8000", "0x40137fff7fff8001", "0x40137ffd7fff8002", "0x480a7ffd7fff8000", "0x480a80017fff8000", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2", "0x480a80027fff8000", "0x482680017ffb8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x482680017ffc8000", "0x4", "0x482a80007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x48127ffe7fff8000", "0x482880007ffe8000", "0x208b7fff7fff7ffe", "0x20780017fff7ffa", "0x4", "0x480a7ff97fff8000", "0x208b7fff7fff7ffe", "0x480280007ffb8000", "0x400280007ffd7fff", "0x480280017ffb8000", "0x400280017ffd7fff", "0x480280037ffb8000", "0x400280027ffd7fff", "0x480280027ffb8000", "0x48327fff7ffc8000", "0x400280037ffd7fff", "0x480a7ff97fff8000", "0x482680017ffa8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x482680017ffb8000", "0x4", "0x480a7ffc7fff8000", "0x482680017ffd8000", "0x4", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3e", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x402b7ffd7ffc7ffd", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff19", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x480280027ffb8000", "0x480280017ffd8000", "0x400080007ffe7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x48307fff7ffe8000", "0x402a7ffd7ffc7fff", "0x480280027ffb8000", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x482480017ffc8000", "0x1", "0x480280007ffd8000", "0x480280017ffd8000", "0x482680017ffd8000", "0x2", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3", "0x48127ff37fff8000", "0x48127ff37fff8000", "0x48127ffb7fff8000", "0x48127ff27fff8000", "0x480280047ffb8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe61", "0x48127ffe7fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480080057ffb8000", "0x480080037ffa8000", "0x480080047ff98000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecf", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480280027ffb8000", "0x480280007ffd8000", "0x400080007ffe7fff", "0x482680017ffd8000", "0x1", "0x480280007ffd8000", "0x484480017fff8000", "0x4", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480080007ffe8000", "0x400080017ffe7fff", "0x482480017ffd8000", "0x1", "0x480080007ffc8000", "0x48307fff7ffe8000", "0x402a7ffd7ffc7fff", "0x480280027ffb8000", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x482480017ffc8000", "0x2", "0x480280007ffd8000", "0x482680017ffd8000", "0x1", "0x480080007ff38000", "0x482480017ff28000", "0x1", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd3", "0x40780017fff7fff", "0x1", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe26", "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480080057ffb8000", "0x480080037ffa8000", "0x480080047ff98000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe94", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8", "0x40780017fff7fff", "0x1", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe00", "0x48127ffe7fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480080057ffb8000", "0x480080037ffa8000", "0x480080047ff98000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6e", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x3", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x480280027ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", "0x40780017fff7fff", "0x1", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5a", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x3", "0x4003800080007ffb", "0x400380007ffd7ffb", "0x402780017ffd8001", "0x1", "0x4826800180008000", "0x1", "0x40297ffb7fff8002", "0x4826800180008000", "0x1", "0x480a7ffc7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f", "0x480a80017fff8000", "0x4829800080008002", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x4", "0x480280027ffb8000", "0x480280007ffd8000", "0x400080007ffe7fff", "0x482680017ffd8000", "0x1", "0x480280007ffd8000", "0x484480017fff8000", "0x4", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480080007ffe8000", "0x400080017ffe7fff", "0x482480017ffd8000", "0x1", "0x480080007ffc8000", "0x48307fff7ffe8000", "0x402a7ffd7ffc7fff", "0x480280027ffb8000", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x482480017ffb8000", "0x2", "0x480280007ffd8000", "0x482680017ffd8000", "0x1", "0x480080007ff28000", "0x482480017ff18000", "0x1", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2", "0x40137ff97fff8000", "0x40137ffa7fff8001", "0x40137ffb7fff8002", "0x40137ffc7fff8003", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7", "0x480a80007fff8000", "0x480a80017fff8000", "0x48127ffb7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe"], "main_scope": "__main__", "identifiers": {"__main__.Account": {"destination": "openzeppelin.account.library.Account", "type": "alias"}, "__main__.AccountCallArray": {"destination": "openzeppelin.account.library.AccountCallArray", "type": "alias"}, "__main__.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "__main__.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "__main__.SignatureBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "alias"}, "__main__.__execute__": {"pc": 668, "decorators": ["external"], "type": "function"}, "__main__.__execute__.Args": {"size": 4, "members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "__main__.__execute__.Args", "type": "struct"}, "__main__.__execute__.ImplicitArgs": {"size": 5, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "bitwise_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin*", "offset": 3}, "range_check_ptr": {"cairo_type": "felt", "offset": 4}}, "full_name": "__main__.__execute__.ImplicitArgs", "type": "struct"}, "__main__.__execute__.Return": {"cairo_type": "(response_len: felt, response: felt*)", "type": "type_definition"}, "__main__.__execute__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.__validate__": {"pc": 531, "decorators": ["external"], "type": "function"}, "__main__.__validate__.Args": {"size": 4, "members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "__main__.__validate__.Args", "type": "struct"}, "__main__.__validate__.ImplicitArgs": {"size": 4, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.__validate__.ImplicitArgs", "type": "struct"}, "__main__.__validate__.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.__validate__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.__validate_declare__": {"pc": 590, "decorators": ["external"], "type": "function"}, "__main__.__validate_declare__.Args": {"size": 1, "members": {"class_hash": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.__validate_declare__.Args", "type": "struct"}, "__main__.__validate_declare__.ImplicitArgs": {"size": 4, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.__validate_declare__.ImplicitArgs", "type": "struct"}, "__main__.__validate_declare__.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.__validate_declare__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.__validate_deploy__": {"pc": 628, "decorators": ["external"], "type": "function"}, "__main__.__validate_deploy__.Args": {"size": 3, "members": {"class_hash": {"cairo_type": "felt", "offset": 0}, "salt": {"cairo_type": "felt", "offset": 1}, "publicKey": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.__validate_deploy__.Args", "type": "struct"}, "__main__.__validate_deploy__.ImplicitArgs": {"size": 4, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.__validate_deploy__.ImplicitArgs", "type": "struct"}, "__main__.__validate_deploy__.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.__validate_deploy__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.constructor": {"pc": 359, "decorators": ["constructor"], "type": "function"}, "__main__.constructor.Args": {"size": 1, "members": {"publicKey": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.constructor.Args", "type": "struct"}, "__main__.constructor.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.constructor.ImplicitArgs", "type": "struct"}, "__main__.constructor.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.constructor.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.getPublicKey": {"pc": 386, "decorators": ["view"], "type": "function"}, "__main__.getPublicKey.Args": {"size": 0, "members": {}, "full_name": "__main__.getPublicKey.Args", "type": "struct"}, "__main__.getPublicKey.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.getPublicKey.ImplicitArgs", "type": "struct"}, "__main__.getPublicKey.Return": {"cairo_type": "(publicKey: felt)", "type": "type_definition"}, "__main__.getPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.get_tx_info": {"destination": "starkware.starknet.common.syscalls.get_tx_info", "type": "alias"}, "__main__.isValidSignature": {"pc": 481, "decorators": ["view"], "type": "function"}, "__main__.isValidSignature.Args": {"size": 3, "members": {"hash": {"cairo_type": "felt", "offset": 0}, "signature_len": {"cairo_type": "felt", "offset": 1}, "signature": {"cairo_type": "felt*", "offset": 2}}, "full_name": "__main__.isValidSignature.Args", "type": "struct"}, "__main__.isValidSignature.ImplicitArgs": {"size": 4, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.isValidSignature.ImplicitArgs", "type": "struct"}, "__main__.isValidSignature.Return": {"cairo_type": "(isValid: felt)", "type": "type_definition"}, "__main__.isValidSignature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.setPublicKey": {"pc": 454, "decorators": ["external"], "type": "function"}, "__main__.setPublicKey.Args": {"size": 1, "members": {"newPublicKey": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.setPublicKey.Args", "type": "struct"}, "__main__.setPublicKey.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.setPublicKey.ImplicitArgs", "type": "struct"}, "__main__.setPublicKey.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.setPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.supportsInterface": {"pc": 418, "decorators": ["view"], "type": "function"}, "__main__.supportsInterface.Args": {"size": 1, "members": {"interfaceId": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.supportsInterface.Args", "type": "struct"}, "__main__.supportsInterface.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.supportsInterface.ImplicitArgs", "type": "struct"}, "__main__.supportsInterface.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "__main__.supportsInterface.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__execute__": {"pc": 699, "decorators": ["external"], "type": "function"}, "__wrappers__.__execute__.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.__execute__.Args", "type": "struct"}, "__wrappers__.__execute__.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.__execute__.ImplicitArgs", "type": "struct"}, "__wrappers__.__execute__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: starkware.cairo.common.cairo_builtins.BitwiseBuiltin*, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__execute__.SIZEOF_LOCALS": {"value": 4, "type": "const"}, "__wrappers__.__execute__.__wrapped_func": {"destination": "__main__.__execute__", "type": "alias"}, "__wrappers__.__execute___encode_return": {"pc": 680, "decorators": [], "type": "function"}, "__wrappers__.__execute___encode_return.Args": {"size": 3, "members": {"ret_value": {"cairo_type": "(response_len: felt, response: felt*)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__wrappers__.__execute___encode_return.Args", "type": "struct"}, "__wrappers__.__execute___encode_return.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.__execute___encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.__execute___encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.__execute___encode_return.SIZEOF_LOCALS": {"value": 3, "type": "const"}, "__wrappers__.__execute___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.__validate__": {"pc": 548, "decorators": ["external"], "type": "function"}, "__wrappers__.__validate__.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.__validate__.Args", "type": "struct"}, "__wrappers__.__validate__.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.__validate__.ImplicitArgs", "type": "struct"}, "__wrappers__.__validate__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__validate__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__validate__.__wrapped_func": {"destination": "__main__.__validate__", "type": "alias"}, "__wrappers__.__validate___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.__validate_declare__": {"pc": 607, "decorators": ["external"], "type": "function"}, "__wrappers__.__validate_declare__.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.__validate_declare__.Args", "type": "struct"}, "__wrappers__.__validate_declare__.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.__validate_declare__.ImplicitArgs", "type": "struct"}, "__wrappers__.__validate_declare__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__validate_declare__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__validate_declare__.__wrapped_func": {"destination": "__main__.__validate_declare__", "type": "alias"}, "__wrappers__.__validate_declare___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.__validate_deploy__": {"pc": 645, "decorators": ["external"], "type": "function"}, "__wrappers__.__validate_deploy__.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.__validate_deploy__.Args", "type": "struct"}, "__wrappers__.__validate_deploy__.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.__validate_deploy__.ImplicitArgs", "type": "struct"}, "__wrappers__.__validate_deploy__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__validate_deploy__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__validate_deploy__.__wrapped_func": {"destination": "__main__.__validate_deploy__", "type": "alias"}, "__wrappers__.__validate_deploy___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.constructor": {"pc": 366, "decorators": ["constructor"], "type": "function"}, "__wrappers__.constructor.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.constructor.Args", "type": "struct"}, "__wrappers__.constructor.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.constructor.ImplicitArgs", "type": "struct"}, "__wrappers__.constructor.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.constructor.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.constructor.__wrapped_func": {"destination": "__main__.constructor", "type": "alias"}, "__wrappers__.constructor_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.getPublicKey": {"pc": 401, "decorators": ["view"], "type": "function"}, "__wrappers__.getPublicKey.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.getPublicKey.Args", "type": "struct"}, "__wrappers__.getPublicKey.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.getPublicKey.ImplicitArgs", "type": "struct"}, "__wrappers__.getPublicKey.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.getPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.getPublicKey.__wrapped_func": {"destination": "__main__.getPublicKey", "type": "alias"}, "__wrappers__.getPublicKey_encode_return": {"pc": 392, "decorators": [], "type": "function"}, "__wrappers__.getPublicKey_encode_return.Args": {"size": 2, "members": {"ret_value": {"cairo_type": "(publicKey: felt)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "__wrappers__.getPublicKey_encode_return.Args", "type": "struct"}, "__wrappers__.getPublicKey_encode_return.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.getPublicKey_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.getPublicKey_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.getPublicKey_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.getPublicKey_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.isValidSignature": {"pc": 500, "decorators": ["view"], "type": "function"}, "__wrappers__.isValidSignature.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.isValidSignature.Args", "type": "struct"}, "__wrappers__.isValidSignature.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.isValidSignature.ImplicitArgs", "type": "struct"}, "__wrappers__.isValidSignature.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.isValidSignature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.isValidSignature.__wrapped_func": {"destination": "__main__.isValidSignature", "type": "alias"}, "__wrappers__.isValidSignature_encode_return": {"pc": 491, "decorators": [], "type": "function"}, "__wrappers__.isValidSignature_encode_return.Args": {"size": 2, "members": {"ret_value": {"cairo_type": "(isValid: felt)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "__wrappers__.isValidSignature_encode_return.Args", "type": "struct"}, "__wrappers__.isValidSignature_encode_return.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.isValidSignature_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.isValidSignature_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.isValidSignature_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.setPublicKey": {"pc": 461, "decorators": ["external"], "type": "function"}, "__wrappers__.setPublicKey.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.setPublicKey.Args", "type": "struct"}, "__wrappers__.setPublicKey.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.setPublicKey.ImplicitArgs", "type": "struct"}, "__wrappers__.setPublicKey.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.setPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.setPublicKey.__wrapped_func": {"destination": "__main__.setPublicKey", "type": "alias"}, "__wrappers__.setPublicKey_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.supportsInterface": {"pc": 434, "decorators": ["view"], "type": "function"}, "__wrappers__.supportsInterface.Args": {"size": 0, "members": {}, "full_name": "__wrappers__.supportsInterface.Args", "type": "struct"}, "__wrappers__.supportsInterface.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.supportsInterface.ImplicitArgs", "type": "struct"}, "__wrappers__.supportsInterface.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.supportsInterface.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.supportsInterface.__wrapped_func": {"destination": "__main__.supportsInterface", "type": "alias"}, "__wrappers__.supportsInterface_encode_return": {"pc": 425, "decorators": [], "type": "function"}, "__wrappers__.supportsInterface_encode_return.Args": {"size": 2, "members": {"ret_value": {"cairo_type": "(success: felt)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "__wrappers__.supportsInterface_encode_return.Args", "type": "struct"}, "__wrappers__.supportsInterface_encode_return.ImplicitArgs": {"size": 0, "members": {}, "full_name": "__wrappers__.supportsInterface_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.supportsInterface_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.supportsInterface_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "openzeppelin.account.library.Account": {"type": "namespace"}, "openzeppelin.account.library.Account.Args": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account.Args", "type": "struct"}, "openzeppelin.account.library.Account.ImplicitArgs": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account._execute_list": {"pc": 301, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account._execute_list.Args": {"size": 3, "members": {"calls_len": {"cairo_type": "felt", "offset": 0}, "calls": {"cairo_type": "openzeppelin.account.library.Call*", "offset": 1}, "response": {"cairo_type": "felt*", "offset": 2}}, "full_name": "openzeppelin.account.library.Account._execute_list.Args", "type": "struct"}, "openzeppelin.account.library.Account._execute_list.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "openzeppelin.account.library.Account._execute_list.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account._execute_list.Return": {"cairo_type": "(response_len: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account._execute_list.SIZEOF_LOCALS": {"value": 3, "type": "const"}, "openzeppelin.account.library.Account._from_call_array_to_call": {"pc": 335, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account._from_call_array_to_call.Args": {"size": 4, "members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata": {"cairo_type": "felt*", "offset": 2}, "calls": {"cairo_type": "openzeppelin.account.library.Call*", "offset": 3}}, "full_name": "openzeppelin.account.library.Account._from_call_array_to_call.Args", "type": "struct"}, "openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account._from_call_array_to_call.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account._from_call_array_to_call.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.assert_only_self": {"pc": 185, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.assert_only_self.Args": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account.assert_only_self.Args", "type": "struct"}, "openzeppelin.account.library.Account.assert_only_self.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.assert_only_self.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.assert_only_self.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.assert_only_self.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.execute": {"pc": 254, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.execute.Args": {"size": 4, "members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "openzeppelin.account.library.Account.execute.Args", "type": "struct"}, "openzeppelin.account.library.Account.execute.ImplicitArgs": {"size": 5, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "bitwise_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin*", "offset": 3}, "range_check_ptr": {"cairo_type": "felt", "offset": 4}}, "full_name": "openzeppelin.account.library.Account.execute.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.execute.Return": {"cairo_type": "(response_len: felt, response: felt*)", "type": "type_definition"}, "openzeppelin.account.library.Account.execute.SIZEOF_LOCALS": {"value": 3, "type": "const"}, "openzeppelin.account.library.Account.get_public_key": {"pc": 194, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.get_public_key.Args": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account.get_public_key.Args", "type": "struct"}, "openzeppelin.account.library.Account.get_public_key.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.get_public_key.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.get_public_key.Return": {"cairo_type": "(public_key: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account.get_public_key.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.initializer": {"pc": 178, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.initializer.Args": {"size": 1, "members": {"_public_key": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.initializer.Args", "type": "struct"}, "openzeppelin.account.library.Account.initializer.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.initializer.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.initializer.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.initializer.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.is_valid_signature": {"pc": 235, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.is_valid_signature.Args": {"size": 3, "members": {"hash": {"cairo_type": "felt", "offset": 0}, "signature_len": {"cairo_type": "felt", "offset": 1}, "signature": {"cairo_type": "felt*", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.is_valid_signature.Args", "type": "struct"}, "openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs": {"size": 4, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.is_valid_signature.Return": {"cairo_type": "(is_valid: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account.is_valid_signature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.set_public_key": {"pc": 226, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.set_public_key.Args": {"size": 1, "members": {"new_public_key": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.set_public_key.Args", "type": "struct"}, "openzeppelin.account.library.Account.set_public_key.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.set_public_key.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.set_public_key.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.set_public_key.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.supports_interface": {"pc": 200, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account.supports_interface.Args": {"size": 1, "members": {"interface_id": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.supports_interface.Args", "type": "struct"}, "openzeppelin.account.library.Account.supports_interface.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.supports_interface.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account.supports_interface.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account.supports_interface.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.AccountCallArray": {"size": 4, "members": {"to": {"cairo_type": "felt", "offset": 0}, "selector": {"cairo_type": "felt", "offset": 1}, "data_offset": {"cairo_type": "felt", "offset": 2}, "data_len": {"cairo_type": "felt", "offset": 3}}, "full_name": "openzeppelin.account.library.AccountCallArray", "type": "struct"}, "openzeppelin.account.library.Account_public_key": {"type": "namespace"}, "openzeppelin.account.library.Account_public_key.Args": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account_public_key.Args", "type": "struct"}, "openzeppelin.account.library.Account_public_key.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "openzeppelin.account.library.Account_public_key.ImplicitArgs": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account_public_key.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account_public_key.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account_public_key.addr": {"pc": 148, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account_public_key.addr.Args": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account_public_key.addr.Args", "type": "struct"}, "openzeppelin.account.library.Account_public_key.addr.ImplicitArgs": {"size": 2, "members": {"pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "openzeppelin.account.library.Account_public_key.addr.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account_public_key.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account_public_key.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "openzeppelin.account.library.Account_public_key.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "openzeppelin.account.library.Account_public_key.read": {"pc": 153, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account_public_key.read.Args": {"size": 0, "members": {}, "full_name": "openzeppelin.account.library.Account_public_key.read.Args", "type": "struct"}, "openzeppelin.account.library.Account_public_key.read.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account_public_key.read.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account_public_key.read.Return": {"cairo_type": "(public_key: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account_public_key.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "openzeppelin.account.library.Account_public_key.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "openzeppelin.account.library.Account_public_key.write": {"pc": 166, "decorators": [], "type": "function"}, "openzeppelin.account.library.Account_public_key.write.Args": {"size": 1, "members": {"value": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account_public_key.write.Args", "type": "struct"}, "openzeppelin.account.library.Account_public_key.write.ImplicitArgs": {"size": 3, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account_public_key.write.ImplicitArgs", "type": "struct"}, "openzeppelin.account.library.Account_public_key.write.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "openzeppelin.account.library.Call": {"size": 4, "members": {"to": {"cairo_type": "felt", "offset": 0}, "selector": {"cairo_type": "felt", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "openzeppelin.account.library.Call", "type": "struct"}, "openzeppelin.account.library.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "openzeppelin.account.library.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "openzeppelin.account.library.IACCOUNT_ID": {"destination": "openzeppelin.utils.constants.library.IACCOUNT_ID", "type": "alias"}, "openzeppelin.account.library.IERC165_ID": {"destination": "openzeppelin.utils.constants.library.IERC165_ID", "type": "alias"}, "openzeppelin.account.library.SignatureBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "alias"}, "openzeppelin.account.library.TRANSACTION_VERSION": {"destination": "openzeppelin.utils.constants.library.TRANSACTION_VERSION", "type": "alias"}, "openzeppelin.account.library.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "openzeppelin.account.library.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "openzeppelin.account.library.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "openzeppelin.account.library.call_contract": {"destination": "starkware.starknet.common.syscalls.call_contract", "type": "alias"}, "openzeppelin.account.library.get_caller_address": {"destination": "starkware.starknet.common.syscalls.get_caller_address", "type": "alias"}, "openzeppelin.account.library.get_contract_address": {"destination": "starkware.starknet.common.syscalls.get_contract_address", "type": "alias"}, "openzeppelin.account.library.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "openzeppelin.account.library.get_tx_info": {"destination": "starkware.starknet.common.syscalls.get_tx_info", "type": "alias"}, "openzeppelin.account.library.is_le_felt": {"destination": "starkware.cairo.common.math_cmp.is_le_felt", "type": "alias"}, "openzeppelin.account.library.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "openzeppelin.account.library.split_felt": {"destination": "starkware.cairo.common.math.split_felt", "type": "alias"}, "openzeppelin.account.library.verify_ecdsa_signature": {"destination": "starkware.cairo.common.signature.verify_ecdsa_signature", "type": "alias"}, "openzeppelin.account.library.verify_eth_signature_uint256": {"destination": "starkware.cairo.common.cairo_secp.signature.verify_eth_signature_uint256", "type": "alias"}, "openzeppelin.utils.constants.library.DEFAULT_ADMIN_ROLE": {"value": 0, "type": "const"}, "openzeppelin.utils.constants.library.IACCESSCONTROL_ID": {"value": 2036718347, "type": "const"}, "openzeppelin.utils.constants.library.IACCOUNT_ID": {"value": 2792084853, "type": "const"}, "openzeppelin.utils.constants.library.IERC165_ID": {"value": 33540519, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_ENUMERABLE_ID": {"value": 2014223715, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_ID": {"value": 2158778573, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_METADATA_ID": {"value": 1532892063, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_RECEIVER_ID": {"value": 353073666, "type": "const"}, "openzeppelin.utils.constants.library.INVALID_ID": {"value": 4294967295, "type": "const"}, "openzeppelin.utils.constants.library.TRANSACTION_VERSION": {"value": 1, "type": "const"}, "openzeppelin.utils.constants.library.UINT8_MAX": {"value": 255, "type": "const"}, "starkware.cairo.common.alloc.alloc": {"pc": 0, "decorators": [], "type": "function"}, "starkware.cairo.common.alloc.alloc.Args": {"size": 0, "members": {}, "full_name": "starkware.cairo.common.alloc.alloc.Args", "type": "struct"}, "starkware.cairo.common.alloc.alloc.ImplicitArgs": {"size": 0, "members": {}, "full_name": "starkware.cairo.common.alloc.alloc.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.alloc.alloc.Return": {"cairo_type": "(ptr: felt*)", "type": "type_definition"}, "starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.bitwise.ALL_ONES": {"value": -106710729501573572985208420194530329073740042555888586719234, "type": "const"}, "starkware.cairo.common.bitwise.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.bool.FALSE": {"value": 0, "type": "const"}, "starkware.cairo.common.bool.TRUE": {"value": 1, "type": "const"}, "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": {"size": 5, "members": {"x": {"cairo_type": "felt", "offset": 0}, "y": {"cairo_type": "felt", "offset": 1}, "x_and_y": {"cairo_type": "felt", "offset": 2}, "x_xor_y": {"cairo_type": "felt", "offset": 3}, "x_or_y": {"cairo_type": "felt", "offset": 4}}, "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.EcOpBuiltin": {"size": 7, "members": {"p": {"cairo_type": "starkware.cairo.common.ec_point.EcPoint", "offset": 0}, "q": {"cairo_type": "starkware.cairo.common.ec_point.EcPoint", "offset": 2}, "m": {"cairo_type": "felt", "offset": 4}, "r": {"cairo_type": "starkware.cairo.common.ec_point.EcPoint", "offset": 5}}, "full_name": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.cairo_builtins.HashBuiltin": {"size": 3, "members": {"x": {"cairo_type": "felt", "offset": 0}, "y": {"cairo_type": "felt", "offset": 1}, "result": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.KeccakBuiltin": {"size": 16, "members": {"input": {"cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "offset": 0}, "output": {"cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "offset": 8}}, "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": {"destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "type": "alias"}, "starkware.cairo.common.cairo_builtins.SignatureBuiltin": {"size": 2, "members": {"pub_key": {"cairo_type": "felt", "offset": 0}, "message": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_keccak.keccak.BLOCK_SIZE": {"destination": "starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.BYTES_IN_WORD": {"value": 8, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_CAPACITY_IN_WORDS": {"value": 8, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_BYTES": {"value": 136, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_WORDS": {"value": 17, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_STATE_SIZE_FELTS": {"value": 25, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_lt": {"destination": "starkware.cairo.common.math.assert_lt", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_nn": {"destination": "starkware.cairo.common.math.assert_nn", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.bitwise_and": {"destination": "starkware.cairo.common.bitwise.bitwise_and", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.bitwise_or": {"destination": "starkware.cairo.common.bitwise.bitwise_or", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.bitwise_xor": {"destination": "starkware.cairo.common.bitwise.bitwise_xor", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.memset": {"destination": "starkware.cairo.common.memset.memset", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.packed_keccak_func": {"destination": "starkware.cairo.common.cairo_keccak.packed_keccak.packed_keccak_func", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.pow": {"destination": "starkware.cairo.common.pow.pow", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.split_felt": {"destination": "starkware.cairo.common.math.split_felt", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.uint256_reverse_endian": {"destination": "starkware.cairo.common.uint256.uint256_reverse_endian", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "starkware.cairo.common.cairo_keccak.packed_keccak.ALL_ONES": {"value": -106710729501573572985208420194530329073740042555888586719234, "type": "const"}, "starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE": {"value": 3, "type": "const"}, "starkware.cairo.common.cairo_keccak.packed_keccak.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.cairo_keccak.packed_keccak.SHIFTS": {"value": 340282366920938463481821351505477763073, "type": "const"}, "starkware.cairo.common.cairo_keccak.packed_keccak.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "starkware.cairo.common.cairo_keccak.packed_keccak.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.BASE": {"destination": "starkware.cairo.common.cairo_secp.constants.BASE", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.BigInt3": {"size": 3, "members": {"d0": {"cairo_type": "felt", "offset": 0}, "d1": {"cairo_type": "felt", "offset": 1}, "d2": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "struct"}, "starkware.cairo.common.cairo_secp.bigint.RC_BOUND": {"destination": "starkware.cairo.common.math_cmp.RC_BOUND", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3": {"size": 3, "members": {"d0": {"cairo_type": "felt", "offset": 0}, "d1": {"cairo_type": "felt", "offset": 1}, "d2": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "struct"}, "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5": {"size": 5, "members": {"d0": {"cairo_type": "felt", "offset": 0}, "d1": {"cairo_type": "felt", "offset": 1}, "d2": {"cairo_type": "felt", "offset": 2}, "d3": {"cairo_type": "felt", "offset": 3}, "d4": {"cairo_type": "felt", "offset": 4}}, "full_name": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5", "type": "struct"}, "starkware.cairo.common.cairo_secp.bigint.assert_nn": {"destination": "starkware.cairo.common.math.assert_nn", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "starkware.cairo.common.cairo_secp.constants.BASE": {"value": 77371252455336267181195264, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.BETA": {"value": 7, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.N0": {"value": 10428087374290690730508609, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.N1": {"value": 77371252455330678278691517, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.N2": {"value": 19342813113834066795298815, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.P0": {"value": 77371252455336262886226991, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.P1": {"value": 77371252455336267181195263, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.P2": {"value": 19342813113834066795298815, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.SECP_REM": {"value": 4294968273, "type": "const"}, "starkware.cairo.common.cairo_secp.ec.BigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.EcPoint": {"size": 6, "members": {"x": {"cairo_type": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "offset": 0}, "y": {"cairo_type": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "offset": 3}}, "full_name": "starkware.cairo.common.cairo_secp.ec.EcPoint", "type": "struct"}, "starkware.cairo.common.cairo_secp.ec.UnreducedBigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.is_zero": {"destination": "starkware.cairo.common.cairo_secp.field.is_zero", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.nondet_bigint3": {"destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.unreduced_mul": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.unreduced_sqr": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_sqr", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.verify_zero": {"destination": "starkware.cairo.common.cairo_secp.field.verify_zero", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.BASE": {"destination": "starkware.cairo.common.cairo_secp.constants.BASE", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.BigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.P0": {"destination": "starkware.cairo.common.cairo_secp.constants.P0", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.P1": {"destination": "starkware.cairo.common.cairo_secp.constants.P1", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.P2": {"destination": "starkware.cairo.common.cairo_secp.constants.P2", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.SECP_REM": {"destination": "starkware.cairo.common.cairo_secp.constants.SECP_REM", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.UnreducedBigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.nondet_bigint3": {"destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BASE": {"destination": "starkware.cairo.common.cairo_secp.bigint.BASE", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BETA": {"destination": "starkware.cairo.common.cairo_secp.constants.BETA", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.EcPoint": {"destination": "starkware.cairo.common.cairo_secp.ec.EcPoint", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.N0": {"destination": "starkware.cairo.common.cairo_secp.constants.N0", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.N1": {"destination": "starkware.cairo.common.cairo_secp.constants.N1", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.N2": {"destination": "starkware.cairo.common.cairo_secp.constants.N2", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.RC_BOUND": {"destination": "starkware.cairo.common.math_cmp.RC_BOUND", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.UnreducedBigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.assert_nn": {"destination": "starkware.cairo.common.math.assert_nn", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.bigint_mul": {"destination": "starkware.cairo.common.cairo_secp.bigint.bigint_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.bigint_to_uint256": {"destination": "starkware.cairo.common.cairo_secp.bigint.bigint_to_uint256", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.ec_add": {"destination": "starkware.cairo.common.cairo_secp.ec.ec_add", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.ec_mul": {"destination": "starkware.cairo.common.cairo_secp.ec.ec_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.ec_negate": {"destination": "starkware.cairo.common.cairo_secp.ec.ec_negate", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.finalize_keccak": {"destination": "starkware.cairo.common.cairo_keccak.keccak.finalize_keccak", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.keccak_uint256s_bigend": {"destination": "starkware.cairo.common.cairo_keccak.keccak.keccak_uint256s_bigend", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.nondet_bigint3": {"destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.reduce": {"destination": "starkware.cairo.common.cairo_secp.field.reduce", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.uint256_to_bigint": {"destination": "starkware.cairo.common.cairo_secp.bigint.uint256_to_bigint", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.unreduced_mul": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.unreduced_sqr": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_sqr", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.validate_reduced_field_element": {"destination": "starkware.cairo.common.cairo_secp.field.validate_reduced_field_element", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.verify_zero": {"destination": "starkware.cairo.common.cairo_secp.field.verify_zero", "type": "alias"}, "starkware.cairo.common.dict_access.DictAccess": {"size": 3, "members": {"key": {"cairo_type": "felt", "offset": 0}, "prev_value": {"cairo_type": "felt", "offset": 1}, "new_value": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.dict_access.DictAccess", "type": "struct"}, "starkware.cairo.common.ec.EcOpBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "type": "alias"}, "starkware.cairo.common.ec.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.ec.StarkCurve": {"type": "namespace"}, "starkware.cairo.common.ec.StarkCurve.ALPHA": {"value": 1, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.Args": {"size": 0, "members": {}, "full_name": "starkware.cairo.common.ec.StarkCurve.Args", "type": "struct"}, "starkware.cairo.common.ec.StarkCurve.BETA": {"value": -476910135076337975234679399815567221425937815956490878998147463828055613816, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.GEN_X": {"value": 874739451078007766457464989774322083649278607533249481151382481072868806602, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.GEN_Y": {"value": 152666792071518830868575557812948353041420400780739481342941381225525861407, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.ImplicitArgs": {"size": 0, "members": {}, "full_name": "starkware.cairo.common.ec.StarkCurve.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.ec.StarkCurve.ORDER": {"value": -96363463615509210819012598251359154898, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.ec.is_quad_residue": {"destination": "starkware.cairo.common.math.is_quad_residue", "type": "alias"}, "starkware.cairo.common.ec_point.EcPoint": {"size": 2, "members": {"x": {"cairo_type": "felt", "offset": 0}, "y": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.ec_point.EcPoint", "type": "struct"}, "starkware.cairo.common.hash.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "starkware.cairo.common.keccak_state.KeccakBuiltinState": {"size": 8, "members": {"s0": {"cairo_type": "felt", "offset": 0}, "s1": {"cairo_type": "felt", "offset": 1}, "s2": {"cairo_type": "felt", "offset": 2}, "s3": {"cairo_type": "felt", "offset": 3}, "s4": {"cairo_type": "felt", "offset": 4}, "s5": {"cairo_type": "felt", "offset": 5}, "s6": {"cairo_type": "felt", "offset": 6}, "s7": {"cairo_type": "felt", "offset": 7}}, "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "type": "struct"}, "starkware.cairo.common.math.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "starkware.cairo.common.math.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "starkware.cairo.common.math.assert_le_felt": {"pc": 18, "decorators": ["known_ap_change"], "type": "function"}, "starkware.cairo.common.math.assert_le_felt.Args": {"size": 2, "members": {"a": {"cairo_type": "felt", "offset": 0}, "b": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.math.assert_le_felt.Args", "type": "struct"}, "starkware.cairo.common.math.assert_le_felt.ImplicitArgs": {"size": 1, "members": {"range_check_ptr": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.cairo.common.math.assert_le_felt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH": {"value": 5316911983139663648412552867652567041, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH": {"value": 3544607988759775765608368578435044694, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.a": {"full_name": "starkware.cairo.common.math.assert_le_felt.a", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 2, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 18}], "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.b": {"full_name": "starkware.cairo.common.math.assert_le_felt.b", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 2, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 18}], "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.range_check_ptr": {"full_name": "starkware.cairo.common.math.assert_le_felt.range_check_ptr", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 2, "offset": 0}, "value": "[cast(fp + (-5), felt*)]", "pc": 18}, {"ap_tracking_data": {"group": 2, "offset": 8}, "value": "cast([fp + (-5)] + 4, felt)", "pc": 28}], "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.skip_exclude_a": {"pc": 42, "type": "label"}, "starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a": {"pc": 54, "type": "label"}, "starkware.cairo.common.math.assert_lt_felt": {"pc": 63, "decorators": ["known_ap_change"], "type": "function"}, "starkware.cairo.common.math.assert_lt_felt.Args": {"size": 2, "members": {"a": {"cairo_type": "felt", "offset": 0}, "b": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.math.assert_lt_felt.Args", "type": "struct"}, "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs": {"size": 1, "members": {"range_check_ptr": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_lt_felt.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_lt_felt.a": {"full_name": "starkware.cairo.common.math.assert_lt_felt.a", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 3, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 63}], "type": "reference"}, "starkware.cairo.common.math.assert_lt_felt.b": {"full_name": "starkware.cairo.common.math.assert_lt_felt.b", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 3, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 63}], "type": "reference"}, "starkware.cairo.common.math_cmp.RC_BOUND": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.math_cmp.assert_le_felt": {"destination": "starkware.cairo.common.math.assert_le_felt", "type": "alias"}, "starkware.cairo.common.math_cmp.assert_lt_felt": {"destination": "starkware.cairo.common.math.assert_lt_felt", "type": "alias"}, "starkware.cairo.common.math_cmp.is_le_felt": {"pc": 128, "decorators": ["known_ap_change"], "type": "function"}, "starkware.cairo.common.math_cmp.is_le_felt.Args": {"size": 2, "members": {"a": {"cairo_type": "felt", "offset": 0}, "b": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.math_cmp.is_le_felt.Args", "type": "struct"}, "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs": {"size": 1, "members": {"range_check_ptr": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math_cmp.is_le_felt.Return": {"cairo_type": "felt", "type": "type_definition"}, "starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math_cmp.is_le_felt.a": {"full_name": "starkware.cairo.common.math_cmp.is_le_felt.a", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 11, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 128}], "type": "reference"}, "starkware.cairo.common.math_cmp.is_le_felt.b": {"full_name": "starkware.cairo.common.math_cmp.is_le_felt.b", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 11, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 128}], "type": "reference"}, "starkware.cairo.common.math_cmp.is_le_felt.not_le": {"pc": 140, "type": "label"}, "starkware.cairo.common.memcpy.memcpy": {"pc": 3, "decorators": [], "type": "function"}, "starkware.cairo.common.memcpy.memcpy.Args": {"size": 3, "members": {"dst": {"cairo_type": "felt*", "offset": 0}, "src": {"cairo_type": "felt*", "offset": 1}, "len": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.memcpy.memcpy.Args", "type": "struct"}, "starkware.cairo.common.memcpy.memcpy.ImplicitArgs": {"size": 0, "members": {}, "full_name": "starkware.cairo.common.memcpy.memcpy.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.memcpy.memcpy.LoopFrame": {"size": 2, "members": {"dst": {"cairo_type": "felt*", "offset": 0}, "src": {"cairo_type": "felt*", "offset": 1}}, "full_name": "starkware.cairo.common.memcpy.memcpy.LoopFrame", "type": "struct"}, "starkware.cairo.common.memcpy.memcpy.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.memcpy.memcpy.continue_copying": {"full_name": "starkware.cairo.common.memcpy.memcpy.continue_copying", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 1, "offset": 3}, "value": "[cast(ap, felt*)]", "pc": 10}], "type": "reference"}, "starkware.cairo.common.memcpy.memcpy.len": {"full_name": "starkware.cairo.common.memcpy.memcpy.len", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 1, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 3}], "type": "reference"}, "starkware.cairo.common.memcpy.memcpy.loop": {"pc": 8, "type": "label"}, "starkware.cairo.common.pow.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "starkware.cairo.common.pow.get_ap": {"destination": "starkware.cairo.common.registers.get_ap", "type": "alias"}, "starkware.cairo.common.pow.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.registers.get_ap": {"destination": "starkware.cairo.lang.compiler.lib.registers.get_ap", "type": "alias"}, "starkware.cairo.common.registers.get_fp_and_pc": {"destination": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.signature.EcOpBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "type": "alias"}, "starkware.cairo.common.signature.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.signature.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "starkware.cairo.common.signature.SignatureBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "alias"}, "starkware.cairo.common.signature.StarkCurve": {"destination": "starkware.cairo.common.ec.StarkCurve", "type": "alias"}, "starkware.cairo.common.signature.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "starkware.cairo.common.signature.ec_add": {"destination": "starkware.cairo.common.ec.ec_add", "type": "alias"}, "starkware.cairo.common.signature.ec_mul": {"destination": "starkware.cairo.common.ec.ec_mul", "type": "alias"}, "starkware.cairo.common.signature.ec_sub": {"destination": "starkware.cairo.common.ec.ec_sub", "type": "alias"}, "starkware.cairo.common.signature.is_x_on_curve": {"destination": "starkware.cairo.common.ec.is_x_on_curve", "type": "alias"}, "starkware.cairo.common.signature.recover_y": {"destination": "starkware.cairo.common.ec.recover_y", "type": "alias"}, "starkware.cairo.common.signature.verify_ecdsa_signature": {"pc": 123, "decorators": [], "type": "function"}, "starkware.cairo.common.signature.verify_ecdsa_signature.Args": {"size": 4, "members": {"message": {"cairo_type": "felt", "offset": 0}, "public_key": {"cairo_type": "felt", "offset": 1}, "signature_r": {"cairo_type": "felt", "offset": 2}, "signature_s": {"cairo_type": "felt", "offset": 3}}, "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.Args", "type": "struct"}, "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs": {"size": 1, "members": {"ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 0}}, "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.signature.verify_ecdsa_signature.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": {"full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr", "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "references": [{"ap_tracking_data": {"group": 10, "offset": 0}, "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]", "pc": 123}, {"ap_tracking_data": {"group": 10, "offset": 0}, "value": "cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)", "pc": 125}], "type": "reference"}, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": {"full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 10, "offset": 0}, "value": "[cast(fp + (-4), felt*)]", "pc": 123}], "type": "reference"}, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": {"full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s", "cairo_type": "felt", "references": [{"ap_tracking_data": {"group": 10, "offset": 0}, "value": "[cast(fp + (-3), felt*)]", "pc": 123}], "type": "reference"}, "starkware.cairo.common.uint256.ALL_ONES": {"value": 340282366920938463463374607431768211455, "type": "const"}, "starkware.cairo.common.uint256.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.uint256.HALF_SHIFT": {"value": 18446744073709551616, "type": "const"}, "starkware.cairo.common.uint256.SHIFT": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.uint256.Uint256": {"size": 2, "members": {"low": {"cairo_type": "felt", "offset": 0}, "high": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.uint256.Uint256", "type": "struct"}, "starkware.cairo.common.uint256.assert_in_range": {"destination": "starkware.cairo.common.math.assert_in_range", "type": "alias"}, "starkware.cairo.common.uint256.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "starkware.cairo.common.uint256.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.uint256.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_and": {"destination": "starkware.cairo.common.bitwise.bitwise_and", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_or": {"destination": "starkware.cairo.common.bitwise.bitwise_or", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_xor": {"destination": "starkware.cairo.common.bitwise.bitwise_xor", "type": "alias"}, "starkware.cairo.common.uint256.get_ap": {"destination": "starkware.cairo.common.registers.get_ap", "type": "alias"}, "starkware.cairo.common.uint256.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.uint256.is_le": {"destination": "starkware.cairo.common.math_cmp.is_le", "type": "alias"}, "starkware.cairo.common.uint256.pow": {"destination": "starkware.cairo.common.pow.pow", "type": "alias"}, "starkware.starknet.common.storage.ADDR_BOUND": {"value": -106710729501573572985208420194530329073740042555888586719489, "type": "const"}, "starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE": {"value": 256, "type": "const"}, "starkware.starknet.common.storage.assert_250_bit": {"destination": "starkware.cairo.common.math.assert_250_bit", "type": "alias"}, "starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR": {"value": 20853273475220472486191784820, "type": "const"}, "starkware.starknet.common.syscalls.CallContract": {"size": 7, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.CallContractRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", "offset": 5}}, "full_name": "starkware.starknet.common.syscalls.CallContract", "type": "struct"}, "starkware.starknet.common.syscalls.CallContractRequest": {"size": 5, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "contract_address": {"cairo_type": "felt", "offset": 1}, "function_selector": {"cairo_type": "felt", "offset": 2}, "calldata_size": {"cairo_type": "felt", "offset": 3}, "calldata": {"cairo_type": "felt*", "offset": 4}}, "full_name": "starkware.starknet.common.syscalls.CallContractRequest", "type": "struct"}, "starkware.starknet.common.syscalls.CallContractResponse": {"size": 2, "members": {"retdata_size": {"cairo_type": "felt", "offset": 0}, "retdata": {"cairo_type": "felt*", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.CallContractResponse", "type": "struct"}, "starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR": {"value": 21167594061783206823196716140, "type": "const"}, "starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR": {"value": 23274015802972845247556842986379118667122, "type": "const"}, "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": {"value": 75202468540281, "type": "const"}, "starkware.starknet.common.syscalls.Deploy": {"size": 9, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.DeployRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.DeployResponse", "offset": 6}}, "full_name": "starkware.starknet.common.syscalls.Deploy", "type": "struct"}, "starkware.starknet.common.syscalls.DeployRequest": {"size": 6, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "class_hash": {"cairo_type": "felt", "offset": 1}, "contract_address_salt": {"cairo_type": "felt", "offset": 2}, "constructor_calldata_size": {"cairo_type": "felt", "offset": 3}, "constructor_calldata": {"cairo_type": "felt*", "offset": 4}, "deploy_from_zero": {"cairo_type": "felt", "offset": 5}}, "full_name": "starkware.starknet.common.syscalls.DeployRequest", "type": "struct"}, "starkware.starknet.common.syscalls.DeployResponse": {"size": 3, "members": {"contract_address": {"cairo_type": "felt", "offset": 0}, "constructor_retdata_size": {"cairo_type": "felt", "offset": 1}, "constructor_retdata": {"cairo_type": "felt*", "offset": 2}}, "full_name": "starkware.starknet.common.syscalls.DeployResponse", "type": "struct"}, "starkware.starknet.common.syscalls.DictAccess": {"destination": "starkware.cairo.common.dict_access.DictAccess", "type": "alias"}, "starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR": {"value": 1280709301550335749748, "type": "const"}, "starkware.starknet.common.syscalls.EmitEvent": {"size": 5, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "keys_len": {"cairo_type": "felt", "offset": 1}, "keys": {"cairo_type": "felt*", "offset": 2}, "data_len": {"cairo_type": "felt", "offset": 3}, "data": {"cairo_type": "felt*", "offset": 4}}, "full_name": "starkware.starknet.common.syscalls.EmitEvent", "type": "struct"}, "starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR": {"value": 1448089106835523001438702345020786, "type": "const"}, "starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR": {"value": 24294903732626645868215235778792757751152, "type": "const"}, "starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR": {"value": 94901967781393078444254803017658102643, "type": "const"}, "starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR": {"value": 6219495360805491471215297013070624192820083, "type": "const"}, "starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR": {"value": 1592190833581991703053805829594610833820054387, "type": "const"}, "starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR": {"value": 1317029390204112103023, "type": "const"}, "starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR": {"value": 1448089128652340074717162277007973, "type": "const"}, "starkware.starknet.common.syscalls.GetBlockNumber": {"size": 2, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetBlockNumber", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockNumberRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockNumberRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockNumberResponse": {"size": 1, "members": {"block_number": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockNumberResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestamp": {"size": 2, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestamp", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestampRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestampResponse": {"size": 1, "members": {"block_timestamp": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddress": {"size": 2, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetCallerAddress", "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddressRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetCallerAddressRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddressResponse": {"size": 1, "members": {"caller_address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetCallerAddressResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddress": {"size": 2, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetContractAddressRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetContractAddressResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetContractAddress", "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddressRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetContractAddressRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddressResponse": {"size": 1, "members": {"contract_address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetContractAddressResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddress": {"size": 2, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddress", "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddressRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddressResponse": {"size": 1, "members": {"sequencer_address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfo": {"size": 2, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetTxInfoRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetTxInfoResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetTxInfo", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfoRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetTxInfoRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfoResponse": {"size": 1, "members": {"tx_info": {"cairo_type": "starkware.starknet.common.syscalls.TxInfo*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetTxInfoResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignature": {"size": 3, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetTxSignature", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignatureRequest": {"size": 1, "members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetTxSignatureRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignatureResponse": {"size": 2, "members": {"signature_len": {"cairo_type": "felt", "offset": 0}, "signature": {"cairo_type": "felt*", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetTxSignatureResponse", "type": "struct"}, "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": {"value": 436233452754198157705746250789557519228244616562, "type": "const"}, "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": {"value": 92376026794327011772951660, "type": "const"}, "starkware.starknet.common.syscalls.LibraryCall": {"size": 7, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", "offset": 5}}, "full_name": "starkware.starknet.common.syscalls.LibraryCall", "type": "struct"}, "starkware.starknet.common.syscalls.LibraryCallRequest": {"size": 5, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "class_hash": {"cairo_type": "felt", "offset": 1}, "function_selector": {"cairo_type": "felt", "offset": 2}, "calldata_size": {"cairo_type": "felt", "offset": 3}, "calldata": {"cairo_type": "felt*", "offset": 4}}, "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", "type": "struct"}, "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": {"value": 433017908768303439907196859243777073, "type": "const"}, "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": {"value": 100890693370601760042082660, "type": "const"}, "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": {"value": 25828017502874050592466629733, "type": "const"}, "starkware.starknet.common.syscalls.SendMessageToL1SysCall": {"size": 4, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "to_address": {"cairo_type": "felt", "offset": 1}, "payload_size": {"cairo_type": "felt", "offset": 2}, "payload_ptr": {"cairo_type": "felt*", "offset": 3}}, "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", "type": "struct"}, "starkware.starknet.common.syscalls.StorageRead": {"size": 3, "members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.StorageReadRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse", "offset": 2}}, "full_name": "starkware.starknet.common.syscalls.StorageRead", "type": "struct"}, "starkware.starknet.common.syscalls.StorageReadRequest": {"size": 2, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "address": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.StorageReadRequest", "type": "struct"}, "starkware.starknet.common.syscalls.StorageReadResponse": {"size": 1, "members": {"value": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.StorageReadResponse", "type": "struct"}, "starkware.starknet.common.syscalls.StorageWrite": {"size": 3, "members": {"selector": {"cairo_type": "felt", "offset": 0}, "address": {"cairo_type": "felt", "offset": 1}, "value": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.starknet.common.syscalls.StorageWrite", "type": "struct"}, "starkware.starknet.common.syscalls.TxInfo": {"size": 8, "members": {"version": {"cairo_type": "felt", "offset": 0}, "account_contract_address": {"cairo_type": "felt", "offset": 1}, "max_fee": {"cairo_type": "felt", "offset": 2}, "signature_len": {"cairo_type": "felt", "offset": 3}, "signature": {"cairo_type": "felt*", "offset": 4}, "transaction_hash": {"cairo_type": "felt", "offset": 5}, "chain_id": {"cairo_type": "felt", "offset": 6}, "nonce": {"cairo_type": "felt", "offset": 7}}, "full_name": "starkware.starknet.common.syscalls.TxInfo", "type": "struct"}, "starkware.starknet.common.syscalls.call_contract": {"pc": 74, "decorators": [], "type": "function"}, "starkware.starknet.common.syscalls.call_contract.Args": {"size": 4, "members": {"contract_address": {"cairo_type": "felt", "offset": 0}, "function_selector": {"cairo_type": "felt", "offset": 1}, "calldata_size": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "starkware.starknet.common.syscalls.call_contract.Args", "type": "struct"}, "starkware.starknet.common.syscalls.call_contract.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.call_contract.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.call_contract.Return": {"cairo_type": "(retdata_size: felt, retdata: felt*)", "type": "type_definition"}, "starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.call_contract.syscall_ptr": {"full_name": "starkware.starknet.common.syscalls.call_contract.syscall_ptr", "cairo_type": "felt*", "references": [{"ap_tracking_data": {"group": 4, "offset": 0}, "value": "[cast(fp + (-7), felt**)]", "pc": 74}, {"ap_tracking_data": {"group": 4, "offset": 1}, "value": "cast([fp + (-7)] + 7, felt*)", "pc": 81}], "type": "reference"}, "starkware.starknet.common.syscalls.get_caller_address": {"pc": 86, "decorators": [], "type": "function"}, "starkware.starknet.common.syscalls.get_caller_address.Args": {"size": 0, "members": {}, "full_name": "starkware.starknet.common.syscalls.get_caller_address.Args", "type": "struct"}, "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.get_caller_address.Return": {"cairo_type": "(caller_address: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": {"full_name": "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr", "cairo_type": "felt*", "references": [{"ap_tracking_data": {"group": 5, "offset": 0}, "value": "[cast(fp + (-3), felt**)]", "pc": 86}, {"ap_tracking_data": {"group": 5, "offset": 1}, "value": "cast([fp + (-3)] + 2, felt*)", "pc": 89}], "type": "reference"}, "starkware.starknet.common.syscalls.get_contract_address": {"pc": 93, "decorators": [], "type": "function"}, "starkware.starknet.common.syscalls.get_contract_address.Args": {"size": 0, "members": {}, "full_name": "starkware.starknet.common.syscalls.get_contract_address.Args", "type": "struct"}, "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.get_contract_address.Return": {"cairo_type": "(contract_address: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": {"full_name": "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr", "cairo_type": "felt*", "references": [{"ap_tracking_data": {"group": 6, "offset": 0}, "value": "[cast(fp + (-3), felt**)]", "pc": 93}, {"ap_tracking_data": {"group": 6, "offset": 1}, "value": "cast([fp + (-3)] + 2, felt*)", "pc": 96}], "type": "reference"}, "starkware.starknet.common.syscalls.get_tx_info": {"pc": 116, "decorators": [], "type": "function"}, "starkware.starknet.common.syscalls.get_tx_info.Args": {"size": 0, "members": {}, "full_name": "starkware.starknet.common.syscalls.get_tx_info.Args", "type": "struct"}, "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.get_tx_info.Return": {"cairo_type": "(tx_info: starkware.starknet.common.syscalls.TxInfo*)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": {"full_name": "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr", "cairo_type": "felt*", "references": [{"ap_tracking_data": {"group": 9, "offset": 0}, "value": "[cast(fp + (-3), felt**)]", "pc": 116}, {"ap_tracking_data": {"group": 9, "offset": 1}, "value": "cast([fp + (-3)] + 2, felt*)", "pc": 119}], "type": "reference"}, "starkware.starknet.common.syscalls.storage_read": {"pc": 100, "decorators": [], "type": "function"}, "starkware.starknet.common.syscalls.storage_read.Args": {"size": 1, "members": {"address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.storage_read.Args", "type": "struct"}, "starkware.starknet.common.syscalls.storage_read.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.storage_read.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.storage_read.Return": {"cairo_type": "(value: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.storage_read.syscall_ptr": {"full_name": "starkware.starknet.common.syscalls.storage_read.syscall_ptr", "cairo_type": "felt*", "references": [{"ap_tracking_data": {"group": 7, "offset": 0}, "value": "[cast(fp + (-4), felt**)]", "pc": 100}, {"ap_tracking_data": {"group": 7, "offset": 1}, "value": "cast([fp + (-4)] + 3, felt*)", "pc": 104}], "type": "reference"}, "starkware.starknet.common.syscalls.storage_write": {"pc": 108, "decorators": [], "type": "function"}, "starkware.starknet.common.syscalls.storage_write.Args": {"size": 2, "members": {"address": {"cairo_type": "felt", "offset": 0}, "value": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.storage_write.Args", "type": "struct"}, "starkware.starknet.common.syscalls.storage_write.ImplicitArgs": {"size": 1, "members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.storage_write.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.storage_write.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.storage_write.syscall_ptr": {"full_name": "starkware.starknet.common.syscalls.storage_write.syscall_ptr", "cairo_type": "felt*", "references": [{"ap_tracking_data": {"group": 8, "offset": 0}, "value": "[cast(fp + (-5), felt**)]", "pc": 108}, {"ap_tracking_data": {"group": 8, "offset": 1}, "value": "cast([fp + (-5)] + 3, felt*)", "pc": 113}], "type": "reference"}}, "compiler_version": "0.10.2", "attributes": [{"end_pc": 192, "value": "Account: caller is not this account", "accessible_scopes": ["openzeppelin.account.library", "openzeppelin.account.library.Account", "openzeppelin.account.library.Account.assert_only_self"], "name": "error_message", "start_pc": 191, "flow_tracking_data": {"ap_tracking": {"group": 16, "offset": 12}, "reference_ids": {}}}, {"end_pc": 269, "value": "Account: deprecated tx version", "accessible_scopes": ["openzeppelin.account.library", "openzeppelin.account.library.Account", "openzeppelin.account.library.Account.execute"], "name": "error_message", "start_pc": 259, "flow_tracking_data": {"ap_tracking": {"group": 21, "offset": 9}, "reference_ids": {}}}, {"end_pc": 274, "value": "Account: reentrant call", "accessible_scopes": ["openzeppelin.account.library", "openzeppelin.account.library.Account", "openzeppelin.account.library.Account.execute"], "name": "error_message", "start_pc": 272, "flow_tracking_data": {"ap_tracking": {"group": 21, "offset": 49}, "reference_ids": {}}}], "prime": "0x800000000000011000000000000000000000000000000000000000000000001"}} diff --git a/starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_mainnet.json b/starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_mainnet.json new file mode 100644 index 000000000..9f41227de --- /dev/null +++ b/starknet_programs/raw_contract_classes/0x04d07e40e93398ed3c76981e72dd1fd22557a78ce36c0515f679e27f0bb5bc5f_mainnet.json @@ -0,0 +1 @@ +{"abi": [{"members": [{"name": "to", "offset": 0, "type": "felt"}, {"name": "selector", "offset": 1, "type": "felt"}, {"name": "data_offset", "offset": 2, "type": "felt"}, {"name": "data_len", "offset": 3, "type": "felt"}], "name": "AccountCallArray", "size": 4, "type": "struct"}, {"inputs": [{"name": "publicKey", "type": "felt"}], "name": "constructor", "outputs": [], "type": "constructor"}, {"inputs": [], "name": "getPublicKey", "outputs": [{"name": "publicKey", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "interfaceId", "type": "felt"}], "name": "supportsInterface", "outputs": [{"name": "success", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "newPublicKey", "type": "felt"}], "name": "setPublicKey", "outputs": [], "type": "function"}, {"inputs": [{"name": "hash", "type": "felt"}, {"name": "signature_len", "type": "felt"}, {"name": "signature", "type": "felt*"}], "name": "isValidSignature", "outputs": [{"name": "isValid", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "call_array_len", "type": "felt"}, {"name": "call_array", "type": "AccountCallArray*"}, {"name": "calldata_len", "type": "felt"}, {"name": "calldata", "type": "felt*"}], "name": "__validate__", "outputs": [], "type": "function"}, {"inputs": [{"name": "class_hash", "type": "felt"}], "name": "__validate_declare__", "outputs": [], "type": "function"}, {"inputs": [{"name": "class_hash", "type": "felt"}, {"name": "salt", "type": "felt"}, {"name": "publicKey", "type": "felt"}], "name": "__validate_deploy__", "outputs": [], "type": "function"}, {"inputs": [{"name": "call_array_len", "type": "felt"}, {"name": "call_array", "type": "AccountCallArray*"}, {"name": "calldata_len", "type": "felt"}, {"name": "calldata", "type": "felt*"}], "name": "__execute__", "outputs": [{"name": "response_len", "type": "felt"}, {"name": "response", "type": "felt*"}], "type": "function"}], "entry_points_by_type": {"CONSTRUCTOR": [{"offset": "0x16e", "selector": "0x28ffe4ff0f226a9107253e17a904099aa4f63a02a5621de0576e5aa71bc5194"}], "EXTERNAL": [{"offset": "0x1cd", "selector": "0xbc0eb87884ab91e330445c3584a50d7ddf4b568f02fbeb456a6242cce3f5d9"}, {"offset": "0x2bb", "selector": "0x15d40a3d6ca2ac30f4031e42be28da9b056fef9bb7357ac5e85627ee876e5ad"}, {"offset": "0x224", "selector": "0x162da33a4585851fe8d3af3c2a9c60b557814e221e0d4f30ff0b2189d9c7775"}, {"offset": "0x191", "selector": "0x1a6c6a0bdec86cc645c91997d8eea83e87148659e3e61122f72361fd5e94079"}, {"offset": "0x1f4", "selector": "0x213dfe25e2ca309c4d615a09cfc95fdb2fc7dc73fbcad12c450fe93b1f2ff9e"}, {"offset": "0x25f", "selector": "0x289da278a8dc833409cabfdad1581e8e7d40e42dcaed693fa4008dcdb4963b3"}, {"offset": "0x1b2", "selector": "0x29e211664c0b63c79638fbea474206ca74016b3e9a3dc4f9ac300ffd8bdf2cd"}, {"offset": "0x285", "selector": "0x36fcbf06cd96843058359e1a75928beacfac10727dab22a3972f0af8aa92895"}], "L1_HANDLER": []}, "program": {"main_scope": "__main__", "hints": {"0": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["starkware.cairo.common.alloc", "starkware.cairo.common.alloc.alloc"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 0, "offset": 0}}}], "6": [{"code": "vm_enter_scope({'n': ids.len})", "accessible_scopes": ["starkware.cairo.common.memcpy", "starkware.cairo.common.memcpy.memcpy"], "flow_tracking_data": {"reference_ids": {"starkware.cairo.common.memcpy.memcpy.len": 0}, "ap_tracking": {"group": 1, "offset": 0}}}], "14": [{"code": "n -= 1\nids.continue_copying = 1 if n > 0 else 0", "accessible_scopes": ["starkware.cairo.common.memcpy", "starkware.cairo.common.memcpy.memcpy"], "flow_tracking_data": {"reference_ids": {"starkware.cairo.common.memcpy.memcpy.continue_copying": 1}, "ap_tracking": {"group": 1, "offset": 5}}}], "17": [{"code": "vm_exit_scope()", "accessible_scopes": ["starkware.cairo.common.memcpy", "starkware.cairo.common.memcpy.memcpy"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 1, "offset": 6}}}], "18": [{"code": "import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_le_felt.a": 2, "starkware.cairo.common.math.assert_le_felt.b": 3, "starkware.cairo.common.math.assert_le_felt.range_check_ptr": 4}, "ap_tracking": {"group": 2, "offset": 0}}}], "28": [{"code": "memory[ap] = 1 if excluded != 0 else 0", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 2, "offset": 8}}}], "42": [{"code": "memory[ap] = 1 if excluded != 1 else 0", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 2, "offset": 9}}}], "54": [{"code": "assert excluded == 2", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 2, "offset": 10}}}], "63": [{"code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'", "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_lt_felt"], "flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_lt_felt.a": 5, "starkware.cairo.common.math.assert_lt_felt.b": 6}, "ap_tracking": {"group": 3, "offset": 0}}}], "81": [{"code": "syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.call_contract"], "flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.call_contract.syscall_ptr": 7}, "ap_tracking": {"group": 4, "offset": 1}}}], "89": [{"code": "syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_caller_address"], "flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": 8}, "ap_tracking": {"group": 5, "offset": 1}}}], "96": [{"code": "syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_contract_address"], "flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": 9}, "ap_tracking": {"group": 6, "offset": 1}}}], "104": [{"code": "syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read"], "flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.storage_read.syscall_ptr": 10}, "ap_tracking": {"group": 7, "offset": 1}}}], "113": [{"code": "syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write"], "flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.storage_write.syscall_ptr": 11}, "ap_tracking": {"group": 8, "offset": 1}}}], "119": [{"code": "syscall_handler.get_tx_info(segments=segments, syscall_ptr=ids.syscall_ptr)", "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_tx_info"], "flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": 12}, "ap_tracking": {"group": 9, "offset": 1}}}], "123": [{"code": "ecdsa_builtin.add_signature(ids.ecdsa_ptr.address_, (ids.signature_r, ids.signature_s))", "accessible_scopes": ["starkware.cairo.common.signature", "starkware.cairo.common.signature.verify_ecdsa_signature"], "flow_tracking_data": {"reference_ids": {"starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": 15, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": 13, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": 14}, "ap_tracking": {"group": 10, "offset": 0}}}], "128": [{"code": "memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1", "accessible_scopes": ["starkware.cairo.common.math_cmp", "starkware.cairo.common.math_cmp.is_le_felt"], "flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math_cmp.is_le_felt.a": 16, "starkware.cairo.common.math_cmp.is_le_felt.b": 17}, "ap_tracking": {"group": 11, "offset": 0}}}], "375": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.constructor"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 30, "offset": 35}}}], "392": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.getPublicKey_encode_return"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 32, "offset": 0}}}], "425": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.supportsInterface_encode_return"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 36, "offset": 0}}}], "470": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.setPublicKey"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 40, "offset": 50}}}], "491": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.isValidSignature_encode_return"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 42, "offset": 0}}}], "579": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__validate__"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 45, "offset": 77}}}], "617": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__validate_declare__"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 47, "offset": 63}}}], "657": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__validate_deploy__"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 49, "offset": 65}}}], "680": [{"code": "memory[ap] = segments.add()", "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.__execute___encode_return"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 52, "offset": 0}}}]}, "data": ["0x40780017fff7fff", "0x1", "0x208b7fff7fff7ffe", "0x20780017fff7ffd", "0x3", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480080007fff8000", "0x400080007ffd7fff", "0x482480017ffd8001", "0x1", "0x482480017ffd8001", "0x1", "0xa0680017fff7ffe", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb", "0x402a7ffc7ffd7fff", "0x208b7fff7fff7ffe", "0x480280007ffb8000", "0x480280017ffb8000", "0x484480017fff8000", "0x2aaaaaaaaaaaab05555555555555556", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480280037ffb8000", "0x484480017fff8000", "0x4000000000000088000000000000001", "0x48307fff7ffd8000", "0xa0680017fff8000", "0xe", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48287ffc80007fff", "0x40307ffc7ff87fff", "0x48297ffd80007ffc", "0x482680017ffd8000", "0x1", "0x48507fff7ffe8000", "0x40507ff97ff57fff", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xc", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48287ffd80007fff", "0x48327fff7ffc8000", "0x40307ffa7ff67fff", "0x48527ffe7ffc8000", "0x40507ff97ff57fff", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0x40317ffd7ff97ffd", "0x48297ffc80007ffd", "0x48527fff7ffc8000", "0x40507ffb7ff77fff", "0x40780017fff7fff", "0x2", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0x48297ffd80007ffc", "0x20680017fff7fff", "0x4", "0x402780017ffc7ffc", "0x1", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ff97fff", "0x400380017ff97ffa", "0x400380027ff97ffb", "0x400380037ff97ffc", "0x400380047ff97ffd", "0x482680017ff98000", "0x7", "0x480280057ff98000", "0x480280067ff98000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x47657443616c6c657241646472657373", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x476574436f6e747261637441646472657373", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x53746f7261676552656164", "0x400280007ffc7fff", "0x400380017ffc7ffd", "0x482680017ffc8000", "0x3", "0x480280027ffc8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffb7fff", "0x400380017ffb7ffc", "0x400380027ffb7ffd", "0x482680017ffb8000", "0x3", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x4765745478496e666f", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x400380017ff97ffa", "0x400380007ff97ffb", "0x482680017ff98000", "0x2", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xc", "0x40780017fff7fff", "0x6", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff8c", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffd7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb1", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1379ac0624b939ceb9dede92211d7db5ee174fe28be72245b0a1a2abd81c98f", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc6", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc0", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x208b7fff7fff7ffe", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa4", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9a", "0x40127fff7fff7ff9", "0x48127ffe7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd5", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffe00365a", "0x20680017fff7fff", "0x8", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffff59942a8c", "0x20680017fff7fff", "0x8", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd7", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbf", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffac", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x48127ffd7fff8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff87", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffd7fff8000", "0x48127ff37fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x3", "0x480a7ff57fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff74", "0x480a7ff97fff8000", "0x480680017fff8000", "0x1", "0x480080007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7a", "0x480680017fff8000", "0x1", "0x40127fff7fff7ffe", "0x40137ffd7fff8000", "0x48127fdc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff49", "0x400680017fff7fff", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeef", "0x40137fff7fff8001", "0x48127ffb7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffd7fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x35", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffee5", "0x40137fff7fff8002", "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x480a80017fff8000", "0x480a80027fff8000", "0x1104800180018000", "0xa", "0x48127ffe7fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a80007fff8000", "0x48127ffa7fff8000", "0x480a80027fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x3", "0x20780017fff7ffb", "0x6", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480280007ffc8000", "0x480280017ffc8000", "0x480280027ffc8000", "0x480280037ffc8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff11", "0x40137ffe7fff8000", "0x40137fff7fff8001", "0x40137ffd7fff8002", "0x480a7ffd7fff8000", "0x480a80017fff8000", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffec2", "0x480a80027fff8000", "0x482680017ffb8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x482680017ffc8000", "0x4", "0x482a80007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x48127ffe7fff8000", "0x482880007ffe8000", "0x208b7fff7fff7ffe", "0x20780017fff7ffa", "0x4", "0x480a7ff97fff8000", "0x208b7fff7fff7ffe", "0x480280007ffb8000", "0x400280007ffd7fff", "0x480280017ffb8000", "0x400280017ffd7fff", "0x480280037ffb8000", "0x400280027ffd7fff", "0x480280027ffb8000", "0x48327fff7ffc8000", "0x400280037ffd7fff", "0x480a7ff97fff8000", "0x482680017ffa8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x482680017ffb8000", "0x4", "0x480a7ffc7fff8000", "0x482680017ffd8000", "0x4", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff48", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff3e", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x402b7ffd7ffc7ffd", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff23", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffea", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff19", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff3", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff04", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x480280027ffb8000", "0x480280017ffd8000", "0x400080007ffe7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x48307fff7ffe8000", "0x402a7ffd7ffc7fff", "0x480280027ffb8000", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x482480017ffc8000", "0x1", "0x480280007ffd8000", "0x480280017ffd8000", "0x482680017ffd8000", "0x2", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdc", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3", "0x48127ff37fff8000", "0x48127ff37fff8000", "0x48127ffb7fff8000", "0x48127ff27fff8000", "0x480280047ffb8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe61", "0x48127ffe7fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480080057ffb8000", "0x480080037ffa8000", "0x480080047ff98000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecf", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480280027ffb8000", "0x480280007ffd8000", "0x400080007ffe7fff", "0x482680017ffd8000", "0x1", "0x480280007ffd8000", "0x484480017fff8000", "0x4", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480080007ffe8000", "0x400080017ffe7fff", "0x482480017ffd8000", "0x1", "0x480080007ffc8000", "0x48307fff7ffe8000", "0x402a7ffd7ffc7fff", "0x480280027ffb8000", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x482480017ffc8000", "0x2", "0x480280007ffd8000", "0x482680017ffd8000", "0x1", "0x480080007ff38000", "0x482480017ff28000", "0x1", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd3", "0x40780017fff7fff", "0x1", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe26", "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480080057ffb8000", "0x480080037ffa8000", "0x480080047ff98000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe94", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe8", "0x40780017fff7fff", "0x1", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe00", "0x48127ffe7fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480080057ffb8000", "0x480080037ffa8000", "0x480080047ff98000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe6e", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x3", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x480280027ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", "0x40780017fff7fff", "0x1", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x480280047ffb8000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x208b7fff7fff7ffe", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe5a", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x3", "0x4003800080007ffb", "0x400380007ffd7ffb", "0x402780017ffd8001", "0x1", "0x4826800180008000", "0x1", "0x40297ffb7fff8002", "0x4826800180008000", "0x1", "0x480a7ffc7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f", "0x480a80017fff8000", "0x4829800080008002", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x4", "0x480280027ffb8000", "0x480280007ffd8000", "0x400080007ffe7fff", "0x482680017ffd8000", "0x1", "0x480280007ffd8000", "0x484480017fff8000", "0x4", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480080007ffe8000", "0x400080017ffe7fff", "0x482480017ffd8000", "0x1", "0x480080007ffc8000", "0x48307fff7ffe8000", "0x402a7ffd7ffc7fff", "0x480280027ffb8000", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280037ffb8000", "0x480280047ffb8000", "0x482480017ffb8000", "0x2", "0x480280007ffd8000", "0x482680017ffd8000", "0x1", "0x480080007ff28000", "0x482480017ff18000", "0x1", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2", "0x40137ff97fff8000", "0x40137ffa7fff8001", "0x40137ffb7fff8002", "0x40137ffc7fff8003", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc7", "0x480a80007fff8000", "0x480a80017fff8000", "0x48127ffb7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x208b7fff7fff7ffe"], "compiler_version": "0.10.2", "attributes": [{"start_pc": 191, "value": "Account: caller is not this account", "end_pc": 192, "accessible_scopes": ["openzeppelin.account.library", "openzeppelin.account.library.Account", "openzeppelin.account.library.Account.assert_only_self"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 16, "offset": 12}}, "name": "error_message"}, {"start_pc": 259, "value": "Account: deprecated tx version", "end_pc": 269, "accessible_scopes": ["openzeppelin.account.library", "openzeppelin.account.library.Account", "openzeppelin.account.library.Account.execute"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 21, "offset": 9}}, "name": "error_message"}, {"start_pc": 272, "value": "Account: reentrant call", "end_pc": 274, "accessible_scopes": ["openzeppelin.account.library", "openzeppelin.account.library.Account", "openzeppelin.account.library.Account.execute"], "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"group": 21, "offset": 49}}, "name": "error_message"}], "builtins": ["pedersen", "range_check", "ecdsa", "bitwise"], "debug_info": null, "identifiers": {"__main__.Account": {"destination": "openzeppelin.account.library.Account", "type": "alias"}, "__main__.AccountCallArray": {"destination": "openzeppelin.account.library.AccountCallArray", "type": "alias"}, "__main__.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "__main__.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "__main__.SignatureBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "alias"}, "__main__.__execute__": {"decorators": ["external"], "pc": 668, "type": "function"}, "__main__.__execute__.Args": {"members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "__main__.__execute__.Args", "size": 4, "type": "struct"}, "__main__.__execute__.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "bitwise_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin*", "offset": 3}, "range_check_ptr": {"cairo_type": "felt", "offset": 4}}, "full_name": "__main__.__execute__.ImplicitArgs", "size": 5, "type": "struct"}, "__main__.__execute__.Return": {"cairo_type": "(response_len: felt, response: felt*)", "type": "type_definition"}, "__main__.__execute__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.__validate__": {"decorators": ["external"], "pc": 531, "type": "function"}, "__main__.__validate__.Args": {"members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "__main__.__validate__.Args", "size": 4, "type": "struct"}, "__main__.__validate__.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.__validate__.ImplicitArgs", "size": 4, "type": "struct"}, "__main__.__validate__.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.__validate__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.__validate_declare__": {"decorators": ["external"], "pc": 590, "type": "function"}, "__main__.__validate_declare__.Args": {"members": {"class_hash": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.__validate_declare__.Args", "size": 1, "type": "struct"}, "__main__.__validate_declare__.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.__validate_declare__.ImplicitArgs", "size": 4, "type": "struct"}, "__main__.__validate_declare__.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.__validate_declare__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.__validate_deploy__": {"decorators": ["external"], "pc": 628, "type": "function"}, "__main__.__validate_deploy__.Args": {"members": {"class_hash": {"cairo_type": "felt", "offset": 0}, "salt": {"cairo_type": "felt", "offset": 1}, "publicKey": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.__validate_deploy__.Args", "size": 3, "type": "struct"}, "__main__.__validate_deploy__.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.__validate_deploy__.ImplicitArgs", "size": 4, "type": "struct"}, "__main__.__validate_deploy__.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.__validate_deploy__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.constructor": {"decorators": ["constructor"], "pc": 359, "type": "function"}, "__main__.constructor.Args": {"members": {"publicKey": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.constructor.Args", "size": 1, "type": "struct"}, "__main__.constructor.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.constructor.ImplicitArgs", "size": 3, "type": "struct"}, "__main__.constructor.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.constructor.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.getPublicKey": {"decorators": ["view"], "pc": 386, "type": "function"}, "__main__.getPublicKey.Args": {"members": {}, "full_name": "__main__.getPublicKey.Args", "size": 0, "type": "struct"}, "__main__.getPublicKey.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.getPublicKey.ImplicitArgs", "size": 3, "type": "struct"}, "__main__.getPublicKey.Return": {"cairo_type": "(publicKey: felt)", "type": "type_definition"}, "__main__.getPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.get_tx_info": {"destination": "starkware.starknet.common.syscalls.get_tx_info", "type": "alias"}, "__main__.isValidSignature": {"decorators": ["view"], "pc": 481, "type": "function"}, "__main__.isValidSignature.Args": {"members": {"hash": {"cairo_type": "felt", "offset": 0}, "signature_len": {"cairo_type": "felt", "offset": 1}, "signature": {"cairo_type": "felt*", "offset": 2}}, "full_name": "__main__.isValidSignature.Args", "size": 3, "type": "struct"}, "__main__.isValidSignature.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "__main__.isValidSignature.ImplicitArgs", "size": 4, "type": "struct"}, "__main__.isValidSignature.Return": {"cairo_type": "(isValid: felt)", "type": "type_definition"}, "__main__.isValidSignature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.setPublicKey": {"decorators": ["external"], "pc": 454, "type": "function"}, "__main__.setPublicKey.Args": {"members": {"newPublicKey": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.setPublicKey.Args", "size": 1, "type": "struct"}, "__main__.setPublicKey.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.setPublicKey.ImplicitArgs", "size": 3, "type": "struct"}, "__main__.setPublicKey.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.setPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.supportsInterface": {"decorators": ["view"], "pc": 418, "type": "function"}, "__main__.supportsInterface.Args": {"members": {"interfaceId": {"cairo_type": "felt", "offset": 0}}, "full_name": "__main__.supportsInterface.Args", "size": 1, "type": "struct"}, "__main__.supportsInterface.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__main__.supportsInterface.ImplicitArgs", "size": 3, "type": "struct"}, "__main__.supportsInterface.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "__main__.supportsInterface.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__execute__": {"decorators": ["external"], "pc": 699, "type": "function"}, "__wrappers__.__execute__.Args": {"members": {}, "full_name": "__wrappers__.__execute__.Args", "size": 0, "type": "struct"}, "__wrappers__.__execute__.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.__execute__.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.__execute__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: starkware.cairo.common.cairo_builtins.BitwiseBuiltin*, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__execute__.SIZEOF_LOCALS": {"value": 4, "type": "const"}, "__wrappers__.__execute__.__wrapped_func": {"destination": "__main__.__execute__", "type": "alias"}, "__wrappers__.__execute___encode_return": {"decorators": [], "pc": 680, "type": "function"}, "__wrappers__.__execute___encode_return.Args": {"members": {"ret_value": {"cairo_type": "(response_len: felt, response: felt*)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "__wrappers__.__execute___encode_return.Args", "size": 3, "type": "struct"}, "__wrappers__.__execute___encode_return.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.__execute___encode_return.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.__execute___encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.__execute___encode_return.SIZEOF_LOCALS": {"value": 3, "type": "const"}, "__wrappers__.__execute___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.__validate__": {"decorators": ["external"], "pc": 548, "type": "function"}, "__wrappers__.__validate__.Args": {"members": {}, "full_name": "__wrappers__.__validate__.Args", "size": 0, "type": "struct"}, "__wrappers__.__validate__.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.__validate__.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.__validate__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__validate__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__validate__.__wrapped_func": {"destination": "__main__.__validate__", "type": "alias"}, "__wrappers__.__validate___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.__validate_declare__": {"decorators": ["external"], "pc": 607, "type": "function"}, "__wrappers__.__validate_declare__.Args": {"members": {}, "full_name": "__wrappers__.__validate_declare__.Args", "size": 0, "type": "struct"}, "__wrappers__.__validate_declare__.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.__validate_declare__.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.__validate_declare__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__validate_declare__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__validate_declare__.__wrapped_func": {"destination": "__main__.__validate_declare__", "type": "alias"}, "__wrappers__.__validate_declare___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.__validate_deploy__": {"decorators": ["external"], "pc": 645, "type": "function"}, "__wrappers__.__validate_deploy__.Args": {"members": {}, "full_name": "__wrappers__.__validate_deploy__.Args", "size": 0, "type": "struct"}, "__wrappers__.__validate_deploy__.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.__validate_deploy__.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.__validate_deploy__.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.__validate_deploy__.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.__validate_deploy__.__wrapped_func": {"destination": "__main__.__validate_deploy__", "type": "alias"}, "__wrappers__.__validate_deploy___encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.constructor": {"decorators": ["constructor"], "pc": 366, "type": "function"}, "__wrappers__.constructor.Args": {"members": {}, "full_name": "__wrappers__.constructor.Args", "size": 0, "type": "struct"}, "__wrappers__.constructor.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.constructor.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.constructor.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.constructor.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.constructor.__wrapped_func": {"destination": "__main__.constructor", "type": "alias"}, "__wrappers__.constructor_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.getPublicKey": {"decorators": ["view"], "pc": 401, "type": "function"}, "__wrappers__.getPublicKey.Args": {"members": {}, "full_name": "__wrappers__.getPublicKey.Args", "size": 0, "type": "struct"}, "__wrappers__.getPublicKey.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.getPublicKey.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.getPublicKey.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.getPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.getPublicKey.__wrapped_func": {"destination": "__main__.getPublicKey", "type": "alias"}, "__wrappers__.getPublicKey_encode_return": {"decorators": [], "pc": 392, "type": "function"}, "__wrappers__.getPublicKey_encode_return.Args": {"members": {"ret_value": {"cairo_type": "(publicKey: felt)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "__wrappers__.getPublicKey_encode_return.Args", "size": 2, "type": "struct"}, "__wrappers__.getPublicKey_encode_return.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.getPublicKey_encode_return.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.getPublicKey_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.getPublicKey_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.getPublicKey_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.isValidSignature": {"decorators": ["view"], "pc": 500, "type": "function"}, "__wrappers__.isValidSignature.Args": {"members": {}, "full_name": "__wrappers__.isValidSignature.Args", "size": 0, "type": "struct"}, "__wrappers__.isValidSignature.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.isValidSignature.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.isValidSignature.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: starkware.cairo.common.cairo_builtins.SignatureBuiltin*, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.isValidSignature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.isValidSignature.__wrapped_func": {"destination": "__main__.isValidSignature", "type": "alias"}, "__wrappers__.isValidSignature_encode_return": {"decorators": [], "pc": 491, "type": "function"}, "__wrappers__.isValidSignature_encode_return.Args": {"members": {"ret_value": {"cairo_type": "(isValid: felt)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "__wrappers__.isValidSignature_encode_return.Args", "size": 2, "type": "struct"}, "__wrappers__.isValidSignature_encode_return.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.isValidSignature_encode_return.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.isValidSignature_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.isValidSignature_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.isValidSignature_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.setPublicKey": {"decorators": ["external"], "pc": 461, "type": "function"}, "__wrappers__.setPublicKey.Args": {"members": {}, "full_name": "__wrappers__.setPublicKey.Args", "size": 0, "type": "struct"}, "__wrappers__.setPublicKey.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.setPublicKey.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.setPublicKey.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.setPublicKey.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.setPublicKey.__wrapped_func": {"destination": "__main__.setPublicKey", "type": "alias"}, "__wrappers__.setPublicKey_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.supportsInterface": {"decorators": ["view"], "pc": 434, "type": "function"}, "__wrappers__.supportsInterface.Args": {"members": {}, "full_name": "__wrappers__.supportsInterface.Args", "size": 0, "type": "struct"}, "__wrappers__.supportsInterface.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.supportsInterface.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.supportsInterface.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, ecdsa_ptr: felt, bitwise_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.supportsInterface.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.supportsInterface.__wrapped_func": {"destination": "__main__.supportsInterface", "type": "alias"}, "__wrappers__.supportsInterface_encode_return": {"decorators": [], "pc": 425, "type": "function"}, "__wrappers__.supportsInterface_encode_return.Args": {"members": {"ret_value": {"cairo_type": "(success: felt)", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "__wrappers__.supportsInterface_encode_return.Args", "size": 2, "type": "struct"}, "__wrappers__.supportsInterface_encode_return.ImplicitArgs": {"members": {}, "full_name": "__wrappers__.supportsInterface_encode_return.ImplicitArgs", "size": 0, "type": "struct"}, "__wrappers__.supportsInterface_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.supportsInterface_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.supportsInterface_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "openzeppelin.account.library.Account": {"type": "namespace"}, "openzeppelin.account.library.Account.Args": {"members": {}, "full_name": "openzeppelin.account.library.Account.Args", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account.ImplicitArgs": {"members": {}, "full_name": "openzeppelin.account.library.Account.ImplicitArgs", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account._execute_list": {"decorators": [], "pc": 301, "type": "function"}, "openzeppelin.account.library.Account._execute_list.Args": {"members": {"calls_len": {"cairo_type": "felt", "offset": 0}, "calls": {"cairo_type": "openzeppelin.account.library.Call*", "offset": 1}, "response": {"cairo_type": "felt*", "offset": 2}}, "full_name": "openzeppelin.account.library.Account._execute_list.Args", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account._execute_list.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "openzeppelin.account.library.Account._execute_list.ImplicitArgs", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account._execute_list.Return": {"cairo_type": "(response_len: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account._execute_list.SIZEOF_LOCALS": {"value": 3, "type": "const"}, "openzeppelin.account.library.Account._from_call_array_to_call": {"decorators": [], "pc": 335, "type": "function"}, "openzeppelin.account.library.Account._from_call_array_to_call.Args": {"members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata": {"cairo_type": "felt*", "offset": 2}, "calls": {"cairo_type": "openzeppelin.account.library.Call*", "offset": 3}}, "full_name": "openzeppelin.account.library.Account._from_call_array_to_call.Args", "size": 4, "type": "struct"}, "openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "openzeppelin.account.library.Account._from_call_array_to_call.ImplicitArgs", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account._from_call_array_to_call.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account._from_call_array_to_call.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.assert_only_self": {"decorators": [], "pc": 185, "type": "function"}, "openzeppelin.account.library.Account.assert_only_self.Args": {"members": {}, "full_name": "openzeppelin.account.library.Account.assert_only_self.Args", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account.assert_only_self.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.assert_only_self.ImplicitArgs", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account.assert_only_self.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.assert_only_self.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.execute": {"decorators": [], "pc": 254, "type": "function"}, "openzeppelin.account.library.Account.execute.Args": {"members": {"call_array_len": {"cairo_type": "felt", "offset": 0}, "call_array": {"cairo_type": "openzeppelin.account.library.AccountCallArray*", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "openzeppelin.account.library.Account.execute.Args", "size": 4, "type": "struct"}, "openzeppelin.account.library.Account.execute.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "bitwise_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin*", "offset": 3}, "range_check_ptr": {"cairo_type": "felt", "offset": 4}}, "full_name": "openzeppelin.account.library.Account.execute.ImplicitArgs", "size": 5, "type": "struct"}, "openzeppelin.account.library.Account.execute.Return": {"cairo_type": "(response_len: felt, response: felt*)", "type": "type_definition"}, "openzeppelin.account.library.Account.execute.SIZEOF_LOCALS": {"value": 3, "type": "const"}, "openzeppelin.account.library.Account.get_public_key": {"decorators": [], "pc": 194, "type": "function"}, "openzeppelin.account.library.Account.get_public_key.Args": {"members": {}, "full_name": "openzeppelin.account.library.Account.get_public_key.Args", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account.get_public_key.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.get_public_key.ImplicitArgs", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account.get_public_key.Return": {"cairo_type": "(public_key: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account.get_public_key.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.initializer": {"decorators": [], "pc": 178, "type": "function"}, "openzeppelin.account.library.Account.initializer.Args": {"members": {"_public_key": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.initializer.Args", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account.initializer.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.initializer.ImplicitArgs", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account.initializer.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.initializer.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.is_valid_signature": {"decorators": [], "pc": 235, "type": "function"}, "openzeppelin.account.library.Account.is_valid_signature.Args": {"members": {"hash": {"cairo_type": "felt", "offset": 0}, "signature_len": {"cairo_type": "felt", "offset": 1}, "signature": {"cairo_type": "felt*", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.is_valid_signature.Args", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 2}, "range_check_ptr": {"cairo_type": "felt", "offset": 3}}, "full_name": "openzeppelin.account.library.Account.is_valid_signature.ImplicitArgs", "size": 4, "type": "struct"}, "openzeppelin.account.library.Account.is_valid_signature.Return": {"cairo_type": "(is_valid: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account.is_valid_signature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.set_public_key": {"decorators": [], "pc": 226, "type": "function"}, "openzeppelin.account.library.Account.set_public_key.Args": {"members": {"new_public_key": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.set_public_key.Args", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account.set_public_key.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.set_public_key.ImplicitArgs", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account.set_public_key.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account.set_public_key.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account.supports_interface": {"decorators": [], "pc": 200, "type": "function"}, "openzeppelin.account.library.Account.supports_interface.Args": {"members": {"interface_id": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account.supports_interface.Args", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account.supports_interface.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account.supports_interface.ImplicitArgs", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account.supports_interface.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account.supports_interface.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.AccountCallArray": {"members": {"to": {"cairo_type": "felt", "offset": 0}, "selector": {"cairo_type": "felt", "offset": 1}, "data_offset": {"cairo_type": "felt", "offset": 2}, "data_len": {"cairo_type": "felt", "offset": 3}}, "full_name": "openzeppelin.account.library.AccountCallArray", "size": 4, "type": "struct"}, "openzeppelin.account.library.Account_public_key": {"type": "namespace"}, "openzeppelin.account.library.Account_public_key.Args": {"members": {}, "full_name": "openzeppelin.account.library.Account_public_key.Args", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account_public_key.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "openzeppelin.account.library.Account_public_key.ImplicitArgs": {"members": {}, "full_name": "openzeppelin.account.library.Account_public_key.ImplicitArgs", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account_public_key.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account_public_key.addr": {"decorators": [], "pc": 148, "type": "function"}, "openzeppelin.account.library.Account_public_key.addr.Args": {"members": {}, "full_name": "openzeppelin.account.library.Account_public_key.addr.Args", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account_public_key.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 0}, "range_check_ptr": {"cairo_type": "felt", "offset": 1}}, "full_name": "openzeppelin.account.library.Account_public_key.addr.ImplicitArgs", "size": 2, "type": "struct"}, "openzeppelin.account.library.Account_public_key.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account_public_key.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "openzeppelin.account.library.Account_public_key.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "openzeppelin.account.library.Account_public_key.read": {"decorators": [], "pc": 153, "type": "function"}, "openzeppelin.account.library.Account_public_key.read.Args": {"members": {}, "full_name": "openzeppelin.account.library.Account_public_key.read.Args", "size": 0, "type": "struct"}, "openzeppelin.account.library.Account_public_key.read.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account_public_key.read.ImplicitArgs", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account_public_key.read.Return": {"cairo_type": "(public_key: felt)", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.Account_public_key.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "openzeppelin.account.library.Account_public_key.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "openzeppelin.account.library.Account_public_key.write": {"decorators": [], "pc": 166, "type": "function"}, "openzeppelin.account.library.Account_public_key.write.Args": {"members": {"value": {"cairo_type": "felt", "offset": 0}}, "full_name": "openzeppelin.account.library.Account_public_key.write.Args", "size": 1, "type": "struct"}, "openzeppelin.account.library.Account_public_key.write.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}, "pedersen_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*", "offset": 1}, "range_check_ptr": {"cairo_type": "felt", "offset": 2}}, "full_name": "openzeppelin.account.library.Account_public_key.write.ImplicitArgs", "size": 3, "type": "struct"}, "openzeppelin.account.library.Account_public_key.write.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.account.library.Account_public_key.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.account.library.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "openzeppelin.account.library.Call": {"members": {"to": {"cairo_type": "felt", "offset": 0}, "selector": {"cairo_type": "felt", "offset": 1}, "calldata_len": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "openzeppelin.account.library.Call", "size": 4, "type": "struct"}, "openzeppelin.account.library.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "openzeppelin.account.library.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "openzeppelin.account.library.IACCOUNT_ID": {"destination": "openzeppelin.utils.constants.library.IACCOUNT_ID", "type": "alias"}, "openzeppelin.account.library.IERC165_ID": {"destination": "openzeppelin.utils.constants.library.IERC165_ID", "type": "alias"}, "openzeppelin.account.library.SignatureBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "alias"}, "openzeppelin.account.library.TRANSACTION_VERSION": {"destination": "openzeppelin.utils.constants.library.TRANSACTION_VERSION", "type": "alias"}, "openzeppelin.account.library.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "openzeppelin.account.library.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "openzeppelin.account.library.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "openzeppelin.account.library.call_contract": {"destination": "starkware.starknet.common.syscalls.call_contract", "type": "alias"}, "openzeppelin.account.library.get_caller_address": {"destination": "starkware.starknet.common.syscalls.get_caller_address", "type": "alias"}, "openzeppelin.account.library.get_contract_address": {"destination": "starkware.starknet.common.syscalls.get_contract_address", "type": "alias"}, "openzeppelin.account.library.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "openzeppelin.account.library.get_tx_info": {"destination": "starkware.starknet.common.syscalls.get_tx_info", "type": "alias"}, "openzeppelin.account.library.is_le_felt": {"destination": "starkware.cairo.common.math_cmp.is_le_felt", "type": "alias"}, "openzeppelin.account.library.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "openzeppelin.account.library.split_felt": {"destination": "starkware.cairo.common.math.split_felt", "type": "alias"}, "openzeppelin.account.library.verify_ecdsa_signature": {"destination": "starkware.cairo.common.signature.verify_ecdsa_signature", "type": "alias"}, "openzeppelin.account.library.verify_eth_signature_uint256": {"destination": "starkware.cairo.common.cairo_secp.signature.verify_eth_signature_uint256", "type": "alias"}, "openzeppelin.utils.constants.library.DEFAULT_ADMIN_ROLE": {"value": 0, "type": "const"}, "openzeppelin.utils.constants.library.IACCESSCONTROL_ID": {"value": 2036718347, "type": "const"}, "openzeppelin.utils.constants.library.IACCOUNT_ID": {"value": 2792084853, "type": "const"}, "openzeppelin.utils.constants.library.IERC165_ID": {"value": 33540519, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_ENUMERABLE_ID": {"value": 2014223715, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_ID": {"value": 2158778573, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_METADATA_ID": {"value": 1532892063, "type": "const"}, "openzeppelin.utils.constants.library.IERC721_RECEIVER_ID": {"value": 353073666, "type": "const"}, "openzeppelin.utils.constants.library.INVALID_ID": {"value": 4294967295, "type": "const"}, "openzeppelin.utils.constants.library.TRANSACTION_VERSION": {"value": 1, "type": "const"}, "openzeppelin.utils.constants.library.UINT8_MAX": {"value": 255, "type": "const"}, "starkware.cairo.common.alloc.alloc": {"decorators": [], "pc": 0, "type": "function"}, "starkware.cairo.common.alloc.alloc.Args": {"members": {}, "full_name": "starkware.cairo.common.alloc.alloc.Args", "size": 0, "type": "struct"}, "starkware.cairo.common.alloc.alloc.ImplicitArgs": {"members": {}, "full_name": "starkware.cairo.common.alloc.alloc.ImplicitArgs", "size": 0, "type": "struct"}, "starkware.cairo.common.alloc.alloc.Return": {"cairo_type": "(ptr: felt*)", "type": "type_definition"}, "starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.bitwise.ALL_ONES": {"value": -106710729501573572985208420194530329073740042555888586719234, "type": "const"}, "starkware.cairo.common.bitwise.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.bool.FALSE": {"value": 0, "type": "const"}, "starkware.cairo.common.bool.TRUE": {"value": 1, "type": "const"}, "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": {"members": {"x": {"cairo_type": "felt", "offset": 0}, "y": {"cairo_type": "felt", "offset": 1}, "x_and_y": {"cairo_type": "felt", "offset": 2}, "x_xor_y": {"cairo_type": "felt", "offset": 3}, "x_or_y": {"cairo_type": "felt", "offset": 4}}, "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "size": 5, "type": "struct"}, "starkware.cairo.common.cairo_builtins.EcOpBuiltin": {"members": {"p": {"cairo_type": "starkware.cairo.common.ec_point.EcPoint", "offset": 0}, "q": {"cairo_type": "starkware.cairo.common.ec_point.EcPoint", "offset": 2}, "m": {"cairo_type": "felt", "offset": 4}, "r": {"cairo_type": "starkware.cairo.common.ec_point.EcPoint", "offset": 5}}, "full_name": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "size": 7, "type": "struct"}, "starkware.cairo.common.cairo_builtins.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.cairo_builtins.HashBuiltin": {"members": {"x": {"cairo_type": "felt", "offset": 0}, "y": {"cairo_type": "felt", "offset": 1}, "result": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.cairo_builtins.HashBuiltin", "size": 3, "type": "struct"}, "starkware.cairo.common.cairo_builtins.KeccakBuiltin": {"members": {"input": {"cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "offset": 0}, "output": {"cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "offset": 8}}, "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", "size": 16, "type": "struct"}, "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": {"destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "type": "alias"}, "starkware.cairo.common.cairo_builtins.SignatureBuiltin": {"members": {"pub_key": {"cairo_type": "felt", "offset": 0}, "message": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "size": 2, "type": "struct"}, "starkware.cairo.common.cairo_keccak.keccak.BLOCK_SIZE": {"destination": "starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.BYTES_IN_WORD": {"value": 8, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_CAPACITY_IN_WORDS": {"value": 8, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_BYTES": {"value": 136, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_FULL_RATE_IN_WORDS": {"value": 17, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.KECCAK_STATE_SIZE_FELTS": {"value": 25, "type": "const"}, "starkware.cairo.common.cairo_keccak.keccak.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_lt": {"destination": "starkware.cairo.common.math.assert_lt", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_nn": {"destination": "starkware.cairo.common.math.assert_nn", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.bitwise_and": {"destination": "starkware.cairo.common.bitwise.bitwise_and", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.bitwise_or": {"destination": "starkware.cairo.common.bitwise.bitwise_or", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.bitwise_xor": {"destination": "starkware.cairo.common.bitwise.bitwise_xor", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.memset": {"destination": "starkware.cairo.common.memset.memset", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.packed_keccak_func": {"destination": "starkware.cairo.common.cairo_keccak.packed_keccak.packed_keccak_func", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.pow": {"destination": "starkware.cairo.common.pow.pow", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.split_felt": {"destination": "starkware.cairo.common.math.split_felt", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.uint256_reverse_endian": {"destination": "starkware.cairo.common.uint256.uint256_reverse_endian", "type": "alias"}, "starkware.cairo.common.cairo_keccak.keccak.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "starkware.cairo.common.cairo_keccak.packed_keccak.ALL_ONES": {"value": -106710729501573572985208420194530329073740042555888586719234, "type": "const"}, "starkware.cairo.common.cairo_keccak.packed_keccak.BLOCK_SIZE": {"value": 3, "type": "const"}, "starkware.cairo.common.cairo_keccak.packed_keccak.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.cairo_keccak.packed_keccak.SHIFTS": {"value": 340282366920938463481821351505477763073, "type": "const"}, "starkware.cairo.common.cairo_keccak.packed_keccak.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "starkware.cairo.common.cairo_keccak.packed_keccak.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.BASE": {"destination": "starkware.cairo.common.cairo_secp.constants.BASE", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.BigInt3": {"members": {"d0": {"cairo_type": "felt", "offset": 0}, "d1": {"cairo_type": "felt", "offset": 1}, "d2": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "size": 3, "type": "struct"}, "starkware.cairo.common.cairo_secp.bigint.RC_BOUND": {"destination": "starkware.cairo.common.math_cmp.RC_BOUND", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3": {"members": {"d0": {"cairo_type": "felt", "offset": 0}, "d1": {"cairo_type": "felt", "offset": 1}, "d2": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "size": 3, "type": "struct"}, "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5": {"members": {"d0": {"cairo_type": "felt", "offset": 0}, "d1": {"cairo_type": "felt", "offset": 1}, "d2": {"cairo_type": "felt", "offset": 2}, "d3": {"cairo_type": "felt", "offset": 3}, "d4": {"cairo_type": "felt", "offset": 4}}, "full_name": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt5", "size": 5, "type": "struct"}, "starkware.cairo.common.cairo_secp.bigint.assert_nn": {"destination": "starkware.cairo.common.math.assert_nn", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_secp.bigint.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "starkware.cairo.common.cairo_secp.constants.BASE": {"value": 77371252455336267181195264, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.BETA": {"value": 7, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.N0": {"value": 10428087374290690730508609, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.N1": {"value": 77371252455330678278691517, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.N2": {"value": 19342813113834066795298815, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.P0": {"value": 77371252455336262886226991, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.P1": {"value": 77371252455336267181195263, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.P2": {"value": 19342813113834066795298815, "type": "const"}, "starkware.cairo.common.cairo_secp.constants.SECP_REM": {"value": 4294968273, "type": "const"}, "starkware.cairo.common.cairo_secp.ec.BigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.EcPoint": {"members": {"x": {"cairo_type": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "offset": 0}, "y": {"cairo_type": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "offset": 3}}, "full_name": "starkware.cairo.common.cairo_secp.ec.EcPoint", "size": 6, "type": "struct"}, "starkware.cairo.common.cairo_secp.ec.UnreducedBigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.is_zero": {"destination": "starkware.cairo.common.cairo_secp.field.is_zero", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.nondet_bigint3": {"destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.unreduced_mul": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.unreduced_sqr": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_sqr", "type": "alias"}, "starkware.cairo.common.cairo_secp.ec.verify_zero": {"destination": "starkware.cairo.common.cairo_secp.field.verify_zero", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.BASE": {"destination": "starkware.cairo.common.cairo_secp.constants.BASE", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.BigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.P0": {"destination": "starkware.cairo.common.cairo_secp.constants.P0", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.P1": {"destination": "starkware.cairo.common.cairo_secp.constants.P1", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.P2": {"destination": "starkware.cairo.common.cairo_secp.constants.P2", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.SECP_REM": {"destination": "starkware.cairo.common.cairo_secp.constants.SECP_REM", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.UnreducedBigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_secp.field.nondet_bigint3": {"destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BASE": {"destination": "starkware.cairo.common.cairo_secp.bigint.BASE", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BETA": {"destination": "starkware.cairo.common.cairo_secp.constants.BETA", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.BigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.EcPoint": {"destination": "starkware.cairo.common.cairo_secp.ec.EcPoint", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.N0": {"destination": "starkware.cairo.common.cairo_secp.constants.N0", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.N1": {"destination": "starkware.cairo.common.cairo_secp.constants.N1", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.N2": {"destination": "starkware.cairo.common.cairo_secp.constants.N2", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.RC_BOUND": {"destination": "starkware.cairo.common.math_cmp.RC_BOUND", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.UnreducedBigInt3": {"destination": "starkware.cairo.common.cairo_secp.bigint.UnreducedBigInt3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.assert_nn": {"destination": "starkware.cairo.common.math.assert_nn", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.bigint_mul": {"destination": "starkware.cairo.common.cairo_secp.bigint.bigint_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.bigint_to_uint256": {"destination": "starkware.cairo.common.cairo_secp.bigint.bigint_to_uint256", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.ec_add": {"destination": "starkware.cairo.common.cairo_secp.ec.ec_add", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.ec_mul": {"destination": "starkware.cairo.common.cairo_secp.ec.ec_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.ec_negate": {"destination": "starkware.cairo.common.cairo_secp.ec.ec_negate", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.finalize_keccak": {"destination": "starkware.cairo.common.cairo_keccak.keccak.finalize_keccak", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.keccak_uint256s_bigend": {"destination": "starkware.cairo.common.cairo_keccak.keccak.keccak_uint256s_bigend", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.nondet_bigint3": {"destination": "starkware.cairo.common.cairo_secp.bigint.nondet_bigint3", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.reduce": {"destination": "starkware.cairo.common.cairo_secp.field.reduce", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.uint256_to_bigint": {"destination": "starkware.cairo.common.cairo_secp.bigint.uint256_to_bigint", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.unreduced_mul": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_mul", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.unreduced_sqr": {"destination": "starkware.cairo.common.cairo_secp.field.unreduced_sqr", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.validate_reduced_field_element": {"destination": "starkware.cairo.common.cairo_secp.field.validate_reduced_field_element", "type": "alias"}, "starkware.cairo.common.cairo_secp.signature.verify_zero": {"destination": "starkware.cairo.common.cairo_secp.field.verify_zero", "type": "alias"}, "starkware.cairo.common.dict_access.DictAccess": {"members": {"key": {"cairo_type": "felt", "offset": 0}, "prev_value": {"cairo_type": "felt", "offset": 1}, "new_value": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.dict_access.DictAccess", "size": 3, "type": "struct"}, "starkware.cairo.common.ec.EcOpBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "type": "alias"}, "starkware.cairo.common.ec.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.ec.StarkCurve": {"type": "namespace"}, "starkware.cairo.common.ec.StarkCurve.ALPHA": {"value": 1, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.Args": {"members": {}, "full_name": "starkware.cairo.common.ec.StarkCurve.Args", "size": 0, "type": "struct"}, "starkware.cairo.common.ec.StarkCurve.BETA": {"value": -476910135076337975234679399815567221425937815956490878998147463828055613816, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.GEN_X": {"value": 874739451078007766457464989774322083649278607533249481151382481072868806602, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.GEN_Y": {"value": 152666792071518830868575557812948353041420400780739481342941381225525861407, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.ImplicitArgs": {"members": {}, "full_name": "starkware.cairo.common.ec.StarkCurve.ImplicitArgs", "size": 0, "type": "struct"}, "starkware.cairo.common.ec.StarkCurve.ORDER": {"value": -96363463615509210819012598251359154898, "type": "const"}, "starkware.cairo.common.ec.StarkCurve.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.ec.StarkCurve.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.ec.is_quad_residue": {"destination": "starkware.cairo.common.math.is_quad_residue", "type": "alias"}, "starkware.cairo.common.ec_point.EcPoint": {"members": {"x": {"cairo_type": "felt", "offset": 0}, "y": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.ec_point.EcPoint", "size": 2, "type": "struct"}, "starkware.cairo.common.hash.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "starkware.cairo.common.keccak_state.KeccakBuiltinState": {"members": {"s0": {"cairo_type": "felt", "offset": 0}, "s1": {"cairo_type": "felt", "offset": 1}, "s2": {"cairo_type": "felt", "offset": 2}, "s3": {"cairo_type": "felt", "offset": 3}, "s4": {"cairo_type": "felt", "offset": 4}, "s5": {"cairo_type": "felt", "offset": 5}, "s6": {"cairo_type": "felt", "offset": 6}, "s7": {"cairo_type": "felt", "offset": 7}}, "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "size": 8, "type": "struct"}, "starkware.cairo.common.math.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "starkware.cairo.common.math.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "starkware.cairo.common.math.assert_le_felt": {"decorators": ["known_ap_change"], "pc": 18, "type": "function"}, "starkware.cairo.common.math.assert_le_felt.Args": {"members": {"a": {"cairo_type": "felt", "offset": 0}, "b": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.math.assert_le_felt.Args", "size": 2, "type": "struct"}, "starkware.cairo.common.math.assert_le_felt.ImplicitArgs": {"members": {"range_check_ptr": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.cairo.common.math.assert_le_felt.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH": {"value": 5316911983139663648412552867652567041, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH": {"value": 3544607988759775765608368578435044694, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.a": {"references": [{"pc": 18, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 2, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_le_felt.a", "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.b": {"references": [{"pc": 18, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 2, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_le_felt.b", "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.range_check_ptr": {"references": [{"pc": 18, "value": "[cast(fp + (-5), felt*)]", "ap_tracking_data": {"group": 2, "offset": 0}}, {"pc": 28, "value": "cast([fp + (-5)] + 4, felt)", "ap_tracking_data": {"group": 2, "offset": 8}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_le_felt.range_check_ptr", "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.skip_exclude_a": {"pc": 42, "type": "label"}, "starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a": {"pc": 54, "type": "label"}, "starkware.cairo.common.math.assert_lt_felt": {"decorators": ["known_ap_change"], "pc": 63, "type": "function"}, "starkware.cairo.common.math.assert_lt_felt.Args": {"members": {"a": {"cairo_type": "felt", "offset": 0}, "b": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.math.assert_lt_felt.Args", "size": 2, "type": "struct"}, "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs": {"members": {"range_check_ptr": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.cairo.common.math.assert_lt_felt.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_lt_felt.a": {"references": [{"pc": 63, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 3, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_lt_felt.a", "type": "reference"}, "starkware.cairo.common.math.assert_lt_felt.b": {"references": [{"pc": 63, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 3, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_lt_felt.b", "type": "reference"}, "starkware.cairo.common.math_cmp.RC_BOUND": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.math_cmp.assert_le_felt": {"destination": "starkware.cairo.common.math.assert_le_felt", "type": "alias"}, "starkware.cairo.common.math_cmp.assert_lt_felt": {"destination": "starkware.cairo.common.math.assert_lt_felt", "type": "alias"}, "starkware.cairo.common.math_cmp.is_le_felt": {"decorators": ["known_ap_change"], "pc": 128, "type": "function"}, "starkware.cairo.common.math_cmp.is_le_felt.Args": {"members": {"a": {"cairo_type": "felt", "offset": 0}, "b": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.math_cmp.is_le_felt.Args", "size": 2, "type": "struct"}, "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs": {"members": {"range_check_ptr": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.cairo.common.math_cmp.is_le_felt.Return": {"cairo_type": "felt", "type": "type_definition"}, "starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math_cmp.is_le_felt.a": {"references": [{"pc": 128, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 11, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math_cmp.is_le_felt.a", "type": "reference"}, "starkware.cairo.common.math_cmp.is_le_felt.b": {"references": [{"pc": 128, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 11, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math_cmp.is_le_felt.b", "type": "reference"}, "starkware.cairo.common.math_cmp.is_le_felt.not_le": {"pc": 140, "type": "label"}, "starkware.cairo.common.memcpy.memcpy": {"decorators": [], "pc": 3, "type": "function"}, "starkware.cairo.common.memcpy.memcpy.Args": {"members": {"dst": {"cairo_type": "felt*", "offset": 0}, "src": {"cairo_type": "felt*", "offset": 1}, "len": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.cairo.common.memcpy.memcpy.Args", "size": 3, "type": "struct"}, "starkware.cairo.common.memcpy.memcpy.ImplicitArgs": {"members": {}, "full_name": "starkware.cairo.common.memcpy.memcpy.ImplicitArgs", "size": 0, "type": "struct"}, "starkware.cairo.common.memcpy.memcpy.LoopFrame": {"members": {"dst": {"cairo_type": "felt*", "offset": 0}, "src": {"cairo_type": "felt*", "offset": 1}}, "full_name": "starkware.cairo.common.memcpy.memcpy.LoopFrame", "size": 2, "type": "struct"}, "starkware.cairo.common.memcpy.memcpy.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.memcpy.memcpy.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.memcpy.memcpy.continue_copying": {"references": [{"pc": 10, "value": "[cast(ap, felt*)]", "ap_tracking_data": {"group": 1, "offset": 3}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.memcpy.memcpy.continue_copying", "type": "reference"}, "starkware.cairo.common.memcpy.memcpy.len": {"references": [{"pc": 3, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 1, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.memcpy.memcpy.len", "type": "reference"}, "starkware.cairo.common.memcpy.memcpy.loop": {"pc": 8, "type": "label"}, "starkware.cairo.common.pow.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "starkware.cairo.common.pow.get_ap": {"destination": "starkware.cairo.common.registers.get_ap", "type": "alias"}, "starkware.cairo.common.pow.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.registers.get_ap": {"destination": "starkware.cairo.lang.compiler.lib.registers.get_ap", "type": "alias"}, "starkware.cairo.common.registers.get_fp_and_pc": {"destination": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.signature.EcOpBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "type": "alias"}, "starkware.cairo.common.signature.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.signature.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "starkware.cairo.common.signature.SignatureBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "alias"}, "starkware.cairo.common.signature.StarkCurve": {"destination": "starkware.cairo.common.ec.StarkCurve", "type": "alias"}, "starkware.cairo.common.signature.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "starkware.cairo.common.signature.ec_add": {"destination": "starkware.cairo.common.ec.ec_add", "type": "alias"}, "starkware.cairo.common.signature.ec_mul": {"destination": "starkware.cairo.common.ec.ec_mul", "type": "alias"}, "starkware.cairo.common.signature.ec_sub": {"destination": "starkware.cairo.common.ec.ec_sub", "type": "alias"}, "starkware.cairo.common.signature.is_x_on_curve": {"destination": "starkware.cairo.common.ec.is_x_on_curve", "type": "alias"}, "starkware.cairo.common.signature.recover_y": {"destination": "starkware.cairo.common.ec.recover_y", "type": "alias"}, "starkware.cairo.common.signature.verify_ecdsa_signature": {"decorators": [], "pc": 123, "type": "function"}, "starkware.cairo.common.signature.verify_ecdsa_signature.Args": {"members": {"message": {"cairo_type": "felt", "offset": 0}, "public_key": {"cairo_type": "felt", "offset": 1}, "signature_r": {"cairo_type": "felt", "offset": 2}, "signature_s": {"cairo_type": "felt", "offset": 3}}, "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.Args", "size": 4, "type": "struct"}, "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs": {"members": {"ecdsa_ptr": {"cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "offset": 0}}, "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.cairo.common.signature.verify_ecdsa_signature.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.signature.verify_ecdsa_signature.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr": {"references": [{"pc": 123, "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]", "ap_tracking_data": {"group": 10, "offset": 0}}, {"pc": 125, "value": "cast([fp + (-7)] + 2, starkware.cairo.common.cairo_builtins.SignatureBuiltin*)", "ap_tracking_data": {"group": 10, "offset": 0}}], "cairo_type": "starkware.cairo.common.cairo_builtins.SignatureBuiltin*", "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.ecdsa_ptr", "type": "reference"}, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r": {"references": [{"pc": 123, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 10, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_r", "type": "reference"}, "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s": {"references": [{"pc": 123, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 10, "offset": 0}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.signature.verify_ecdsa_signature.signature_s", "type": "reference"}, "starkware.cairo.common.uint256.ALL_ONES": {"value": 340282366920938463463374607431768211455, "type": "const"}, "starkware.cairo.common.uint256.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.uint256.HALF_SHIFT": {"value": 18446744073709551616, "type": "const"}, "starkware.cairo.common.uint256.SHIFT": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.uint256.Uint256": {"members": {"low": {"cairo_type": "felt", "offset": 0}, "high": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.cairo.common.uint256.Uint256", "size": 2, "type": "struct"}, "starkware.cairo.common.uint256.assert_in_range": {"destination": "starkware.cairo.common.math.assert_in_range", "type": "alias"}, "starkware.cairo.common.uint256.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "starkware.cairo.common.uint256.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.uint256.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_and": {"destination": "starkware.cairo.common.bitwise.bitwise_and", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_or": {"destination": "starkware.cairo.common.bitwise.bitwise_or", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_xor": {"destination": "starkware.cairo.common.bitwise.bitwise_xor", "type": "alias"}, "starkware.cairo.common.uint256.get_ap": {"destination": "starkware.cairo.common.registers.get_ap", "type": "alias"}, "starkware.cairo.common.uint256.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.uint256.is_le": {"destination": "starkware.cairo.common.math_cmp.is_le", "type": "alias"}, "starkware.cairo.common.uint256.pow": {"destination": "starkware.cairo.common.pow.pow", "type": "alias"}, "starkware.starknet.common.storage.ADDR_BOUND": {"value": -106710729501573572985208420194530329073740042555888586719489, "type": "const"}, "starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE": {"value": 256, "type": "const"}, "starkware.starknet.common.storage.assert_250_bit": {"destination": "starkware.cairo.common.math.assert_250_bit", "type": "alias"}, "starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR": {"value": 20853273475220472486191784820, "type": "const"}, "starkware.starknet.common.syscalls.CallContract": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.CallContractRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", "offset": 5}}, "full_name": "starkware.starknet.common.syscalls.CallContract", "size": 7, "type": "struct"}, "starkware.starknet.common.syscalls.CallContractRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "contract_address": {"cairo_type": "felt", "offset": 1}, "function_selector": {"cairo_type": "felt", "offset": 2}, "calldata_size": {"cairo_type": "felt", "offset": 3}, "calldata": {"cairo_type": "felt*", "offset": 4}}, "full_name": "starkware.starknet.common.syscalls.CallContractRequest", "size": 5, "type": "struct"}, "starkware.starknet.common.syscalls.CallContractResponse": {"members": {"retdata_size": {"cairo_type": "felt", "offset": 0}, "retdata": {"cairo_type": "felt*", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.CallContractResponse", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR": {"value": 21167594061783206823196716140, "type": "const"}, "starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR": {"value": 23274015802972845247556842986379118667122, "type": "const"}, "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": {"value": 75202468540281, "type": "const"}, "starkware.starknet.common.syscalls.Deploy": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.DeployRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.DeployResponse", "offset": 6}}, "full_name": "starkware.starknet.common.syscalls.Deploy", "size": 9, "type": "struct"}, "starkware.starknet.common.syscalls.DeployRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "class_hash": {"cairo_type": "felt", "offset": 1}, "contract_address_salt": {"cairo_type": "felt", "offset": 2}, "constructor_calldata_size": {"cairo_type": "felt", "offset": 3}, "constructor_calldata": {"cairo_type": "felt*", "offset": 4}, "deploy_from_zero": {"cairo_type": "felt", "offset": 5}}, "full_name": "starkware.starknet.common.syscalls.DeployRequest", "size": 6, "type": "struct"}, "starkware.starknet.common.syscalls.DeployResponse": {"members": {"contract_address": {"cairo_type": "felt", "offset": 0}, "constructor_retdata_size": {"cairo_type": "felt", "offset": 1}, "constructor_retdata": {"cairo_type": "felt*", "offset": 2}}, "full_name": "starkware.starknet.common.syscalls.DeployResponse", "size": 3, "type": "struct"}, "starkware.starknet.common.syscalls.DictAccess": {"destination": "starkware.cairo.common.dict_access.DictAccess", "type": "alias"}, "starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR": {"value": 1280709301550335749748, "type": "const"}, "starkware.starknet.common.syscalls.EmitEvent": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "keys_len": {"cairo_type": "felt", "offset": 1}, "keys": {"cairo_type": "felt*", "offset": 2}, "data_len": {"cairo_type": "felt", "offset": 3}, "data": {"cairo_type": "felt*", "offset": 4}}, "full_name": "starkware.starknet.common.syscalls.EmitEvent", "size": 5, "type": "struct"}, "starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR": {"value": 1448089106835523001438702345020786, "type": "const"}, "starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR": {"value": 24294903732626645868215235778792757751152, "type": "const"}, "starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR": {"value": 94901967781393078444254803017658102643, "type": "const"}, "starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR": {"value": 6219495360805491471215297013070624192820083, "type": "const"}, "starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR": {"value": 1592190833581991703053805829594610833820054387, "type": "const"}, "starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR": {"value": 1317029390204112103023, "type": "const"}, "starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR": {"value": 1448089128652340074717162277007973, "type": "const"}, "starkware.starknet.common.syscalls.GetBlockNumber": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetBlockNumber", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockNumberRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockNumberRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockNumberResponse": {"members": {"block_number": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockNumberResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestamp": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestamp", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestampRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestampResponse": {"members": {"block_timestamp": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddress": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetCallerAddress", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddressRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetCallerAddressRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddressResponse": {"members": {"caller_address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetCallerAddressResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddress": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetContractAddressRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetContractAddressResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetContractAddress", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddressRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetContractAddressRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddressResponse": {"members": {"contract_address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetContractAddressResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddress": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddress", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddressRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddressResponse": {"members": {"sequencer_address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfo": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetTxInfoRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetTxInfoResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetTxInfo", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfoRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetTxInfoRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfoResponse": {"members": {"tx_info": {"cairo_type": "starkware.starknet.common.syscalls.TxInfo*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetTxInfoResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignature": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureResponse", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetTxSignature", "size": 3, "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignatureRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.GetTxSignatureRequest", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignatureResponse": {"members": {"signature_len": {"cairo_type": "felt", "offset": 0}, "signature": {"cairo_type": "felt*", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.GetTxSignatureResponse", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": {"value": 436233452754198157705746250789557519228244616562, "type": "const"}, "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": {"value": 92376026794327011772951660, "type": "const"}, "starkware.starknet.common.syscalls.LibraryCall": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.CallContractResponse", "offset": 5}}, "full_name": "starkware.starknet.common.syscalls.LibraryCall", "size": 7, "type": "struct"}, "starkware.starknet.common.syscalls.LibraryCallRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "class_hash": {"cairo_type": "felt", "offset": 1}, "function_selector": {"cairo_type": "felt", "offset": 2}, "calldata_size": {"cairo_type": "felt", "offset": 3}, "calldata": {"cairo_type": "felt*", "offset": 4}}, "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", "size": 5, "type": "struct"}, "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": {"value": 433017908768303439907196859243777073, "type": "const"}, "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": {"value": 100890693370601760042082660, "type": "const"}, "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": {"value": 25828017502874050592466629733, "type": "const"}, "starkware.starknet.common.syscalls.SendMessageToL1SysCall": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "to_address": {"cairo_type": "felt", "offset": 1}, "payload_size": {"cairo_type": "felt", "offset": 2}, "payload_ptr": {"cairo_type": "felt*", "offset": 3}}, "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", "size": 4, "type": "struct"}, "starkware.starknet.common.syscalls.StorageRead": {"members": {"request": {"cairo_type": "starkware.starknet.common.syscalls.StorageReadRequest", "offset": 0}, "response": {"cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse", "offset": 2}}, "full_name": "starkware.starknet.common.syscalls.StorageRead", "size": 3, "type": "struct"}, "starkware.starknet.common.syscalls.StorageReadRequest": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "address": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.StorageReadRequest", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.StorageReadResponse": {"members": {"value": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.StorageReadResponse", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.StorageWrite": {"members": {"selector": {"cairo_type": "felt", "offset": 0}, "address": {"cairo_type": "felt", "offset": 1}, "value": {"cairo_type": "felt", "offset": 2}}, "full_name": "starkware.starknet.common.syscalls.StorageWrite", "size": 3, "type": "struct"}, "starkware.starknet.common.syscalls.TxInfo": {"members": {"version": {"cairo_type": "felt", "offset": 0}, "account_contract_address": {"cairo_type": "felt", "offset": 1}, "max_fee": {"cairo_type": "felt", "offset": 2}, "signature_len": {"cairo_type": "felt", "offset": 3}, "signature": {"cairo_type": "felt*", "offset": 4}, "transaction_hash": {"cairo_type": "felt", "offset": 5}, "chain_id": {"cairo_type": "felt", "offset": 6}, "nonce": {"cairo_type": "felt", "offset": 7}}, "full_name": "starkware.starknet.common.syscalls.TxInfo", "size": 8, "type": "struct"}, "starkware.starknet.common.syscalls.call_contract": {"decorators": [], "pc": 74, "type": "function"}, "starkware.starknet.common.syscalls.call_contract.Args": {"members": {"contract_address": {"cairo_type": "felt", "offset": 0}, "function_selector": {"cairo_type": "felt", "offset": 1}, "calldata_size": {"cairo_type": "felt", "offset": 2}, "calldata": {"cairo_type": "felt*", "offset": 3}}, "full_name": "starkware.starknet.common.syscalls.call_contract.Args", "size": 4, "type": "struct"}, "starkware.starknet.common.syscalls.call_contract.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.call_contract.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.call_contract.Return": {"cairo_type": "(retdata_size: felt, retdata: felt*)", "type": "type_definition"}, "starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.call_contract.syscall_ptr": {"references": [{"pc": 74, "value": "[cast(fp + (-7), felt**)]", "ap_tracking_data": {"group": 4, "offset": 0}}, {"pc": 81, "value": "cast([fp + (-7)] + 7, felt*)", "ap_tracking_data": {"group": 4, "offset": 1}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.call_contract.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.get_caller_address": {"decorators": [], "pc": 86, "type": "function"}, "starkware.starknet.common.syscalls.get_caller_address.Args": {"members": {}, "full_name": "starkware.starknet.common.syscalls.get_caller_address.Args", "size": 0, "type": "struct"}, "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.get_caller_address.Return": {"cairo_type": "(caller_address: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": {"references": [{"pc": 86, "value": "[cast(fp + (-3), felt**)]", "ap_tracking_data": {"group": 5, "offset": 0}}, {"pc": 89, "value": "cast([fp + (-3)] + 2, felt*)", "ap_tracking_data": {"group": 5, "offset": 1}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.get_contract_address": {"decorators": [], "pc": 93, "type": "function"}, "starkware.starknet.common.syscalls.get_contract_address.Args": {"members": {}, "full_name": "starkware.starknet.common.syscalls.get_contract_address.Args", "size": 0, "type": "struct"}, "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.get_contract_address.Return": {"cairo_type": "(contract_address: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": {"references": [{"pc": 93, "value": "[cast(fp + (-3), felt**)]", "ap_tracking_data": {"group": 6, "offset": 0}}, {"pc": 96, "value": "cast([fp + (-3)] + 2, felt*)", "ap_tracking_data": {"group": 6, "offset": 1}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.get_tx_info": {"decorators": [], "pc": 116, "type": "function"}, "starkware.starknet.common.syscalls.get_tx_info.Args": {"members": {}, "full_name": "starkware.starknet.common.syscalls.get_tx_info.Args", "size": 0, "type": "struct"}, "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.get_tx_info.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.get_tx_info.Return": {"cairo_type": "(tx_info: starkware.starknet.common.syscalls.TxInfo*)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_tx_info.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr": {"references": [{"pc": 116, "value": "[cast(fp + (-3), felt**)]", "ap_tracking_data": {"group": 9, "offset": 0}}, {"pc": 119, "value": "cast([fp + (-3)] + 2, felt*)", "ap_tracking_data": {"group": 9, "offset": 1}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.get_tx_info.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.storage_read": {"decorators": [], "pc": 100, "type": "function"}, "starkware.starknet.common.syscalls.storage_read.Args": {"members": {"address": {"cairo_type": "felt", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.storage_read.Args", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.storage_read.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.storage_read.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.storage_read.Return": {"cairo_type": "(value: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.storage_read.syscall_ptr": {"references": [{"pc": 100, "value": "[cast(fp + (-4), felt**)]", "ap_tracking_data": {"group": 7, "offset": 0}}, {"pc": 104, "value": "cast([fp + (-4)] + 3, felt*)", "ap_tracking_data": {"group": 7, "offset": 1}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.storage_read.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.storage_write": {"decorators": [], "pc": 108, "type": "function"}, "starkware.starknet.common.syscalls.storage_write.Args": {"members": {"address": {"cairo_type": "felt", "offset": 0}, "value": {"cairo_type": "felt", "offset": 1}}, "full_name": "starkware.starknet.common.syscalls.storage_write.Args", "size": 2, "type": "struct"}, "starkware.starknet.common.syscalls.storage_write.ImplicitArgs": {"members": {"syscall_ptr": {"cairo_type": "felt*", "offset": 0}}, "full_name": "starkware.starknet.common.syscalls.storage_write.ImplicitArgs", "size": 1, "type": "struct"}, "starkware.starknet.common.syscalls.storage_write.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.storage_write.syscall_ptr": {"references": [{"pc": 108, "value": "[cast(fp + (-5), felt**)]", "ap_tracking_data": {"group": 8, "offset": 0}}, {"pc": 113, "value": "cast([fp + (-5)] + 3, felt*)", "ap_tracking_data": {"group": 8, "offset": 1}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.storage_write.syscall_ptr", "type": "reference"}}, "prime": "0x800000000000011000000000000000000000000000000000000000000000001", "reference_manager": {"references": [{"pc": 3, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 1, "offset": 0}}, {"pc": 10, "value": "[cast(ap, felt*)]", "ap_tracking_data": {"group": 1, "offset": 3}}, {"pc": 18, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 2, "offset": 0}}, {"pc": 18, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 2, "offset": 0}}, {"pc": 18, "value": "[cast(fp + (-5), felt*)]", "ap_tracking_data": {"group": 2, "offset": 0}}, {"pc": 63, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 3, "offset": 0}}, {"pc": 63, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 3, "offset": 0}}, {"pc": 74, "value": "[cast(fp + (-7), felt**)]", "ap_tracking_data": {"group": 4, "offset": 0}}, {"pc": 86, "value": "[cast(fp + (-3), felt**)]", "ap_tracking_data": {"group": 5, "offset": 0}}, {"pc": 93, "value": "[cast(fp + (-3), felt**)]", "ap_tracking_data": {"group": 6, "offset": 0}}, {"pc": 100, "value": "[cast(fp + (-4), felt**)]", "ap_tracking_data": {"group": 7, "offset": 0}}, {"pc": 108, "value": "[cast(fp + (-5), felt**)]", "ap_tracking_data": {"group": 8, "offset": 0}}, {"pc": 116, "value": "[cast(fp + (-3), felt**)]", "ap_tracking_data": {"group": 9, "offset": 0}}, {"pc": 123, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 10, "offset": 0}}, {"pc": 123, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 10, "offset": 0}}, {"pc": 123, "value": "[cast(fp + (-7), starkware.cairo.common.cairo_builtins.SignatureBuiltin**)]", "ap_tracking_data": {"group": 10, "offset": 0}}, {"pc": 128, "value": "[cast(fp + (-4), felt*)]", "ap_tracking_data": {"group": 11, "offset": 0}}, {"pc": 128, "value": "[cast(fp + (-3), felt*)]", "ap_tracking_data": {"group": 11, "offset": 0}}]}}} \ No newline at end of file diff --git a/starknet_programs/raw_contract_classes/0x4479c3b883b34f1eafa5065418225d78a11ee7957c371e1b285e4b77afc6dad.json b/starknet_programs/raw_contract_classes/0x4479c3b883b34f1eafa5065418225d78a11ee7957c371e1b285e4b77afc6dad.json new file mode 100644 index 000000000..b95328f3d --- /dev/null +++ b/starknet_programs/raw_contract_classes/0x4479c3b883b34f1eafa5065418225d78a11ee7957c371e1b285e4b77afc6dad.json @@ -0,0 +1 @@ +{"abi": [{"members": [{"name": "low", "offset": 0, "type": "felt"}, {"name": "high", "offset": 1, "type": "felt"}], "name": "Uint256", "size": 2, "type": "struct"}, {"members": [{"name": "status", "offset": 0, "type": "felt"}, {"name": "len", "offset": 1, "type": "felt"}, {"name": "total_eth", "offset": 2, "type": "Uint256"}, {"name": "total_tokens", "offset": 4, "type": "Uint256"}, {"name": "collected_fee", "offset": 6, "type": "felt"}, {"name": "pool_batch_id", "offset": 7, "type": "felt"}, {"name": "pool_batch_index", "offset": 8, "type": "felt"}, {"name": "start_block_timestamp", "offset": 9, "type": "felt"}, {"name": "distributed_len", "offset": 10, "type": "felt"}], "name": "Batch", "size": 11, "type": "struct"}, {"data": [{"name": "implementation", "type": "felt"}], "keys": [], "name": "Upgraded", "type": "event"}, {"data": [{"name": "account", "type": "felt"}, {"name": "amount", "type": "Uint256"}, {"name": "batchId", "type": "felt"}, {"name": "idx", "type": "felt"}], "keys": [], "name": "stake_eth", "type": "event"}, {"data": [{"name": "account", "type": "felt"}, {"name": "amount", "type": "Uint256"}, {"name": "batchId", "type": "felt"}, {"name": "idx", "type": "felt"}], "keys": [], "name": "withdraw_staked_token", "type": "event"}, {"data": [{"name": "type", "type": "felt"}, {"name": "batchId", "type": "felt"}, {"name": "amount", "type": "Uint256"}, {"name": "fee", "type": "felt"}], "keys": [], "name": "batch_to_pool", "type": "event"}, {"data": [{"name": "type", "type": "felt"}, {"name": "batchId", "type": "felt"}, {"name": "eth_amount", "type": "Uint256"}, {"name": "token_amount", "type": "Uint256"}], "keys": [], "name": "batch_from_pool", "type": "event"}, {"inputs": [{"name": "new_implementation", "type": "felt"}], "name": "upgrade", "outputs": [], "type": "function"}, {"inputs": [{"name": "amount", "type": "Uint256"}], "name": "set_min_deposit_eth", "outputs": [], "type": "function"}, {"inputs": [{"name": "maxSlippagePercentage", "type": "felt"}], "name": "set_max_slippage_percentage", "outputs": [], "type": "function"}, {"inputs": [{"name": "address", "type": "felt"}], "name": "set_eth_bridge_token_address", "outputs": [], "type": "function"}, {"inputs": [{"name": "fractionalFee", "type": "felt"}], "name": "set_fractional_fee", "outputs": [], "type": "function"}, {"inputs": [{"name": "stakingPool", "type": "felt"}], "name": "set_staking_pool", "outputs": [], "type": "function"}, {"inputs": [{"name": "stakeToken", "type": "felt"}], "name": "set_stake_token", "outputs": [], "type": "function"}, {"inputs": [{"name": "mySwapAmm", "type": "felt"}], "name": "set_myswap_amm", "outputs": [], "type": "function"}, {"inputs": [{"name": "mySwapLpToken", "type": "felt"}], "name": "set_myswap_lp_token", "outputs": [], "type": "function"}, {"inputs": [{"name": "mySwapPoolId", "type": "felt"}], "name": "set_myswap_pool_id", "outputs": [], "type": "function"}, {"inputs": [{"name": "marketingVerifierChash", "type": "felt"}], "name": "set_marketing_verifier_chash", "outputs": [], "type": "function"}, {"inputs": [{"name": "action", "type": "felt"}, {"name": "amount", "type": "Uint256"}, {"name": "caller_address", "type": "felt"}], "name": "is_action_eligible", "outputs": [{"name": "eligible", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "ethAmount", "type": "Uint256"}], "name": "stake", "outputs": [{"name": "batchId", "type": "felt"}, {"name": "idx", "type": "felt"}], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}], "name": "close_deposit_batch", "outputs": [], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}], "name": "handle_deposit_batch", "outputs": [], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}, {"name": "chunkSize", "type": "felt"}, {"name": "chunkOffset", "type": "felt"}], "name": "distribute_deposit_batch", "outputs": [{"name": "batch_fully_distributed", "type": "felt"}], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}], "name": "get_deposit_batch", "outputs": [{"name": "batch", "type": "Batch"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "get_active_deposit_batch_id", "outputs": [{"name": "batchId", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "amount", "type": "Uint256"}], "name": "withdraw", "outputs": [{"name": "batchId", "type": "felt"}, {"name": "idx", "type": "felt"}], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}], "name": "close_withdraw_batch", "outputs": [], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}], "name": "get_withdraw_batch", "outputs": [{"name": "batch", "type": "Batch"}], "stateMutability": "view", "type": "function"}, {"inputs": [], "name": "get_active_withdraw_batch_id", "outputs": [{"name": "batchId", "type": "felt"}], "stateMutability": "view", "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}], "name": "handle_withdraw_batch", "outputs": [], "type": "function"}, {"inputs": [{"name": "batchId", "type": "felt"}, {"name": "chunkSize", "type": "felt"}, {"name": "chunkOffset", "type": "felt"}], "name": "distribute_withdraw_batch", "outputs": [{"name": "batch_fully_distributed", "type": "felt"}], "type": "function"}], "entry_points_by_type": {"EXTERNAL": [{"selector": "0x39a40c82a53053da7a5ee032935dfda289f785bac86f8bacde20788eb0335", "offset": 4197}, {"selector": "0x3273773fe9c513814a436fec7855f2052170885ef979712535c880fdeaa5b0", "offset": 4544}, {"selector": "0x70a148987f518b23ebc0048563d02b9f110ea6bf5c157abaafb8b43e9b2976", "offset": 4327}, {"selector": "0x931ed208a0f76172539f530ff28d716c8a85396b2ce927aad069e7f5ba3e90", "offset": 4160}, {"selector": "0xb242ba148b7edd394af388687b08e69ee79ac5ab131f91dca7fbb6c7d385e2", "offset": 4291}, {"selector": "0xc1659fd78621928923dbbfb15e201de973effab6055f83fd3dba83cfac380a", "offset": 4511}, {"selector": "0xc9ffbb7b96cdfbb7c2efc272b0468da0400b8157da897374e85837092f8ee5", "offset": 4604}, {"selector": "0xe57d1bcdde9f31fcc7ac86b6aaca253d0899272d0d99ad50960b592dde358a", "offset": 4264}, {"selector": "0xf2f7c15cbe06c8d94597cd91fd7f3369eae842359235712def5584f8d270cd", "offset": 3888}, {"selector": "0x154d156b6b2da61612a3dd8b56b21e486f5eb7da763e3671388a22c9b13ed28", "offset": 4467}, {"selector": "0x15511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77", "offset": 4439}, {"selector": "0x18d76b976f7b1c42ee4b867b6c8416e0d18cff5607dabb708f20ec29a90aace", "offset": 4106}, {"selector": "0x1b15ca209c4ec9d23f0d564bf61777fff1a860b8b93aad550df91105fa2ea01", "offset": 4079}, {"selector": "0x1bd6ac8915f8fda60e460310f5c07d8a6ef065e91c11424598bb321f4289110", "offset": 3916}, {"selector": "0x1c762b6dde1945d4fdbef5b8f161c45213121504b59df88805ce6fa05b0b1a9", "offset": 3998}, {"selector": "0x1ea8ee8ae7a85688e2a915d917a58586bed81a7dce41f321aa75a7a16b71ad1", "offset": 4133}, {"selector": "0x20b2e8d5cf653bd38b9b180a24f7625b646dfbc59119754eb10a6374fa5a98e", "offset": 4025}, {"selector": "0x21ae9b956042e0ce194ab890a3b93583cd4199b1ab194592f3ee64cc470de05", "offset": 4052}, {"selector": "0x25f0420c16be31f53fe1fbcedba33c8303dbddebb5f47bb1ec09d54de57ac20", "offset": 4406}, {"selector": "0x329512b9d7cbe2a80ee55bc8b3911d90afe0cf160267db520cebe9405090b28", "offset": 3944}, {"selector": "0x34cfa389f3671388510ed719f0c2898e8ab2dce68dc23a11d8e8bc044dccc69", "offset": 3971}, {"selector": "0x393abcf6ea0c3081e300002f54b0e76200412759564a71781d676b3957bb436", "offset": 4568}, {"selector": "0x3a04795accb4b73d12f13b05a1e0e240cefeb9a89d008676730867a819d2f79", "offset": 4236}, {"selector": "0x3fbe15063570cd2aa027600fb715fd939db96f82919285cf08b14913e9278e2", "offset": 4373}], "CONSTRUCTOR": [], "L1_HANDLER": []}, "program": {"reference_manager": {"references": [{"value": "[cast(fp + (-7), felt**)]", "pc": 9, "ap_tracking_data": {"offset": 0, "group": 2}}, {"value": "[cast(fp + (-7), felt**)]", "pc": 21, "ap_tracking_data": {"offset": 0, "group": 3}}, {"value": "[cast(fp + (-3), felt**)]", "pc": 33, "ap_tracking_data": {"offset": 0, "group": 4}}, {"value": "[cast(fp + (-3), felt**)]", "pc": 40, "ap_tracking_data": {"offset": 0, "group": 5}}, {"value": "[cast(fp + (-3), felt**)]", "pc": 47, "ap_tracking_data": {"offset": 0, "group": 6}}, {"value": "[cast(fp + (-4), felt**)]", "pc": 54, "ap_tracking_data": {"offset": 0, "group": 7}}, {"value": "[cast(fp + (-5), felt**)]", "pc": 62, "ap_tracking_data": {"offset": 0, "group": 8}}, {"value": "[cast(fp + (-7), felt**)]", "pc": 70, "ap_tracking_data": {"offset": 0, "group": 9}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 80, "ap_tracking_data": {"offset": 0, "group": 10}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 85, "ap_tracking_data": {"offset": 0, "group": 11}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 94, "ap_tracking_data": {"offset": 0, "group": 13}}, {"value": "[cast([fp + (-4)], felt*)]", "pc": 94, "ap_tracking_data": {"offset": 0, "group": 13}}, {"value": "[cast([fp + (-4)] + 1, felt*)]", "pc": 94, "ap_tracking_data": {"offset": 0, "group": 13}}, {"value": "[cast(fp + (-4), felt*)]", "pc": 107, "ap_tracking_data": {"offset": 0, "group": 14}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 107, "ap_tracking_data": {"offset": 0, "group": 14}}, {"value": "[cast(fp + (-5), felt*)]", "pc": 107, "ap_tracking_data": {"offset": 0, "group": 14}}, {"value": "[cast(fp + (-4), felt*)]", "pc": 152, "ap_tracking_data": {"offset": 0, "group": 15}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 152, "ap_tracking_data": {"offset": 0, "group": 15}}, {"value": "[cast(fp + (-4), felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}, {"value": "[cast([fp + (-5)], felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}, {"value": "[cast([fp + (-5)] + 1, felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 178, "ap_tracking_data": {"offset": 0, "group": 17}}, {"value": "[cast(ap + (-1), felt*)]", "pc": 180, "ap_tracking_data": {"offset": 1, "group": 17}}, {"value": "[cast(ap + (-1), felt*)]", "pc": 198, "ap_tracking_data": {"offset": 2, "group": 17}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 226, "ap_tracking_data": {"offset": 0, "group": 19}}, {"value": "[cast(fp + (-4), felt*)]", "pc": 264, "ap_tracking_data": {"offset": 0, "group": 21}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 264, "ap_tracking_data": {"offset": 0, "group": 21}}, {"value": "[cast(fp + (-6), starkware.cairo.common.uint256.Uint256*)]", "pc": 289, "ap_tracking_data": {"offset": 0, "group": 23}}, {"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 289, "ap_tracking_data": {"offset": 0, "group": 23}}, {"value": "[cast(fp + 2, felt*)]", "pc": 291, "ap_tracking_data": {"offset": 4, "group": 23}}, {"value": "[cast(fp + 3, felt*)]", "pc": 291, "ap_tracking_data": {"offset": 4, "group": 23}}, {"value": "[cast(fp + (-3), felt*)]", "pc": 311, "ap_tracking_data": {"offset": 0, "group": 24}}, {"value": "[cast(fp, felt*)]", "pc": 313, "ap_tracking_data": {"offset": 2, "group": 24}}, {"value": "[cast(fp + 1, felt*)]", "pc": 313, "ap_tracking_data": {"offset": 2, "group": 24}}, {"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 415, "ap_tracking_data": {"offset": 0, "group": 26}}, {"value": "[cast(fp, starkware.cairo.common.uint256.Uint256*)]", "pc": 417, "ap_tracking_data": {"offset": 2, "group": 26}}, {"value": "[cast(fp + (-6), starkware.cairo.common.uint256.Uint256*)]", "pc": 510, "ap_tracking_data": {"offset": 0, "group": 32}}, {"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 510, "ap_tracking_data": {"offset": 0, "group": 32}}, {"value": "[cast(fp, starkware.cairo.common.uint256.Uint256*)]", "pc": 525, "ap_tracking_data": {"offset": 5, "group": 32}}, {"value": "[cast(fp + 2, starkware.cairo.common.uint256.Uint256*)]", "pc": 525, "ap_tracking_data": {"offset": 5, "group": 32}}, {"value": "[cast(fp + (-8), starkware.cairo.common.uint256.Uint256*)]", "pc": 570, "ap_tracking_data": {"offset": 0, "group": 33}}, {"value": "[cast(fp + (-6), starkware.cairo.common.uint256.Uint256*)]", "pc": 570, "ap_tracking_data": {"offset": 0, "group": 33}}, {"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 570, "ap_tracking_data": {"offset": 0, "group": 33}}, {"value": "[cast(fp, starkware.cairo.common.uint256.Uint256*)]", "pc": 579, "ap_tracking_data": {"offset": 182, "group": 33}}, {"value": "[cast(fp + 2, starkware.cairo.common.uint256.Uint256*)]", "pc": 579, "ap_tracking_data": {"offset": 182, "group": 33}}, {"value": "[cast(fp + 4, starkware.cairo.common.uint256.Uint256*)]", "pc": 579, "ap_tracking_data": {"offset": 182, "group": 33}}]}, "attributes": [{"end_pc": 716, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 50, "group": 38}}, "value": "assert_uint256_le failed", "start_pc": 714, "accessible_scopes": ["starkware.cairo.common.uint256", "starkware.cairo.common.uint256.assert_uint256_le"]}, {"end_pc": 901, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 29, "group": 49}}, "value": "Proxy: caller is not admin", "start_pc": 900, "accessible_scopes": ["upgrades.library", "upgrades.library.Proxy", "upgrades.library.Proxy.assert_only_admin"]}, {"end_pc": 2251, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 125}}, "value": "Not eligible", "start_pc": 2249, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._stake"]}, {"end_pc": 2259, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 33, "group": 125}}, "value": "MinDepositEth not set", "start_pc": 2256, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._stake"]}, {"end_pc": 2268, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 36, "group": 125}}, "value": "Stake amount smaller than minimum amount", "start_pc": 2259, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._stake"]}, {"end_pc": 2278, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 105, "group": 125}}, "value": "EthBridgeToken not set", "start_pc": 2276, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._stake"]}, {"end_pc": 2296, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 296, "group": 125}}, "value": "Current Batch is not active", "start_pc": 2294, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._stake"]}, {"end_pc": 2594, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 1433, "group": 132}}, "value": "Boost: error computing expected ETH in pool balancing step", "start_pc": 2590, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._balanceMySwapPool"]}, {"end_pc": 2658, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 41, "group": 133}}, "value": "Close deposit batch called on non-active batch", "start_pc": 2657, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeDepositBatch"]}, {"end_pc": 2677, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 182, "group": 133}}, "value": "Current Batch is not active", "start_pc": 2675, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeDepositBatch"]}, {"end_pc": 2700, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 251, "group": 133}}, "value": "Fee is not set", "start_pc": 2697, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeDepositBatch"]}, {"end_pc": 2702, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 254, "group": 133}}, "value": "ETH Deposit amount not supported", "start_pc": 2700, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeDepositBatch"]}, {"end_pc": 2735, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 72, "group": 134}}, "value": "StakingPool not set", "start_pc": 2733, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeDepositBatch"]}, {"end_pc": 2799, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 141, "group": 135}}, "value": "Current Batch has not run yet", "start_pc": 2793, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._getDepositAmountOut"]}, {"end_pc": 2819, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 915, "group": 135}}, "value": "Amount Out Ratio Calc Error", "start_pc": 2815, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._getDepositAmountOut"]}, {"end_pc": 2847, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 162, "group": 136}}, "value": "Given batch is in wrong status", "start_pc": 2845, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 2855, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 185, "group": 136}}, "value": "StakingPool not set", "start_pc": 2853, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 2909, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 781, "group": 137}}, "value": "Boost handle deposit batch: error balancing myswap pool", "start_pc": 2905, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 2913, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 138}}, "value": "invalid token amount", "start_pc": 2909, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 2922, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 28, "group": 138}}, "value": "MySwapAMM not set", "start_pc": 2919, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 2937, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 77, "group": 138}}, "value": "Stake Token not set", "start_pc": 2934, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 2989, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 1385, "group": 139}}, "value": "MySwap LPToken not set", "start_pc": 2987, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 3029, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 1420, "group": 139}}, "value": "Boost: error in adding liquidity when handling deposit batch", "start_pc": 2998, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleDepositBatch"]}, {"end_pc": 3094, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 154, "group": 140}}, "value": "Given batch is not waiting for distribution", "start_pc": 3092, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._distributeDepositBatch"]}, {"end_pc": 3100, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 154, "group": 140}}, "value": "Invalid chunk size or offset", "start_pc": 3094, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._distributeDepositBatch"]}, {"end_pc": 3216, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 145}}, "value": "Not eligible", "start_pc": 3214, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._withdraw"]}, {"end_pc": 3226, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 31, "group": 145}}, "value": "MySwapLpToken not set", "start_pc": 3224, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._withdraw"]}, {"end_pc": 3244, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 222, "group": 145}}, "value": "Current Batch is not active", "start_pc": 3242, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._withdraw"]}, {"end_pc": 3335, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 23, "group": 147}}, "value": "Close withdraw batch called on non-active batch", "start_pc": 3334, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeWithdrawBatch"]}, {"end_pc": 3343, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 164, "group": 147}}, "value": "Current Batch is not active", "start_pc": 3341, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeWithdrawBatch"]}, {"end_pc": 3457, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 2462, "group": 147}}, "value": "Slippage in pool rate is high", "start_pc": 3439, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeWithdrawBatch"]}, {"end_pc": 3534, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 2939, "group": 147}}, "value": "StakingPool not set", "start_pc": 3532, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._closeWithdrawBatch"]}, {"end_pc": 3599, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 141, "group": 148}}, "value": "Current Batch has not run yet", "start_pc": 3593, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._getWithdrawAmountOut"]}, {"end_pc": 3619, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 915, "group": 148}}, "value": "Amount Out Ratio Calc Error", "start_pc": 3615, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._getWithdrawAmountOut"]}, {"end_pc": 3636, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 141, "group": 149}}, "value": "Given batch is in wrong status", "start_pc": 3634, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleWithdrawBatch"]}, {"end_pc": 3643, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 164, "group": 149}}, "value": "StakingPool not set", "start_pc": 3641, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleWithdrawBatch"]}, {"end_pc": 3664, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 220, "group": 149}}, "value": "invalid token amount", "start_pc": 3659, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._handleWithdrawBatch"]}, {"end_pc": 3732, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 35, "group": 154}}, "value": "EthBridgeToken not set", "start_pc": 3730, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._distributeWithdrawBatch"]}, {"end_pc": 3760, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 211, "group": 154}}, "value": "Given batch is not waiting for distribution", "start_pc": 3758, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._distributeWithdrawBatch"]}, {"end_pc": 3766, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 211, "group": 154}}, "value": "Invalid chunk size or offset", "start_pc": 3760, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost._distributeWithdrawBatch"]}, {"end_pc": 3838, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 952, "group": 156}}, "value": "EthBridgeToken not set", "start_pc": 3836, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost.distributeEthToBatch"]}, {"end_pc": 3865, "name": "error_message", "flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 1013, "group": 156}}, "value": "Total amount of eth distributed supersedes amount in", "start_pc": 3856, "accessible_scopes": ["boost.library", "boost.library.Boost", "boost.library.Boost.distributeEthToBatch"]}], "identifiers": {"__main__.Batch": {"destination": "boost.library.Batch", "type": "alias"}, "__main__.Boost": {"destination": "boost.library.Boost", "type": "alias"}, "__main__.DepositRequest": {"destination": "boost.library.DepositRequest", "type": "alias"}, "__main__.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "__main__.Proxy": {"destination": "upgrades.library.Proxy", "type": "alias"}, "__main__.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "__main__.WithdrawRequest": {"destination": "boost.library.WithdrawRequest", "type": "alias"}, "__main__.close_deposit_batch": {"decorators": ["external"], "pc": 4255, "type": "function"}, "__main__.close_deposit_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.close_deposit_batch.Args", "type": "struct"}, "__main__.close_deposit_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.close_deposit_batch.ImplicitArgs", "type": "struct"}, "__main__.close_deposit_batch.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.close_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.close_withdraw_batch": {"decorators": ["external"], "pc": 4458, "type": "function"}, "__main__.close_withdraw_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.close_withdraw_batch.Args", "type": "struct"}, "__main__.close_withdraw_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.close_withdraw_batch.ImplicitArgs", "type": "struct"}, "__main__.close_withdraw_batch.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.close_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.distribute_deposit_batch": {"decorators": ["external"], "pc": 4309, "type": "function"}, "__main__.distribute_deposit_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "chunkSize": {"offset": 1, "cairo_type": "felt"}, "chunkOffset": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.distribute_deposit_batch.Args", "type": "struct"}, "__main__.distribute_deposit_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.distribute_deposit_batch.ImplicitArgs", "type": "struct"}, "__main__.distribute_deposit_batch.Return": {"cairo_type": "(batch_fully_distributed: felt)", "type": "type_definition"}, "__main__.distribute_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.distribute_withdraw_batch": {"decorators": ["external"], "pc": 4586, "type": "function"}, "__main__.distribute_withdraw_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "chunkSize": {"offset": 1, "cairo_type": "felt"}, "chunkOffset": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.distribute_withdraw_batch.Args", "type": "struct"}, "__main__.distribute_withdraw_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.distribute_withdraw_batch.ImplicitArgs", "type": "struct"}, "__main__.distribute_withdraw_batch.Return": {"cairo_type": "(batch_fully_distributed: felt)", "type": "type_definition"}, "__main__.distribute_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.get_active_deposit_batch_id": {"decorators": ["view"], "pc": 4391, "type": "function"}, "__main__.get_active_deposit_batch_id.Args": {"members": {}, "size": 0, "full_name": "__main__.get_active_deposit_batch_id.Args", "type": "struct"}, "__main__.get_active_deposit_batch_id.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.get_active_deposit_batch_id.ImplicitArgs", "type": "struct"}, "__main__.get_active_deposit_batch_id.Return": {"cairo_type": "(batchId: felt)", "type": "type_definition"}, "__main__.get_active_deposit_batch_id.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.get_active_withdraw_batch_id": {"decorators": ["view"], "pc": 4529, "type": "function"}, "__main__.get_active_withdraw_batch_id.Args": {"members": {}, "size": 0, "full_name": "__main__.get_active_withdraw_batch_id.Args", "type": "struct"}, "__main__.get_active_withdraw_batch_id.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.get_active_withdraw_batch_id.ImplicitArgs", "type": "struct"}, "__main__.get_active_withdraw_batch_id.Return": {"cairo_type": "(batchId: felt)", "type": "type_definition"}, "__main__.get_active_withdraw_batch_id.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.get_deposit_batch": {"decorators": ["view"], "pc": 4347, "type": "function"}, "__main__.get_deposit_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.get_deposit_batch.Args", "type": "struct"}, "__main__.get_deposit_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.get_deposit_batch.ImplicitArgs", "type": "struct"}, "__main__.get_deposit_batch.Return": {"cairo_type": "(batch: boost.library.Batch)", "type": "type_definition"}, "__main__.get_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.get_withdraw_batch": {"decorators": ["view"], "pc": 4485, "type": "function"}, "__main__.get_withdraw_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.get_withdraw_batch.Args", "type": "struct"}, "__main__.get_withdraw_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.get_withdraw_batch.ImplicitArgs", "type": "struct"}, "__main__.get_withdraw_batch.Return": {"cairo_type": "(batch: boost.library.Batch)", "type": "type_definition"}, "__main__.get_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.handle_deposit_batch": {"decorators": ["external"], "pc": 4282, "type": "function"}, "__main__.handle_deposit_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.handle_deposit_batch.Args", "type": "struct"}, "__main__.handle_deposit_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.handle_deposit_batch.ImplicitArgs", "type": "struct"}, "__main__.handle_deposit_batch.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.handle_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.handle_withdraw_batch": {"decorators": ["external"], "pc": 4559, "type": "function"}, "__main__.handle_withdraw_batch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.handle_withdraw_batch.Args", "type": "struct"}, "__main__.handle_withdraw_batch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.handle_withdraw_batch.ImplicitArgs", "type": "struct"}, "__main__.handle_withdraw_batch.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.handle_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.is_action_eligible": {"decorators": ["view"], "pc": 4178, "type": "function"}, "__main__.is_action_eligible.Args": {"members": {"action": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "caller_address": {"offset": 3, "cairo_type": "felt"}}, "size": 4, "full_name": "__main__.is_action_eligible.Args", "type": "struct"}, "__main__.is_action_eligible.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.is_action_eligible.ImplicitArgs", "type": "struct"}, "__main__.is_action_eligible.Return": {"cairo_type": "(eligible: felt)", "type": "type_definition"}, "__main__.is_action_eligible.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_eth_bridge_token_address": {"decorators": ["external"], "pc": 3962, "type": "function"}, "__main__.set_eth_bridge_token_address.Args": {"members": {"address": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_eth_bridge_token_address.Args", "type": "struct"}, "__main__.set_eth_bridge_token_address.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_eth_bridge_token_address.ImplicitArgs", "type": "struct"}, "__main__.set_eth_bridge_token_address.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_eth_bridge_token_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_fractional_fee": {"decorators": ["external"], "pc": 3989, "type": "function"}, "__main__.set_fractional_fee.Args": {"members": {"fractionalFee": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_fractional_fee.Args", "type": "struct"}, "__main__.set_fractional_fee.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_fractional_fee.ImplicitArgs", "type": "struct"}, "__main__.set_fractional_fee.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_fractional_fee.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_marketing_verifier_chash": {"decorators": ["external"], "pc": 4151, "type": "function"}, "__main__.set_marketing_verifier_chash.Args": {"members": {"marketingVerifierChash": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_marketing_verifier_chash.Args", "type": "struct"}, "__main__.set_marketing_verifier_chash.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_marketing_verifier_chash.ImplicitArgs", "type": "struct"}, "__main__.set_marketing_verifier_chash.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_marketing_verifier_chash.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_max_slippage_percentage": {"decorators": ["external"], "pc": 3935, "type": "function"}, "__main__.set_max_slippage_percentage.Args": {"members": {"maxSlippagePercentage": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_max_slippage_percentage.Args", "type": "struct"}, "__main__.set_max_slippage_percentage.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_max_slippage_percentage.ImplicitArgs", "type": "struct"}, "__main__.set_max_slippage_percentage.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_max_slippage_percentage.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_min_deposit_eth": {"decorators": ["external"], "pc": 3906, "type": "function"}, "__main__.set_min_deposit_eth.Args": {"members": {"amount": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "__main__.set_min_deposit_eth.Args", "type": "struct"}, "__main__.set_min_deposit_eth.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_min_deposit_eth.ImplicitArgs", "type": "struct"}, "__main__.set_min_deposit_eth.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_min_deposit_eth.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_myswap_amm": {"decorators": ["external"], "pc": 4070, "type": "function"}, "__main__.set_myswap_amm.Args": {"members": {"mySwapAmm": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_myswap_amm.Args", "type": "struct"}, "__main__.set_myswap_amm.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_myswap_amm.ImplicitArgs", "type": "struct"}, "__main__.set_myswap_amm.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_myswap_amm.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_myswap_lp_token": {"decorators": ["external"], "pc": 4097, "type": "function"}, "__main__.set_myswap_lp_token.Args": {"members": {"mySwapLpToken": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_myswap_lp_token.Args", "type": "struct"}, "__main__.set_myswap_lp_token.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_myswap_lp_token.ImplicitArgs", "type": "struct"}, "__main__.set_myswap_lp_token.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_myswap_lp_token.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_myswap_pool_id": {"decorators": ["external"], "pc": 4124, "type": "function"}, "__main__.set_myswap_pool_id.Args": {"members": {"mySwapPoolId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_myswap_pool_id.Args", "type": "struct"}, "__main__.set_myswap_pool_id.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_myswap_pool_id.ImplicitArgs", "type": "struct"}, "__main__.set_myswap_pool_id.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_myswap_pool_id.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_stake_token": {"decorators": ["external"], "pc": 4043, "type": "function"}, "__main__.set_stake_token.Args": {"members": {"stakeToken": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_stake_token.Args", "type": "struct"}, "__main__.set_stake_token.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_stake_token.ImplicitArgs", "type": "struct"}, "__main__.set_stake_token.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_stake_token.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.set_staking_pool": {"decorators": ["external"], "pc": 4016, "type": "function"}, "__main__.set_staking_pool.Args": {"members": {"stakingPool": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.set_staking_pool.Args", "type": "struct"}, "__main__.set_staking_pool.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.set_staking_pool.ImplicitArgs", "type": "struct"}, "__main__.set_staking_pool.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.set_staking_pool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.stake": {"decorators": ["external"], "pc": 4218, "type": "function"}, "__main__.stake.Args": {"members": {"ethAmount": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "__main__.stake.Args", "type": "struct"}, "__main__.stake.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.stake.ImplicitArgs", "type": "struct"}, "__main__.stake.Return": {"cairo_type": "(batchId: felt, idx: felt)", "type": "type_definition"}, "__main__.stake.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.upgrade": {"decorators": ["external"], "pc": 3879, "type": "function"}, "__main__.upgrade.Args": {"members": {"new_implementation": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "__main__.upgrade.Args", "type": "struct"}, "__main__.upgrade.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.upgrade.ImplicitArgs", "type": "struct"}, "__main__.upgrade.Return": {"cairo_type": "()", "type": "type_definition"}, "__main__.upgrade.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__main__.withdraw": {"decorators": ["external"], "pc": 4421, "type": "function"}, "__main__.withdraw.Args": {"members": {"amount": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "__main__.withdraw.Args", "type": "struct"}, "__main__.withdraw.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__main__.withdraw.ImplicitArgs", "type": "struct"}, "__main__.withdraw.Return": {"cairo_type": "(batchId: felt, idx: felt)", "type": "type_definition"}, "__main__.withdraw.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.close_deposit_batch": {"decorators": ["external"], "pc": 4264, "type": "function"}, "__wrappers__.close_deposit_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.close_deposit_batch.Args", "type": "struct"}, "__wrappers__.close_deposit_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.close_deposit_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.close_deposit_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.close_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.close_deposit_batch.__wrapped_func": {"destination": "__main__.close_deposit_batch", "type": "alias"}, "__wrappers__.close_deposit_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.close_withdraw_batch": {"decorators": ["external"], "pc": 4467, "type": "function"}, "__wrappers__.close_withdraw_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.close_withdraw_batch.Args", "type": "struct"}, "__wrappers__.close_withdraw_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.close_withdraw_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.close_withdraw_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.close_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.close_withdraw_batch.__wrapped_func": {"destination": "__main__.close_withdraw_batch", "type": "alias"}, "__wrappers__.close_withdraw_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.distribute_deposit_batch": {"decorators": ["external"], "pc": 4327, "type": "function"}, "__wrappers__.distribute_deposit_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.distribute_deposit_batch.Args", "type": "struct"}, "__wrappers__.distribute_deposit_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.distribute_deposit_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.distribute_deposit_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.distribute_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.distribute_deposit_batch.__wrapped_func": {"destination": "__main__.distribute_deposit_batch", "type": "alias"}, "__wrappers__.distribute_deposit_batch_encode_return": {"decorators": [], "pc": 4318, "type": "function"}, "__wrappers__.distribute_deposit_batch_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batch_fully_distributed: felt)"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "__wrappers__.distribute_deposit_batch_encode_return.Args", "type": "struct"}, "__wrappers__.distribute_deposit_batch_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.distribute_deposit_batch_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.distribute_deposit_batch_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.distribute_deposit_batch_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.distribute_deposit_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.distribute_withdraw_batch": {"decorators": ["external"], "pc": 4604, "type": "function"}, "__wrappers__.distribute_withdraw_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.distribute_withdraw_batch.Args", "type": "struct"}, "__wrappers__.distribute_withdraw_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.distribute_withdraw_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.distribute_withdraw_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.distribute_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.distribute_withdraw_batch.__wrapped_func": {"destination": "__main__.distribute_withdraw_batch", "type": "alias"}, "__wrappers__.distribute_withdraw_batch_encode_return": {"decorators": [], "pc": 4595, "type": "function"}, "__wrappers__.distribute_withdraw_batch_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batch_fully_distributed: felt)"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "__wrappers__.distribute_withdraw_batch_encode_return.Args", "type": "struct"}, "__wrappers__.distribute_withdraw_batch_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.distribute_withdraw_batch_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.distribute_withdraw_batch_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.distribute_withdraw_batch_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.distribute_withdraw_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.get_active_deposit_batch_id": {"decorators": ["view"], "pc": 4406, "type": "function"}, "__wrappers__.get_active_deposit_batch_id.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.get_active_deposit_batch_id.Args", "type": "struct"}, "__wrappers__.get_active_deposit_batch_id.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_active_deposit_batch_id.ImplicitArgs", "type": "struct"}, "__wrappers__.get_active_deposit_batch_id.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.get_active_deposit_batch_id.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.get_active_deposit_batch_id.__wrapped_func": {"destination": "__main__.get_active_deposit_batch_id", "type": "alias"}, "__wrappers__.get_active_deposit_batch_id_encode_return": {"decorators": [], "pc": 4397, "type": "function"}, "__wrappers__.get_active_deposit_batch_id_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batchId: felt)"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "__wrappers__.get_active_deposit_batch_id_encode_return.Args", "type": "struct"}, "__wrappers__.get_active_deposit_batch_id_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_active_deposit_batch_id_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.get_active_deposit_batch_id_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.get_active_deposit_batch_id_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.get_active_deposit_batch_id_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.get_active_withdraw_batch_id": {"decorators": ["view"], "pc": 4544, "type": "function"}, "__wrappers__.get_active_withdraw_batch_id.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.get_active_withdraw_batch_id.Args", "type": "struct"}, "__wrappers__.get_active_withdraw_batch_id.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_active_withdraw_batch_id.ImplicitArgs", "type": "struct"}, "__wrappers__.get_active_withdraw_batch_id.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.get_active_withdraw_batch_id.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.get_active_withdraw_batch_id.__wrapped_func": {"destination": "__main__.get_active_withdraw_batch_id", "type": "alias"}, "__wrappers__.get_active_withdraw_batch_id_encode_return": {"decorators": [], "pc": 4535, "type": "function"}, "__wrappers__.get_active_withdraw_batch_id_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batchId: felt)"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "__wrappers__.get_active_withdraw_batch_id_encode_return.Args", "type": "struct"}, "__wrappers__.get_active_withdraw_batch_id_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_active_withdraw_batch_id_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.get_active_withdraw_batch_id_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.get_active_withdraw_batch_id_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.get_active_withdraw_batch_id_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.get_deposit_batch": {"decorators": ["view"], "pc": 4373, "type": "function"}, "__wrappers__.get_deposit_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.get_deposit_batch.Args", "type": "struct"}, "__wrappers__.get_deposit_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_deposit_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.get_deposit_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.get_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.get_deposit_batch.__wrapped_func": {"destination": "__main__.get_deposit_batch", "type": "alias"}, "__wrappers__.get_deposit_batch_encode_return": {"decorators": [], "pc": 4354, "type": "function"}, "__wrappers__.get_deposit_batch_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batch: boost.library.Batch)"}, "range_check_ptr": {"offset": 11, "cairo_type": "felt"}}, "size": 12, "full_name": "__wrappers__.get_deposit_batch_encode_return.Args", "type": "struct"}, "__wrappers__.get_deposit_batch_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_deposit_batch_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.get_deposit_batch_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.get_deposit_batch_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.get_deposit_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.get_withdraw_batch": {"decorators": ["view"], "pc": 4511, "type": "function"}, "__wrappers__.get_withdraw_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.get_withdraw_batch.Args", "type": "struct"}, "__wrappers__.get_withdraw_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_withdraw_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.get_withdraw_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.get_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.get_withdraw_batch.__wrapped_func": {"destination": "__main__.get_withdraw_batch", "type": "alias"}, "__wrappers__.get_withdraw_batch_encode_return": {"decorators": [], "pc": 4492, "type": "function"}, "__wrappers__.get_withdraw_batch_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batch: boost.library.Batch)"}, "range_check_ptr": {"offset": 11, "cairo_type": "felt"}}, "size": 12, "full_name": "__wrappers__.get_withdraw_batch_encode_return.Args", "type": "struct"}, "__wrappers__.get_withdraw_batch_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.get_withdraw_batch_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.get_withdraw_batch_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.get_withdraw_batch_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.get_withdraw_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.handle_deposit_batch": {"decorators": ["external"], "pc": 4291, "type": "function"}, "__wrappers__.handle_deposit_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.handle_deposit_batch.Args", "type": "struct"}, "__wrappers__.handle_deposit_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.handle_deposit_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.handle_deposit_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.handle_deposit_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.handle_deposit_batch.__wrapped_func": {"destination": "__main__.handle_deposit_batch", "type": "alias"}, "__wrappers__.handle_deposit_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.handle_withdraw_batch": {"decorators": ["external"], "pc": 4568, "type": "function"}, "__wrappers__.handle_withdraw_batch.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.handle_withdraw_batch.Args", "type": "struct"}, "__wrappers__.handle_withdraw_batch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.handle_withdraw_batch.ImplicitArgs", "type": "struct"}, "__wrappers__.handle_withdraw_batch.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.handle_withdraw_batch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.handle_withdraw_batch.__wrapped_func": {"destination": "__main__.handle_withdraw_batch", "type": "alias"}, "__wrappers__.handle_withdraw_batch_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.is_action_eligible": {"decorators": ["view"], "pc": 4197, "type": "function"}, "__wrappers__.is_action_eligible.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.is_action_eligible.Args", "type": "struct"}, "__wrappers__.is_action_eligible.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.is_action_eligible.ImplicitArgs", "type": "struct"}, "__wrappers__.is_action_eligible.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.is_action_eligible.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.is_action_eligible.__wrapped_func": {"destination": "__main__.is_action_eligible", "type": "alias"}, "__wrappers__.is_action_eligible_encode_return": {"decorators": [], "pc": 4188, "type": "function"}, "__wrappers__.is_action_eligible_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(eligible: felt)"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "__wrappers__.is_action_eligible_encode_return.Args", "type": "struct"}, "__wrappers__.is_action_eligible_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.is_action_eligible_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.is_action_eligible_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.is_action_eligible_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.is_action_eligible_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_eth_bridge_token_address": {"decorators": ["external"], "pc": 3971, "type": "function"}, "__wrappers__.set_eth_bridge_token_address.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_eth_bridge_token_address.Args", "type": "struct"}, "__wrappers__.set_eth_bridge_token_address.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_eth_bridge_token_address.ImplicitArgs", "type": "struct"}, "__wrappers__.set_eth_bridge_token_address.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_eth_bridge_token_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_eth_bridge_token_address.__wrapped_func": {"destination": "__main__.set_eth_bridge_token_address", "type": "alias"}, "__wrappers__.set_eth_bridge_token_address_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_fractional_fee": {"decorators": ["external"], "pc": 3998, "type": "function"}, "__wrappers__.set_fractional_fee.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_fractional_fee.Args", "type": "struct"}, "__wrappers__.set_fractional_fee.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_fractional_fee.ImplicitArgs", "type": "struct"}, "__wrappers__.set_fractional_fee.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_fractional_fee.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_fractional_fee.__wrapped_func": {"destination": "__main__.set_fractional_fee", "type": "alias"}, "__wrappers__.set_fractional_fee_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_marketing_verifier_chash": {"decorators": ["external"], "pc": 4160, "type": "function"}, "__wrappers__.set_marketing_verifier_chash.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_marketing_verifier_chash.Args", "type": "struct"}, "__wrappers__.set_marketing_verifier_chash.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_marketing_verifier_chash.ImplicitArgs", "type": "struct"}, "__wrappers__.set_marketing_verifier_chash.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_marketing_verifier_chash.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_marketing_verifier_chash.__wrapped_func": {"destination": "__main__.set_marketing_verifier_chash", "type": "alias"}, "__wrappers__.set_marketing_verifier_chash_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_max_slippage_percentage": {"decorators": ["external"], "pc": 3944, "type": "function"}, "__wrappers__.set_max_slippage_percentage.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_max_slippage_percentage.Args", "type": "struct"}, "__wrappers__.set_max_slippage_percentage.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_max_slippage_percentage.ImplicitArgs", "type": "struct"}, "__wrappers__.set_max_slippage_percentage.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_max_slippage_percentage.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_max_slippage_percentage.__wrapped_func": {"destination": "__main__.set_max_slippage_percentage", "type": "alias"}, "__wrappers__.set_max_slippage_percentage_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_min_deposit_eth": {"decorators": ["external"], "pc": 3916, "type": "function"}, "__wrappers__.set_min_deposit_eth.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_min_deposit_eth.Args", "type": "struct"}, "__wrappers__.set_min_deposit_eth.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_min_deposit_eth.ImplicitArgs", "type": "struct"}, "__wrappers__.set_min_deposit_eth.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_min_deposit_eth.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_min_deposit_eth.__wrapped_func": {"destination": "__main__.set_min_deposit_eth", "type": "alias"}, "__wrappers__.set_min_deposit_eth_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_myswap_amm": {"decorators": ["external"], "pc": 4079, "type": "function"}, "__wrappers__.set_myswap_amm.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_myswap_amm.Args", "type": "struct"}, "__wrappers__.set_myswap_amm.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_myswap_amm.ImplicitArgs", "type": "struct"}, "__wrappers__.set_myswap_amm.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_myswap_amm.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_myswap_amm.__wrapped_func": {"destination": "__main__.set_myswap_amm", "type": "alias"}, "__wrappers__.set_myswap_amm_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_myswap_lp_token": {"decorators": ["external"], "pc": 4106, "type": "function"}, "__wrappers__.set_myswap_lp_token.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_myswap_lp_token.Args", "type": "struct"}, "__wrappers__.set_myswap_lp_token.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_myswap_lp_token.ImplicitArgs", "type": "struct"}, "__wrappers__.set_myswap_lp_token.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_myswap_lp_token.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_myswap_lp_token.__wrapped_func": {"destination": "__main__.set_myswap_lp_token", "type": "alias"}, "__wrappers__.set_myswap_lp_token_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_myswap_pool_id": {"decorators": ["external"], "pc": 4133, "type": "function"}, "__wrappers__.set_myswap_pool_id.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_myswap_pool_id.Args", "type": "struct"}, "__wrappers__.set_myswap_pool_id.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_myswap_pool_id.ImplicitArgs", "type": "struct"}, "__wrappers__.set_myswap_pool_id.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_myswap_pool_id.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_myswap_pool_id.__wrapped_func": {"destination": "__main__.set_myswap_pool_id", "type": "alias"}, "__wrappers__.set_myswap_pool_id_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_stake_token": {"decorators": ["external"], "pc": 4052, "type": "function"}, "__wrappers__.set_stake_token.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_stake_token.Args", "type": "struct"}, "__wrappers__.set_stake_token.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_stake_token.ImplicitArgs", "type": "struct"}, "__wrappers__.set_stake_token.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_stake_token.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_stake_token.__wrapped_func": {"destination": "__main__.set_stake_token", "type": "alias"}, "__wrappers__.set_stake_token_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.set_staking_pool": {"decorators": ["external"], "pc": 4025, "type": "function"}, "__wrappers__.set_staking_pool.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.set_staking_pool.Args", "type": "struct"}, "__wrappers__.set_staking_pool.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.set_staking_pool.ImplicitArgs", "type": "struct"}, "__wrappers__.set_staking_pool.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.set_staking_pool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.set_staking_pool.__wrapped_func": {"destination": "__main__.set_staking_pool", "type": "alias"}, "__wrappers__.set_staking_pool_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.stake": {"decorators": ["external"], "pc": 4236, "type": "function"}, "__wrappers__.stake.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.stake.Args", "type": "struct"}, "__wrappers__.stake.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.stake.ImplicitArgs", "type": "struct"}, "__wrappers__.stake.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.stake.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.stake.__wrapped_func": {"destination": "__main__.stake", "type": "alias"}, "__wrappers__.stake_encode_return": {"decorators": [], "pc": 4226, "type": "function"}, "__wrappers__.stake_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batchId: felt, idx: felt)"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__wrappers__.stake_encode_return.Args", "type": "struct"}, "__wrappers__.stake_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.stake_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.stake_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.stake_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.stake_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.upgrade": {"decorators": ["external"], "pc": 3888, "type": "function"}, "__wrappers__.upgrade.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.upgrade.Args", "type": "struct"}, "__wrappers__.upgrade.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.upgrade.ImplicitArgs", "type": "struct"}, "__wrappers__.upgrade.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.upgrade.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.upgrade.__wrapped_func": {"destination": "__main__.upgrade", "type": "alias"}, "__wrappers__.upgrade_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "__wrappers__.withdraw": {"decorators": ["external"], "pc": 4439, "type": "function"}, "__wrappers__.withdraw.Args": {"members": {}, "size": 0, "full_name": "__wrappers__.withdraw.Args", "type": "struct"}, "__wrappers__.withdraw.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.withdraw.ImplicitArgs", "type": "struct"}, "__wrappers__.withdraw.Return": {"cairo_type": "(syscall_ptr: felt*, pedersen_ptr: starkware.cairo.common.cairo_builtins.HashBuiltin*, range_check_ptr: felt, size: felt, retdata: felt*)", "type": "type_definition"}, "__wrappers__.withdraw.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "__wrappers__.withdraw.__wrapped_func": {"destination": "__main__.withdraw", "type": "alias"}, "__wrappers__.withdraw_encode_return": {"decorators": [], "pc": 4429, "type": "function"}, "__wrappers__.withdraw_encode_return.Args": {"members": {"ret_value": {"offset": 0, "cairo_type": "(batchId: felt, idx: felt)"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "__wrappers__.withdraw_encode_return.Args", "type": "struct"}, "__wrappers__.withdraw_encode_return.ImplicitArgs": {"members": {}, "size": 0, "full_name": "__wrappers__.withdraw_encode_return.ImplicitArgs", "type": "struct"}, "__wrappers__.withdraw_encode_return.Return": {"cairo_type": "(range_check_ptr: felt, data_len: felt, data: felt*)", "type": "type_definition"}, "__wrappers__.withdraw_encode_return.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "__wrappers__.withdraw_encode_return.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "boost.library.ActiveDepositBatch": {"type": "namespace"}, "boost.library.ActiveDepositBatch.Args": {"members": {}, "size": 0, "full_name": "boost.library.ActiveDepositBatch.Args", "type": "struct"}, "boost.library.ActiveDepositBatch.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.ActiveDepositBatch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.ActiveDepositBatch.ImplicitArgs", "type": "struct"}, "boost.library.ActiveDepositBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.ActiveDepositBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveDepositBatch.addr": {"decorators": [], "pc": 1305, "type": "function"}, "boost.library.ActiveDepositBatch.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.ActiveDepositBatch.addr.Args", "type": "struct"}, "boost.library.ActiveDepositBatch.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.ActiveDepositBatch.addr.ImplicitArgs", "type": "struct"}, "boost.library.ActiveDepositBatch.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.ActiveDepositBatch.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveDepositBatch.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.ActiveDepositBatch.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.ActiveDepositBatch.read": {"decorators": [], "pc": 1310, "type": "function"}, "boost.library.ActiveDepositBatch.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.ActiveDepositBatch.read.Args", "type": "struct"}, "boost.library.ActiveDepositBatch.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.ActiveDepositBatch.read.ImplicitArgs", "type": "struct"}, "boost.library.ActiveDepositBatch.read.Return": {"cairo_type": "(batchId: felt)", "type": "type_definition"}, "boost.library.ActiveDepositBatch.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveDepositBatch.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.ActiveDepositBatch.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.ActiveDepositBatch.write": {"decorators": [], "pc": 1323, "type": "function"}, "boost.library.ActiveDepositBatch.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.ActiveDepositBatch.write.Args", "type": "struct"}, "boost.library.ActiveDepositBatch.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.ActiveDepositBatch.write.ImplicitArgs", "type": "struct"}, "boost.library.ActiveDepositBatch.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.ActiveDepositBatch.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveWithdrawBatch": {"type": "namespace"}, "boost.library.ActiveWithdrawBatch.Args": {"members": {}, "size": 0, "full_name": "boost.library.ActiveWithdrawBatch.Args", "type": "struct"}, "boost.library.ActiveWithdrawBatch.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.ActiveWithdrawBatch.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.ActiveWithdrawBatch.ImplicitArgs", "type": "struct"}, "boost.library.ActiveWithdrawBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.ActiveWithdrawBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveWithdrawBatch.addr": {"decorators": [], "pc": 1486, "type": "function"}, "boost.library.ActiveWithdrawBatch.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.ActiveWithdrawBatch.addr.Args", "type": "struct"}, "boost.library.ActiveWithdrawBatch.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.ActiveWithdrawBatch.addr.ImplicitArgs", "type": "struct"}, "boost.library.ActiveWithdrawBatch.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.ActiveWithdrawBatch.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveWithdrawBatch.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.ActiveWithdrawBatch.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.ActiveWithdrawBatch.read": {"decorators": [], "pc": 1491, "type": "function"}, "boost.library.ActiveWithdrawBatch.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.ActiveWithdrawBatch.read.Args", "type": "struct"}, "boost.library.ActiveWithdrawBatch.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.ActiveWithdrawBatch.read.ImplicitArgs", "type": "struct"}, "boost.library.ActiveWithdrawBatch.read.Return": {"cairo_type": "(batchId: felt)", "type": "type_definition"}, "boost.library.ActiveWithdrawBatch.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ActiveWithdrawBatch.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.ActiveWithdrawBatch.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.ActiveWithdrawBatch.write": {"decorators": [], "pc": 1504, "type": "function"}, "boost.library.ActiveWithdrawBatch.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.ActiveWithdrawBatch.write.Args", "type": "struct"}, "boost.library.ActiveWithdrawBatch.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.ActiveWithdrawBatch.write.ImplicitArgs", "type": "struct"}, "boost.library.ActiveWithdrawBatch.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.ActiveWithdrawBatch.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllDepositRequests": {"type": "namespace"}, "boost.library.AllDepositRequests.Args": {"members": {}, "size": 0, "full_name": "boost.library.AllDepositRequests.Args", "type": "struct"}, "boost.library.AllDepositRequests.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.AllDepositRequests.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.AllDepositRequests.ImplicitArgs", "type": "struct"}, "boost.library.AllDepositRequests.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.AllDepositRequests.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllDepositRequests.addr": {"decorators": [], "pc": 1018, "type": "function"}, "boost.library.AllDepositRequests.addr.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.AllDepositRequests.addr.Args", "type": "struct"}, "boost.library.AllDepositRequests.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.AllDepositRequests.addr.ImplicitArgs", "type": "struct"}, "boost.library.AllDepositRequests.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.AllDepositRequests.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllDepositRequests.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.AllDepositRequests.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.AllDepositRequests.read": {"decorators": [], "pc": 1035, "type": "function"}, "boost.library.AllDepositRequests.read.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.AllDepositRequests.read.Args", "type": "struct"}, "boost.library.AllDepositRequests.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.AllDepositRequests.read.ImplicitArgs", "type": "struct"}, "boost.library.AllDepositRequests.read.Return": {"cairo_type": "(req: boost.library.DepositRequest)", "type": "type_definition"}, "boost.library.AllDepositRequests.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllDepositRequests.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.AllDepositRequests.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.AllDepositRequests.write": {"decorators": [], "pc": 1062, "type": "function"}, "boost.library.AllDepositRequests.write.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}, "value": {"offset": 2, "cairo_type": "boost.library.DepositRequest"}}, "size": 5, "full_name": "boost.library.AllDepositRequests.write.Args", "type": "struct"}, "boost.library.AllDepositRequests.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.AllDepositRequests.write.ImplicitArgs", "type": "struct"}, "boost.library.AllDepositRequests.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.AllDepositRequests.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllWithdrawRequests": {"type": "namespace"}, "boost.library.AllWithdrawRequests.Args": {"members": {}, "size": 0, "full_name": "boost.library.AllWithdrawRequests.Args", "type": "struct"}, "boost.library.AllWithdrawRequests.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.AllWithdrawRequests.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.AllWithdrawRequests.ImplicitArgs", "type": "struct"}, "boost.library.AllWithdrawRequests.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.AllWithdrawRequests.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllWithdrawRequests.addr": {"decorators": [], "pc": 1086, "type": "function"}, "boost.library.AllWithdrawRequests.addr.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.AllWithdrawRequests.addr.Args", "type": "struct"}, "boost.library.AllWithdrawRequests.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.AllWithdrawRequests.addr.ImplicitArgs", "type": "struct"}, "boost.library.AllWithdrawRequests.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.AllWithdrawRequests.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllWithdrawRequests.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.AllWithdrawRequests.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.AllWithdrawRequests.read": {"decorators": [], "pc": 1103, "type": "function"}, "boost.library.AllWithdrawRequests.read.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.AllWithdrawRequests.read.Args", "type": "struct"}, "boost.library.AllWithdrawRequests.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.AllWithdrawRequests.read.ImplicitArgs", "type": "struct"}, "boost.library.AllWithdrawRequests.read.Return": {"cairo_type": "(req: boost.library.WithdrawRequest)", "type": "type_definition"}, "boost.library.AllWithdrawRequests.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.AllWithdrawRequests.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.AllWithdrawRequests.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.AllWithdrawRequests.write": {"decorators": [], "pc": 1130, "type": "function"}, "boost.library.AllWithdrawRequests.write.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}, "value": {"offset": 2, "cairo_type": "boost.library.WithdrawRequest"}}, "size": 5, "full_name": "boost.library.AllWithdrawRequests.write.Args", "type": "struct"}, "boost.library.AllWithdrawRequests.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.AllWithdrawRequests.write.ImplicitArgs", "type": "struct"}, "boost.library.AllWithdrawRequests.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.AllWithdrawRequests.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Batch": {"members": {"status": {"offset": 0, "cairo_type": "felt"}, "len": {"offset": 1, "cairo_type": "felt"}, "total_eth": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "total_tokens": {"offset": 4, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "collected_fee": {"offset": 6, "cairo_type": "felt"}, "pool_batch_id": {"offset": 7, "cairo_type": "felt"}, "pool_batch_index": {"offset": 8, "cairo_type": "felt"}, "start_block_timestamp": {"offset": 9, "cairo_type": "felt"}, "distributed_len": {"offset": 10, "cairo_type": "felt"}}, "size": 11, "full_name": "boost.library.Batch", "type": "struct"}, "boost.library.Boost": {"type": "namespace"}, "boost.library.Boost.Args": {"members": {}, "size": 0, "full_name": "boost.library.Boost.Args", "type": "struct"}, "boost.library.Boost.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.Boost.ImplicitArgs", "type": "struct"}, "boost.library.Boost.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._balanceMySwapPool": {"decorators": [], "pc": 2410, "type": "function"}, "boost.library.Boost._balanceMySwapPool.Args": {"members": {"eth_per_wsteth_rate": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "boost.library.Boost._balanceMySwapPool.Args", "type": "struct"}, "boost.library.Boost._balanceMySwapPool.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._balanceMySwapPool.ImplicitArgs", "type": "struct"}, "boost.library.Boost._balanceMySwapPool.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._balanceMySwapPool.SIZEOF_LOCALS": {"value": 23, "type": "const"}, "boost.library.Boost._closeDepositBatch": {"decorators": [], "pc": 2650, "type": "function"}, "boost.library.Boost._closeDepositBatch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._closeDepositBatch.Args", "type": "struct"}, "boost.library.Boost._closeDepositBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._closeDepositBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._closeDepositBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._closeDepositBatch.SIZEOF_LOCALS": {"value": 18, "type": "const"}, "boost.library.Boost._closeWithdrawBatch": {"decorators": [], "pc": 3327, "type": "function"}, "boost.library.Boost._closeWithdrawBatch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._closeWithdrawBatch.Args", "type": "struct"}, "boost.library.Boost._closeWithdrawBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._closeWithdrawBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._closeWithdrawBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._closeWithdrawBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._distributeDepositBatch": {"decorators": [], "pc": 3073, "type": "function"}, "boost.library.Boost._distributeDepositBatch.Args": {"members": {"batch_id": {"offset": 0, "cairo_type": "felt"}, "chunk_size": {"offset": 1, "cairo_type": "felt"}, "chunk_offset": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._distributeDepositBatch.Args", "type": "struct"}, "boost.library.Boost._distributeDepositBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._distributeDepositBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._distributeDepositBatch.Return": {"cairo_type": "(batch_fully_distributed: felt)", "type": "type_definition"}, "boost.library.Boost._distributeDepositBatch.SIZEOF_LOCALS": {"value": 13, "type": "const"}, "boost.library.Boost._distributeWithdrawBatch": {"decorators": [], "pc": 3723, "type": "function"}, "boost.library.Boost._distributeWithdrawBatch.Args": {"members": {"batch_id": {"offset": 0, "cairo_type": "felt"}, "chunk_size": {"offset": 1, "cairo_type": "felt"}, "chunk_offset": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._distributeWithdrawBatch.Args", "type": "struct"}, "boost.library.Boost._distributeWithdrawBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._distributeWithdrawBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._distributeWithdrawBatch.Return": {"cairo_type": "(batch_fully_distributed: felt)", "type": "type_definition"}, "boost.library.Boost._distributeWithdrawBatch.SIZEOF_LOCALS": {"value": 12, "type": "const"}, "boost.library.Boost._getActiveDepositBatchId": {"decorators": [], "pc": 3704, "type": "function"}, "boost.library.Boost._getActiveDepositBatchId.Args": {"members": {}, "size": 0, "full_name": "boost.library.Boost._getActiveDepositBatchId.Args", "type": "struct"}, "boost.library.Boost._getActiveDepositBatchId.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._getActiveDepositBatchId.ImplicitArgs", "type": "struct"}, "boost.library.Boost._getActiveDepositBatchId.Return": {"cairo_type": "(batchId: felt)", "type": "type_definition"}, "boost.library.Boost._getActiveDepositBatchId.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._getActiveWithdrawBatchId": {"decorators": [], "pc": 3717, "type": "function"}, "boost.library.Boost._getActiveWithdrawBatchId.Args": {"members": {}, "size": 0, "full_name": "boost.library.Boost._getActiveWithdrawBatchId.Args", "type": "struct"}, "boost.library.Boost._getActiveWithdrawBatchId.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._getActiveWithdrawBatchId.ImplicitArgs", "type": "struct"}, "boost.library.Boost._getActiveWithdrawBatchId.Return": {"cairo_type": "(batchId: felt)", "type": "type_definition"}, "boost.library.Boost._getActiveWithdrawBatchId.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._getDepositAmountOut": {"decorators": [], "pc": 2787, "type": "function"}, "boost.library.Boost._getDepositAmountOut.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.Boost._getDepositAmountOut.Args", "type": "struct"}, "boost.library.Boost._getDepositAmountOut.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._getDepositAmountOut.ImplicitArgs", "type": "struct"}, "boost.library.Boost._getDepositAmountOut.Return": {"cairo_type": "(recipient: felt, amount: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.Boost._getDepositAmountOut.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._getDepositBatch": {"decorators": [], "pc": 3697, "type": "function"}, "boost.library.Boost._getDepositBatch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._getDepositBatch.Args", "type": "struct"}, "boost.library.Boost._getDepositBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._getDepositBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._getDepositBatch.Return": {"cairo_type": "(batch: boost.library.Batch)", "type": "type_definition"}, "boost.library.Boost._getDepositBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._getWithdrawAmountOut": {"decorators": [], "pc": 3585, "type": "function"}, "boost.library.Boost._getWithdrawAmountOut.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "idx": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.Boost._getWithdrawAmountOut.Args", "type": "struct"}, "boost.library.Boost._getWithdrawAmountOut.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._getWithdrawAmountOut.ImplicitArgs", "type": "struct"}, "boost.library.Boost._getWithdrawAmountOut.Return": {"cairo_type": "(recipient: felt, amount: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.Boost._getWithdrawAmountOut.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._getWithdrawBatch": {"decorators": [], "pc": 3710, "type": "function"}, "boost.library.Boost._getWithdrawBatch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._getWithdrawBatch.Args", "type": "struct"}, "boost.library.Boost._getWithdrawBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._getWithdrawBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._getWithdrawBatch.Return": {"cairo_type": "(batch: boost.library.Batch)", "type": "type_definition"}, "boost.library.Boost._getWithdrawBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._handleDepositBatch": {"decorators": [], "pc": 2826, "type": "function"}, "boost.library.Boost._handleDepositBatch.Args": {"members": {"batch_id": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._handleDepositBatch.Args", "type": "struct"}, "boost.library.Boost._handleDepositBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._handleDepositBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._handleDepositBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._handleDepositBatch.SIZEOF_LOCALS": {"value": 21, "type": "const"}, "boost.library.Boost._handleWithdrawBatch": {"decorators": [], "pc": 3626, "type": "function"}, "boost.library.Boost._handleWithdrawBatch.Args": {"members": {"batch_id": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._handleWithdrawBatch.Args", "type": "struct"}, "boost.library.Boost._handleWithdrawBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._handleWithdrawBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost._handleWithdrawBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._handleWithdrawBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._isActionEligible": {"decorators": [], "pc": 2193, "type": "function"}, "boost.library.Boost._isActionEligible.Args": {"members": {"action": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "caller": {"offset": 3, "cairo_type": "felt"}}, "size": 4, "full_name": "boost.library.Boost._isActionEligible.Args", "type": "struct"}, "boost.library.Boost._isActionEligible.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._isActionEligible.ImplicitArgs", "type": "struct"}, "boost.library.Boost._isActionEligible.Return": {"cairo_type": "(eligible: felt)", "type": "type_definition"}, "boost.library.Boost._isActionEligible.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._isPoolRateCloseToTargetRate": {"decorators": [], "pc": 2368, "type": "function"}, "boost.library.Boost._isPoolRateCloseToTargetRate.Args": {"members": {"pool_rate": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "target_rate": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "slippage_percent": {"offset": 4, "cairo_type": "felt"}}, "size": 5, "full_name": "boost.library.Boost._isPoolRateCloseToTargetRate.Args", "type": "struct"}, "boost.library.Boost._isPoolRateCloseToTargetRate.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._isPoolRateCloseToTargetRate.ImplicitArgs", "type": "struct"}, "boost.library.Boost._isPoolRateCloseToTargetRate.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.Boost._isPoolRateCloseToTargetRate.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setEthBridgeTokenAddress": {"decorators": [], "pc": 2121, "type": "function"}, "boost.library.Boost._setEthBridgeTokenAddress.Args": {"members": {"address": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setEthBridgeTokenAddress.Args", "type": "struct"}, "boost.library.Boost._setEthBridgeTokenAddress.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setEthBridgeTokenAddress.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setEthBridgeTokenAddress.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setEthBridgeTokenAddress.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setFractionalFee": {"decorators": [], "pc": 2130, "type": "function"}, "boost.library.Boost._setFractionalFee.Args": {"members": {"fractionalFee": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setFractionalFee.Args", "type": "struct"}, "boost.library.Boost._setFractionalFee.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setFractionalFee.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setFractionalFee.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setFractionalFee.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setMarketingVerifierChash": {"decorators": [], "pc": 2184, "type": "function"}, "boost.library.Boost._setMarketingVerifierChash.Args": {"members": {"marketingVerifierChash": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setMarketingVerifierChash.Args", "type": "struct"}, "boost.library.Boost._setMarketingVerifierChash.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setMarketingVerifierChash.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setMarketingVerifierChash.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setMarketingVerifierChash.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setMaxSlippagePercentage": {"decorators": [], "pc": 2112, "type": "function"}, "boost.library.Boost._setMaxSlippagePercentage.Args": {"members": {"maxSlippagePercentage": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setMaxSlippagePercentage.Args", "type": "struct"}, "boost.library.Boost._setMaxSlippagePercentage.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setMaxSlippagePercentage.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setMaxSlippagePercentage.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setMaxSlippagePercentage.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setMinDepositEth": {"decorators": [], "pc": 2102, "type": "function"}, "boost.library.Boost._setMinDepositEth.Args": {"members": {"amount": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "boost.library.Boost._setMinDepositEth.Args", "type": "struct"}, "boost.library.Boost._setMinDepositEth.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setMinDepositEth.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setMinDepositEth.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setMinDepositEth.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setMySwapAmm": {"decorators": [], "pc": 2157, "type": "function"}, "boost.library.Boost._setMySwapAmm.Args": {"members": {"mySwapAmm": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setMySwapAmm.Args", "type": "struct"}, "boost.library.Boost._setMySwapAmm.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setMySwapAmm.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setMySwapAmm.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setMySwapAmm.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setMySwapLpToken": {"decorators": [], "pc": 2166, "type": "function"}, "boost.library.Boost._setMySwapLpToken.Args": {"members": {"mySwapLpToken": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setMySwapLpToken.Args", "type": "struct"}, "boost.library.Boost._setMySwapLpToken.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setMySwapLpToken.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setMySwapLpToken.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setMySwapLpToken.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setMySwapPoolId": {"decorators": [], "pc": 2175, "type": "function"}, "boost.library.Boost._setMySwapPoolId.Args": {"members": {"mySwapPoolId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setMySwapPoolId.Args", "type": "struct"}, "boost.library.Boost._setMySwapPoolId.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setMySwapPoolId.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setMySwapPoolId.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setMySwapPoolId.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setStakeToken": {"decorators": [], "pc": 2148, "type": "function"}, "boost.library.Boost._setStakeToken.Args": {"members": {"stakeToken": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setStakeToken.Args", "type": "struct"}, "boost.library.Boost._setStakeToken.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setStakeToken.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setStakeToken.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setStakeToken.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._setStakingPool": {"decorators": [], "pc": 2139, "type": "function"}, "boost.library.Boost._setStakingPool.Args": {"members": {"stakingPool": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.Boost._setStakingPool.Args", "type": "struct"}, "boost.library.Boost._setStakingPool.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._setStakingPool.ImplicitArgs", "type": "struct"}, "boost.library.Boost._setStakingPool.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost._setStakingPool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost._stake": {"decorators": [], "pc": 2228, "type": "function"}, "boost.library.Boost._stake.Args": {"members": {"ethAmount": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "boost.library.Boost._stake.Args", "type": "struct"}, "boost.library.Boost._stake.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._stake.ImplicitArgs", "type": "struct"}, "boost.library.Boost._stake.Return": {"cairo_type": "(batchId: felt, idx: felt)", "type": "type_definition"}, "boost.library.Boost._stake.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "boost.library.Boost._withdraw": {"decorators": [], "pc": 3193, "type": "function"}, "boost.library.Boost._withdraw.Args": {"members": {"amount": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "boost.library.Boost._withdraw.Args", "type": "struct"}, "boost.library.Boost._withdraw.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost._withdraw.ImplicitArgs", "type": "struct"}, "boost.library.Boost._withdraw.Return": {"cairo_type": "(batchId: felt, idx: felt)", "type": "type_definition"}, "boost.library.Boost._withdraw.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "boost.library.Boost.distributeEthToBatch": {"decorators": [], "pc": 3813, "type": "function"}, "boost.library.Boost.distributeEthToBatch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "total_amount_eth": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "total_amount_eth_distributed": {"offset": 3, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "chunk_size": {"offset": 5, "cairo_type": "felt"}, "idx": {"offset": 6, "cairo_type": "felt"}}, "size": 7, "full_name": "boost.library.Boost.distributeEthToBatch.Args", "type": "struct"}, "boost.library.Boost.distributeEthToBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost.distributeEthToBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost.distributeEthToBatch.Return": {"cairo_type": "(distributed_tokens: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.Boost.distributeEthToBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost.distributeTokenToBatch": {"decorators": [], "pc": 3150, "type": "function"}, "boost.library.Boost.distributeTokenToBatch.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "total_amount_eth": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "total_amount_token": {"offset": 3, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "chunk_size": {"offset": 5, "cairo_type": "felt"}, "idx": {"offset": 6, "cairo_type": "felt"}}, "size": 7, "full_name": "boost.library.Boost.distributeTokenToBatch.Args", "type": "struct"}, "boost.library.Boost.distributeTokenToBatch.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost.distributeTokenToBatch.ImplicitArgs", "type": "struct"}, "boost.library.Boost.distributeTokenToBatch.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.Boost.distributeTokenToBatch.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Boost.ret_uint256_by_flag": {"decorators": [], "pc": 3310, "type": "function"}, "boost.library.Boost.ret_uint256_by_flag.Args": {"members": {"flag": {"offset": 0, "cairo_type": "felt"}, "val1": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "val2": {"offset": 3, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 5, "full_name": "boost.library.Boost.ret_uint256_by_flag.Args", "type": "struct"}, "boost.library.Boost.ret_uint256_by_flag.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.Boost.ret_uint256_by_flag.ImplicitArgs", "type": "struct"}, "boost.library.Boost.ret_uint256_by_flag.Return": {"cairo_type": "(r: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.Boost.ret_uint256_by_flag.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.DEPOSIT": {"value": 0, "type": "const"}, "boost.library.DepositBatches": {"type": "namespace"}, "boost.library.DepositBatches.Args": {"members": {}, "size": 0, "full_name": "boost.library.DepositBatches.Args", "type": "struct"}, "boost.library.DepositBatches.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.DepositBatches.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.DepositBatches.ImplicitArgs", "type": "struct"}, "boost.library.DepositBatches.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.DepositBatches.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.DepositBatches.addr": {"decorators": [], "pc": 1154, "type": "function"}, "boost.library.DepositBatches.addr.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.DepositBatches.addr.Args", "type": "struct"}, "boost.library.DepositBatches.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.DepositBatches.addr.ImplicitArgs", "type": "struct"}, "boost.library.DepositBatches.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.DepositBatches.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.DepositBatches.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.DepositBatches.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.DepositBatches.read": {"decorators": [], "pc": 1168, "type": "function"}, "boost.library.DepositBatches.read.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.DepositBatches.read.Args", "type": "struct"}, "boost.library.DepositBatches.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.DepositBatches.read.ImplicitArgs", "type": "struct"}, "boost.library.DepositBatches.read.Return": {"cairo_type": "(batch: boost.library.Batch)", "type": "type_definition"}, "boost.library.DepositBatches.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.DepositBatches.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.DepositBatches.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.DepositBatches.write": {"decorators": [], "pc": 1242, "type": "function"}, "boost.library.DepositBatches.write.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "value": {"offset": 1, "cairo_type": "boost.library.Batch"}}, "size": 12, "full_name": "boost.library.DepositBatches.write.Args", "type": "struct"}, "boost.library.DepositBatches.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.DepositBatches.write.ImplicitArgs", "type": "struct"}, "boost.library.DepositBatches.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.DepositBatches.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.DepositRequest": {"members": {"account": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 3, "full_name": "boost.library.DepositRequest", "type": "struct"}, "boost.library.ETHER": {"value": 1000000000000000000, "type": "const"}, "boost.library.EthBridgeToken": {"type": "namespace"}, "boost.library.EthBridgeToken.Args": {"members": {}, "size": 0, "full_name": "boost.library.EthBridgeToken.Args", "type": "struct"}, "boost.library.EthBridgeToken.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.EthBridgeToken.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.EthBridgeToken.ImplicitArgs", "type": "struct"}, "boost.library.EthBridgeToken.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.EthBridgeToken.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthBridgeToken.addr": {"decorators": [], "pc": 1516, "type": "function"}, "boost.library.EthBridgeToken.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.EthBridgeToken.addr.Args", "type": "struct"}, "boost.library.EthBridgeToken.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.EthBridgeToken.addr.ImplicitArgs", "type": "struct"}, "boost.library.EthBridgeToken.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.EthBridgeToken.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthBridgeToken.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.EthBridgeToken.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.EthBridgeToken.read": {"decorators": [], "pc": 1521, "type": "function"}, "boost.library.EthBridgeToken.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.EthBridgeToken.read.Args", "type": "struct"}, "boost.library.EthBridgeToken.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.EthBridgeToken.read.ImplicitArgs", "type": "struct"}, "boost.library.EthBridgeToken.read.Return": {"cairo_type": "(address: felt)", "type": "type_definition"}, "boost.library.EthBridgeToken.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthBridgeToken.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.EthBridgeToken.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.EthBridgeToken.write": {"decorators": [], "pc": 1534, "type": "function"}, "boost.library.EthBridgeToken.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.EthBridgeToken.write.Args", "type": "struct"}, "boost.library.EthBridgeToken.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.EthBridgeToken.write.ImplicitArgs", "type": "struct"}, "boost.library.EthBridgeToken.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.EthBridgeToken.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthPerToken": {"type": "namespace"}, "boost.library.EthPerToken.Args": {"members": {}, "size": 0, "full_name": "boost.library.EthPerToken.Args", "type": "struct"}, "boost.library.EthPerToken.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.EthPerToken.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.EthPerToken.ImplicitArgs", "type": "struct"}, "boost.library.EthPerToken.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.EthPerToken.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthPerToken.addr": {"decorators": [], "pc": 1827, "type": "function"}, "boost.library.EthPerToken.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.EthPerToken.addr.Args", "type": "struct"}, "boost.library.EthPerToken.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.EthPerToken.addr.ImplicitArgs", "type": "struct"}, "boost.library.EthPerToken.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.EthPerToken.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthPerToken.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.EthPerToken.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.EthPerToken.read": {"decorators": [], "pc": 1832, "type": "function"}, "boost.library.EthPerToken.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.EthPerToken.read.Args", "type": "struct"}, "boost.library.EthPerToken.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.EthPerToken.read.ImplicitArgs", "type": "struct"}, "boost.library.EthPerToken.read.Return": {"cairo_type": "(ethPerToken: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.EthPerToken.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.EthPerToken.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.EthPerToken.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.EthPerToken.write": {"decorators": [], "pc": 1851, "type": "function"}, "boost.library.EthPerToken.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "boost.library.EthPerToken.write.Args", "type": "struct"}, "boost.library.EthPerToken.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.EthPerToken.write.ImplicitArgs", "type": "struct"}, "boost.library.EthPerToken.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.EthPerToken.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.FractionalFee": {"type": "namespace"}, "boost.library.FractionalFee.Args": {"members": {}, "size": 0, "full_name": "boost.library.FractionalFee.Args", "type": "struct"}, "boost.library.FractionalFee.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.FractionalFee.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.FractionalFee.ImplicitArgs", "type": "struct"}, "boost.library.FractionalFee.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.FractionalFee.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.FractionalFee.addr": {"decorators": [], "pc": 1647, "type": "function"}, "boost.library.FractionalFee.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.FractionalFee.addr.Args", "type": "struct"}, "boost.library.FractionalFee.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.FractionalFee.addr.ImplicitArgs", "type": "struct"}, "boost.library.FractionalFee.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.FractionalFee.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.FractionalFee.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.FractionalFee.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.FractionalFee.read": {"decorators": [], "pc": 1652, "type": "function"}, "boost.library.FractionalFee.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.FractionalFee.read.Args", "type": "struct"}, "boost.library.FractionalFee.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.FractionalFee.read.ImplicitArgs", "type": "struct"}, "boost.library.FractionalFee.read.Return": {"cairo_type": "(fractionalFee: felt)", "type": "type_definition"}, "boost.library.FractionalFee.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.FractionalFee.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.FractionalFee.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.FractionalFee.write": {"decorators": [], "pc": 1665, "type": "function"}, "boost.library.FractionalFee.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.FractionalFee.write.Args", "type": "struct"}, "boost.library.FractionalFee.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.FractionalFee.write.ImplicitArgs", "type": "struct"}, "boost.library.FractionalFee.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.FractionalFee.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.IDpool": {"type": "namespace"}, "boost.library.IDpool.Args": {"members": {}, "size": 0, "full_name": "boost.library.IDpool.Args", "type": "struct"}, "boost.library.IDpool.GET_DEPOSIT_AMOUNT_OUT_SELECTOR": {"value": 161884495070352107450905669339505736796322031009193130425806046709409660197, "type": "const"}, "boost.library.IDpool.GET_WITHDRAW_AMOUNT_OUT_SELECTOR": {"value": 888114060571628402435205183563530212176987528053765822602425229595568343693, "type": "const"}, "boost.library.IDpool.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.IDpool.ImplicitArgs", "type": "struct"}, "boost.library.IDpool.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.IDpool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.IDpool.STAKE_SELECTOR": {"value": 1640128135334360963952617826950674415490722662962339953698475555721960042361, "type": "const"}, "boost.library.IDpool.WITHDRAW_SELECTOR": {"value": 602617684354587743731238934093348436560137034424203693318834094005509508215, "type": "const"}, "boost.library.IDpool.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.IDpool.call_contract": {"destination": "starkware.starknet.common.syscalls.call_contract", "type": "alias"}, "boost.library.IDpool.get_deposit_amount_out": {"decorators": [], "pc": 1918, "type": "function"}, "boost.library.IDpool.get_deposit_amount_out.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "batchId": {"offset": 1, "cairo_type": "felt"}, "idx": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.IDpool.get_deposit_amount_out.Args", "type": "struct"}, "boost.library.IDpool.get_deposit_amount_out.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IDpool.get_deposit_amount_out.ImplicitArgs", "type": "struct"}, "boost.library.IDpool.get_deposit_amount_out.Return": {"cairo_type": "(recipient: felt, amount: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.IDpool.get_deposit_amount_out.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IDpool.get_withdraw_amount_out": {"decorators": [], "pc": 1944, "type": "function"}, "boost.library.IDpool.get_withdraw_amount_out.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "batchId": {"offset": 1, "cairo_type": "felt"}, "idx": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.IDpool.get_withdraw_amount_out.Args", "type": "struct"}, "boost.library.IDpool.get_withdraw_amount_out.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IDpool.get_withdraw_amount_out.ImplicitArgs", "type": "struct"}, "boost.library.IDpool.get_withdraw_amount_out.Return": {"cairo_type": "(recipient: felt, amount: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.IDpool.get_withdraw_amount_out.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IDpool.library_call": {"destination": "starkware.starknet.common.syscalls.library_call", "type": "alias"}, "boost.library.IDpool.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "boost.library.IDpool.stake": {"decorators": [], "pc": 1868, "type": "function"}, "boost.library.IDpool.stake.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "ethAmount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 3, "full_name": "boost.library.IDpool.stake.Args", "type": "struct"}, "boost.library.IDpool.stake.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IDpool.stake.ImplicitArgs", "type": "struct"}, "boost.library.IDpool.stake.Return": {"cairo_type": "(batchId: felt, idx: felt)", "type": "type_definition"}, "boost.library.IDpool.stake.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IDpool.withdraw": {"decorators": [], "pc": 1893, "type": "function"}, "boost.library.IDpool.withdraw.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 3, "full_name": "boost.library.IDpool.withdraw.Args", "type": "struct"}, "boost.library.IDpool.withdraw.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IDpool.withdraw.ImplicitArgs", "type": "struct"}, "boost.library.IDpool.withdraw.Return": {"cairo_type": "(batchId: felt, idx: felt)", "type": "type_definition"}, "boost.library.IDpool.withdraw.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IERC20": {"destination": "openzeppelin.token.erc20.IERC20.IERC20", "type": "alias"}, "boost.library.IMySwapAMM": {"type": "namespace"}, "boost.library.IMySwapAMM.ADD_LIQUIDITY_SELECTOR": {"value": 1271585942111654734125606951221628240160430040413791527265389999851511344752, "type": "const"}, "boost.library.IMySwapAMM.Args": {"members": {}, "size": 0, "full_name": "boost.library.IMySwapAMM.Args", "type": "struct"}, "boost.library.IMySwapAMM.GET_POOL_SELECTOR": {"value": 1118588323614569596538946486551051798296478979861068383112736142824293012856, "type": "const"}, "boost.library.IMySwapAMM.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.IMySwapAMM.ImplicitArgs", "type": "struct"}, "boost.library.IMySwapAMM.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.IMySwapAMM.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.IMySwapAMM.SWAP_SELECTOR": {"value": 602962535134499854912799851629033993488593928113527484350375636311213640489, "type": "const"}, "boost.library.IMySwapAMM.WITHDRAW_LIQUIDITY_SELECTOR": {"value": 322637753074552370500544931377150993467524337001753746958704872129235461672, "type": "const"}, "boost.library.IMySwapAMM.add_liquidity": {"decorators": [], "pc": 2035, "type": "function"}, "boost.library.IMySwapAMM.add_liquidity.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "a_address": {"offset": 1, "cairo_type": "felt"}, "a_amount": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "a_min_amount": {"offset": 4, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b_address": {"offset": 6, "cairo_type": "felt"}, "b_amount": {"offset": 7, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b_min_amount": {"offset": 9, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 11, "full_name": "boost.library.IMySwapAMM.add_liquidity.Args", "type": "struct"}, "boost.library.IMySwapAMM.add_liquidity.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IMySwapAMM.add_liquidity.ImplicitArgs", "type": "struct"}, "boost.library.IMySwapAMM.add_liquidity.Return": {"cairo_type": "(actual1: starkware.cairo.common.uint256.Uint256, actual2: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.IMySwapAMM.add_liquidity.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IMySwapAMM.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.IMySwapAMM.call_contract": {"destination": "starkware.starknet.common.syscalls.call_contract", "type": "alias"}, "boost.library.IMySwapAMM.get_pool": {"decorators": [], "pc": 2070, "type": "function"}, "boost.library.IMySwapAMM.get_pool.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "pool_id": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IMySwapAMM.get_pool.Args", "type": "struct"}, "boost.library.IMySwapAMM.get_pool.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IMySwapAMM.get_pool.ImplicitArgs", "type": "struct"}, "boost.library.IMySwapAMM.get_pool.Return": {"cairo_type": "(pool: boost.library.Pool)", "type": "type_definition"}, "boost.library.IMySwapAMM.get_pool.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IMySwapAMM.library_call": {"destination": "starkware.starknet.common.syscalls.library_call", "type": "alias"}, "boost.library.IMySwapAMM.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "boost.library.IMySwapAMM.swap": {"decorators": [], "pc": 1970, "type": "function"}, "boost.library.IMySwapAMM.swap.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "pool_id": {"offset": 1, "cairo_type": "felt"}, "token_from_addr": {"offset": 2, "cairo_type": "felt"}, "amount_from": {"offset": 3, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "amount_to_min": {"offset": 5, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 7, "full_name": "boost.library.IMySwapAMM.swap.Args", "type": "struct"}, "boost.library.IMySwapAMM.swap.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IMySwapAMM.swap.ImplicitArgs", "type": "struct"}, "boost.library.IMySwapAMM.swap.Return": {"cairo_type": "(amount_to: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.IMySwapAMM.swap.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.IMySwapAMM.withdraw_liquidity": {"decorators": [], "pc": 1999, "type": "function"}, "boost.library.IMySwapAMM.withdraw_liquidity.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "pool_id": {"offset": 1, "cairo_type": "felt"}, "shares_amount": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "amount_min_a": {"offset": 4, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "amount_min_b": {"offset": 6, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 8, "full_name": "boost.library.IMySwapAMM.withdraw_liquidity.Args", "type": "struct"}, "boost.library.IMySwapAMM.withdraw_liquidity.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.IMySwapAMM.withdraw_liquidity.ImplicitArgs", "type": "struct"}, "boost.library.IMySwapAMM.withdraw_liquidity.Return": {"cairo_type": "(actual1: starkware.cairo.common.uint256.Uint256, actual2: starkware.cairo.common.uint256.Uint256, res1: starkware.cairo.common.uint256.Uint256, res2: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.IMySwapAMM.withdraw_liquidity.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "boost.library.MYSWAP_POOL_FEE_HUNDRED_PERCENT": {"value": 100000, "type": "const"}, "boost.library.MarketingVerifierChash": {"type": "namespace"}, "boost.library.MarketingVerifierChash.Args": {"members": {}, "size": 0, "full_name": "boost.library.MarketingVerifierChash.Args", "type": "struct"}, "boost.library.MarketingVerifierChash.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.MarketingVerifierChash.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.MarketingVerifierChash.ImplicitArgs", "type": "struct"}, "boost.library.MarketingVerifierChash.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MarketingVerifierChash.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MarketingVerifierChash.addr": {"decorators": [], "pc": 1797, "type": "function"}, "boost.library.MarketingVerifierChash.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.MarketingVerifierChash.addr.Args", "type": "struct"}, "boost.library.MarketingVerifierChash.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.MarketingVerifierChash.addr.ImplicitArgs", "type": "struct"}, "boost.library.MarketingVerifierChash.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.MarketingVerifierChash.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MarketingVerifierChash.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.MarketingVerifierChash.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.MarketingVerifierChash.read": {"decorators": [], "pc": 1802, "type": "function"}, "boost.library.MarketingVerifierChash.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.MarketingVerifierChash.read.Args", "type": "struct"}, "boost.library.MarketingVerifierChash.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MarketingVerifierChash.read.ImplicitArgs", "type": "struct"}, "boost.library.MarketingVerifierChash.read.Return": {"cairo_type": "(marketingVerifierChash: felt)", "type": "type_definition"}, "boost.library.MarketingVerifierChash.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MarketingVerifierChash.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.MarketingVerifierChash.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.MarketingVerifierChash.write": {"decorators": [], "pc": 1815, "type": "function"}, "boost.library.MarketingVerifierChash.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.MarketingVerifierChash.write.Args", "type": "struct"}, "boost.library.MarketingVerifierChash.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MarketingVerifierChash.write.ImplicitArgs", "type": "struct"}, "boost.library.MarketingVerifierChash.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MarketingVerifierChash.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MaxSlippagePercentage": {"type": "namespace"}, "boost.library.MaxSlippagePercentage.Args": {"members": {}, "size": 0, "full_name": "boost.library.MaxSlippagePercentage.Args", "type": "struct"}, "boost.library.MaxSlippagePercentage.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.MaxSlippagePercentage.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.MaxSlippagePercentage.ImplicitArgs", "type": "struct"}, "boost.library.MaxSlippagePercentage.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MaxSlippagePercentage.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MaxSlippagePercentage.addr": {"decorators": [], "pc": 1767, "type": "function"}, "boost.library.MaxSlippagePercentage.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.MaxSlippagePercentage.addr.Args", "type": "struct"}, "boost.library.MaxSlippagePercentage.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.MaxSlippagePercentage.addr.ImplicitArgs", "type": "struct"}, "boost.library.MaxSlippagePercentage.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.MaxSlippagePercentage.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MaxSlippagePercentage.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.MaxSlippagePercentage.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.MaxSlippagePercentage.read": {"decorators": [], "pc": 1772, "type": "function"}, "boost.library.MaxSlippagePercentage.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.MaxSlippagePercentage.read.Args", "type": "struct"}, "boost.library.MaxSlippagePercentage.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MaxSlippagePercentage.read.ImplicitArgs", "type": "struct"}, "boost.library.MaxSlippagePercentage.read.Return": {"cairo_type": "(maxSlippagePercentage: felt)", "type": "type_definition"}, "boost.library.MaxSlippagePercentage.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MaxSlippagePercentage.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.MaxSlippagePercentage.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.MaxSlippagePercentage.write": {"decorators": [], "pc": 1785, "type": "function"}, "boost.library.MaxSlippagePercentage.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.MaxSlippagePercentage.write.Args", "type": "struct"}, "boost.library.MaxSlippagePercentage.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MaxSlippagePercentage.write.ImplicitArgs", "type": "struct"}, "boost.library.MaxSlippagePercentage.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MaxSlippagePercentage.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MinDepositEth": {"type": "namespace"}, "boost.library.MinDepositEth.Args": {"members": {}, "size": 0, "full_name": "boost.library.MinDepositEth.Args", "type": "struct"}, "boost.library.MinDepositEth.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.MinDepositEth.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.MinDepositEth.ImplicitArgs", "type": "struct"}, "boost.library.MinDepositEth.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MinDepositEth.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MinDepositEth.addr": {"decorators": [], "pc": 1576, "type": "function"}, "boost.library.MinDepositEth.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.MinDepositEth.addr.Args", "type": "struct"}, "boost.library.MinDepositEth.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.MinDepositEth.addr.ImplicitArgs", "type": "struct"}, "boost.library.MinDepositEth.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.MinDepositEth.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MinDepositEth.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.MinDepositEth.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.MinDepositEth.read": {"decorators": [], "pc": 1581, "type": "function"}, "boost.library.MinDepositEth.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.MinDepositEth.read.Args", "type": "struct"}, "boost.library.MinDepositEth.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MinDepositEth.read.ImplicitArgs", "type": "struct"}, "boost.library.MinDepositEth.read.Return": {"cairo_type": "(amount: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "boost.library.MinDepositEth.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MinDepositEth.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.MinDepositEth.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.MinDepositEth.write": {"decorators": [], "pc": 1600, "type": "function"}, "boost.library.MinDepositEth.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "boost.library.MinDepositEth.write.Args", "type": "struct"}, "boost.library.MinDepositEth.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MinDepositEth.write.ImplicitArgs", "type": "struct"}, "boost.library.MinDepositEth.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MinDepositEth.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapAmm": {"type": "namespace"}, "boost.library.MySwapAmm.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapAmm.Args", "type": "struct"}, "boost.library.MySwapAmm.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.MySwapAmm.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.MySwapAmm.ImplicitArgs", "type": "struct"}, "boost.library.MySwapAmm.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MySwapAmm.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapAmm.addr": {"decorators": [], "pc": 1677, "type": "function"}, "boost.library.MySwapAmm.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapAmm.addr.Args", "type": "struct"}, "boost.library.MySwapAmm.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.MySwapAmm.addr.ImplicitArgs", "type": "struct"}, "boost.library.MySwapAmm.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.MySwapAmm.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapAmm.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.MySwapAmm.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.MySwapAmm.read": {"decorators": [], "pc": 1682, "type": "function"}, "boost.library.MySwapAmm.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapAmm.read.Args", "type": "struct"}, "boost.library.MySwapAmm.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MySwapAmm.read.ImplicitArgs", "type": "struct"}, "boost.library.MySwapAmm.read.Return": {"cairo_type": "(mySwapAmm: felt)", "type": "type_definition"}, "boost.library.MySwapAmm.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapAmm.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.MySwapAmm.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.MySwapAmm.write": {"decorators": [], "pc": 1695, "type": "function"}, "boost.library.MySwapAmm.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.MySwapAmm.write.Args", "type": "struct"}, "boost.library.MySwapAmm.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MySwapAmm.write.ImplicitArgs", "type": "struct"}, "boost.library.MySwapAmm.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MySwapAmm.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapLpToken": {"type": "namespace"}, "boost.library.MySwapLpToken.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapLpToken.Args", "type": "struct"}, "boost.library.MySwapLpToken.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.MySwapLpToken.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.MySwapLpToken.ImplicitArgs", "type": "struct"}, "boost.library.MySwapLpToken.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MySwapLpToken.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapLpToken.addr": {"decorators": [], "pc": 1737, "type": "function"}, "boost.library.MySwapLpToken.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapLpToken.addr.Args", "type": "struct"}, "boost.library.MySwapLpToken.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.MySwapLpToken.addr.ImplicitArgs", "type": "struct"}, "boost.library.MySwapLpToken.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.MySwapLpToken.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapLpToken.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.MySwapLpToken.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.MySwapLpToken.read": {"decorators": [], "pc": 1742, "type": "function"}, "boost.library.MySwapLpToken.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapLpToken.read.Args", "type": "struct"}, "boost.library.MySwapLpToken.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MySwapLpToken.read.ImplicitArgs", "type": "struct"}, "boost.library.MySwapLpToken.read.Return": {"cairo_type": "(mySwapLpToken: felt)", "type": "type_definition"}, "boost.library.MySwapLpToken.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapLpToken.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.MySwapLpToken.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.MySwapLpToken.write": {"decorators": [], "pc": 1755, "type": "function"}, "boost.library.MySwapLpToken.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.MySwapLpToken.write.Args", "type": "struct"}, "boost.library.MySwapLpToken.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MySwapLpToken.write.ImplicitArgs", "type": "struct"}, "boost.library.MySwapLpToken.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MySwapLpToken.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapPoolId": {"type": "namespace"}, "boost.library.MySwapPoolId.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapPoolId.Args", "type": "struct"}, "boost.library.MySwapPoolId.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.MySwapPoolId.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.MySwapPoolId.ImplicitArgs", "type": "struct"}, "boost.library.MySwapPoolId.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MySwapPoolId.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapPoolId.addr": {"decorators": [], "pc": 1707, "type": "function"}, "boost.library.MySwapPoolId.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapPoolId.addr.Args", "type": "struct"}, "boost.library.MySwapPoolId.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.MySwapPoolId.addr.ImplicitArgs", "type": "struct"}, "boost.library.MySwapPoolId.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.MySwapPoolId.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapPoolId.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.MySwapPoolId.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.MySwapPoolId.read": {"decorators": [], "pc": 1712, "type": "function"}, "boost.library.MySwapPoolId.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.MySwapPoolId.read.Args", "type": "struct"}, "boost.library.MySwapPoolId.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MySwapPoolId.read.ImplicitArgs", "type": "struct"}, "boost.library.MySwapPoolId.read.Return": {"cairo_type": "(mySwapPoolId: felt)", "type": "type_definition"}, "boost.library.MySwapPoolId.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.MySwapPoolId.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.MySwapPoolId.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.MySwapPoolId.write": {"decorators": [], "pc": 1725, "type": "function"}, "boost.library.MySwapPoolId.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.MySwapPoolId.write.Args", "type": "struct"}, "boost.library.MySwapPoolId.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.MySwapPoolId.write.ImplicitArgs", "type": "struct"}, "boost.library.MySwapPoolId.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.MySwapPoolId.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.ONE_HUNDRED_PERCENT": {"value": 1000000, "type": "const"}, "boost.library.Pool": {"members": {"name": {"offset": 0, "cairo_type": "felt"}, "token_a_address": {"offset": 1, "cairo_type": "felt"}, "token_a_reserves": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "token_b_address": {"offset": 4, "cairo_type": "felt"}, "token_b_reserves": {"offset": 5, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "fee_percentage": {"offset": 7, "cairo_type": "felt"}, "cfmm_type": {"offset": 8, "cairo_type": "felt"}, "liq_token": {"offset": 9, "cairo_type": "felt"}}, "size": 10, "full_name": "boost.library.Pool", "type": "struct"}, "boost.library.Proxy_admin": {"destination": "upgrades.library.Proxy_admin", "type": "alias"}, "boost.library.StakeToken": {"type": "namespace"}, "boost.library.StakeToken.Args": {"members": {}, "size": 0, "full_name": "boost.library.StakeToken.Args", "type": "struct"}, "boost.library.StakeToken.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.StakeToken.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.StakeToken.ImplicitArgs", "type": "struct"}, "boost.library.StakeToken.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.StakeToken.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakeToken.addr": {"decorators": [], "pc": 1546, "type": "function"}, "boost.library.StakeToken.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.StakeToken.addr.Args", "type": "struct"}, "boost.library.StakeToken.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.StakeToken.addr.ImplicitArgs", "type": "struct"}, "boost.library.StakeToken.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.StakeToken.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakeToken.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.StakeToken.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.StakeToken.read": {"decorators": [], "pc": 1551, "type": "function"}, "boost.library.StakeToken.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.StakeToken.read.Args", "type": "struct"}, "boost.library.StakeToken.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.StakeToken.read.ImplicitArgs", "type": "struct"}, "boost.library.StakeToken.read.Return": {"cairo_type": "(address: felt)", "type": "type_definition"}, "boost.library.StakeToken.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakeToken.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.StakeToken.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.StakeToken.write": {"decorators": [], "pc": 1564, "type": "function"}, "boost.library.StakeToken.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.StakeToken.write.Args", "type": "struct"}, "boost.library.StakeToken.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.StakeToken.write.ImplicitArgs", "type": "struct"}, "boost.library.StakeToken.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.StakeToken.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakingPool": {"type": "namespace"}, "boost.library.StakingPool.Args": {"members": {}, "size": 0, "full_name": "boost.library.StakingPool.Args", "type": "struct"}, "boost.library.StakingPool.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.StakingPool.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.StakingPool.ImplicitArgs", "type": "struct"}, "boost.library.StakingPool.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.StakingPool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakingPool.addr": {"decorators": [], "pc": 1617, "type": "function"}, "boost.library.StakingPool.addr.Args": {"members": {}, "size": 0, "full_name": "boost.library.StakingPool.addr.Args", "type": "struct"}, "boost.library.StakingPool.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.StakingPool.addr.ImplicitArgs", "type": "struct"}, "boost.library.StakingPool.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.StakingPool.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakingPool.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.StakingPool.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.StakingPool.read": {"decorators": [], "pc": 1622, "type": "function"}, "boost.library.StakingPool.read.Args": {"members": {}, "size": 0, "full_name": "boost.library.StakingPool.read.Args", "type": "struct"}, "boost.library.StakingPool.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.StakingPool.read.ImplicitArgs", "type": "struct"}, "boost.library.StakingPool.read.Return": {"cairo_type": "(stakingPool: felt)", "type": "type_definition"}, "boost.library.StakingPool.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.StakingPool.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.StakingPool.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.StakingPool.write": {"decorators": [], "pc": 1635, "type": "function"}, "boost.library.StakingPool.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.StakingPool.write.Args", "type": "struct"}, "boost.library.StakingPool.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.StakingPool.write.ImplicitArgs", "type": "struct"}, "boost.library.StakingPool.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.StakingPool.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "boost.library.WITHDRAW": {"value": 1, "type": "const"}, "boost.library.WithdrawBatches": {"type": "namespace"}, "boost.library.WithdrawBatches.Args": {"members": {}, "size": 0, "full_name": "boost.library.WithdrawBatches.Args", "type": "struct"}, "boost.library.WithdrawBatches.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "boost.library.WithdrawBatches.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.WithdrawBatches.ImplicitArgs", "type": "struct"}, "boost.library.WithdrawBatches.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.WithdrawBatches.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.WithdrawBatches.addr": {"decorators": [], "pc": 1335, "type": "function"}, "boost.library.WithdrawBatches.addr.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.WithdrawBatches.addr.Args", "type": "struct"}, "boost.library.WithdrawBatches.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.WithdrawBatches.addr.ImplicitArgs", "type": "struct"}, "boost.library.WithdrawBatches.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "boost.library.WithdrawBatches.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.WithdrawBatches.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "boost.library.WithdrawBatches.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "boost.library.WithdrawBatches.read": {"decorators": [], "pc": 1349, "type": "function"}, "boost.library.WithdrawBatches.read.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "boost.library.WithdrawBatches.read.Args", "type": "struct"}, "boost.library.WithdrawBatches.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.WithdrawBatches.read.ImplicitArgs", "type": "struct"}, "boost.library.WithdrawBatches.read.Return": {"cairo_type": "(batch: boost.library.Batch)", "type": "type_definition"}, "boost.library.WithdrawBatches.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.WithdrawBatches.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "boost.library.WithdrawBatches.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "boost.library.WithdrawBatches.write": {"decorators": [], "pc": 1423, "type": "function"}, "boost.library.WithdrawBatches.write.Args": {"members": {"batchId": {"offset": 0, "cairo_type": "felt"}, "value": {"offset": 1, "cairo_type": "boost.library.Batch"}}, "size": 12, "full_name": "boost.library.WithdrawBatches.write.Args", "type": "struct"}, "boost.library.WithdrawBatches.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "boost.library.WithdrawBatches.write.ImplicitArgs", "type": "struct"}, "boost.library.WithdrawBatches.write.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.WithdrawBatches.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.WithdrawRequest": {"members": {"account": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 3, "full_name": "boost.library.WithdrawRequest", "type": "struct"}, "boost.library.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "boost.library.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "boost.library.assert_uint256_le": {"destination": "starkware.cairo.common.uint256.assert_uint256_le", "type": "alias"}, "boost.library.batch_from_pool": {"type": "namespace"}, "boost.library.batch_from_pool.Args": {"members": {}, "size": 0, "full_name": "boost.library.batch_from_pool.Args", "type": "struct"}, "boost.library.batch_from_pool.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.batch_from_pool.ImplicitArgs", "type": "struct"}, "boost.library.batch_from_pool.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.batch_from_pool.SELECTOR": {"value": 295728432320799686095782364200488981267167216315578691995779675256327958410, "type": "const"}, "boost.library.batch_from_pool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.batch_from_pool.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.batch_from_pool.emit": {"decorators": [], "pc": 989, "type": "function"}, "boost.library.batch_from_pool.emit.Args": {"members": {"type": {"offset": 0, "cairo_type": "felt"}, "batchId": {"offset": 1, "cairo_type": "felt"}, "eth_amount": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "token_amount": {"offset": 4, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 6, "full_name": "boost.library.batch_from_pool.emit.Args", "type": "struct"}, "boost.library.batch_from_pool.emit.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.batch_from_pool.emit.ImplicitArgs", "type": "struct"}, "boost.library.batch_from_pool.emit.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.batch_from_pool.emit.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "boost.library.batch_from_pool.emit_event": {"destination": "starkware.starknet.common.syscalls.emit_event", "type": "alias"}, "boost.library.batch_from_pool.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "boost.library.batch_to_pool": {"type": "namespace"}, "boost.library.batch_to_pool.Args": {"members": {}, "size": 0, "full_name": "boost.library.batch_to_pool.Args", "type": "struct"}, "boost.library.batch_to_pool.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.batch_to_pool.ImplicitArgs", "type": "struct"}, "boost.library.batch_to_pool.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.batch_to_pool.SELECTOR": {"value": 745518041372146677633174039424439166986546042199627287713067469427809845059, "type": "const"}, "boost.library.batch_to_pool.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.batch_to_pool.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.batch_to_pool.emit": {"decorators": [], "pc": 961, "type": "function"}, "boost.library.batch_to_pool.emit.Args": {"members": {"type": {"offset": 0, "cairo_type": "felt"}, "batchId": {"offset": 1, "cairo_type": "felt"}, "amount": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "fee": {"offset": 4, "cairo_type": "felt"}}, "size": 5, "full_name": "boost.library.batch_to_pool.emit.Args", "type": "struct"}, "boost.library.batch_to_pool.emit.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.batch_to_pool.emit.ImplicitArgs", "type": "struct"}, "boost.library.batch_to_pool.emit.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.batch_to_pool.emit.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "boost.library.batch_to_pool.emit_event": {"destination": "starkware.starknet.common.syscalls.emit_event", "type": "alias"}, "boost.library.batch_to_pool.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "boost.library.get_block_timestamp": {"destination": "starkware.starknet.common.syscalls.get_block_timestamp", "type": "alias"}, "boost.library.get_caller_address": {"destination": "starkware.starknet.common.syscalls.get_caller_address", "type": "alias"}, "boost.library.get_contract_address": {"destination": "starkware.starknet.common.syscalls.get_contract_address", "type": "alias"}, "boost.library.is_le": {"destination": "starkware.cairo.common.math_cmp.is_le", "type": "alias"}, "boost.library.is_le_felt": {"destination": "starkware.cairo.common.math_cmp.is_le_felt", "type": "alias"}, "boost.library.is_not_zero": {"destination": "starkware.cairo.common.math_cmp.is_not_zero", "type": "alias"}, "boost.library.library_call": {"destination": "starkware.starknet.common.syscalls.library_call", "type": "alias"}, "boost.library.stake_eth": {"type": "namespace"}, "boost.library.stake_eth.Args": {"members": {}, "size": 0, "full_name": "boost.library.stake_eth.Args", "type": "struct"}, "boost.library.stake_eth.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.stake_eth.ImplicitArgs", "type": "struct"}, "boost.library.stake_eth.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.stake_eth.SELECTOR": {"value": 275174830438215987825564658592494805200969647832561921949961470877498602681, "type": "const"}, "boost.library.stake_eth.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.stake_eth.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.stake_eth.emit": {"decorators": [], "pc": 905, "type": "function"}, "boost.library.stake_eth.emit.Args": {"members": {"account": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "batchId": {"offset": 3, "cairo_type": "felt"}, "idx": {"offset": 4, "cairo_type": "felt"}}, "size": 5, "full_name": "boost.library.stake_eth.emit.Args", "type": "struct"}, "boost.library.stake_eth.emit.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.stake_eth.emit.ImplicitArgs", "type": "struct"}, "boost.library.stake_eth.emit.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.stake_eth.emit.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "boost.library.stake_eth.emit_event": {"destination": "starkware.starknet.common.syscalls.emit_event", "type": "alias"}, "boost.library.stake_eth.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "boost.library.uint256_add": {"destination": "starkware.cairo.common.uint256.uint256_add", "type": "alias"}, "boost.library.uint256_check": {"destination": "starkware.cairo.common.uint256.uint256_check", "type": "alias"}, "boost.library.uint256_cond_neg": {"destination": "starkware.cairo.common.uint256.uint256_cond_neg", "type": "alias"}, "boost.library.uint256_le": {"destination": "starkware.cairo.common.uint256.uint256_le", "type": "alias"}, "boost.library.uint256_lt": {"destination": "starkware.cairo.common.uint256.uint256_lt", "type": "alias"}, "boost.library.uint256_mul": {"destination": "starkware.cairo.common.uint256.uint256_mul", "type": "alias"}, "boost.library.uint256_mul_div_mod": {"destination": "starkware.cairo.common.uint256.uint256_mul_div_mod", "type": "alias"}, "boost.library.uint256_signed_lt": {"destination": "starkware.cairo.common.uint256.uint256_signed_lt", "type": "alias"}, "boost.library.uint256_sqrt": {"destination": "starkware.cairo.common.uint256.uint256_sqrt", "type": "alias"}, "boost.library.uint256_sub": {"destination": "starkware.cairo.common.uint256.uint256_sub", "type": "alias"}, "boost.library.uint256_unsigned_div_rem": {"destination": "starkware.cairo.common.uint256.uint256_unsigned_div_rem", "type": "alias"}, "boost.library.unsigned_div_rem": {"destination": "starkware.cairo.common.math.unsigned_div_rem", "type": "alias"}, "boost.library.withdraw_staked_token": {"type": "namespace"}, "boost.library.withdraw_staked_token.Args": {"members": {}, "size": 0, "full_name": "boost.library.withdraw_staked_token.Args", "type": "struct"}, "boost.library.withdraw_staked_token.ImplicitArgs": {"members": {}, "size": 0, "full_name": "boost.library.withdraw_staked_token.ImplicitArgs", "type": "struct"}, "boost.library.withdraw_staked_token.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.withdraw_staked_token.SELECTOR": {"value": 1689147739158953628725167365093342613880425159840617005136988653798969165684, "type": "const"}, "boost.library.withdraw_staked_token.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "boost.library.withdraw_staked_token.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "boost.library.withdraw_staked_token.emit": {"decorators": [], "pc": 933, "type": "function"}, "boost.library.withdraw_staked_token.emit.Args": {"members": {"account": {"offset": 0, "cairo_type": "felt"}, "amount": {"offset": 1, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "batchId": {"offset": 3, "cairo_type": "felt"}, "idx": {"offset": 4, "cairo_type": "felt"}}, "size": 5, "full_name": "boost.library.withdraw_staked_token.emit.Args", "type": "struct"}, "boost.library.withdraw_staked_token.emit.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "boost.library.withdraw_staked_token.emit.ImplicitArgs", "type": "struct"}, "boost.library.withdraw_staked_token.emit.Return": {"cairo_type": "()", "type": "type_definition"}, "boost.library.withdraw_staked_token.emit.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "boost.library.withdraw_staked_token.emit_event": {"destination": "starkware.starknet.common.syscalls.emit_event", "type": "alias"}, "boost.library.withdraw_staked_token.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "openzeppelin.token.erc20.IERC20.IERC20": {"type": "namespace"}, "openzeppelin.token.erc20.IERC20.IERC20.ALLOWANCE_SELECTOR": {"value": 863164345921111744606866654754108663958095967665259696902984674202985078753, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.APPROVE_SELECTOR": {"value": 949021990203918389843157787496164629863144228991510976554585288817234167820, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.Args": {"members": {}, "size": 0, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.Args", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.BALANCEOF_SELECTOR": {"value": 1307730684388977109649524593492043083703013045633289330664425380824804018030, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.DECIMALS_SELECTOR": {"value": 134830404806214277570220174593674215737759987247891306080029841794115377321, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.ImplicitArgs": {"members": {}, "size": 0, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.ImplicitArgs", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.NAME_SELECTOR": {"value": 1528802474226268325865027367859591458315299653151958663884057507666229546336, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.Return": {"cairo_type": "()", "type": "type_definition"}, "openzeppelin.token.erc20.IERC20.IERC20.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.SYMBOL_SELECTOR": {"value": 944713526212149105522785400348068751682982210605126537021911324578866405028, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.TOTALSUPPLY_SELECTOR": {"value": 227334030968744315992796982100494617316223563777432855541120004521101595501, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.TRANSFERFROM_SELECTOR": {"value": 116061167288211781254449158074459916871457383008289084697957612485591092000, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.TRANSFER_SELECTOR": {"value": 232670485425082704932579856502088130646006032362877466777181098476241604910, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "openzeppelin.token.erc20.IERC20.IERC20.approve": {"decorators": [], "pc": 793, "type": "function"}, "openzeppelin.token.erc20.IERC20.IERC20.approve.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "spender": {"offset": 1, "cairo_type": "felt"}, "amount": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.approve.Args", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.approve.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.approve.ImplicitArgs", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.approve.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "openzeppelin.token.erc20.IERC20.IERC20.approve.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.balanceOf": {"decorators": [], "pc": 718, "type": "function"}, "openzeppelin.token.erc20.IERC20.IERC20.balanceOf.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "account": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.balanceOf.Args", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.balanceOf.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.balanceOf.ImplicitArgs", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.balanceOf.Return": {"cairo_type": "(balance: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "openzeppelin.token.erc20.IERC20.IERC20.balanceOf.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.call_contract": {"destination": "starkware.starknet.common.syscalls.call_contract", "type": "alias"}, "openzeppelin.token.erc20.IERC20.IERC20.library_call": {"destination": "starkware.starknet.common.syscalls.library_call", "type": "alias"}, "openzeppelin.token.erc20.IERC20.IERC20.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "openzeppelin.token.erc20.IERC20.IERC20.transfer": {"decorators": [], "pc": 742, "type": "function"}, "openzeppelin.token.erc20.IERC20.IERC20.transfer.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "recipient": {"offset": 1, "cairo_type": "felt"}, "amount": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.transfer.Args", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.transfer.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.transfer.ImplicitArgs", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.transfer.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "openzeppelin.token.erc20.IERC20.IERC20.transfer.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "openzeppelin.token.erc20.IERC20.IERC20.transferFrom": {"decorators": [], "pc": 767, "type": "function"}, "openzeppelin.token.erc20.IERC20.IERC20.transferFrom.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "sender": {"offset": 1, "cairo_type": "felt"}, "recipient": {"offset": 2, "cairo_type": "felt"}, "amount": {"offset": 3, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 5, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.transferFrom.Args", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.transferFrom.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "openzeppelin.token.erc20.IERC20.IERC20.transferFrom.ImplicitArgs", "type": "struct"}, "openzeppelin.token.erc20.IERC20.IERC20.transferFrom.Return": {"cairo_type": "(success: felt)", "type": "type_definition"}, "openzeppelin.token.erc20.IERC20.IERC20.transferFrom.SIZEOF_LOCALS": {"value": 1, "type": "const"}, "openzeppelin.token.erc20.IERC20.Uint256": {"destination": "starkware.cairo.common.uint256.Uint256", "type": "alias"}, "starkware.cairo.common.alloc.alloc": {"decorators": [], "pc": 0, "type": "function"}, "starkware.cairo.common.alloc.alloc.Args": {"members": {}, "size": 0, "full_name": "starkware.cairo.common.alloc.alloc.Args", "type": "struct"}, "starkware.cairo.common.alloc.alloc.ImplicitArgs": {"members": {}, "size": 0, "full_name": "starkware.cairo.common.alloc.alloc.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.alloc.alloc.Return": {"cairo_type": "(ptr: felt*)", "type": "type_definition"}, "starkware.cairo.common.alloc.alloc.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.bitwise.ALL_ONES": {"value": -106710729501573572985208420194530329073740042555888586719234, "type": "const"}, "starkware.cairo.common.bitwise.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.bool.FALSE": {"value": 0, "type": "const"}, "starkware.cairo.common.bool.TRUE": {"value": 1, "type": "const"}, "starkware.cairo.common.cairo_builtins.BitwiseBuiltin": {"members": {"x": {"offset": 0, "cairo_type": "felt"}, "y": {"offset": 1, "cairo_type": "felt"}, "x_and_y": {"offset": 2, "cairo_type": "felt"}, "x_xor_y": {"offset": 3, "cairo_type": "felt"}, "x_or_y": {"offset": 4, "cairo_type": "felt"}}, "size": 5, "full_name": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.EcOpBuiltin": {"members": {"p": {"offset": 0, "cairo_type": "starkware.cairo.common.ec_point.EcPoint"}, "q": {"offset": 2, "cairo_type": "starkware.cairo.common.ec_point.EcPoint"}, "m": {"offset": 4, "cairo_type": "felt"}, "r": {"offset": 5, "cairo_type": "starkware.cairo.common.ec_point.EcPoint"}}, "size": 7, "full_name": "starkware.cairo.common.cairo_builtins.EcOpBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.EcPoint": {"destination": "starkware.cairo.common.ec_point.EcPoint", "type": "alias"}, "starkware.cairo.common.cairo_builtins.HashBuiltin": {"members": {"x": {"offset": 0, "cairo_type": "felt"}, "y": {"offset": 1, "cairo_type": "felt"}, "result": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.KeccakBuiltin": {"members": {"input": {"offset": 0, "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState"}, "output": {"offset": 8, "cairo_type": "starkware.cairo.common.keccak_state.KeccakBuiltinState"}}, "size": 16, "full_name": "starkware.cairo.common.cairo_builtins.KeccakBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.KeccakBuiltinState": {"destination": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "type": "alias"}, "starkware.cairo.common.cairo_builtins.PoseidonBuiltin": {"members": {"input": {"offset": 0, "cairo_type": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState"}, "output": {"offset": 3, "cairo_type": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState"}}, "size": 6, "full_name": "starkware.cairo.common.cairo_builtins.PoseidonBuiltin", "type": "struct"}, "starkware.cairo.common.cairo_builtins.PoseidonBuiltinState": {"destination": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", "type": "alias"}, "starkware.cairo.common.cairo_builtins.SignatureBuiltin": {"members": {"pub_key": {"offset": 0, "cairo_type": "felt"}, "message": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.cairo_builtins.SignatureBuiltin", "type": "struct"}, "starkware.cairo.common.dict_access.DictAccess": {"members": {"key": {"offset": 0, "cairo_type": "felt"}, "prev_value": {"offset": 1, "cairo_type": "felt"}, "new_value": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "starkware.cairo.common.dict_access.DictAccess", "type": "struct"}, "starkware.cairo.common.ec_point.EcPoint": {"members": {"x": {"offset": 0, "cairo_type": "felt"}, "y": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.ec_point.EcPoint", "type": "struct"}, "starkware.cairo.common.hash.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "starkware.cairo.common.hash.hash2": {"decorators": [], "pc": 3, "type": "function"}, "starkware.cairo.common.hash.hash2.Args": {"members": {"x": {"offset": 0, "cairo_type": "felt"}, "y": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.hash.hash2.Args", "type": "struct"}, "starkware.cairo.common.hash.hash2.ImplicitArgs": {"members": {"hash_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}}, "size": 1, "full_name": "starkware.cairo.common.hash.hash2.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.hash.hash2.Return": {"cairo_type": "(result: felt)", "type": "type_definition"}, "starkware.cairo.common.hash.hash2.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.keccak_state.KeccakBuiltinState": {"members": {"s0": {"offset": 0, "cairo_type": "felt"}, "s1": {"offset": 1, "cairo_type": "felt"}, "s2": {"offset": 2, "cairo_type": "felt"}, "s3": {"offset": 3, "cairo_type": "felt"}, "s4": {"offset": 4, "cairo_type": "felt"}, "s5": {"offset": 5, "cairo_type": "felt"}, "s6": {"offset": 6, "cairo_type": "felt"}, "s7": {"offset": 7, "cairo_type": "felt"}}, "size": 8, "full_name": "starkware.cairo.common.keccak_state.KeccakBuiltinState", "type": "struct"}, "starkware.cairo.common.math.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "starkware.cairo.common.math.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "starkware.cairo.common.math.assert_250_bit": {"decorators": ["known_ap_change"], "pc": 94, "type": "function"}, "starkware.cairo.common.math.assert_250_bit.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_250_bit.Args", "type": "struct"}, "starkware.cairo.common.math.assert_250_bit.HIGH_BOUND": {"value": 5316911983139663491615228241121378304, "type": "const"}, "starkware.cairo.common.math.assert_250_bit.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_250_bit.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_250_bit.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_250_bit.SHIFT": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.math.assert_250_bit.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_250_bit.UPPER_BOUND": {"value": 1809251394333065553493296640760748560207343510400633813116524750123642650624, "type": "const"}, "starkware.cairo.common.math.assert_250_bit.high": {"references": [{"value": "[cast([fp + (-4)] + 1, felt*)]", "pc": 94, "ap_tracking_data": {"offset": 0, "group": 13}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_250_bit.high", "type": "reference"}, "starkware.cairo.common.math.assert_250_bit.low": {"references": [{"value": "[cast([fp + (-4)], felt*)]", "pc": 94, "ap_tracking_data": {"offset": 0, "group": 13}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_250_bit.low", "type": "reference"}, "starkware.cairo.common.math.assert_250_bit.value": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 94, "ap_tracking_data": {"offset": 0, "group": 13}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_250_bit.value", "type": "reference"}, "starkware.cairo.common.math.assert_le": {"decorators": [], "pc": 89, "type": "function"}, "starkware.cairo.common.math.assert_le.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}, "b": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.math.assert_le.Args", "type": "struct"}, "starkware.cairo.common.math.assert_le.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_le.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_le.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_le.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_le_felt": {"decorators": ["known_ap_change"], "pc": 107, "type": "function"}, "starkware.cairo.common.math.assert_le_felt.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}, "b": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.math.assert_le_felt.Args", "type": "struct"}, "starkware.cairo.common.math.assert_le_felt.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_le_felt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_2_HIGH": {"value": 5316911983139663648412552867652567041, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.PRIME_OVER_3_HIGH": {"value": 3544607988759775765608368578435044694, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_le_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_le_felt.a": {"references": [{"value": "[cast(fp + (-4), felt*)]", "pc": 107, "ap_tracking_data": {"offset": 0, "group": 14}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_le_felt.a", "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.b": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 107, "ap_tracking_data": {"offset": 0, "group": 14}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_le_felt.b", "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.range_check_ptr": {"references": [{"value": "[cast(fp + (-5), felt*)]", "pc": 107, "ap_tracking_data": {"offset": 0, "group": 14}}, {"value": "cast([fp + (-5)] + 4, felt)", "pc": 117, "ap_tracking_data": {"offset": 8, "group": 14}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_le_felt.range_check_ptr", "type": "reference"}, "starkware.cairo.common.math.assert_le_felt.skip_exclude_a": {"pc": 131, "type": "label"}, "starkware.cairo.common.math.assert_le_felt.skip_exclude_b_minus_a": {"pc": 143, "type": "label"}, "starkware.cairo.common.math.assert_lt_felt": {"decorators": ["known_ap_change"], "pc": 152, "type": "function"}, "starkware.cairo.common.math.assert_lt_felt.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}, "b": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.math.assert_lt_felt.Args", "type": "struct"}, "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_lt_felt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_lt_felt.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_lt_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_lt_felt.a": {"references": [{"value": "[cast(fp + (-4), felt*)]", "pc": 152, "ap_tracking_data": {"offset": 0, "group": 15}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_lt_felt.a", "type": "reference"}, "starkware.cairo.common.math.assert_lt_felt.b": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 152, "ap_tracking_data": {"offset": 0, "group": 15}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_lt_felt.b", "type": "reference"}, "starkware.cairo.common.math.assert_nn": {"decorators": [], "pc": 85, "type": "function"}, "starkware.cairo.common.math.assert_nn.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_nn.Args", "type": "struct"}, "starkware.cairo.common.math.assert_nn.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_nn.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_nn.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_nn.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_nn.a": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 85, "ap_tracking_data": {"offset": 0, "group": 11}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_nn.a", "type": "reference"}, "starkware.cairo.common.math.assert_not_zero": {"decorators": [], "pc": 80, "type": "function"}, "starkware.cairo.common.math.assert_not_zero.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.assert_not_zero.Args", "type": "struct"}, "starkware.cairo.common.math.assert_not_zero.ImplicitArgs": {"members": {}, "size": 0, "full_name": "starkware.cairo.common.math.assert_not_zero.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.assert_not_zero.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.math.assert_not_zero.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.assert_not_zero.value": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 80, "ap_tracking_data": {"offset": 0, "group": 10}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.assert_not_zero.value", "type": "reference"}, "starkware.cairo.common.math.unsigned_div_rem": {"decorators": [], "pc": 163, "type": "function"}, "starkware.cairo.common.math.unsigned_div_rem.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}, "div": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.math.unsigned_div_rem.Args", "type": "struct"}, "starkware.cairo.common.math.unsigned_div_rem.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math.unsigned_div_rem.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math.unsigned_div_rem.Return": {"cairo_type": "(q: felt, r: felt)", "type": "type_definition"}, "starkware.cairo.common.math.unsigned_div_rem.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math.unsigned_div_rem.div": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.unsigned_div_rem.div", "type": "reference"}, "starkware.cairo.common.math.unsigned_div_rem.q": {"references": [{"value": "[cast([fp + (-5)] + 1, felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.unsigned_div_rem.q", "type": "reference"}, "starkware.cairo.common.math.unsigned_div_rem.r": {"references": [{"value": "[cast([fp + (-5)], felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.unsigned_div_rem.r", "type": "reference"}, "starkware.cairo.common.math.unsigned_div_rem.value": {"references": [{"value": "[cast(fp + (-4), felt*)]", "pc": 163, "ap_tracking_data": {"offset": 0, "group": 16}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math.unsigned_div_rem.value", "type": "reference"}, "starkware.cairo.common.math_cmp.RC_BOUND": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.math_cmp.assert_le_felt": {"destination": "starkware.cairo.common.math.assert_le_felt", "type": "alias"}, "starkware.cairo.common.math_cmp.assert_lt_felt": {"destination": "starkware.cairo.common.math.assert_lt_felt", "type": "alias"}, "starkware.cairo.common.math_cmp.is_le": {"decorators": ["known_ap_change"], "pc": 259, "type": "function"}, "starkware.cairo.common.math_cmp.is_le.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}, "b": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.math_cmp.is_le.Args", "type": "struct"}, "starkware.cairo.common.math_cmp.is_le.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math_cmp.is_le.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math_cmp.is_le.Return": {"cairo_type": "felt", "type": "type_definition"}, "starkware.cairo.common.math_cmp.is_le.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math_cmp.is_le_felt": {"decorators": ["known_ap_change"], "pc": 264, "type": "function"}, "starkware.cairo.common.math_cmp.is_le_felt.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}, "b": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.math_cmp.is_le_felt.Args", "type": "struct"}, "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math_cmp.is_le_felt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math_cmp.is_le_felt.Return": {"cairo_type": "felt", "type": "type_definition"}, "starkware.cairo.common.math_cmp.is_le_felt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math_cmp.is_le_felt.a": {"references": [{"value": "[cast(fp + (-4), felt*)]", "pc": 264, "ap_tracking_data": {"offset": 0, "group": 21}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math_cmp.is_le_felt.a", "type": "reference"}, "starkware.cairo.common.math_cmp.is_le_felt.b": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 264, "ap_tracking_data": {"offset": 0, "group": 21}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math_cmp.is_le_felt.b", "type": "reference"}, "starkware.cairo.common.math_cmp.is_le_felt.not_le": {"pc": 276, "type": "label"}, "starkware.cairo.common.math_cmp.is_nn": {"decorators": ["known_ap_change"], "pc": 226, "type": "function"}, "starkware.cairo.common.math_cmp.is_nn.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math_cmp.is_nn.Args", "type": "struct"}, "starkware.cairo.common.math_cmp.is_nn.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math_cmp.is_nn.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math_cmp.is_nn.Return": {"cairo_type": "felt", "type": "type_definition"}, "starkware.cairo.common.math_cmp.is_nn.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.math_cmp.is_nn.a": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 226, "ap_tracking_data": {"offset": 0, "group": 19}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.math_cmp.is_nn.a", "type": "reference"}, "starkware.cairo.common.math_cmp.is_nn.need_felt_comparison": {"pc": 250, "type": "label"}, "starkware.cairo.common.math_cmp.is_nn.out_of_range": {"pc": 236, "type": "label"}, "starkware.cairo.common.math_cmp.is_not_zero": {"decorators": ["known_ap_change"], "pc": 218, "type": "function"}, "starkware.cairo.common.math_cmp.is_not_zero.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.math_cmp.is_not_zero.Args", "type": "struct"}, "starkware.cairo.common.math_cmp.is_not_zero.ImplicitArgs": {"members": {}, "size": 0, "full_name": "starkware.cairo.common.math_cmp.is_not_zero.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.math_cmp.is_not_zero.Return": {"cairo_type": "felt", "type": "type_definition"}, "starkware.cairo.common.math_cmp.is_not_zero.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.poseidon_state.PoseidonBuiltinState": {"members": {"s0": {"offset": 0, "cairo_type": "felt"}, "s1": {"offset": 1, "cairo_type": "felt"}, "s2": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "starkware.cairo.common.poseidon_state.PoseidonBuiltinState", "type": "struct"}, "starkware.cairo.common.pow.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "starkware.cairo.common.pow.get_ap": {"destination": "starkware.cairo.common.registers.get_ap", "type": "alias"}, "starkware.cairo.common.pow.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.registers.get_ap": {"destination": "starkware.cairo.lang.compiler.lib.registers.get_ap", "type": "alias"}, "starkware.cairo.common.registers.get_fp_and_pc": {"destination": "starkware.cairo.lang.compiler.lib.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.uint256.ALL_ONES": {"value": 340282366920938463463374607431768211455, "type": "const"}, "starkware.cairo.common.uint256.BitwiseBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.BitwiseBuiltin", "type": "alias"}, "starkware.cairo.common.uint256.HALF_SHIFT": {"value": 18446744073709551616, "type": "const"}, "starkware.cairo.common.uint256.SHIFT": {"value": 340282366920938463463374607431768211456, "type": "const"}, "starkware.cairo.common.uint256.Uint256": {"members": {"low": {"offset": 0, "cairo_type": "felt"}, "high": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.cairo.common.uint256.Uint256", "type": "struct"}, "starkware.cairo.common.uint256.assert_in_range": {"destination": "starkware.cairo.common.math.assert_in_range", "type": "alias"}, "starkware.cairo.common.uint256.assert_le": {"destination": "starkware.cairo.common.math.assert_le", "type": "alias"}, "starkware.cairo.common.uint256.assert_nn_le": {"destination": "starkware.cairo.common.math.assert_nn_le", "type": "alias"}, "starkware.cairo.common.uint256.assert_not_zero": {"destination": "starkware.cairo.common.math.assert_not_zero", "type": "alias"}, "starkware.cairo.common.uint256.assert_uint256_le": {"decorators": [], "pc": 707, "type": "function"}, "starkware.cairo.common.uint256.assert_uint256_le.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.assert_uint256_le.Args", "type": "struct"}, "starkware.cairo.common.uint256.assert_uint256_le.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.assert_uint256_le.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.assert_uint256_le.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.uint256.assert_uint256_le.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.bitwise_and": {"destination": "starkware.cairo.common.bitwise.bitwise_and", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_or": {"destination": "starkware.cairo.common.bitwise.bitwise_or", "type": "alias"}, "starkware.cairo.common.uint256.bitwise_xor": {"destination": "starkware.cairo.common.bitwise.bitwise_xor", "type": "alias"}, "starkware.cairo.common.uint256.get_ap": {"destination": "starkware.cairo.common.registers.get_ap", "type": "alias"}, "starkware.cairo.common.uint256.get_fp_and_pc": {"destination": "starkware.cairo.common.registers.get_fp_and_pc", "type": "alias"}, "starkware.cairo.common.uint256.is_le": {"destination": "starkware.cairo.common.math_cmp.is_le", "type": "alias"}, "starkware.cairo.common.uint256.pow": {"destination": "starkware.cairo.common.pow.pow", "type": "alias"}, "starkware.cairo.common.uint256.split_64": {"decorators": [], "pc": 311, "type": "function"}, "starkware.cairo.common.uint256.split_64.Args": {"members": {"a": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.split_64.Args", "type": "struct"}, "starkware.cairo.common.uint256.split_64.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.split_64.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.split_64.Return": {"cairo_type": "(low: felt, high: felt)", "type": "type_definition"}, "starkware.cairo.common.uint256.split_64.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "starkware.cairo.common.uint256.split_64.a": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 311, "ap_tracking_data": {"offset": 0, "group": 24}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.uint256.split_64.a", "type": "reference"}, "starkware.cairo.common.uint256.split_64.high": {"references": [{"value": "[cast(fp + 1, felt*)]", "pc": 313, "ap_tracking_data": {"offset": 2, "group": 24}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.uint256.split_64.high", "type": "reference"}, "starkware.cairo.common.uint256.split_64.low": {"references": [{"value": "[cast(fp, felt*)]", "pc": 313, "ap_tracking_data": {"offset": 2, "group": 24}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.uint256.split_64.low", "type": "reference"}, "starkware.cairo.common.uint256.uint256_add": {"decorators": [], "pc": 289, "type": "function"}, "starkware.cairo.common.uint256.uint256_add.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.uint256_add.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_add.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_add.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_add.Return": {"cairo_type": "(res: starkware.cairo.common.uint256.Uint256, carry: felt)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_add.SIZEOF_LOCALS": {"value": 4, "type": "const"}, "starkware.cairo.common.uint256.uint256_add.a": {"references": [{"value": "[cast(fp + (-6), starkware.cairo.common.uint256.Uint256*)]", "pc": 289, "ap_tracking_data": {"offset": 0, "group": 23}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_add.a", "type": "reference"}, "starkware.cairo.common.uint256.uint256_add.b": {"references": [{"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 289, "ap_tracking_data": {"offset": 0, "group": 23}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_add.b", "type": "reference"}, "starkware.cairo.common.uint256.uint256_add.carry_high": {"references": [{"value": "[cast(fp + 3, felt*)]", "pc": 291, "ap_tracking_data": {"offset": 4, "group": 23}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.uint256.uint256_add.carry_high", "type": "reference"}, "starkware.cairo.common.uint256.uint256_add.carry_low": {"references": [{"value": "[cast(fp + 2, felt*)]", "pc": 291, "ap_tracking_data": {"offset": 4, "group": 23}}], "cairo_type": "felt", "full_name": "starkware.cairo.common.uint256.uint256_add.carry_low", "type": "reference"}, "starkware.cairo.common.uint256.uint256_check": {"decorators": [], "pc": 284, "type": "function"}, "starkware.cairo.common.uint256.uint256_check.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "starkware.cairo.common.uint256.uint256_check.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_check.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_check.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_check.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_check.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_cond_neg": {"decorators": [], "pc": 679, "type": "function"}, "starkware.cairo.common.uint256.uint256_cond_neg.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "should_neg": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "starkware.cairo.common.uint256.uint256_cond_neg.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_cond_neg.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_cond_neg.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_cond_neg.Return": {"cairo_type": "(res: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_cond_neg.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_le": {"decorators": [], "pc": 498, "type": "function"}, "starkware.cairo.common.uint256.uint256_le.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.uint256_le.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_le.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_le.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_le.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_le.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_lt": {"decorators": [], "pc": 481, "type": "function"}, "starkware.cairo.common.uint256.uint256_lt.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.uint256_lt.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_lt.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_lt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_lt.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_lt.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_mul": {"decorators": [], "pc": 327, "type": "function"}, "starkware.cairo.common.uint256.uint256_mul.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.uint256_mul.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_mul.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_mul.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_mul.Return": {"cairo_type": "(low: starkware.cairo.common.uint256.Uint256, high: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_mul.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_mul_div_mod": {"decorators": [], "pc": 570, "type": "function"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "div": {"offset": 4, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 6, "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.Return": {"cairo_type": "(quotient_low: starkware.cairo.common.uint256.Uint256, quotient_high: starkware.cairo.common.uint256.Uint256, remainder: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.SIZEOF_LOCALS": {"value": 6, "type": "const"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.a": {"references": [{"value": "[cast(fp + (-8), starkware.cairo.common.uint256.Uint256*)]", "pc": 570, "ap_tracking_data": {"offset": 0, "group": 33}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.a", "type": "reference"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.b": {"references": [{"value": "[cast(fp + (-6), starkware.cairo.common.uint256.Uint256*)]", "pc": 570, "ap_tracking_data": {"offset": 0, "group": 33}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.b", "type": "reference"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.div": {"references": [{"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 570, "ap_tracking_data": {"offset": 0, "group": 33}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.div", "type": "reference"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.quotient_high": {"references": [{"value": "[cast(fp + 2, starkware.cairo.common.uint256.Uint256*)]", "pc": 579, "ap_tracking_data": {"offset": 182, "group": 33}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.quotient_high", "type": "reference"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.quotient_low": {"references": [{"value": "[cast(fp, starkware.cairo.common.uint256.Uint256*)]", "pc": 579, "ap_tracking_data": {"offset": 182, "group": 33}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.quotient_low", "type": "reference"}, "starkware.cairo.common.uint256.uint256_mul_div_mod.remainder": {"references": [{"value": "[cast(fp + 4, starkware.cairo.common.uint256.Uint256*)]", "pc": 579, "ap_tracking_data": {"offset": 182, "group": 33}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_mul_div_mod.remainder", "type": "reference"}, "starkware.cairo.common.uint256.uint256_neg": {"decorators": [], "pc": 664, "type": "function"}, "starkware.cairo.common.uint256.uint256_neg.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "starkware.cairo.common.uint256.uint256_neg.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_neg.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_neg.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_neg.Return": {"cairo_type": "(res: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_neg.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_not": {"decorators": [], "pc": 656, "type": "function"}, "starkware.cairo.common.uint256.uint256_not.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "starkware.cairo.common.uint256.uint256_not.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_not.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_not.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_not.Return": {"cairo_type": "(res: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_not.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_sqrt": {"decorators": [], "pc": 415, "type": "function"}, "starkware.cairo.common.uint256.uint256_sqrt.Args": {"members": {"n": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 2, "full_name": "starkware.cairo.common.uint256.uint256_sqrt.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_sqrt.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_sqrt.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_sqrt.Return": {"cairo_type": "(res: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_sqrt.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "starkware.cairo.common.uint256.uint256_sqrt.n": {"references": [{"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 415, "ap_tracking_data": {"offset": 0, "group": 26}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_sqrt.n", "type": "reference"}, "starkware.cairo.common.uint256.uint256_sqrt.root": {"references": [{"value": "[cast(fp, starkware.cairo.common.uint256.Uint256*)]", "pc": 417, "ap_tracking_data": {"offset": 2, "group": 26}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_sqrt.root", "type": "reference"}, "starkware.cairo.common.uint256.uint256_sub": {"decorators": [], "pc": 691, "type": "function"}, "starkware.cairo.common.uint256.uint256_sub.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "b": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.uint256_sub.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_sub.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_sub.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_sub.Return": {"cairo_type": "(res: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_sub.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem": {"decorators": [], "pc": 510, "type": "function"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.Args": {"members": {"a": {"offset": 0, "cairo_type": "starkware.cairo.common.uint256.Uint256"}, "div": {"offset": 2, "cairo_type": "starkware.cairo.common.uint256.Uint256"}}, "size": 4, "full_name": "starkware.cairo.common.uint256.uint256_unsigned_div_rem.Args", "type": "struct"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.cairo.common.uint256.uint256_unsigned_div_rem.ImplicitArgs", "type": "struct"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.Return": {"cairo_type": "(quotient: starkware.cairo.common.uint256.Uint256, remainder: starkware.cairo.common.uint256.Uint256)", "type": "type_definition"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.SIZEOF_LOCALS": {"value": 4, "type": "const"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.a": {"references": [{"value": "[cast(fp + (-6), starkware.cairo.common.uint256.Uint256*)]", "pc": 510, "ap_tracking_data": {"offset": 0, "group": 32}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_unsigned_div_rem.a", "type": "reference"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.div": {"references": [{"value": "[cast(fp + (-4), starkware.cairo.common.uint256.Uint256*)]", "pc": 510, "ap_tracking_data": {"offset": 0, "group": 32}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_unsigned_div_rem.div", "type": "reference"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.quotient": {"references": [{"value": "[cast(fp, starkware.cairo.common.uint256.Uint256*)]", "pc": 525, "ap_tracking_data": {"offset": 5, "group": 32}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_unsigned_div_rem.quotient", "type": "reference"}, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.remainder": {"references": [{"value": "[cast(fp + 2, starkware.cairo.common.uint256.Uint256*)]", "pc": 525, "ap_tracking_data": {"offset": 5, "group": 32}}], "cairo_type": "starkware.cairo.common.uint256.Uint256", "full_name": "starkware.cairo.common.uint256.uint256_unsigned_div_rem.remainder", "type": "reference"}, "starkware.starknet.common.storage.ADDR_BOUND": {"value": -106710729501573572985208420194530329073740042555888586719489, "type": "const"}, "starkware.starknet.common.storage.MAX_STORAGE_ITEM_SIZE": {"value": 256, "type": "const"}, "starkware.starknet.common.storage.assert_250_bit": {"destination": "starkware.cairo.common.math.assert_250_bit", "type": "alias"}, "starkware.starknet.common.storage.normalize_address": {"decorators": ["known_ap_change"], "pc": 178, "type": "function"}, "starkware.starknet.common.storage.normalize_address.Args": {"members": {"addr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.storage.normalize_address.Args", "type": "struct"}, "starkware.starknet.common.storage.normalize_address.ImplicitArgs": {"members": {"range_check_ptr": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.storage.normalize_address.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.storage.normalize_address.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "starkware.starknet.common.storage.normalize_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.storage.normalize_address.addr": {"references": [{"value": "[cast(fp + (-3), felt*)]", "pc": 178, "ap_tracking_data": {"offset": 0, "group": 17}}], "cairo_type": "felt", "full_name": "starkware.starknet.common.storage.normalize_address.addr", "type": "reference"}, "starkware.starknet.common.storage.normalize_address.is_250": {"references": [{"value": "[cast(ap + (-1), felt*)]", "pc": 198, "ap_tracking_data": {"offset": 2, "group": 17}}], "cairo_type": "felt", "full_name": "starkware.starknet.common.storage.normalize_address.is_250", "type": "reference"}, "starkware.starknet.common.storage.normalize_address.is_small": {"references": [{"value": "[cast(ap + (-1), felt*)]", "pc": 180, "ap_tracking_data": {"offset": 1, "group": 17}}], "cairo_type": "felt", "full_name": "starkware.starknet.common.storage.normalize_address.is_small", "type": "reference"}, "starkware.starknet.common.syscalls.CALL_CONTRACT_SELECTOR": {"value": 20853273475220472486191784820, "type": "const"}, "starkware.starknet.common.syscalls.CallContract": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.CallContractRequest"}, "response": {"offset": 5, "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse"}}, "size": 7, "full_name": "starkware.starknet.common.syscalls.CallContract", "type": "struct"}, "starkware.starknet.common.syscalls.CallContractRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "contract_address": {"offset": 1, "cairo_type": "felt"}, "function_selector": {"offset": 2, "cairo_type": "felt"}, "calldata_size": {"offset": 3, "cairo_type": "felt"}, "calldata": {"offset": 4, "cairo_type": "felt*"}}, "size": 5, "full_name": "starkware.starknet.common.syscalls.CallContractRequest", "type": "struct"}, "starkware.starknet.common.syscalls.CallContractResponse": {"members": {"retdata_size": {"offset": 0, "cairo_type": "felt"}, "retdata": {"offset": 1, "cairo_type": "felt*"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.CallContractResponse", "type": "struct"}, "starkware.starknet.common.syscalls.DELEGATE_CALL_SELECTOR": {"value": 21167594061783206823196716140, "type": "const"}, "starkware.starknet.common.syscalls.DELEGATE_L1_HANDLER_SELECTOR": {"value": 23274015802972845247556842986379118667122, "type": "const"}, "starkware.starknet.common.syscalls.DEPLOY_SELECTOR": {"value": 75202468540281, "type": "const"}, "starkware.starknet.common.syscalls.Deploy": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.DeployRequest"}, "response": {"offset": 6, "cairo_type": "starkware.starknet.common.syscalls.DeployResponse"}}, "size": 9, "full_name": "starkware.starknet.common.syscalls.Deploy", "type": "struct"}, "starkware.starknet.common.syscalls.DeployRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "class_hash": {"offset": 1, "cairo_type": "felt"}, "contract_address_salt": {"offset": 2, "cairo_type": "felt"}, "constructor_calldata_size": {"offset": 3, "cairo_type": "felt"}, "constructor_calldata": {"offset": 4, "cairo_type": "felt*"}, "deploy_from_zero": {"offset": 5, "cairo_type": "felt"}}, "size": 6, "full_name": "starkware.starknet.common.syscalls.DeployRequest", "type": "struct"}, "starkware.starknet.common.syscalls.DeployResponse": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "constructor_retdata_size": {"offset": 1, "cairo_type": "felt"}, "constructor_retdata": {"offset": 2, "cairo_type": "felt*"}}, "size": 3, "full_name": "starkware.starknet.common.syscalls.DeployResponse", "type": "struct"}, "starkware.starknet.common.syscalls.DictAccess": {"destination": "starkware.cairo.common.dict_access.DictAccess", "type": "alias"}, "starkware.starknet.common.syscalls.EMIT_EVENT_SELECTOR": {"value": 1280709301550335749748, "type": "const"}, "starkware.starknet.common.syscalls.EmitEvent": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "keys_len": {"offset": 1, "cairo_type": "felt"}, "keys": {"offset": 2, "cairo_type": "felt*"}, "data_len": {"offset": 3, "cairo_type": "felt"}, "data": {"offset": 4, "cairo_type": "felt*"}}, "size": 5, "full_name": "starkware.starknet.common.syscalls.EmitEvent", "type": "struct"}, "starkware.starknet.common.syscalls.GET_BLOCK_NUMBER_SELECTOR": {"value": 1448089106835523001438702345020786, "type": "const"}, "starkware.starknet.common.syscalls.GET_BLOCK_TIMESTAMP_SELECTOR": {"value": 24294903732626645868215235778792757751152, "type": "const"}, "starkware.starknet.common.syscalls.GET_CALLER_ADDRESS_SELECTOR": {"value": 94901967781393078444254803017658102643, "type": "const"}, "starkware.starknet.common.syscalls.GET_CONTRACT_ADDRESS_SELECTOR": {"value": 6219495360805491471215297013070624192820083, "type": "const"}, "starkware.starknet.common.syscalls.GET_SEQUENCER_ADDRESS_SELECTOR": {"value": 1592190833581991703053805829594610833820054387, "type": "const"}, "starkware.starknet.common.syscalls.GET_TX_INFO_SELECTOR": {"value": 1317029390204112103023, "type": "const"}, "starkware.starknet.common.syscalls.GET_TX_SIGNATURE_SELECTOR": {"value": 1448089128652340074717162277007973, "type": "const"}, "starkware.starknet.common.syscalls.GetBlockNumber": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetBlockNumberResponse"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetBlockNumber", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockNumberRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetBlockNumberRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockNumberResponse": {"members": {"block_number": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetBlockNumberResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestamp": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetBlockTimestampResponse"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestamp", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestampRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetBlockTimestampResponse": {"members": {"block_timestamp": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetBlockTimestampResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddress": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetCallerAddressResponse"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetCallerAddress", "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddressRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetCallerAddressRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetCallerAddressResponse": {"members": {"caller_address": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetCallerAddressResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddress": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetContractAddressResponse"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetContractAddress", "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddressRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetContractAddressRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetContractAddressResponse": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetContractAddressResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddress": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetSequencerAddressResponse"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddress", "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddressRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetSequencerAddressResponse": {"members": {"sequencer_address": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetSequencerAddressResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfo": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetTxInfoResponse"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetTxInfo", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfoRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetTxInfoRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxInfoResponse": {"members": {"tx_info": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.TxInfo*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetTxInfoResponse", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignature": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureRequest"}, "response": {"offset": 1, "cairo_type": "starkware.starknet.common.syscalls.GetTxSignatureResponse"}}, "size": 3, "full_name": "starkware.starknet.common.syscalls.GetTxSignature", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignatureRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.GetTxSignatureRequest", "type": "struct"}, "starkware.starknet.common.syscalls.GetTxSignatureResponse": {"members": {"signature_len": {"offset": 0, "cairo_type": "felt"}, "signature": {"offset": 1, "cairo_type": "felt*"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.GetTxSignatureResponse", "type": "struct"}, "starkware.starknet.common.syscalls.LIBRARY_CALL_L1_HANDLER_SELECTOR": {"value": 436233452754198157705746250789557519228244616562, "type": "const"}, "starkware.starknet.common.syscalls.LIBRARY_CALL_SELECTOR": {"value": 92376026794327011772951660, "type": "const"}, "starkware.starknet.common.syscalls.LibraryCall": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.LibraryCallRequest"}, "response": {"offset": 5, "cairo_type": "starkware.starknet.common.syscalls.CallContractResponse"}}, "size": 7, "full_name": "starkware.starknet.common.syscalls.LibraryCall", "type": "struct"}, "starkware.starknet.common.syscalls.LibraryCallRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "class_hash": {"offset": 1, "cairo_type": "felt"}, "function_selector": {"offset": 2, "cairo_type": "felt"}, "calldata_size": {"offset": 3, "cairo_type": "felt"}, "calldata": {"offset": 4, "cairo_type": "felt*"}}, "size": 5, "full_name": "starkware.starknet.common.syscalls.LibraryCallRequest", "type": "struct"}, "starkware.starknet.common.syscalls.REPLACE_CLASS_SELECTOR": {"value": 25500403217443378527601783667, "type": "const"}, "starkware.starknet.common.syscalls.ReplaceClass": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "class_hash": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.ReplaceClass", "type": "struct"}, "starkware.starknet.common.syscalls.SEND_MESSAGE_TO_L1_SELECTOR": {"value": 433017908768303439907196859243777073, "type": "const"}, "starkware.starknet.common.syscalls.STORAGE_READ_SELECTOR": {"value": 100890693370601760042082660, "type": "const"}, "starkware.starknet.common.syscalls.STORAGE_WRITE_SELECTOR": {"value": 25828017502874050592466629733, "type": "const"}, "starkware.starknet.common.syscalls.SendMessageToL1SysCall": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "to_address": {"offset": 1, "cairo_type": "felt"}, "payload_size": {"offset": 2, "cairo_type": "felt"}, "payload_ptr": {"offset": 3, "cairo_type": "felt*"}}, "size": 4, "full_name": "starkware.starknet.common.syscalls.SendMessageToL1SysCall", "type": "struct"}, "starkware.starknet.common.syscalls.StorageRead": {"members": {"request": {"offset": 0, "cairo_type": "starkware.starknet.common.syscalls.StorageReadRequest"}, "response": {"offset": 2, "cairo_type": "starkware.starknet.common.syscalls.StorageReadResponse"}}, "size": 3, "full_name": "starkware.starknet.common.syscalls.StorageRead", "type": "struct"}, "starkware.starknet.common.syscalls.StorageReadRequest": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "address": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.StorageReadRequest", "type": "struct"}, "starkware.starknet.common.syscalls.StorageReadResponse": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.StorageReadResponse", "type": "struct"}, "starkware.starknet.common.syscalls.StorageWrite": {"members": {"selector": {"offset": 0, "cairo_type": "felt"}, "address": {"offset": 1, "cairo_type": "felt"}, "value": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "starkware.starknet.common.syscalls.StorageWrite", "type": "struct"}, "starkware.starknet.common.syscalls.TxInfo": {"members": {"version": {"offset": 0, "cairo_type": "felt"}, "account_contract_address": {"offset": 1, "cairo_type": "felt"}, "max_fee": {"offset": 2, "cairo_type": "felt"}, "signature_len": {"offset": 3, "cairo_type": "felt"}, "signature": {"offset": 4, "cairo_type": "felt*"}, "transaction_hash": {"offset": 5, "cairo_type": "felt"}, "chain_id": {"offset": 6, "cairo_type": "felt"}, "nonce": {"offset": 7, "cairo_type": "felt"}}, "size": 8, "full_name": "starkware.starknet.common.syscalls.TxInfo", "type": "struct"}, "starkware.starknet.common.syscalls.call_contract": {"decorators": [], "pc": 9, "type": "function"}, "starkware.starknet.common.syscalls.call_contract.Args": {"members": {"contract_address": {"offset": 0, "cairo_type": "felt"}, "function_selector": {"offset": 1, "cairo_type": "felt"}, "calldata_size": {"offset": 2, "cairo_type": "felt"}, "calldata": {"offset": 3, "cairo_type": "felt*"}}, "size": 4, "full_name": "starkware.starknet.common.syscalls.call_contract.Args", "type": "struct"}, "starkware.starknet.common.syscalls.call_contract.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.call_contract.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.call_contract.Return": {"cairo_type": "(retdata_size: felt, retdata: felt*)", "type": "type_definition"}, "starkware.starknet.common.syscalls.call_contract.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.call_contract.syscall_ptr": {"references": [{"value": "[cast(fp + (-7), felt**)]", "pc": 9, "ap_tracking_data": {"offset": 0, "group": 2}}, {"value": "cast([fp + (-7)] + 7, felt*)", "pc": 16, "ap_tracking_data": {"offset": 1, "group": 2}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.call_contract.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.emit_event": {"decorators": [], "pc": 70, "type": "function"}, "starkware.starknet.common.syscalls.emit_event.Args": {"members": {"keys_len": {"offset": 0, "cairo_type": "felt"}, "keys": {"offset": 1, "cairo_type": "felt*"}, "data_len": {"offset": 2, "cairo_type": "felt"}, "data": {"offset": 3, "cairo_type": "felt*"}}, "size": 4, "full_name": "starkware.starknet.common.syscalls.emit_event.Args", "type": "struct"}, "starkware.starknet.common.syscalls.emit_event.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.emit_event.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.emit_event.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.starknet.common.syscalls.emit_event.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.emit_event.syscall_ptr": {"references": [{"value": "[cast(fp + (-7), felt**)]", "pc": 70, "ap_tracking_data": {"offset": 0, "group": 9}}, {"value": "cast([fp + (-7)] + 5, felt*)", "pc": 77, "ap_tracking_data": {"offset": 1, "group": 9}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.emit_event.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.get_block_timestamp": {"decorators": [], "pc": 47, "type": "function"}, "starkware.starknet.common.syscalls.get_block_timestamp.Args": {"members": {}, "size": 0, "full_name": "starkware.starknet.common.syscalls.get_block_timestamp.Args", "type": "struct"}, "starkware.starknet.common.syscalls.get_block_timestamp.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.get_block_timestamp.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.get_block_timestamp.Return": {"cairo_type": "(block_timestamp: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_block_timestamp.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_block_timestamp.syscall_ptr": {"references": [{"value": "[cast(fp + (-3), felt**)]", "pc": 47, "ap_tracking_data": {"offset": 0, "group": 6}}, {"value": "cast([fp + (-3)] + 2, felt*)", "pc": 50, "ap_tracking_data": {"offset": 1, "group": 6}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.get_block_timestamp.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.get_caller_address": {"decorators": [], "pc": 33, "type": "function"}, "starkware.starknet.common.syscalls.get_caller_address.Args": {"members": {}, "size": 0, "full_name": "starkware.starknet.common.syscalls.get_caller_address.Args", "type": "struct"}, "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.get_caller_address.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.get_caller_address.Return": {"cairo_type": "(caller_address: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_caller_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": {"references": [{"value": "[cast(fp + (-3), felt**)]", "pc": 33, "ap_tracking_data": {"offset": 0, "group": 4}}, {"value": "cast([fp + (-3)] + 2, felt*)", "pc": 36, "ap_tracking_data": {"offset": 1, "group": 4}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.get_caller_address.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.get_contract_address": {"decorators": [], "pc": 40, "type": "function"}, "starkware.starknet.common.syscalls.get_contract_address.Args": {"members": {}, "size": 0, "full_name": "starkware.starknet.common.syscalls.get_contract_address.Args", "type": "struct"}, "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.get_contract_address.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.get_contract_address.Return": {"cairo_type": "(contract_address: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.get_contract_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": {"references": [{"value": "[cast(fp + (-3), felt**)]", "pc": 40, "ap_tracking_data": {"offset": 0, "group": 5}}, {"value": "cast([fp + (-3)] + 2, felt*)", "pc": 43, "ap_tracking_data": {"offset": 1, "group": 5}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.get_contract_address.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.library_call": {"decorators": [], "pc": 21, "type": "function"}, "starkware.starknet.common.syscalls.library_call.Args": {"members": {"class_hash": {"offset": 0, "cairo_type": "felt"}, "function_selector": {"offset": 1, "cairo_type": "felt"}, "calldata_size": {"offset": 2, "cairo_type": "felt"}, "calldata": {"offset": 3, "cairo_type": "felt*"}}, "size": 4, "full_name": "starkware.starknet.common.syscalls.library_call.Args", "type": "struct"}, "starkware.starknet.common.syscalls.library_call.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.library_call.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.library_call.Return": {"cairo_type": "(retdata_size: felt, retdata: felt*)", "type": "type_definition"}, "starkware.starknet.common.syscalls.library_call.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.library_call.syscall_ptr": {"references": [{"value": "[cast(fp + (-7), felt**)]", "pc": 21, "ap_tracking_data": {"offset": 0, "group": 3}}, {"value": "cast([fp + (-7)] + 7, felt*)", "pc": 28, "ap_tracking_data": {"offset": 1, "group": 3}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.library_call.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.storage_read": {"decorators": [], "pc": 54, "type": "function"}, "starkware.starknet.common.syscalls.storage_read.Args": {"members": {"address": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.storage_read.Args", "type": "struct"}, "starkware.starknet.common.syscalls.storage_read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.storage_read.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.storage_read.Return": {"cairo_type": "(value: felt)", "type": "type_definition"}, "starkware.starknet.common.syscalls.storage_read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.storage_read.syscall_ptr": {"references": [{"value": "[cast(fp + (-4), felt**)]", "pc": 54, "ap_tracking_data": {"offset": 0, "group": 7}}, {"value": "cast([fp + (-4)] + 3, felt*)", "pc": 58, "ap_tracking_data": {"offset": 1, "group": 7}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.storage_read.syscall_ptr", "type": "reference"}, "starkware.starknet.common.syscalls.storage_write": {"decorators": [], "pc": 62, "type": "function"}, "starkware.starknet.common.syscalls.storage_write.Args": {"members": {"address": {"offset": 0, "cairo_type": "felt"}, "value": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "starkware.starknet.common.syscalls.storage_write.Args", "type": "struct"}, "starkware.starknet.common.syscalls.storage_write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}}, "size": 1, "full_name": "starkware.starknet.common.syscalls.storage_write.ImplicitArgs", "type": "struct"}, "starkware.starknet.common.syscalls.storage_write.Return": {"cairo_type": "()", "type": "type_definition"}, "starkware.starknet.common.syscalls.storage_write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "starkware.starknet.common.syscalls.storage_write.syscall_ptr": {"references": [{"value": "[cast(fp + (-5), felt**)]", "pc": 62, "ap_tracking_data": {"offset": 0, "group": 8}}, {"value": "cast([fp + (-5)] + 3, felt*)", "pc": 67, "ap_tracking_data": {"offset": 1, "group": 8}}], "cairo_type": "felt*", "full_name": "starkware.starknet.common.syscalls.storage_write.syscall_ptr", "type": "reference"}, "upgrades.library.FALSE": {"destination": "starkware.cairo.common.bool.FALSE", "type": "alias"}, "upgrades.library.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "upgrades.library.Proxy": {"type": "namespace"}, "upgrades.library.Proxy.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy.Args", "type": "struct"}, "upgrades.library.Proxy.ImplicitArgs": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy._set_implementation": {"decorators": [], "pc": 877, "type": "function"}, "upgrades.library.Proxy._set_implementation.Args": {"members": {"new_implementation": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "upgrades.library.Proxy._set_implementation.Args", "type": "struct"}, "upgrades.library.Proxy._set_implementation.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "upgrades.library.Proxy._set_implementation.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy._set_implementation.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy._set_implementation.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy.assert_only_admin": {"decorators": [], "pc": 892, "type": "function"}, "upgrades.library.Proxy.assert_only_admin.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy.assert_only_admin.Args", "type": "struct"}, "upgrades.library.Proxy.assert_only_admin.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "upgrades.library.Proxy.assert_only_admin.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy.assert_only_admin.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy.assert_only_admin.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_admin": {"type": "namespace"}, "upgrades.library.Proxy_admin.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_admin.Args", "type": "struct"}, "upgrades.library.Proxy_admin.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "upgrades.library.Proxy_admin.ImplicitArgs": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_admin.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_admin.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy_admin.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_admin.addr": {"decorators": [], "pc": 859, "type": "function"}, "upgrades.library.Proxy_admin.addr.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_admin.addr.Args", "type": "struct"}, "upgrades.library.Proxy_admin.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "upgrades.library.Proxy_admin.addr.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_admin.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "upgrades.library.Proxy_admin.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_admin.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "upgrades.library.Proxy_admin.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "upgrades.library.Proxy_admin.read": {"decorators": [], "pc": 864, "type": "function"}, "upgrades.library.Proxy_admin.read.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_admin.read.Args", "type": "struct"}, "upgrades.library.Proxy_admin.read.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "upgrades.library.Proxy_admin.read.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_admin.read.Return": {"cairo_type": "(proxy_admin: felt)", "type": "type_definition"}, "upgrades.library.Proxy_admin.read.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_admin.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "upgrades.library.Proxy_admin.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "upgrades.library.Proxy_implementation_address": {"type": "namespace"}, "upgrades.library.Proxy_implementation_address.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_implementation_address.Args", "type": "struct"}, "upgrades.library.Proxy_implementation_address.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "upgrades.library.Proxy_implementation_address.ImplicitArgs": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_implementation_address.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_implementation_address.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy_implementation_address.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_implementation_address.addr": {"decorators": [], "pc": 842, "type": "function"}, "upgrades.library.Proxy_implementation_address.addr.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_implementation_address.addr.Args", "type": "struct"}, "upgrades.library.Proxy_implementation_address.addr.ImplicitArgs": {"members": {"pedersen_ptr": {"offset": 0, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "upgrades.library.Proxy_implementation_address.addr.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_implementation_address.addr.Return": {"cairo_type": "(res: felt)", "type": "type_definition"}, "upgrades.library.Proxy_implementation_address.addr.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_implementation_address.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "upgrades.library.Proxy_implementation_address.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "upgrades.library.Proxy_implementation_address.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "upgrades.library.Proxy_implementation_address.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "upgrades.library.Proxy_implementation_address.write": {"decorators": [], "pc": 847, "type": "function"}, "upgrades.library.Proxy_implementation_address.write.Args": {"members": {"value": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "upgrades.library.Proxy_implementation_address.write.Args", "type": "struct"}, "upgrades.library.Proxy_implementation_address.write.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "pedersen_ptr": {"offset": 1, "cairo_type": "starkware.cairo.common.cairo_builtins.HashBuiltin*"}, "range_check_ptr": {"offset": 2, "cairo_type": "felt"}}, "size": 3, "full_name": "upgrades.library.Proxy_implementation_address.write.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_implementation_address.write.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy_implementation_address.write.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_initialized": {"type": "namespace"}, "upgrades.library.Proxy_initialized.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_initialized.Args", "type": "struct"}, "upgrades.library.Proxy_initialized.HashBuiltin": {"destination": "starkware.cairo.common.cairo_builtins.HashBuiltin", "type": "alias"}, "upgrades.library.Proxy_initialized.ImplicitArgs": {"members": {}, "size": 0, "full_name": "upgrades.library.Proxy_initialized.ImplicitArgs", "type": "struct"}, "upgrades.library.Proxy_initialized.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Proxy_initialized.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Proxy_initialized.hash2": {"destination": "starkware.cairo.common.hash.hash2", "type": "alias"}, "upgrades.library.Proxy_initialized.normalize_address": {"destination": "starkware.starknet.common.storage.normalize_address", "type": "alias"}, "upgrades.library.Proxy_initialized.storage_read": {"destination": "starkware.starknet.common.syscalls.storage_read", "type": "alias"}, "upgrades.library.Proxy_initialized.storage_write": {"destination": "starkware.starknet.common.syscalls.storage_write", "type": "alias"}, "upgrades.library.TRUE": {"destination": "starkware.cairo.common.bool.TRUE", "type": "alias"}, "upgrades.library.Upgraded": {"type": "namespace"}, "upgrades.library.Upgraded.Args": {"members": {}, "size": 0, "full_name": "upgrades.library.Upgraded.Args", "type": "struct"}, "upgrades.library.Upgraded.ImplicitArgs": {"members": {}, "size": 0, "full_name": "upgrades.library.Upgraded.ImplicitArgs", "type": "struct"}, "upgrades.library.Upgraded.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Upgraded.SELECTOR": {"value": 1291924484015741933195105472014600539495279993452337828418116470835452386035, "type": "const"}, "upgrades.library.Upgraded.SIZEOF_LOCALS": {"value": 0, "type": "const"}, "upgrades.library.Upgraded.alloc": {"destination": "starkware.cairo.common.alloc.alloc", "type": "alias"}, "upgrades.library.Upgraded.emit": {"decorators": [], "pc": 818, "type": "function"}, "upgrades.library.Upgraded.emit.Args": {"members": {"implementation": {"offset": 0, "cairo_type": "felt"}}, "size": 1, "full_name": "upgrades.library.Upgraded.emit.Args", "type": "struct"}, "upgrades.library.Upgraded.emit.ImplicitArgs": {"members": {"syscall_ptr": {"offset": 0, "cairo_type": "felt*"}, "range_check_ptr": {"offset": 1, "cairo_type": "felt"}}, "size": 2, "full_name": "upgrades.library.Upgraded.emit.ImplicitArgs", "type": "struct"}, "upgrades.library.Upgraded.emit.Return": {"cairo_type": "()", "type": "type_definition"}, "upgrades.library.Upgraded.emit.SIZEOF_LOCALS": {"value": 2, "type": "const"}, "upgrades.library.Upgraded.emit_event": {"destination": "starkware.starknet.common.syscalls.emit_event", "type": "alias"}, "upgrades.library.Upgraded.memcpy": {"destination": "starkware.cairo.common.memcpy.memcpy", "type": "alias"}, "upgrades.library.get_caller_address": {"destination": "starkware.starknet.common.syscalls.get_caller_address", "type": "alias"}}, "hints": {"0": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 0}}, "accessible_scopes": ["starkware.cairo.common.alloc", "starkware.cairo.common.alloc.alloc"], "code": "memory[ap] = segments.add()"}], "16": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.call_contract.syscall_ptr": 0}, "ap_tracking": {"offset": 1, "group": 2}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.call_contract"], "code": "syscall_handler.call_contract(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "28": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.library_call.syscall_ptr": 1}, "ap_tracking": {"offset": 1, "group": 3}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.library_call"], "code": "syscall_handler.library_call(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "36": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.get_caller_address.syscall_ptr": 2}, "ap_tracking": {"offset": 1, "group": 4}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_caller_address"], "code": "syscall_handler.get_caller_address(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "43": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.get_contract_address.syscall_ptr": 3}, "ap_tracking": {"offset": 1, "group": 5}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_contract_address"], "code": "syscall_handler.get_contract_address(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "50": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.get_block_timestamp.syscall_ptr": 4}, "ap_tracking": {"offset": 1, "group": 6}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.get_block_timestamp"], "code": "syscall_handler.get_block_timestamp(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "58": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.storage_read.syscall_ptr": 5}, "ap_tracking": {"offset": 1, "group": 7}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_read"], "code": "syscall_handler.storage_read(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "67": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.storage_write.syscall_ptr": 6}, "ap_tracking": {"offset": 1, "group": 8}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.storage_write"], "code": "syscall_handler.storage_write(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "77": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.syscalls.emit_event.syscall_ptr": 7}, "ap_tracking": {"offset": 1, "group": 9}}, "accessible_scopes": ["starkware.starknet.common.syscalls", "starkware.starknet.common.syscalls.emit_event"], "code": "syscall_handler.emit_event(segments=segments, syscall_ptr=ids.syscall_ptr)"}], "80": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_not_zero.value": 8}, "ap_tracking": {"offset": 0, "group": 10}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_not_zero"], "code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.value)\nassert ids.value % PRIME != 0, f'assert_not_zero failed: {ids.value} = 0.'"}], "85": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_nn.a": 9}, "ap_tracking": {"offset": 0, "group": 11}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_nn"], "code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert 0 <= ids.a % PRIME < range_check_builtin.bound, f'a = {ids.a} is out of range.'"}], "94": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_250_bit.high": 12, "starkware.cairo.common.math.assert_250_bit.low": 11, "starkware.cairo.common.math.assert_250_bit.value": 10}, "ap_tracking": {"offset": 0, "group": 13}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_250_bit"], "code": "from starkware.cairo.common.math_utils import as_int\n\n# Correctness check.\nvalue = as_int(ids.value, PRIME) % PRIME\nassert value < ids.UPPER_BOUND, f'{value} is outside of the range [0, 2**250).'\n\n# Calculation for the assertion.\nids.high, ids.low = divmod(ids.value, ids.SHIFT)"}], "107": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_le_felt.a": 13, "starkware.cairo.common.math.assert_le_felt.b": 14, "starkware.cairo.common.math.assert_le_felt.range_check_ptr": 15}, "ap_tracking": {"offset": 0, "group": 14}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "code": "import itertools\n\nfrom starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\na = ids.a % PRIME\nb = ids.b % PRIME\nassert a <= b, f'a = {a} is not less than or equal to b = {b}.'\n\n# Find an arc less than PRIME / 3, and another less than PRIME / 2.\nlengths_and_indices = [(a, 0), (b - a, 1), (PRIME - 1 - b, 2)]\nlengths_and_indices.sort()\nassert lengths_and_indices[0][0] <= PRIME // 3 and lengths_and_indices[1][0] <= PRIME // 2\nexcluded = lengths_and_indices[2][1]\n\nmemory[ids.range_check_ptr + 1], memory[ids.range_check_ptr + 0] = (\n divmod(lengths_and_indices[0][0], ids.PRIME_OVER_3_HIGH))\nmemory[ids.range_check_ptr + 3], memory[ids.range_check_ptr + 2] = (\n divmod(lengths_and_indices[1][0], ids.PRIME_OVER_2_HIGH))"}], "117": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 8, "group": 14}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "code": "memory[ap] = 1 if excluded != 0 else 0"}], "131": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 9, "group": 14}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "code": "memory[ap] = 1 if excluded != 1 else 0"}], "143": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 10, "group": 14}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_le_felt"], "code": "assert excluded == 2"}], "152": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.assert_lt_felt.a": 16, "starkware.cairo.common.math.assert_lt_felt.b": 17}, "ap_tracking": {"offset": 0, "group": 15}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.assert_lt_felt"], "code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.a)\nassert_integer(ids.b)\nassert (ids.a % PRIME) < (ids.b % PRIME), \\\n f'a = {ids.a % PRIME} is not less than b = {ids.b % PRIME}.'"}], "163": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math.unsigned_div_rem.div": 19, "starkware.cairo.common.math.unsigned_div_rem.q": 21, "starkware.cairo.common.math.unsigned_div_rem.r": 20, "starkware.cairo.common.math.unsigned_div_rem.value": 18}, "ap_tracking": {"offset": 0, "group": 16}}, "accessible_scopes": ["starkware.cairo.common.math", "starkware.cairo.common.math.unsigned_div_rem"], "code": "from starkware.cairo.common.math_utils import assert_integer\nassert_integer(ids.div)\nassert 0 < ids.div <= PRIME // range_check_builtin.bound, \\\n f'div={hex(ids.div)} is out of the valid range.'\nids.q, ids.r = divmod(ids.value, ids.div)"}], "180": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.storage.normalize_address.addr": 22, "starkware.starknet.common.storage.normalize_address.is_small": 23}, "ap_tracking": {"offset": 1, "group": 17}}, "accessible_scopes": ["starkware.starknet.common.storage", "starkware.starknet.common.storage.normalize_address"], "code": "# Verify the assumptions on the relationship between 2**250, ADDR_BOUND and PRIME.\nADDR_BOUND = ids.ADDR_BOUND % PRIME\nassert (2**250 < ADDR_BOUND <= 2**251) and (2 * 2**250 < PRIME) and (\n ADDR_BOUND * 2 > PRIME), \\\n 'normalize_address() cannot be used with the current constants.'\nids.is_small = 1 if ids.addr < ADDR_BOUND else 0"}], "198": [{"flow_tracking_data": {"reference_ids": {"starkware.starknet.common.storage.normalize_address.addr": 22, "starkware.starknet.common.storage.normalize_address.is_250": 24}, "ap_tracking": {"offset": 2, "group": 17}}, "accessible_scopes": ["starkware.starknet.common.storage", "starkware.starknet.common.storage.normalize_address"], "code": "ids.is_250 = 1 if ids.addr < 2**250 else 0"}], "226": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math_cmp.is_nn.a": 25}, "ap_tracking": {"offset": 0, "group": 19}}, "accessible_scopes": ["starkware.cairo.common.math_cmp", "starkware.cairo.common.math_cmp.is_nn"], "code": "memory[ap] = 0 if 0 <= (ids.a % PRIME) < range_check_builtin.bound else 1"}], "236": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math_cmp.is_nn.a": 25}, "ap_tracking": {"offset": 1, "group": 19}}, "accessible_scopes": ["starkware.cairo.common.math_cmp", "starkware.cairo.common.math_cmp.is_nn"], "code": "memory[ap] = 0 if 0 <= ((-ids.a - 1) % PRIME) < range_check_builtin.bound else 1"}], "264": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.math_cmp.is_le_felt.a": 26, "starkware.cairo.common.math_cmp.is_le_felt.b": 27}, "ap_tracking": {"offset": 0, "group": 21}}, "accessible_scopes": ["starkware.cairo.common.math_cmp", "starkware.cairo.common.math_cmp.is_le_felt"], "code": "memory[ap] = 0 if (ids.a % PRIME) <= (ids.b % PRIME) else 1"}], "291": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.uint256.uint256_add.a": 28, "starkware.cairo.common.uint256.uint256_add.b": 29, "starkware.cairo.common.uint256.uint256_add.carry_high": 31, "starkware.cairo.common.uint256.uint256_add.carry_low": 30}, "ap_tracking": {"offset": 4, "group": 23}}, "accessible_scopes": ["starkware.cairo.common.uint256", "starkware.cairo.common.uint256.uint256_add"], "code": "sum_low = ids.a.low + ids.b.low\nids.carry_low = 1 if sum_low >= ids.SHIFT else 0\nsum_high = ids.a.high + ids.b.high + ids.carry_low\nids.carry_high = 1 if sum_high >= ids.SHIFT else 0"}], "313": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.uint256.split_64.a": 32, "starkware.cairo.common.uint256.split_64.high": 34, "starkware.cairo.common.uint256.split_64.low": 33}, "ap_tracking": {"offset": 2, "group": 24}}, "accessible_scopes": ["starkware.cairo.common.uint256", "starkware.cairo.common.uint256.split_64"], "code": "ids.low = ids.a & ((1<<64) - 1)\nids.high = ids.a >> 64"}], "417": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.uint256.uint256_sqrt.n": 35, "starkware.cairo.common.uint256.uint256_sqrt.root": 36}, "ap_tracking": {"offset": 2, "group": 26}}, "accessible_scopes": ["starkware.cairo.common.uint256", "starkware.cairo.common.uint256.uint256_sqrt"], "code": "from starkware.python.math_utils import isqrt\nn = (ids.n.high << 128) + ids.n.low\nroot = isqrt(n)\nassert 0 <= root < 2 ** 128\nids.root.low = root\nids.root.high = 0"}], "525": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.uint256.uint256_unsigned_div_rem.a": 37, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.div": 38, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.quotient": 39, "starkware.cairo.common.uint256.uint256_unsigned_div_rem.remainder": 40}, "ap_tracking": {"offset": 5, "group": 32}}, "accessible_scopes": ["starkware.cairo.common.uint256", "starkware.cairo.common.uint256.uint256_unsigned_div_rem"], "code": "a = (ids.a.high << 128) + ids.a.low\ndiv = (ids.div.high << 128) + ids.div.low\nquotient, remainder = divmod(a, div)\n\nids.quotient.low = quotient & ((1 << 128) - 1)\nids.quotient.high = quotient >> 128\nids.remainder.low = remainder & ((1 << 128) - 1)\nids.remainder.high = remainder >> 128"}], "579": [{"flow_tracking_data": {"reference_ids": {"starkware.cairo.common.uint256.uint256_mul_div_mod.a": 41, "starkware.cairo.common.uint256.uint256_mul_div_mod.b": 42, "starkware.cairo.common.uint256.uint256_mul_div_mod.div": 43, "starkware.cairo.common.uint256.uint256_mul_div_mod.quotient_high": 45, "starkware.cairo.common.uint256.uint256_mul_div_mod.quotient_low": 44, "starkware.cairo.common.uint256.uint256_mul_div_mod.remainder": 46}, "ap_tracking": {"offset": 182, "group": 33}}, "accessible_scopes": ["starkware.cairo.common.uint256", "starkware.cairo.common.uint256.uint256_mul_div_mod"], "code": "a = (ids.a.high << 128) + ids.a.low\nb = (ids.b.high << 128) + ids.b.low\ndiv = (ids.div.high << 128) + ids.div.low\nquotient, remainder = divmod(a * b, div)\n\nids.quotient_low.low = quotient & ((1 << 128) - 1)\nids.quotient_low.high = (quotient >> 128) & ((1 << 128) - 1)\nids.quotient_high.low = (quotient >> 256) & ((1 << 128) - 1)\nids.quotient_high.high = quotient >> 384\nids.remainder.low = remainder & ((1 << 128) - 1)\nids.remainder.high = remainder >> 128"}], "3897": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 97, "group": 159}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.upgrade"], "code": "memory[ap] = segments.add()"}], "3926": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 78, "group": 161}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_min_deposit_eth"], "code": "memory[ap] = segments.add()"}], "3953": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 163}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_max_slippage_percentage"], "code": "memory[ap] = segments.add()"}], "3980": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 165}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_eth_bridge_token_address"], "code": "memory[ap] = segments.add()"}], "4007": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 167}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_fractional_fee"], "code": "memory[ap] = segments.add()"}], "4034": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 169}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_staking_pool"], "code": "memory[ap] = segments.add()"}], "4061": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 171}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_stake_token"], "code": "memory[ap] = segments.add()"}], "4088": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 173}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_myswap_amm"], "code": "memory[ap] = segments.add()"}], "4115": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 175}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_myswap_lp_token"], "code": "memory[ap] = segments.add()"}], "4142": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 177}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_myswap_pool_id"], "code": "memory[ap] = segments.add()"}], "4169": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 69, "group": 179}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.set_marketing_verifier_chash"], "code": "memory[ap] = segments.add()"}], "4188": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 182}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.is_action_eligible_encode_return"], "code": "memory[ap] = segments.add()"}], "4226": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 187}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.stake_encode_return"], "code": "memory[ap] = segments.add()"}], "4273": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 193}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.close_deposit_batch"], "code": "memory[ap] = segments.add()"}], "4300": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 197}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.handle_deposit_batch"], "code": "memory[ap] = segments.add()"}], "4318": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 200}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.distribute_deposit_batch_encode_return"], "code": "memory[ap] = segments.add()"}], "4354": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 204}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.get_deposit_batch_encode_return"], "code": "memory[ap] = segments.add()"}], "4397": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 207}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.get_active_deposit_batch_id_encode_return"], "code": "memory[ap] = segments.add()"}], "4429": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 211}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.withdraw_encode_return"], "code": "memory[ap] = segments.add()"}], "4476": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 3225, "group": 215}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.close_withdraw_batch"], "code": "memory[ap] = segments.add()"}], "4492": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 217}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.get_withdraw_batch_encode_return"], "code": "memory[ap] = segments.add()"}], "4535": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 220}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.get_active_withdraw_batch_id_encode_return"], "code": "memory[ap] = segments.add()"}], "4577": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 436, "group": 223}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.handle_withdraw_batch"], "code": "memory[ap] = segments.add()"}], "4595": [{"flow_tracking_data": {"reference_ids": {}, "ap_tracking": {"offset": 0, "group": 226}}, "accessible_scopes": ["__main__", "__main__", "__wrappers__", "__wrappers__.distribute_withdraw_batch_encode_return"], "code": "memory[ap] = segments.add()"}]}, "main_scope": "__main__", "debug_info": null, "builtins": ["pedersen", "range_check"], "data": ["0x40780017fff7fff", "0x1", "0x208b7fff7fff7ffe", "0x400380007ffb7ffc", "0x400380017ffb7ffd", "0x482680017ffb8000", "0x3", "0x480280027ffb8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x43616c6c436f6e7472616374", "0x400280007ff97fff", "0x400380017ff97ffa", "0x400380027ff97ffb", "0x400380037ff97ffc", "0x400380047ff97ffd", "0x482680017ff98000", "0x7", "0x480280057ff98000", "0x480280067ff98000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x4c69627261727943616c6c", "0x400280007ff97fff", "0x400380017ff97ffa", "0x400380027ff97ffb", "0x400380037ff97ffc", "0x400380047ff97ffd", "0x482680017ff98000", "0x7", "0x480280057ff98000", "0x480280067ff98000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x47657443616c6c657241646472657373", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x476574436f6e747261637441646472657373", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x476574426c6f636b54696d657374616d70", "0x400280007ffd7fff", "0x482680017ffd8000", "0x2", "0x480280017ffd8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x53746f7261676552656164", "0x400280007ffc7fff", "0x400380017ffc7ffd", "0x482680017ffc8000", "0x3", "0x480280027ffc8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x53746f726167655772697465", "0x400280007ffb7fff", "0x400380017ffb7ffc", "0x400380027ffb7ffd", "0x482680017ffb8000", "0x3", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x456d69744576656e74", "0x400280007ff97fff", "0x400380017ff97ffa", "0x400380027ff97ffb", "0x400380037ff97ffc", "0x400380047ff97ffd", "0x482680017ff98000", "0x5", "0x208b7fff7fff7ffe", "0x20780017fff7ffd", "0x4", "0x400780017fff7ffd", "0x1", "0x208b7fff7fff7ffe", "0x400380007ffc7ffd", "0x482680017ffc8000", "0x1", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x48297ffc80007ffd", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffb", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x3ffffffffffffffffffffffffffffff", "0x480280017ffc8000", "0x48307fff80007ffe", "0x400280027ffc7fff", "0x480280017ffc8000", "0x484480017fff8000", "0x100000000000000000000000000000000", "0x480280007ffc8000", "0x40317fff7ffe7ffd", "0x482680017ffc8000", "0x3", "0x208b7fff7fff7ffe", "0x480280007ffb8000", "0x480280017ffb8000", "0x484480017fff8000", "0x2aaaaaaaaaaaab05555555555555556", "0x48307fff7ffd8000", "0x480280027ffb8000", "0x480280037ffb8000", "0x484480017fff8000", "0x4000000000000088000000000000001", "0x48307fff7ffd8000", "0xa0680017fff8000", "0xe", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48287ffc80007fff", "0x40307ffc7ff87fff", "0x48297ffd80007ffc", "0x482680017ffd8000", "0x1", "0x48507fff7ffe8000", "0x40507ff97ff57fff", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xc", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48287ffd80007fff", "0x48327fff7ffc8000", "0x40307ffa7ff67fff", "0x48527ffe7ffc8000", "0x40507ff97ff57fff", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0x40317ffd7ff97ffd", "0x48297ffc80007ffd", "0x48527fff7ffc8000", "0x40507ffb7ff77fff", "0x40780017fff7fff", "0x2", "0x482680017ffb8000", "0x4", "0x208b7fff7fff7ffe", "0x48297ffd80007ffc", "0x20680017fff7fff", "0x4", "0x402780017ffc7ffc", "0x1", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcc", "0x208b7fff7fff7ffe", "0x482680017ffb8000", "0x2", "0x480280007ffb8000", "0x482680017ffd8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb2", "0x480280017ffb8000", "0x48487ffd7fff8000", "0x480280007ffb8000", "0x40317fff7ffe7ffc", "0x48127ffc7fff8000", "0x480280017ffb8000", "0x480280007ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x20680017fff7fff", "0x10", "0x480a7ffc7fff8000", "0x482680017ffd8000", "0x11000000000000000000000000000000000000000000000101", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa6", "0x480680017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x48127ffe7fff8000", "0x48287ffd80007ffe", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa0", "0x482680017ffd8000", "0x11000000000000000000000000000000000000000000000101", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x20680017fff7fff", "0xc", "0x40780017fff7fff", "0xa", "0x480680017fff8000", "0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeff", "0x480a7ffc7fff8000", "0x48287ffd80007ffe", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff91", "0x10780017fff7fff", "0x8", "0x40780017fff7fff", "0xb", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff89", "0x480a7ffd7fff8000", "0x208b7fff7fff7ffe", "0x20780017fff7ffd", "0x5", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xa", "0x400380007ffc7ffd", "0x40780017fff7fff", "0x14", "0x482680017ffc8000", "0x1", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xe", "0x484680017ffd8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x482480017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x400280007ffc7fff", "0x40780017fff7fff", "0x11", "0x482680017ffc8000", "0x1", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x100000000000000000000000000000000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff6e", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x48297ffc80007ffd", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffde", "0x208b7fff7fff7ffe", "0xa0680017fff8000", "0xc", "0x40780017fff7fff", "0x6", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff5d", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffd7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff82", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x400380007ffb7ffc", "0x400380017ffb7ffd", "0x482680017ffb8000", "0x2", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x4", "0x404b800280028002", "0x404b800380038003", "0x482a7ffc7ffa8000", "0x4846800180028000", "0x100000000000000000000000000000000", "0x40327fff80007ffe", "0x482a7ffd7ffb8000", "0x482880027fff8000", "0x4846800180038000", "0x100000000000000000000000000000000", "0x40327fff80017ffe", "0x480a7ff97fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a80037fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x4846800180018000", "0x10000000000000000", "0x40337fff80007ffd", "0x400380007ffc8000", "0x480680017fff8000", "0xffffffffffffffff", "0x4828800080007fff", "0x400280017ffc7fff", "0x400380027ffc8001", "0x482680017ffc8000", "0x3", "0x480a80007fff8000", "0x480a80017fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x48127ffd7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe9", "0x48127ffd7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe5", "0x48127ffd7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe1", "0x48127ffd7fff8000", "0x48507ff17fd98000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdd", "0x48507fe67fcf8000", "0x48507fe67fcd8000", "0x48307fff7ffe8000", "0x48127ffa7fff8000", "0x48307ffb7ffe8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd6", "0x48507fd77fcb8000", "0x48507fd77fbf8000", "0x48307fff7ffe8000", "0x48507fe07fbc8000", "0x48307fff7ffe8000", "0x48127ff87fff8000", "0x48307ff97ffe8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcd", "0x48507fc67fbb8000", "0x48507fc67fb98000", "0x48307fff7ffe8000", "0x48507fcf7fac8000", "0x48307fff7ffe8000", "0x48507fce7fa98000", "0x48307fff7ffe8000", "0x48127ff67fff8000", "0x48307ff77ffe8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2", "0x48507fb47fa88000", "0x48507fbe7fa68000", "0x48307fff7ffe8000", "0x48507fbd7f998000", "0x48307fff7ffe8000", "0x48127ff87fff8000", "0x48307ff97ffe8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb9", "0x48507fae7f978000", "0x48507fae7f958000", "0x48307fff7ffe8000", "0x48127ffa7fff8000", "0x48307ffb7ffe8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb2", "0x48507fa07f888000", "0x48127ffc7fff8000", "0x48307ffd7ffe8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffad", "0x480680017fff8000", "0x10000000000000000", "0x48507fac7fff8000", "0x480680017fff8000", "0x10000000000000000", "0x48507fce7fff8000", "0x480680017fff8000", "0x10000000000000000", "0x48507fec7fff8000", "0x480680017fff8000", "0x10000000000000000", "0x48507ff87fff8000", "0x48127ff57fff8000", "0x48307ff87f958000", "0x48307ff97fb48000", "0x48307ffa7fd78000", "0x48307ffb7ff28000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x400780017fff8001", "0x0", "0x400380007ffb8000", "0x482680017ffb8000", "0x1", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff9e", "0x400680017fff7ffe", "0x0", "0x400680017fff7fff", "0x0", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x3d", "0x400680017fff7fff", "0x1", "0x48127ffe7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff62", "0x400680017fff7fff", "0x0", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff7f", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x1104800180018000", "0xe1", "0x48127ffd7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", "0x19", "0x400680017fff7fff", "0x1", "0x48127ffe7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x208b7fff7fff7ffe", "0x48297ffd80007ffb", "0x20680017fff7fff", "0x9", "0x480a7ff97fff8000", "0x482680017ffa8000", "0x1", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff1c", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x482680017ffb8000", "0x1", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff15", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffeb", "0x480680017fff8000", "0x1", "0x48127ffd7fff8000", "0x48307ffd80007ffe", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x4", "0x482a7ffd7ffc8000", "0x20680017fff7fff", "0xc", "0x480a7ff97fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff0d", "0x480a80027fff8000", "0x480a80037fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff09", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff2e", "0x400680017fff7ffe", "0x0", "0x400680017fff7fff", "0x0", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffefd", "0x400a7ffa7fff7ffd", "0x400a7ffb7fff7ffe", "0x400680017fff7fff", "0x0", "0x48127ffc7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb2", "0x400680017fff7fff", "0x1", "0x48127ffe7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x6", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff07", "0x48127ffb7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffed7", "0x480a80027fff8000", "0x480a80037fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffefc", "0x48127ffb7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffecc", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffef1", "0x400680017fff7f49", "0x0", "0x400680017fff7f4a", "0x0", "0x48127ffb7fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffebd", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffebc", "0x40127e747fff7ffd", "0x40127e757fff7ffe", "0x48127ffc7fff8000", "0x48127fdf7fff8000", "0x48127fdf7fff8000", "0x48127f267fff8000", "0x48127f267fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeb3", "0x400680017fff7fff", "0x0", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127fe37fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffea9", "0x400680017fff7fff", "0x0", "0x40127e447fff7ffd", "0x40127e457fff7ffe", "0x48127ffc7fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff5e", "0x400680017fff7fff", "0x1", "0x48127ffe7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x208b7fff7fff7ffe", "0x480680017fff8000", "0xffffffffffffffffffffffffffffffff", "0x480680017fff8000", "0xffffffffffffffffffffffffffffffff", "0x480a7ffb7fff8000", "0x48287ffc80007ffd", "0x48287ffd80007ffd", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff6", "0x480680017fff8000", "0x1", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe81", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x20780017fff7ffd", "0x6", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe9", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe3", "0x48127ffd7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe65", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff2b", "0x400680017fff7fff", "0x1", "0x48127ffe7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd31", "0x40137fff7fff8000", "0x4003800080007ffd", "0x4826800180008000", "0x1", "0x480a7ffa7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x2e4263afad30923c891518314c3c95dbe830a16874e8abc5777a9a20b54c76e", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd2e", "0x482480017fff8000", "0x2", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd19", "0x40137fff7fff8000", "0x4003800080007ffb", "0x4003800180007ffc", "0x4003800280007ffd", "0x4826800180008000", "0x3", "0x480a7ff87fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x83afd3f4caedc6eebf44246fe54e38c95e3179a5ec9ea81740eca5b482d12e", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd14", "0x482480017fff8000", "0x1", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ff97fff8000", "0x480080007ffc8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd00", "0x40137fff7fff8000", "0x4003800080007ffa", "0x4003800180007ffb", "0x4003800280007ffc", "0x4003800380007ffd", "0x4826800180008000", "0x4", "0x480a7ff77fff8000", "0x480a7ff97fff8000", "0x480680017fff8000", "0x41b033f4a31df8067c24d1e9b550a2ce75fd4a29e1147af9752174f0e6cb20", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcfa", "0x482480017fff8000", "0x1", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ff87fff8000", "0x480080007ffc8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffce6", "0x40137fff7fff8000", "0x4003800080007ffb", "0x4003800180007ffc", "0x4003800280007ffd", "0x4826800180008000", "0x3", "0x480a7ff87fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x219209e083275171774dab1df80982e9df2096516f06319c5c6d71ae0a8480c", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffce1", "0x482480017fff8000", "0x1", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ff97fff8000", "0x480080007ffc8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffccd", "0x40137fff7fff8000", "0x480680017fff8000", "0x2db340e6c609371026731f47050d3976552c89b4fbb012941663841c59d1af3", "0x4002800080007fff", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcc7", "0x40137fff7fff8001", "0x4003800080017ffd", "0x4826800180018000", "0x1", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1", "0x480a80007fff8000", "0x4828800180007ffc", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd01", "0x480a7ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x3ad34fad732b51fe0d1a1350f149f21a0cf14a9382c9c6e7b262c4e0c8dbf18", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffce9", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0xee2b6c840729051a0d06a623ff093dcc01e03f2e0c0e07114ac2440394b889", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcd1", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdf", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffbd", "0x48127ffe7fff8000", "0x48127fe47fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffca5", "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffdf", "0x40127fe87fff7fff", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc76", "0x40137fff7fff8000", "0x480680017fff8000", "0x9bbe51bc5aa2b8d5b7cebd6af239abc84cc0a214bb08769edd45164783f4b9", "0x4002800080007fff", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc70", "0x40137fff7fff8001", "0x4003800080017ff9", "0x4003800180017ffa", "0x4003800280017ffb", "0x4003800380017ffc", "0x4003800480017ffd", "0x4826800180018000", "0x5", "0x480a7ff77fff8000", "0x480680017fff8000", "0x1", "0x480a80007fff8000", "0x4828800180007ffc", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffca6", "0x480a7ff87fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc5a", "0x40137fff7fff8000", "0x480680017fff8000", "0x3bc0613d5c7e58357f5d7b45aa04a94ba4b6d0ac57163c292c513dcaca5c774", "0x4002800080007fff", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc54", "0x40137fff7fff8001", "0x4003800080017ff9", "0x4003800180017ffa", "0x4003800280017ffb", "0x4003800380017ffc", "0x4003800480017ffd", "0x4826800180018000", "0x5", "0x480a7ff77fff8000", "0x480680017fff8000", "0x1", "0x480a80007fff8000", "0x4828800180007ffc", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc8a", "0x480a7ff87fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc3e", "0x40137fff7fff8000", "0x480680017fff8000", "0x1a5f2c10b890e597fb68228b09fbbd728fd56e46252de4378dbe20443b1ff43", "0x4002800080007fff", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc38", "0x40137fff7fff8001", "0x4003800080017ff9", "0x4003800180017ffa", "0x4003800280017ffb", "0x4003800380017ffc", "0x4003800480017ffd", "0x4826800180018000", "0x5", "0x480a7ff77fff8000", "0x480680017fff8000", "0x1", "0x480a80007fff8000", "0x4828800180007ffc", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc6e", "0x480a7ff87fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc22", "0x40137fff7fff8000", "0x480680017fff8000", "0xa760593373121c1f1174d17b350e87a697843397c84b4b0852bab24322ef8a", "0x4002800080007fff", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc1c", "0x40137fff7fff8001", "0x4003800080017ff8", "0x4003800180017ff9", "0x4003800280017ffa", "0x4003800380017ffb", "0x4003800480017ffc", "0x4003800580017ffd", "0x4826800180018000", "0x6", "0x480a7ff67fff8000", "0x480680017fff8000", "0x1", "0x480a80007fff8000", "0x4828800180007ffc", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc51", "0x480a7ff77fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x15ec36e354449bd8cfe480b5763ac3121e6f611b3a4417cbdf07efe6638ef4b", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc06", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc03", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcae", "0x48127fe17fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x480a7ff97fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc24", "0x48127ffe7fff8000", "0x482480017ff78000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc1f", "0x48127ffe7fff8000", "0x482480017ff08000", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc1a", "0x48127ffe7fff8000", "0x48127fe77fff8000", "0x48127fe77fff8000", "0x48127fee7fff8000", "0x48127ff47fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd1", "0x480a7ff67fff8000", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc10", "0x482480017ff88000", "0x1", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc0b", "0x482480017ff28000", "0x2", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc06", "0x48127fea7fff8000", "0x48127fea7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480680017fff8000", "0x1922e85b4f066c1184b729c4f8ef96627e09f898135759578803a5ec045a89", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbc2", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbbf", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc6a", "0x48127fe17fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x480a7ff97fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbe0", "0x48127ffe7fff8000", "0x482480017ff78000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbdb", "0x48127ffe7fff8000", "0x482480017ff08000", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbd6", "0x48127ffe7fff8000", "0x48127fe77fff8000", "0x48127fe77fff8000", "0x48127fee7fff8000", "0x48127ff47fff8000", "0x48127ffa7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd1", "0x480a7ff67fff8000", "0x48127ffe7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbcc", "0x482480017ff88000", "0x1", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbc7", "0x482480017ff28000", "0x2", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbc2", "0x48127fea7fff8000", "0x48127fea7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x314cd2d547b66984424658cf043b8a62a2b13b944549dc1c04f74d2a80db739", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb7e", "0x480a7ffc7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc29", "0x48127fe17fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff0", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffba0", "0x48127ffe7fff8000", "0x482480017ff78000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9b", "0x48127ffe7fff8000", "0x482480017ff08000", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb96", "0x48127ffe7fff8000", "0x482480017fe98000", "0x3", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb91", "0x48127ffe7fff8000", "0x482480017fe28000", "0x4", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb8c", "0x48127ffe7fff8000", "0x482480017fdb8000", "0x5", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb87", "0x48127ffe7fff8000", "0x482480017fd48000", "0x6", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb82", "0x48127ffe7fff8000", "0x482480017fcd8000", "0x7", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb7d", "0x48127ffe7fff8000", "0x482480017fc68000", "0x8", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb78", "0x48127ffe7fff8000", "0x482480017fbf8000", "0x9", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb73", "0x48127ffe7fff8000", "0x482480017fb88000", "0xa", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb6e", "0x48127ffe7fff8000", "0x48127faf7fff8000", "0x48127faf7fff8000", "0x48127fb67fff8000", "0x48127fbc7fff8000", "0x48127fc27fff8000", "0x48127fc87fff8000", "0x48127fce7fff8000", "0x48127fd47fff8000", "0x48127fda7fff8000", "0x48127fe07fff8000", "0x48127fe67fff8000", "0x48127fec7fff8000", "0x48127ff27fff8000", "0x208b7fff7fff7ffe", "0x480a7ff07fff8000", "0x480a7ff17fff8000", "0x480a7ff27fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa6", "0x480a7fef7fff8000", "0x48127ffe7fff8000", "0x480a7ff37fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb5d", "0x482480017ff88000", "0x1", "0x480a7ff47fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb58", "0x482480017ff28000", "0x2", "0x480a7ff57fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb53", "0x482480017fec8000", "0x3", "0x480a7ff67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb4e", "0x482480017fe68000", "0x4", "0x480a7ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb49", "0x482480017fe08000", "0x5", "0x480a7ff87fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb44", "0x482480017fda8000", "0x6", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb3f", "0x482480017fd48000", "0x7", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb3a", "0x482480017fce8000", "0x8", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb35", "0x482480017fc88000", "0x9", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb30", "0x482480017fc28000", "0xa", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb2b", "0x48127fba7fff8000", "0x48127fba7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x9f54d26f38f5e8b5d285784e2d57c9a18bc722b083d045fc7ba874c4dc5edf", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb13", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb0d", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x3ce9f4f8dd7f46f9f3250c9ec9a7db028e0989792abd205292164f4ce3abc3c", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffac9", "0x480a7ffc7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb74", "0x48127fe17fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff0", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffaeb", "0x48127ffe7fff8000", "0x482480017ff78000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffae6", "0x48127ffe7fff8000", "0x482480017ff08000", "0x2", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffae1", "0x48127ffe7fff8000", "0x482480017fe98000", "0x3", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffadc", "0x48127ffe7fff8000", "0x482480017fe28000", "0x4", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffad7", "0x48127ffe7fff8000", "0x482480017fdb8000", "0x5", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffad2", "0x48127ffe7fff8000", "0x482480017fd48000", "0x6", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffacd", "0x48127ffe7fff8000", "0x482480017fcd8000", "0x7", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffac8", "0x48127ffe7fff8000", "0x482480017fc68000", "0x8", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffac3", "0x48127ffe7fff8000", "0x482480017fbf8000", "0x9", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffabe", "0x48127ffe7fff8000", "0x482480017fb88000", "0xa", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffab9", "0x48127ffe7fff8000", "0x48127faf7fff8000", "0x48127faf7fff8000", "0x48127fb67fff8000", "0x48127fbc7fff8000", "0x48127fc27fff8000", "0x48127fc87fff8000", "0x48127fce7fff8000", "0x48127fd47fff8000", "0x48127fda7fff8000", "0x48127fe07fff8000", "0x48127fe67fff8000", "0x48127fec7fff8000", "0x48127ff27fff8000", "0x208b7fff7fff7ffe", "0x480a7ff07fff8000", "0x480a7ff17fff8000", "0x480a7ff27fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffa6", "0x480a7fef7fff8000", "0x48127ffe7fff8000", "0x480a7ff37fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffaa8", "0x482480017ff88000", "0x1", "0x480a7ff47fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffaa3", "0x482480017ff28000", "0x2", "0x480a7ff57fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa9e", "0x482480017fec8000", "0x3", "0x480a7ff67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa99", "0x482480017fe68000", "0x4", "0x480a7ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa94", "0x482480017fe08000", "0x5", "0x480a7ff87fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa8f", "0x482480017fda8000", "0x6", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa8a", "0x482480017fd48000", "0x7", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa85", "0x482480017fce8000", "0x8", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa80", "0x482480017fc88000", "0x9", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa7b", "0x482480017fc28000", "0xa", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa76", "0x48127fba7fff8000", "0x48127fba7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0xb741297e8118754748f194d0a6ecc66905ad284f3b83d6ee523fa20ea7f062", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa5e", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa58", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x30d5edf4075999669c6c24b60e79dc4e4fb0072330c5a7afa07a080c68d3451", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa40", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa3a", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1d3c5c2e4e467f9a977d9335db7cb50d55b0472c7bad5adbc55f80c6a87c664", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa22", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa1c", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x3a014ab1dbf16b73e30e662abb1fc33a1ce4d17ebcdd9c01d9d7b52a0b59ba2", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa04", "0x48127ffe7fff8000", "0x482480017ff78000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9ff", "0x48127ffe7fff8000", "0x48127fee7fff8000", "0x48127fee7fff8000", "0x48127ff57fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", "0x480a7ff97fff8000", "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9f8", "0x482480017ff88000", "0x1", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9f3", "0x48127ff07fff8000", "0x48127ff07fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x30f4ad205cb2c62df68cd8981718333d0edac176ec3820a0738eaa1f8eb4335", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9db", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9d5", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1ea3188a69fc1d92526a2c99af2ac907e835defa72dfe45a4d2ad43260cdaae", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9bd", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9b7", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0xdb376f3f29c934dad31d2269608b505f70b699a6cf08477156262247012c6f", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff99f", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff999", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x15df1b50d1505e97c004e389fb35e498cacd70598e523b4be695d4306fa47a3", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff981", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff97b", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x2250ca2f074384b852e52a5c6f8f43d439ae22e4d37950bdf23f1857562b596", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff963", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff95d", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x5bb68a76574e4a9b6edb8237c75e8d99e20cb5895713733d157b8ad54dbd16", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff945", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff93f", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1ab2a93ca436b431e5eb552771f99f8027c49481f6cc48e5da988a1237d1384", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff927", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffed", "0x480a7ffa7fff8000", "0x48127ffe7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff921", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x13a9d623f0c45c92edb2e5f189cce37a8562fb9be50d152562f5edeaea4eb1b", "0x208b7fff7fff7ffe", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffffa", "0x480a7ffb7fff8000", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff909", "0x48127ffe7fff8000", "0x482480017ff78000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff904", "0x48127ffe7fff8000", "0x48127fee7fff8000", "0x48127fee7fff8000", "0x48127ff57fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", "0x480a7ff97fff8000", "0x48127ffe7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8fd", "0x482480017ff88000", "0x1", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8f8", "0x48127ff07fff8000", "0x48127ff07fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8b3", "0x40137fff7fff8000", "0x4003800080007ffc", "0x4003800180007ffd", "0x4826800180008000", "0x2", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x3a04795accb4b73d12f13b05a1e0e240cefeb9a89d008676730867a819d2f79", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8af", "0x482480017fff8000", "0x2", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff89a", "0x40137fff7fff8000", "0x4003800080007ffc", "0x4003800180007ffd", "0x4826800180008000", "0x2", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x15511cc3694f64379908437d6d64458dc76d02482052bfb8a5b33a72c054c77", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff896", "0x482480017fff8000", "0x2", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff881", "0x40137fff7fff8000", "0x4003800080007ffc", "0x4003800180007ffd", "0x4826800180008000", "0x2", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x5b9f95a5edbbc8d436965564a9be30050de23ee9b780cca0f072ee66003d25", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff87d", "0x482480017fff8000", "0x3", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x480080027ffa8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff867", "0x40137fff7fff8000", "0x4003800080007ffc", "0x4003800180007ffd", "0x4826800180008000", "0x2", "0x480a7ff97fff8000", "0x480a7ffb7fff8000", "0x480680017fff8000", "0x1f6a79d5c1ea5e55c327f4c6f3e2b48bb07ba2a156207c9a2d9da490bbd8a8d", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff863", "0x482480017fff8000", "0x3", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ffa7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x480080027ffa8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff84d", "0x40137fff7fff8000", "0x4003800080007ff8", "0x4003800180007ff9", "0x4003800280007ffa", "0x4003800380007ffb", "0x4003800480007ffc", "0x4003800580007ffd", "0x4826800180008000", "0x6", "0x480a7ff57fff8000", "0x480a7ff77fff8000", "0x480680017fff8000", "0x15543c3708653cda9d418b4ccd3be11368e40636c10c44b18cfe756b6d88b29", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff845", "0x482480017fff8000", "0x2", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ff67fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff830", "0x40137fff7fff8000", "0x4003800080007ff7", "0x4003800180007ff8", "0x4003800280007ff9", "0x4003800380007ffa", "0x4003800480007ffb", "0x4003800580007ffc", "0x4003800680007ffd", "0x4826800180008000", "0x7", "0x480a7ff47fff8000", "0x480a7ff67fff8000", "0x480680017fff8000", "0xb69b4361a8bcfea4e074bd844f59471180e9e07bd42a66ff4906186a9f2628", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff827", "0x482480017fff8000", "0x8", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ff57fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x480080027ffa8000", "0x480080037ff98000", "0x480080047ff88000", "0x480080057ff78000", "0x480080067ff68000", "0x480080077ff58000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff80c", "0x40137fff7fff8000", "0x4003800080007ff4", "0x4003800180007ff5", "0x4003800280007ff6", "0x4003800380007ff7", "0x4003800480007ff8", "0x4003800580007ff9", "0x4003800680007ffa", "0x4003800780007ffb", "0x4003800880007ffc", "0x4003800980007ffd", "0x4826800180008000", "0xa", "0x480a7ff17fff8000", "0x480a7ff37fff8000", "0x480680017fff8000", "0x2cfb12ff9e08412ec5009c65ea06e727119ad948d25c8a8cc2c86fec4adee70", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff800", "0x482480017fff8000", "0x4", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ff27fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x480080027ffa8000", "0x480080037ff98000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7e9", "0x40137fff7fff8000", "0x4003800080007ffd", "0x4826800180008000", "0x1", "0x480a7ffa7fff8000", "0x480a7ffc7fff8000", "0x480680017fff8000", "0x279193ae67f7ef3a6be330f5bd004266a0ec3fd5a6f7d2fe71a2096b3101578", "0x4828800080007ffc", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7e6", "0x482480017fff8000", "0xa", "0x40307ffe7ffd7fff", "0x48127ffc7fff8000", "0x480a7ffb7fff8000", "0x480080007ffc8000", "0x480080017ffb8000", "0x480080027ffa8000", "0x480080037ff98000", "0x480080047ff88000", "0x480080057ff78000", "0x480080067ff68000", "0x480080077ff58000", "0x480080087ff48000", "0x480080097ff38000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe04", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffeb4", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdb0", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe2a", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe03", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffdb3", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe2d", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe60", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe39", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe8a", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe75", "0x20680017fff7fff", "0x8", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x1", "0x208b7fff7fff7ffe", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff761", "0x400180007fff7ffa", "0x400180017fff7ffb", "0x400180027fff7ffc", "0x400180037fff7ffd", "0x48127ff97fff8000", "0x48127ffb7fff8000", "0x480680017fff8000", "0x27ea29384deca9928aa65088faae7fc2e5a99fd6512125ef320c18227e0f7d3", "0x480680017fff8000", "0x4", "0x48127ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff769", "0x48127ffd7fff8000", "0x48127fee7fff8000", "0x48127fee7fff8000", "0x480080007ffc8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff864", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff766", "0x40137fff7fff8000", "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x48127ff77fff8000", "0x480680017fff8000", "0x0", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffcb", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff788", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd60", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff780", "0x48127ffa7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x48127ff87fff8000", "0x48127ff87fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff90a", "0x400680017fff7fff", "0x0", "0x48127fd07fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff74c", "0x48127ffe7fff8000", "0x48127fca7fff8000", "0x48127ff67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd10", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff76d", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80007fff8000", "0x48127fe27fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa13", "0x48127ffd7fff8000", "0x48127fdd7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc2d", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb9d", "0x400680017fff7ff5", "0x0", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127f737fff8000", "0x48127ff27fff8000", "0x480a80007fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb27", "0x48127fa67fff8000", "0x48127fa67fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff81c", "0x400680017fff7fff", "0x0", "0x48127fe57fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff725", "0x480680017fff8000", "0x1", "0x48127f867fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7cb", "0x40327fff80017ffb", "0x48527ffa80018000", "0x480680017fff8000", "0x1", "0x4828800180007fff", "0x48507f877fff8000", "0x48127ff57fff8000", "0x48127fd67fff8000", "0x48127feb7fff8000", "0x48127efb7fff8000", "0x480680017fff8000", "0x0", "0x482480017f798000", "0x1", "0x48127fe87fff8000", "0x48127fe87fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x48307ff27fef8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbac", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480a80007fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x48127e777fff8000", "0x48127ef67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa52", "0x48127ffe7fff8000", "0x48127fe07fff8000", "0x48127ffd7fff8000", "0x48127e5c7fff8000", "0x48127edb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8f2", "0x48127ff97fff8000", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff962", "0x48127ffd7fff8000", "0x480680017fff8000", "0x80000000000000000000000000000000", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7ac", "0x48127ffe7fff8000", "0x48127fdd7fff8000", "0x48127fdd7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff94a", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff87f", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x17", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd24", "0x40137fff7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd3c", "0x40137fff7fff8001", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc77", "0x40137fff7fff8002", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc8f", "0x40137fff7fff8003", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd66", "0x40137fff7fff8004", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9d4", "0x40137fff7fff8005", "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe83", "0x40137ff67fff8006", "0x40137ff77fff8007", "0x40137ff87fff8008", "0x40137ff97fff8009", "0x40137ffa7fff800a", "0x40137ffb7fff800b", "0x40137ffc7fff800c", "0x40137ffd7fff800d", "0x40137ffe7fff800e", "0x40137fff7fff800f", "0x48127ff57fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff766", "0x40137fff7fff8010", "0x48127fd37fff8000", "0x48127fb87fff8000", "0x48127ffc7fff8000", "0x480a80107fff8000", "0x480a80087fff8000", "0x480a80097fff8000", "0x480a800b7fff8000", "0x480a800c7fff8000", "0x1104800180018000", "0x340", "0x40137ffe7fff8011", "0x40137fff7fff8012", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80107fff8000", "0x480a800b7fff8000", "0x480a800c7fff8000", "0x480a80087fff8000", "0x480a80097fff8000", "0x1104800180018000", "0x334", "0x40137ffe7fff8013", "0x40137fff7fff8014", "0x48127ffd7fff8000", "0x480a80137fff8000", "0x480a80147fff8000", "0x480a80117fff8000", "0x480a80127fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff830", "0x20680017fff7fff", "0x6", "0x48127fc97fff8000", "0x48127fc97fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x48127ffe7fff8000", "0x480a80117fff8000", "0x480a80127fff8000", "0x480680017fff8000", "0xde0b6b3a7640000", "0x480680017fff8000", "0x0", "0x480a80137fff8000", "0x480a80147fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff867", "0x48127d217fff8000", "0x48127d217fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480a80047fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff63", "0x40137ffc7fff8015", "0x40137ffd7fff8016", "0x482480017fff8000", "0x800000000000011000000000000000000000000000000000000000000000000", "0x20680017fff7fff", "0x6", "0x480a80157fff8000", "0x480a80167fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x48127ffd7fff8000", "0x480a80117fff8000", "0x480a80127fff8000", "0x480680017fff8000", "0xde0b6b3a7640000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff757", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80137fff8000", "0x480a80147fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff841", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7a1", "0x480a80137fff8000", "0x480a80147fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8b1", "0x480680017fff8000", "0x186a0", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x186a0", "0x480680017fff8000", "0x0", "0x4828800d80007ffa", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff82a", "0x48127ff97fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x48127d0a7fff8000", "0x48127d0a7fff8000", "0x480680017fff8000", "0xde0b6b3a7640000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff81f", "0x400680017fff7ffc", "0x0", "0x400680017fff7ffd", "0x0", "0x48127ff97fff8000", "0x480a80117fff8000", "0x480a80127fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff88d", "0x480680017fff8000", "0xf4240", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x4828800480007ffc", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff806", "0x480a80157fff8000", "0x48127ff87fff8000", "0x480a80037fff8000", "0x480a80007fff8000", "0x48127a5a7fff8000", "0x48127a5a7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8dd", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x480a80007fff8000", "0x480a80017fff8000", "0x480a80037fff8000", "0x48127a3d7fff8000", "0x48127a3d7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x3e8", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd69", "0x40127d197fff7ffe", "0x40127d1a7fff7fff", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480a80027fff8000", "0x480a80057fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff893", "0x48127ffd7fff8000", "0x480a80167fff8000", "0x48127ffc7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x12", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffac0", "0x400a7ffd7fff7fff", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa2b", "0x40137ff57fff8000", "0x40137ff67fff8001", "0x40137ff77fff8002", "0x40137ff87fff8003", "0x40137ff97fff8004", "0x40137ffa7fff8005", "0x40137ffb7fff8006", "0x40137ffc7fff8007", "0x40137ffd7fff8008", "0x40137ffe7fff8009", "0x40137fff7fff800a", "0x400780017fff8000", "0x0", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8e9", "0x40137fff7fff800b", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb74", "0x40137fff7fff800c", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbf1", "0x40137fff7fff800d", "0x40137ffc7fff800e", "0x40137ffd7fff800f", "0x480a800d7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff5c7", "0x400780017fff8003", "0x0", "0x48127ffb7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480680017fff8000", "0x2", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff76a", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a800d7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff60a", "0x40337ffe80108002", "0x400780017fff8011", "0x0", "0x480a800e7fff8000", "0x48127ffc7fff8000", "0x480a800c7fff8000", "0x480a800b7fff8000", "0x48127ffa7fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff841", "0x48127ffd7fff8000", "0x480a800f7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbac", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff5a4", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x480a800c7fff8000", "0x48127ffa7fff8000", "0x48127fae7fff8000", "0x48127fae7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff865", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x48127fdf7fff8000", "0x48127f937fff8000", "0x48127f937fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc91", "0x48127ffc7fff8000", "0x48127fc27fff8000", "0x48127ffb7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1", "0x480a80017fff8000", "0x480a80107fff8000", "0x480a80117fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x48127f877fff8000", "0x48127ff37fff8000", "0x48127ff37fff8000", "0x480a80097fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa0c", "0x482680017ffd8000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa59", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", "0x480a7ffd7fff8000", "0x480a80107fff8000", "0x480a80117fff8000", "0x48127ef67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8e5", "0x48127ffe7fff8000", "0x48127fe07fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9aa", "0x48127ff47fff8000", "0x480680017fff8000", "0x2", "0x48127ff37fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff56d", "0x48127fe87fff8000", "0x48127fe87fff8000", "0x48127ffd7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff918", "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x48127f987fff8000", "0x48127f987fff8000", "0x48307f987f948000", "0x48127f947fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff73e", "0x400680017fff7ffc", "0x0", "0x400680017fff7ffd", "0x0", "0x48127d527fff8000", "0x48127d527fff8000", "0x48127ff77fff8000", "0x48127d527fff8000", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x15", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff981", "0x40137ff57fff8000", "0x40137ff67fff8001", "0x40137ff77fff8002", "0x40137ff87fff8003", "0x40137ff97fff8004", "0x40137ffa7fff8005", "0x40137ffb7fff8006", "0x40137ffc7fff8007", "0x40137ffd7fff8008", "0x40137ffe7fff8009", "0x40137fff7fff800a", "0x400780017fff8000", "0x1", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb35", "0x40137ffd7fff800b", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff52c", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80077fff8000", "0x480a80087fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc53", "0x40137ffe7fff800c", "0x40137fff7fff800d", "0x40137ffb7fff800e", "0x48127ffc7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480a80067fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff5eb", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x2", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6bf", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80067fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff76c", "0x480680017fff8000", "0xde0b6b3a7640000", "0x480680017fff8000", "0x0", "0x480a800c7fff8000", "0x480a800d7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6eb", "0x480a800e7fff8000", "0x480a800b7fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffbe5", "0x48127fdd7fff8000", "0x48127fdd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe10", "0x480a800c7fff8000", "0x480a800d7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff5be", "0x48127ff87fff8000", "0x48127ff87fff8000", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb2f", "0x40137fff7fff800f", "0x480a800f7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4e9", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa85", "0x40137fff7fff8010", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa9d", "0x40137fff7fff8011", "0x480a80117fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4da", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb71", "0x40137fff7fff8012", "0x40137ffc7fff8013", "0x40137ffd7fff8014", "0x48127ffe7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480680017fff8000", "0x2", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff677", "0x480680017fff8000", "0xf4240", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x4828801280007ffc", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6a5", "0x480680017fff8000", "0xf4240", "0x48127ff87fff8000", "0x480a800c7fff8000", "0x480a800d7fff8000", "0x4828801280007ffc", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff697", "0x480a80137fff8000", "0x480a80147fff8000", "0x48127ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb26", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4a6", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff47b", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff71b", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480a80107fff8000", "0x480a800f7fff8000", "0x48127a6c7fff8000", "0x48127a6c7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff75e", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x480a80117fff8000", "0x480a800f7fff8000", "0x480a800c7fff8000", "0x480a800d7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff756", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x480a800f7fff8000", "0x480a80107fff8000", "0x48127a347fff8000", "0x48127a347fff8000", "0x48127cd97fff8000", "0x48127cd97fff8000", "0x480a80117fff8000", "0x480a800c7fff8000", "0x480a800d7fff8000", "0x48127f7d7fff8000", "0x48127f7d7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc21", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127f7c7fff8000", "0x48127f837fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6f6", "0x48127f857fff8000", "0x48127f857fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6d7", "0x48127fb47fff8000", "0x48127f187fff8000", "0x48127ffb7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x2", "0x480a80017fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x480a80067fff8000", "0x480a80077fff8000", "0x480a80087fff8000", "0x480a80097fff8000", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8eb", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480680017fff8000", "0x0", "0x480a7ffd7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x48127f767fff8000", "0x48127f767fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7e3", "0x48127ffe7fff8000", "0x48127fdf7fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0xd", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff88a", "0x40137ff57fff8000", "0x40137ff67fff8001", "0x40137ff77fff8002", "0x40137ff87fff8003", "0x40137ff97fff8004", "0x40137ffa7fff8005", "0x40137ffb7fff8006", "0x40137ffc7fff8007", "0x40137ffd7fff8008", "0x40137ffe7fff8009", "0x40137fff7fff800a", "0x400780017fff8000", "0x2", "0x48127ff47fff8000", "0x482a7ffc800a8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff441", "0x400b800a7fff7ffd", "0x48127fe87fff8000", "0x48127fe87fff8000", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffab0", "0x402b7ffc800a800b", "0x480680017fff8000", "0x1", "0x4829800b80008001", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4b6", "0x40327fff800c7ffb", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x48127ff77fff8000", "0x480a7ffb7fff8000", "0x482a800680028000", "0x480a80037fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x482a7ffc800a8000", "0x480a800a7fff8000", "0x1104800180018000", "0x1c", "0x48468001800c8000", "0x3", "0x480680017fff8000", "0x1", "0x4828800c80007fff", "0x484480017fff8000", "0x2", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x480a7ffb7fff8000", "0x48307ffb7ff88000", "0x480a80017fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x480a80067fff8000", "0x480a80077fff8000", "0x480a80087fff8000", "0x480a80097fff8000", "0x480a800b7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff891", "0x480a7ffb7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x6", "0x480a7ff47fff8000", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x208b7fff7fff7ffe", "0x480a7ff47fff8000", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffe88", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa6e", "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x48127fe37fff8000", "0x48127fe37fff8000", "0x48127fe37fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff67e", "0x48127ffd7fff8000", "0x48127fe07fff8000", "0x48127ffc7fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x482680017ffd8000", "0x1", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffd9", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x2", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff49f", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3a1", "0x40137fff7fff8000", "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x48127ff77fff8000", "0x480680017fff8000", "0x1", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x480a80007fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc06", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3c3", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff398", "0x48127ffe7fff8000", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa39", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3b9", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x480a80007fff8000", "0x48127fe27fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff65f", "0x48127ffd7fff8000", "0x48127fdd7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff92e", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff89e", "0x400680017fff7ff5", "0x0", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127f737fff8000", "0x48127ff27fff8000", "0x480a80007fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7b7", "0x48127fa87fff8000", "0x48127fa87fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff468", "0x400680017fff7fff", "0x0", "0x48127fe57fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff371", "0x480680017fff8000", "0x1", "0x48127f867fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff417", "0x40327fff80017ffb", "0x48127ff97fff8000", "0x48127fda7fff8000", "0x48127fef7fff8000", "0x48127eff7fff8000", "0x480680017fff8000", "0x0", "0x482480017f7d8000", "0x1", "0x48127f7d7fff8000", "0x48127f7d7fff8000", "0x48127fea7fff8000", "0x48127fea7fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8b3", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480a80007fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x48127e7b7fff8000", "0x48127efa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6c0", "0x48127ffe7fff8000", "0x48127fe07fff8000", "0x48127ffd7fff8000", "0x48127e607fff8000", "0x48127edf7fff8000", "0x208b7fff7fff7ffe", "0x404b7ff97ff97ff9", "0x484a7ffa7ff98000", "0x480680017fff8000", "0x1", "0x48287ff980007fff", "0x48487ffc7fff8000", "0x484a7ffb7ff98000", "0x480680017fff8000", "0x1", "0x48287ff980007fff", "0x48487ffd7fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x48307ff87ff58000", "0x48307ffb7ff88000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8d0", "0x400a7ffd7fff7fff", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff83b", "0x400680017fff7ff5", "0x0", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff981", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff99a", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8d6", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8ef", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9c7", "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x48127fa17fff8000", "0x48127fb77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffaeb", "0x48127ff57fff8000", "0x48127fad7fff8000", "0x48127fc37fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3d8", "0x48127fd37fff8000", "0x48127fb87fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127fd37fff8000", "0x48127fd37fff8000", "0x48127fd47fff8000", "0x48127fd47fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffb4", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127fe57fff8000", "0x48127fbf7fff8000", "0x48127fbf7fff8000", "0x48127fba7fff8000", "0x48127fba7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffaa", "0x48127ffd7fff8000", "0x48127fe67fff8000", "0x48127fe67fff8000", "0x480680017fff8000", "0xde0b6b3a7640000", "0x480680017fff8000", "0x0", "0x48127ff97fff8000", "0x48127ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4eb", "0x48127d537fff8000", "0x48127d537fff8000", "0x48127ff77fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9d4", "0x482480017cc68000", "0xf4240", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4dc", "0x480680017fff8000", "0xf4240", "0x48127ff87fff8000", "0x48127d577fff8000", "0x48127d577fff8000", "0x48307a1d80007ffc", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0xf4240", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4ce", "0x48127ff97fff8000", "0x48127d507fff8000", "0x48127d507fff8000", "0x48127a8a7fff8000", "0x48127a8a7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff47f", "0x400680017fff7fff", "0x0", "0x48127ffe7fff8000", "0x48127a5a7fff8000", "0x48127a5a7fff8000", "0x48127fc57fff8000", "0x48127fc57fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff476", "0x400680017fff7fff", "0x0", "0x48127a497fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff2a7", "0x48127ffe7fff8000", "0x48127ff77fff8000", "0x481276de7fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff547", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x481276da7fff8000", "0x48127fe17fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff541", "0x48127ffc7fff8000", "0x48127a0d7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff93c", "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x481276627fff8000", "0x481276447fff8000", "0x481276447fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff57f", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x481276477fff8000", "0x4812765d7fff8000", "0x481276287fff8000", "0x481276287fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa25", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x4812764e7fff8000", "0x48127f6c7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff51e", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x4812764a7fff8000", "0x48127f517fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff518", "0x48127ffd7fff8000", "0x48127fe27fff8000", "0x48127fe27fff8000", "0x48127f507fff8000", "0x48127f507fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4f6", "0x48127ffd7fff8000", "0x48127fb27fff8000", "0x48127fb27fff8000", "0x48127f207fff8000", "0x48127f207fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff4ef", "0x48127f667fff8000", "0x48127eed7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff88d", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff285", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x481275807fff8000", "0x48127ffa7fff8000", "0x48127fe17fff8000", "0x48127fe17fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff546", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x48127fdf7fff8000", "0x48127fc67fff8000", "0x48127fc67fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff98b", "0x48127ffc7fff8000", "0x48127fc27fff8000", "0x48127ffb7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x1", "0x481274e07fff8000", "0x48127f5c7fff8000", "0x48127f5c7fff8000", "0x481274e07fff8000", "0x481274e07fff8000", "0x481274e07fff8000", "0x48127ff37fff8000", "0x48127ff37fff8000", "0x481274e07fff8000", "0x481274e07fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7a3", "0x482680017ffd8000", "0x1", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff7f0", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480680017fff8000", "0x1", "0x480a7ffd7fff8000", "0x4812744d7fff8000", "0x4812744d7fff8000", "0x4812744f7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff5c7", "0x48127ffe7fff8000", "0x48127fe07fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff73f", "0x48127ff47fff8000", "0x480680017fff8000", "0x2", "0x48127ff37fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff24d", "0x48127fe87fff8000", "0x48127fe87fff8000", "0x48127ffd7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff63c", "0x48127ffc7fff8000", "0x48127ffd7fff8000", "0x48127ffd7fff8000", "0x48127f967fff8000", "0x48127f967fff8000", "0x48127f967fff8000", "0x48127f967fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff41e", "0x400680017fff7ffc", "0x0", "0x400680017fff7ffd", "0x0", "0x48127d527fff8000", "0x48127d527fff8000", "0x48127ff77fff8000", "0x48127d527fff8000", "0x48127ff67fff8000", "0x48127ff67fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff716", "0x400680017fff7ff5", "0x1", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x48127ff27fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff820", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff218", "0x48127ffa7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127fe07fff8000", "0x48127fe07fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff959", "0x48127ffc7fff8000", "0x48127fc07fff8000", "0x48127fc07fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff2db", "0x400680017fff7fff", "0x0", "0x48127ffc7fff8000", "0x48127fe47fff8000", "0x48127fe47fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff2cf", "0x48127fdc7fff8000", "0x48127fbe7fff8000", "0x48127ffd7fff8000", "0x480a7ffd7fff8000", "0x480680017fff8000", "0x2", "0x48127f9c7fff8000", "0x48127ff17fff8000", "0x48127ff17fff8000", "0x48127f9c7fff8000", "0x48127f9c7fff8000", "0x48127f9c7fff8000", "0x48127f9c7fff8000", "0x48127f9c7fff8000", "0x48127f9c7fff8000", "0x48127f9c7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff730", "0x48127ffd7fff8000", "0x48127ffe7fff8000", "0x480680017fff8000", "0x1", "0x480a7ffd7fff8000", "0x48127f597fff8000", "0x48127f597fff8000", "0x48127f1c7fff8000", "0x48127f1c7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff573", "0x48127ffe7fff8000", "0x48127fdf7fff8000", "0x48127ffd7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff61c", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6a4", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6c4", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff74c", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0xc", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff762", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff1bf", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6ae", "0x40137ff57fff8000", "0x40137ff67fff8001", "0x40137ff77fff8002", "0x40137ff87fff8003", "0x40137ff97fff8004", "0x40137ffa7fff8005", "0x40137ffb7fff8006", "0x40137ffc7fff8007", "0x40137ffd7fff8008", "0x40137ffe7fff8009", "0x40137fff7fff800a", "0x48127ff27fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff183", "0x48127ffe7fff8000", "0x48127fed7fff8000", "0x48127f687fff8000", "0x48127ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff423", "0x400780017fff8000", "0x2", "0x48127ffd7fff8000", "0x482a7ffc800a8000", "0x480a80017fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff1a7", "0x400b800a7fff7ffd", "0x48127ff27fff8000", "0x48127fc77fff8000", "0x48127ffd7fff8000", "0x480a7ffb7fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480680017fff8000", "0x0", "0x480680017fff8000", "0x0", "0x482a7ffc800a8000", "0x480a800a7fff8000", "0x1104800180018000", "0x23", "0x480680017fff8000", "0x1", "0x482a7ffc800a8000", "0x48317fff80008001", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff213", "0x40327fff800b7ffa", "0x48468001800b8000", "0x3", "0x480680017fff8000", "0x1", "0x4828800b80007fff", "0x484480017fff8000", "0x2", "0x48127ff17fff8000", "0x48127ff17fff8000", "0x48127ff17fff8000", "0x480a7ffb7fff8000", "0x48307ffb7ff88000", "0x480a80017fff8000", "0x480a80027fff8000", "0x480a80037fff8000", "0x480a80047fff8000", "0x480a80057fff8000", "0x480a80067fff8000", "0x480a80077fff8000", "0x480a80087fff8000", "0x480a80097fff8000", "0x482a7ffc800a8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6af", "0x480a800b7fff8000", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x0", "0x48297ffc80007ffd", "0x20680017fff7fff", "0x8", "0x480a7ff47fff8000", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff47fff8000", "0x480a7ff57fff8000", "0x480a7ff67fff8000", "0x480a7ff77fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffff0d", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff6f8", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff155", "0x48127ffa7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff12a", "0x48127ffe7fff8000", "0x48127ff57fff8000", "0x48127ff57fff8000", "0x48127fdb7fff8000", "0x48127fdb7fff8000", "0x48127fdb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3e0", "0x48127ffe7fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x48127fc07fff8000", "0x48127fc07fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff214", "0x400680017fff7fff", "0x0", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3ad", "0x48127faa7fff8000", "0x48127f857fff8000", "0x48127ffd7fff8000", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x48127fbd7fff8000", "0x48127fbd7fff8000", "0x480a7ffc7fff8000", "0x482680017ffd8000", "0x1", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffc2", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff453", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff441", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff438", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8ee", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x2", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffef", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff41b", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8dc", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff400", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8ca", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3e5", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8b8", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3ca", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff8a6", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff3af", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff894", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff394", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff882", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff379", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff870", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff35e", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff85e", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff343", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff84c", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff77fff8000", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff839", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x4", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x480280027ffd8000", "0x480280037ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffeb", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff836", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffb", "0x4003800180007ffc", "0x4826800180008000", "0x2", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x2", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x48127ff37fff8000", "0x48127ff37fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff2db", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff9b6", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff2c0", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffa4b", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb27", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x3", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x480280027ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd73", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ff2", "0x4003800180007ff3", "0x4003800280007ff4", "0x4003800380007ff5", "0x4003800480007ff6", "0x4003800580007ff7", "0x4003800680007ff8", "0x4003800780007ff9", "0x4003800880007ffa", "0x4003800980007ffb", "0x4003800a80007ffc", "0x4826800180008000", "0xb", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe0", "0x48127ff47fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x48127fea7fff8000", "0x48127fea7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffd4f", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x402b7ffd7ffc7ffd", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb30", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffb", "0x4003800180007ffc", "0x4826800180008000", "0x2", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x2", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe7", "0x48127ffd7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x48127ff37fff8000", "0x48127ff37fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff210", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffb90", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcf6", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ff2", "0x4003800180007ff3", "0x4003800280007ff4", "0x4003800380007ff5", "0x4003800480007ff6", "0x4003800580007ff7", "0x4003800680007ff8", "0x4003800780007ff9", "0x4003800880007ffa", "0x4003800980007ffb", "0x4003800a80007ffc", "0x4826800180008000", "0xb", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe0", "0x48127ff47fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe4", "0x48127fea7fff8000", "0x48127fea7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffcd2", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x402b7ffd7ffc7ffd", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffee", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffff1ab", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc56", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x1", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffff1", "0x40780017fff7fff", "0x1", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x48127ffc7fff8000", "0x480680017fff8000", "0x0", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe", "0x480a7ff87fff8000", "0x480a7ff97fff8000", "0x480a7ffa7fff8000", "0x480a7ffb7fff8000", "0x480a7ffc7fff8000", "0x480a7ffd7fff8000", "0x1104800180018000", "0x800000000000010fffffffffffffffffffffffffffffffffffffffffffffc9c", "0x208b7fff7fff7ffe", "0x40780017fff7fff", "0x1", "0x4003800080007ffc", "0x4826800180008000", "0x1", "0x480a7ffd7fff8000", "0x4828800080007ffe", "0x480a80007fff8000", "0x208b7fff7fff7ffe", "0x482680017ffd8000", "0x3", "0x402a7ffd7ffc7fff", "0x480280007ffb8000", "0x480280017ffb8000", "0x480280027ffb8000", "0x480280007ffd8000", "0x480280017ffd8000", "0x480280027ffd8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffe6", "0x48127ffe7fff8000", "0x1104800180018000", "0x800000000000010ffffffffffffffffffffffffffffffffffffffffffffffec", "0x48127ff47fff8000", "0x48127ff47fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x48127ffb7fff8000", "0x208b7fff7fff7ffe"], "prime": "0x800000000000011000000000000000000000000000000000000000000000001", "compiler_version": "0.11.0.2"}} diff --git a/tests/cairo_1_syscalls.rs b/tests/cairo_1_syscalls.rs index 1d49a01e9..cdf711386 100644 --- a/tests/cairo_1_syscalls.rs +++ b/tests/cairo_1_syscalls.rs @@ -1,7 +1,6 @@ use std::{ collections::{HashMap, HashSet}, - path::{Path, PathBuf}, - vec, + sync::Arc, }; use cairo_lang_starknet::casm_contract_class::CasmContractClass; @@ -11,7 +10,7 @@ use cairo_vm::{ }; use num_bigint::BigUint; use num_traits::{Num, One, Zero}; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -57,7 +56,7 @@ fn storage_write_read() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::new( @@ -105,6 +104,7 @@ fn storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -125,9 +125,10 @@ fn storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(call_info.retdata, [25.into()]); + assert_eq!(call_info.call_info.unwrap().retdata, [25.into()]); // RUN INCREASE_BALANCE // Create an execution entry point @@ -146,6 +147,7 @@ fn storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -166,9 +168,10 @@ fn storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(call_info.retdata, [125.into()]) + assert_eq!(call_info.call_info.unwrap().retdata, [125.into()]) } #[test] @@ -221,7 +224,7 @@ fn library_call() { .insert(lib_address, lib_nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [25.into(), Felt252::from_bytes_be(&lib_class_hash)].to_vec(); @@ -256,7 +259,7 @@ fn library_call() { n_steps: 255, #[cfg(feature = "cairo_1_tests")] n_steps: 259, - n_memory_holes: 10, + n_memory_holes: 8, builtin_instance_counter: HashMap::from([(RANGE_CHECK_BUILTIN_NAME.to_string(), 12)]), }; let expected_execution_resources_internal_call = ExecutionResources { @@ -264,7 +267,7 @@ fn library_call() { n_steps: 84, #[cfg(feature = "cairo_1_tests")] n_steps: 85, - n_memory_holes: 6, + n_memory_holes: 5, builtin_instance_counter: HashMap::from([(RANGE_CHECK_BUILTIN_NAME.to_string(), 7)]), }; @@ -318,7 +321,10 @@ fn library_call() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps() ) + .unwrap() + .call_info .unwrap(), expected_call_info ); @@ -384,7 +390,7 @@ fn call_contract_storage_write_read() { .insert(simple_wallet_address.clone(), simple_wallet_nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::new( @@ -436,6 +442,7 @@ fn call_contract_storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -458,9 +465,10 @@ fn call_contract_storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(call_info.retdata, [25.into()]); + assert_eq!(call_info.call_info.unwrap().retdata, [25.into()]); // RUN INCREASE_BALANCE // Create an execution entry point @@ -481,6 +489,7 @@ fn call_contract_storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -503,9 +512,10 @@ fn call_contract_storage_write_read() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(call_info.retdata, [125.into()]) + assert_eq!(call_info.call_info.unwrap().retdata, [125.into()]) } #[test] @@ -536,7 +546,7 @@ fn emit_event() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [].to_vec(); @@ -573,10 +583,11 @@ fn emit_event() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); assert_eq!( - call_info.events, + call_info.call_info.unwrap().events, vec![ OrderedEvent { order: 0, @@ -649,7 +660,7 @@ fn deploy_cairo1_from_cairo1() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // arguments of deploy contract let calldata: Vec<_> = [test_felt_hash, salt].to_vec(); @@ -689,6 +700,7 @@ fn deploy_cairo1_from_cairo1() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert!(call_info.is_ok()); @@ -712,9 +724,8 @@ fn deploy_cairo0_from_cairo1_without_constructor() { let test_class_hash: ClassHash = [2; 32]; let test_felt_hash = Felt252::from_bytes_be(&test_class_hash); let salt = Felt252::zero(); - let contract_path = Path::new("starknet_programs/fibonacci.json"); - let test_contract_class: ContractClass = - ContractClass::try_from(contract_path.to_path_buf()).unwrap(); + let contract_path = "starknet_programs/fibonacci.json"; + let test_contract_class: ContractClass = ContractClass::from_path(contract_path).unwrap(); // Create the deploy contract class #[cfg(not(feature = "cairo_1_tests"))] @@ -748,7 +759,7 @@ fn deploy_cairo0_from_cairo1_without_constructor() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(contract_class_cache), Some(casm_contract_class_cache), ); @@ -791,6 +802,7 @@ fn deploy_cairo0_from_cairo1_without_constructor() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert!(call_info.is_ok()); @@ -814,9 +826,8 @@ fn deploy_cairo0_from_cairo1_with_constructor() { let test_class_hash: ClassHash = [2; 32]; let test_felt_hash = Felt252::from_bytes_be(&test_class_hash); let salt = Felt252::zero(); - let contract_path = Path::new("starknet_programs/test_contract.json"); - let test_contract_class: ContractClass = - ContractClass::try_from(contract_path.to_path_buf()).unwrap(); + let contract_path = "starknet_programs/test_contract.json"; + let test_contract_class: ContractClass = ContractClass::from_path(contract_path).unwrap(); // Create the deploy contract class #[cfg(not(feature = "cairo_1_tests"))] @@ -849,7 +860,7 @@ fn deploy_cairo0_from_cairo1_with_constructor() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(contract_class_cache), Some(casm_contract_class_cache), ); @@ -892,6 +903,7 @@ fn deploy_cairo0_from_cairo1_with_constructor() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert!(call_info.is_ok()); @@ -915,9 +927,8 @@ fn deploy_cairo0_and_invoke() { let test_class_hash: ClassHash = [2; 32]; let test_felt_hash = Felt252::from_bytes_be(&test_class_hash); let salt = Felt252::zero(); - let contract_path = Path::new("starknet_programs/factorial.json"); - let test_contract_class: ContractClass = - ContractClass::try_from(contract_path.to_path_buf()).unwrap(); + let contract_path = "starknet_programs/factorial.json"; + let test_contract_class: ContractClass = ContractClass::from_path(contract_path).unwrap(); // Create the deploy contract class #[cfg(not(feature = "cairo_1_tests"))] @@ -950,8 +961,8 @@ fn deploy_cairo0_and_invoke() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new( - state_reader, + let mut state: CachedState<_> = CachedState::new( + Arc::new(state_reader), Some(contract_class_cache), Some(casm_contract_class_cache), ); @@ -994,6 +1005,7 @@ fn deploy_cairo0_and_invoke() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert!(call_info.is_ok()); @@ -1034,10 +1046,11 @@ fn deploy_cairo0_and_invoke() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - let retdata = call_info.retdata; + let retdata = call_info.call_info.unwrap().retdata; // expected result 3! = 6 assert_eq!(retdata, [6.into()].to_vec()); @@ -1072,7 +1085,7 @@ fn test_send_message_to_l1_syscall() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let create_execute_extrypoint = |selector: &BigUint, calldata: Vec, @@ -1119,6 +1132,7 @@ fn test_send_message_to_l1_syscall() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -1130,7 +1144,7 @@ fn test_send_message_to_l1_syscall() { let expected_execution_resources = ExecutionResources { n_steps: 50, - n_memory_holes: 1, + n_memory_holes: 0, builtin_instance_counter: HashMap::from([(RANGE_CHECK_BUILTIN_NAME.to_string(), 2)]), }; @@ -1147,7 +1161,7 @@ fn test_send_message_to_l1_syscall() { ..Default::default() }; - assert_eq!(call_info, expected_call_info); + assert_eq!(call_info.call_info.unwrap(), expected_call_info); } #[test] @@ -1178,7 +1192,7 @@ fn test_get_execution_info() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::new( @@ -1225,6 +1239,7 @@ fn test_get_execution_info() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -1237,7 +1252,7 @@ fn test_get_execution_info() { let expected_execution_resources = ExecutionResources { n_steps: 268, - n_memory_holes: 5, + n_memory_holes: 4, builtin_instance_counter: HashMap::from([(RANGE_CHECK_BUILTIN_NAME.to_string(), 4)]), }; @@ -1254,7 +1269,7 @@ fn test_get_execution_info() { ..Default::default() }; - assert_eq!(call_info, expected_call_info); + assert_eq!(call_info.call_info.unwrap(), expected_call_info); } #[test] @@ -1297,7 +1312,7 @@ fn replace_class_internal() { contract_class_cache.insert(class_hash_b, contract_class_b.clone()); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Run upgrade entrypoint and check that the storage was updated with the new contract class // Create an execution entry point @@ -1336,6 +1351,7 @@ fn replace_class_internal() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); // Check that the class was indeed replaced in storage @@ -1418,7 +1434,7 @@ fn replace_class_contract_call() { .insert(wrapper_address, nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // INITIALIZE STARKNET CONFIG let block_context = BlockContext::default(); @@ -1457,9 +1473,10 @@ fn replace_class_contract_call() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(result.retdata, vec![25.into()]); + assert_eq!(result.call_info.unwrap().retdata, vec![25.into()]); // REPLACE_CLASS @@ -1483,6 +1500,7 @@ fn replace_class_contract_call() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -1508,9 +1526,10 @@ fn replace_class_contract_call() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(result.retdata, vec![17.into()]); + assert_eq!(result.call_info.unwrap().retdata, vec![17.into()]); } #[test] @@ -1581,7 +1600,7 @@ fn replace_class_contract_call_same_transaction() { .insert(wrapper_address, nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // INITIALIZE STARKNET CONFIG let block_context = BlockContext::default(); @@ -1620,9 +1639,13 @@ fn replace_class_contract_call_same_transaction() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(result.retdata, vec![25.into(), 17.into()]); + assert_eq!( + result.call_info.unwrap().retdata, + vec![25.into(), 17.into()] + ); } #[test] @@ -1636,8 +1659,7 @@ fn call_contract_upgrade_cairo_0_to_cairo_1_same_transaction() { // Add get_number_a.cairo to storage - let path = PathBuf::from("starknet_programs/get_number_c.json"); - let contract_class_c = ContractClass::try_from(path).unwrap(); + let contract_class_c = ContractClass::from_path("starknet_programs/get_number_c.json").unwrap(); // Create state reader with class hash data let mut casm_contract_class_cache = HashMap::new(); @@ -1694,7 +1716,7 @@ fn call_contract_upgrade_cairo_0_to_cairo_1_same_transaction() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(deprecated_contract_class_cache), Some(casm_contract_class_cache), ); @@ -1736,9 +1758,13 @@ fn call_contract_upgrade_cairo_0_to_cairo_1_same_transaction() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(result.retdata, vec![33.into(), 17.into()]); + assert_eq!( + result.call_info.unwrap().retdata, + vec![33.into(), 17.into()] + ); } #[test] @@ -1750,8 +1776,7 @@ fn call_contract_downgrade_cairo_1_to_cairo_0_same_transaction() { // SET GET_NUMBER_C // Add get_number_a.cairo to the state (only its contract_class) - let path = PathBuf::from("starknet_programs/get_number_c.json"); - let contract_class_c = ContractClass::try_from(path).unwrap(); + let contract_class_c = ContractClass::from_path("starknet_programs/get_number_c.json").unwrap(); // Create state reader with class hash data let mut casm_contract_class_cache = HashMap::new(); @@ -1808,7 +1833,7 @@ fn call_contract_downgrade_cairo_1_to_cairo_0_same_transaction() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(deprecated_contract_class_cache), Some(casm_contract_class_cache), ); @@ -1850,9 +1875,13 @@ fn call_contract_downgrade_cairo_1_to_cairo_0_same_transaction() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(result.retdata, vec![17.into(), 33.into()]); + assert_eq!( + result.call_info.unwrap().retdata, + vec![17.into(), 33.into()] + ); } #[test] @@ -1864,8 +1893,7 @@ fn call_contract_replace_class_cairo_0() { // SET GET_NUMBER_C // Add get_number_a.cairo to the state (only its contract_class) - let path = PathBuf::from("starknet_programs/get_number_c.json"); - let contract_class_c = ContractClass::try_from(path).unwrap(); + let contract_class_c = ContractClass::from_path("starknet_programs/get_number_c.json").unwrap(); // Create state reader with class hash data let mut casm_contract_class_cache = HashMap::new(); @@ -1881,8 +1909,7 @@ fn call_contract_replace_class_cairo_0() { // Add get_number_b contract to the state - let path = PathBuf::from("starknet_programs/get_number_d.json"); - let contract_class_d = ContractClass::try_from(path).unwrap(); + let contract_class_d = ContractClass::from_path("starknet_programs/get_number_d.json").unwrap(); let class_hash_d: ClassHash = Felt252::from(2).to_be_bytes(); @@ -1919,7 +1946,7 @@ fn call_contract_replace_class_cairo_0() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(deprecated_contract_class_cache), Some(casm_contract_class_cache), ); @@ -1961,9 +1988,13 @@ fn call_contract_replace_class_cairo_0() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - assert_eq!(result.retdata, vec![64.into(), 33.into()]); + assert_eq!( + result.call_info.unwrap().retdata, + vec![64.into(), 33.into()] + ); } #[test] @@ -1994,7 +2025,7 @@ fn test_out_of_gas_failure() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [].to_vec(); @@ -2032,8 +2063,10 @@ fn test_out_of_gas_failure() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); + let call_info = call_info.call_info.unwrap(); assert_eq!( call_info.retdata, vec![Felt252::from_bytes_be("Out of gas".as_bytes())] @@ -2069,7 +2102,7 @@ fn deploy_syscall_failure_uninitialized_class_hash() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [Felt252::zero()].to_vec(); @@ -2106,10 +2139,11 @@ fn deploy_syscall_failure_uninitialized_class_hash() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); assert_eq!( - std::str::from_utf8(&call_info.retdata[0].to_be_bytes()) + std::str::from_utf8(&call_info.call_info.unwrap().retdata[0].to_be_bytes()) .unwrap() .trim_start_matches('\0'), "CLASS_HASH_NOT_FOUND" @@ -2153,7 +2187,7 @@ fn deploy_syscall_failure_in_constructor() { contract_class_cache.insert(f_c_class_hash.to_be_bytes(), f_c_contract_class); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [f_c_class_hash].to_vec(); @@ -2190,12 +2224,13 @@ fn deploy_syscall_failure_in_constructor() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); // Check that we get the error from the constructor // assert( 1 == 0 , 'Oops'); assert_eq!( - std::str::from_utf8(&call_info.retdata[0].to_be_bytes()) + std::str::from_utf8(&call_info.call_info.unwrap().retdata[0].to_be_bytes()) .unwrap() .trim_start_matches('\0'), "Oops" @@ -2230,7 +2265,7 @@ fn storage_read_no_value() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::new( @@ -2278,10 +2313,11 @@ fn storage_read_no_value() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); // As the value doesn't exist in storage, it's value will be 0 - assert_eq!(call_info.retdata, [0.into()]); + assert_eq!(call_info.call_info.unwrap().retdata, [0.into()]); } #[test] @@ -2314,7 +2350,7 @@ fn storage_read_unavailable_address_domain() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::new( @@ -2362,11 +2398,12 @@ fn storage_read_unavailable_address_domain() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); assert_eq!( - call_info.retdata[0], + call_info.call_info.unwrap().retdata[0], Felt252::from_bytes_be(b"Unsupported address domain") ); } @@ -2401,7 +2438,7 @@ fn storage_write_unavailable_address_domain() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::new( @@ -2449,11 +2486,12 @@ fn storage_write_unavailable_address_domain() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); assert_eq!( - call_info.retdata[0], + call_info.call_info.unwrap().retdata[0], Felt252::from_bytes_be(b"Unsupported address domain") ); } @@ -2506,7 +2544,7 @@ fn library_call_failure() { .insert(lib_address, lib_nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [25.into(), Felt252::from_bytes_be(&lib_class_hash)].to_vec(); @@ -2549,8 +2587,12 @@ fn library_call_failure() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); + + let call_info = call_info.call_info.unwrap(); + assert_eq!( std::str::from_utf8(&call_info.retdata[0].to_be_bytes()) .unwrap() @@ -2611,7 +2653,7 @@ fn send_messages_to_l1_different_contract_calls() { .insert(send_msg_address, send_msg_nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [25.into(), 50.into(), 75.into()].to_vec(); @@ -2649,9 +2691,14 @@ fn send_messages_to_l1_different_contract_calls() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - let l1_to_l2_messages = call_info.get_sorted_l2_to_l1_messages().unwrap(); + let l1_to_l2_messages = call_info + .call_info + .unwrap() + .get_sorted_l2_to_l1_messages() + .unwrap(); assert_eq!( l1_to_l2_messages, vec![ @@ -2708,8 +2755,8 @@ fn send_messages_to_l1_different_contract_calls_cairo1_to_cairo0() { // Add send_message_to_l1 contract to the state - let path = PathBuf::from("starknet_programs/send_message_to_l1.json"); - let send_msg_contract_class = ContractClass::try_from(path).unwrap(); + let send_msg_contract_class = + ContractClass::from_path("starknet_programs/send_message_to_l1.json").unwrap(); let send_msg_address = Address(1.into()); //Hardcoded in contract let send_msg_class_hash: ClassHash = [2; 32]; @@ -2725,7 +2772,7 @@ fn send_messages_to_l1_different_contract_calls_cairo1_to_cairo0() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(deprecated_contract_class_cache), Some(contract_class_cache), ); @@ -2766,9 +2813,14 @@ fn send_messages_to_l1_different_contract_calls_cairo1_to_cairo0() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - let l1_to_l2_messages = call_info.get_sorted_l2_to_l1_messages().unwrap(); + let l1_to_l2_messages = call_info + .call_info + .unwrap() + .get_sorted_l2_to_l1_messages() + .unwrap(); assert_eq!( l1_to_l2_messages, vec![ @@ -2795,8 +2847,8 @@ fn send_messages_to_l1_different_contract_calls_cairo1_to_cairo0() { #[test] fn send_messages_to_l1_different_contract_calls_cairo0_to_cairo1() { // Create program and entry point types for contract class - let path = PathBuf::from("starknet_programs/send_messages_contract_call.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = + ContractClass::from_path("starknet_programs/send_messages_contract_call.json").unwrap(); let entrypoint_selector = &contract_class.entry_points_by_type()[&EntryPointType::External][0] .selector() .to_owned(); @@ -2840,7 +2892,7 @@ fn send_messages_to_l1_different_contract_calls_cairo0_to_cairo1() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(deprecated_contract_class_cache), Some(contract_class_cache), ); @@ -2881,9 +2933,14 @@ fn send_messages_to_l1_different_contract_calls_cairo0_to_cairo1() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); - let l1_to_l2_messages = call_info.get_sorted_l2_to_l1_messages().unwrap(); + let l1_to_l2_messages = call_info + .call_info + .unwrap() + .get_sorted_l2_to_l1_messages() + .unwrap(); assert_eq!( l1_to_l2_messages, vec![ diff --git a/tests/complex_contracts/amm_contracts/amm.rs b/tests/complex_contracts/amm_contracts/amm.rs index 5761d3935..bbab48eb9 100644 --- a/tests/complex_contracts/amm_contracts/amm.rs +++ b/tests/complex_contracts/amm_contracts/amm.rs @@ -1,11 +1,12 @@ use std::collections::{HashMap, HashSet}; +use std::sync::Arc; use cairo_vm::vm::runners::builtin_runner::HASH_BUILTIN_NAME; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use cairo_vm::{felt::Felt252, vm::runners::builtin_runner::RANGE_CHECK_BUILTIN_NAME}; use num_traits::Zero; -use starknet_contract_class::EntryPointType; use starknet_in_rust::definitions::block_context::BlockContext; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ execution::{CallInfo, CallType}, services::api::contract_classes::deprecated_contract_class::ContractClass, @@ -54,7 +55,7 @@ fn swap(calldata: &[Felt252], call_config: &mut CallConfig) -> Result { pub state: &'a mut CachedState, @@ -121,13 +118,16 @@ pub fn execute_entry_point( TRANSACTION_VERSION.clone(), ); - exec_entry_point.execute( + let ExecutionResult { call_info, .. } = exec_entry_point.execute( call_config.state, call_config.block_context, call_config.resources_manager, &mut tx_execution_context, false, - ) + call_config.block_context.invoke_tx_max_n_steps(), + )?; + + Ok(call_info.unwrap()) } pub fn deploy( @@ -137,17 +137,24 @@ pub fn deploy( block_context: &BlockContext, hash_value: Option, ) -> Result<(Address, [u8; 32]), TransactionError> { - let contract_reader = BufReader::new(File::open(path).unwrap()); - let contract_class = ContractClass::try_from(contract_reader).unwrap(); - - let internal_deploy = Deploy::new( - 0.into(), - contract_class.clone(), - calldata.to_vec(), - StarknetChainId::TestNet.to_felt(), - 0.into(), - hash_value, - )?; + let contract_class = ContractClass::from_path(path).unwrap(); + + let internal_deploy = match hash_value { + None => Deploy::new( + 0.into(), + contract_class.clone(), + calldata.to_vec(), + StarknetChainId::TestNet.to_felt(), + 0.into(), + )?, + Some(hash_value) => Deploy::new_with_tx_hash( + 0.into(), + contract_class.clone(), + calldata.to_vec(), + 0.into(), + hash_value, + )?, + }; let class_hash = internal_deploy.class_hash(); state.set_contract_class(&class_hash, &contract_class)?; diff --git a/tests/delegate_call.rs b/tests/delegate_call.rs index 9b7c7926f..cd2c1da89 100644 --- a/tests/delegate_call.rs +++ b/tests/delegate_call.rs @@ -4,7 +4,7 @@ mod cairo_1_syscalls; use cairo_vm::felt::Felt252; use num_traits::{One, Zero}; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -15,6 +15,7 @@ use starknet_in_rust::{ state::{in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager}, utils::Address, }; +use std::sync::Arc; use std::{collections::HashMap, path::PathBuf}; #[test] @@ -29,7 +30,7 @@ fn delegate_call() { // Add get_number.cairo contract to the state let path = PathBuf::from("starknet_programs/get_number.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let address = Address(Felt252::one()); // const CONTRACT_ADDRESS = 1; let class_hash = [2; 32]; @@ -48,7 +49,7 @@ fn delegate_call() { // --------------------------------------------------------- let path = PathBuf::from("starknet_programs/delegate_call.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let entry_points_by_type = contract_class.entry_points_by_type().clone(); // External entry point, delegate_call function delegate.cairo:L13 @@ -77,7 +78,7 @@ fn delegate_call() { //* Create state with previous data //* --------------------------------------- - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* ------------------------------------ //* Create execution entry point @@ -120,6 +121,7 @@ fn delegate_call() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps() ) .is_ok()); } diff --git a/tests/delegate_l1_handler.rs b/tests/delegate_l1_handler.rs index a222dddc9..ee5c2c3ca 100644 --- a/tests/delegate_l1_handler.rs +++ b/tests/delegate_l1_handler.rs @@ -4,7 +4,7 @@ mod cairo_1_syscalls; use cairo_vm::felt::{felt_str, Felt252}; use num_traits::{One, Zero}; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -17,6 +17,7 @@ use starknet_in_rust::{ }, utils::Address, }; +use std::sync::Arc; use std::{collections::HashMap, path::PathBuf}; #[test] @@ -30,7 +31,7 @@ fn delegate_l1_handler() { // Add get_number.cairo contract to the state let path = PathBuf::from("starknet_programs/get_number_l1_handler.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let address = Address(Felt252::one()); // const CONTRACT_ADDRESS = 1; let class_hash = [2; 32]; @@ -49,7 +50,7 @@ fn delegate_l1_handler() { // --------------------------------------------------------- let path = PathBuf::from("starknet_programs/delegate_l1_handler.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); // External entry point, delegate_call function delegate.cairo:L13 let test_delegate_l1_handler_selector = @@ -72,7 +73,7 @@ fn delegate_l1_handler() { //* Create state with previous data //* --------------------------------------- - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* ------------------------------------ //* Create execution entry point @@ -114,6 +115,7 @@ fn delegate_l1_handler() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps() ) .is_ok()); } diff --git a/tests/deploy_account.rs b/tests/deploy_account.rs index 1632492f6..8a3dedd4e 100644 --- a/tests/deploy_account.rs +++ b/tests/deploy_account.rs @@ -4,7 +4,7 @@ use cairo_vm::{ }; use lazy_static::lazy_static; use num_traits::Zero; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ core::contract_address::compute_deprecated_class_hash, definitions::{ @@ -20,7 +20,7 @@ use starknet_in_rust::{ utils::Address, CasmContractClass, }; -use std::{collections::HashSet, fs::File, io::BufReader}; +use std::{collections::HashSet, sync::Arc}; lazy_static! { static ref TEST_ACCOUNT_COMPILED_CONTRACT_CLASS_HASH: Felt252 = felt_str!("1"); @@ -28,15 +28,13 @@ lazy_static! { #[test] fn internal_deploy_account() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, None, None); state.set_contract_classes(Default::default()).unwrap(); - let contract_class = ContractClass::try_from(BufReader::new( - File::open("starknet_programs/account_without_validation.json").unwrap(), - )) - .unwrap(); + let contract_class = + ContractClass::from_path("starknet_programs/account_without_validation.json").unwrap(); let class_hash = compute_deprecated_class_hash(&contract_class).unwrap(); let class_hash_bytes = class_hash.to_be_bytes(); @@ -64,7 +62,6 @@ fn internal_deploy_account() { ], contract_address_salt.clone(), StarknetChainId::TestNet.to_felt(), - None, ) .unwrap(); @@ -93,8 +90,10 @@ fn internal_deploy_account() { ..Default::default() }), None, + None, 0, [ + ("n_steps", 3098), ("pedersen_builtin", 23), ("range_check_builtin", 74), ("l1_gas_usage", 1224) @@ -109,7 +108,7 @@ fn internal_deploy_account() { #[test] fn internal_deploy_account_cairo1() { - let state_reader = InMemoryStateReader::default(); + let state_reader = Arc::new(InMemoryStateReader::default()); let mut state = CachedState::new(state_reader, None, Some(Default::default())); state.set_contract_classes(Default::default()).unwrap(); @@ -148,7 +147,6 @@ fn internal_deploy_account_cairo1() { ], contract_address_salt, StarknetChainId::TestNet.to_felt(), - None, ) .unwrap(); @@ -162,6 +160,16 @@ fn internal_deploy_account_cairo1() { ]; let keys: HashSet<[u8; 32]> = [accessed_keys].iter().copied().collect(); + let n_steps; + #[cfg(not(feature = "cairo_1_tests"))] + { + n_steps = 3359; + } + #[cfg(feature = "cairo_1_tests")] + { + n_steps = 3363; + } + assert_eq!( tx_info, TransactionExecutionInfo::new( @@ -195,7 +203,7 @@ fn internal_deploy_account_cairo1() { n_steps: 152, #[cfg(feature="cairo_1_tests")] n_steps: 155, - n_memory_holes: 18, + n_memory_holes: 17, builtin_instance_counter: [ ("range_check_builtin", 2), @@ -230,7 +238,7 @@ fn internal_deploy_account_cairo1() { n_steps: 92, #[cfg(feature="cairo_1_tests")] n_steps: 93, - n_memory_holes: 1, + n_memory_holes: 0, builtin_instance_counter: [ ("range_check_builtin", 2), @@ -242,8 +250,10 @@ fn internal_deploy_account_cairo1() { ..Default::default() }), None, + None, 0, [ + ("n_steps", n_steps), ("pedersen_builtin", 23), ("range_check_builtin", 78), ("l1_gas_usage", 3672) diff --git a/tests/fibonacci.rs b/tests/fibonacci.rs index 0bcf23e69..17f44906c 100644 --- a/tests/fibonacci.rs +++ b/tests/fibonacci.rs @@ -5,8 +5,8 @@ use cairo_lang_starknet::casm_contract_class::CasmContractClass; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use cairo_vm::{felt::Felt252, vm::runners::builtin_runner::RANGE_CHECK_BUILTIN_NAME}; use num_traits::Zero; -use starknet_contract_class::EntryPointType; use starknet_in_rust::definitions::block_context::BlockContext; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::constants::TRANSACTION_VERSION, execution::{ @@ -17,6 +17,7 @@ use starknet_in_rust::{ state::{in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager}, utils::{Address, ClassHash}, }; +use std::sync::Arc; use std::{collections::HashMap, path::PathBuf}; #[test] @@ -26,7 +27,7 @@ fn integration_test() { // --------------------------------------------------------- let path = PathBuf::from("starknet_programs/fibonacci.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let entry_points_by_type = contract_class.entry_points_by_type().clone(); let fib_entrypoint_selector = entry_points_by_type @@ -62,7 +63,7 @@ fn integration_test() { //* Create state with previous data //* --------------------------------------- - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* ------------------------------------ //* Create execution entry point @@ -122,7 +123,10 @@ fn integration_test() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) + .unwrap() + .call_info .unwrap(), expected_call_info ); @@ -157,7 +161,7 @@ fn integration_test_cairo1() { .insert(address.clone(), nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, None, Some(contract_class_cache)); + let mut state = CachedState::new(Arc::new(state_reader), None, Some(contract_class_cache)); // Create an execution entry point let calldata = [0.into(), 1.into(), 12.into()].to_vec(); @@ -199,7 +203,7 @@ fn integration_test_cairo1() { retdata: [144.into()].to_vec(), execution_resources: ExecutionResources { n_steps: 418, - n_memory_holes: 1, + n_memory_holes: 0, builtin_instance_counter: HashMap::from([(RANGE_CHECK_BUILTIN_NAME.to_string(), 15)]), }, class_hash: Some(class_hash), @@ -215,7 +219,10 @@ fn integration_test_cairo1() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) + .unwrap() + .call_info .unwrap(), expected_call_info ); diff --git a/tests/increase_balance.rs b/tests/increase_balance.rs index b9df55f97..1f5f50742 100644 --- a/tests/increase_balance.rs +++ b/tests/increase_balance.rs @@ -5,7 +5,7 @@ mod cairo_1_syscalls; use cairo_vm::felt::Felt252; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use num_traits::Zero; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -16,6 +16,7 @@ use starknet_in_rust::{ state::{in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager}, utils::{calculate_sn_keccak, Address}, }; +use std::sync::Arc; use std::{ collections::{HashMap, HashSet}, path::PathBuf, @@ -28,7 +29,7 @@ fn hello_starknet_increase_balance() { // --------------------------------------------------------- let path = PathBuf::from("starknet_programs/increase_balance.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let entry_points_by_type = contract_class.entry_points_by_type().clone(); // External entry point, increase_balance function increase_balance.cairo:L13 @@ -70,7 +71,7 @@ fn hello_starknet_increase_balance() { //* Create state with previous data //* --------------------------------------- - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* ------------------------------------ //* Create execution entry point @@ -137,7 +138,10 @@ fn hello_starknet_increase_balance() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps() ) + .unwrap() + .call_info .unwrap(), expected_call_info ); diff --git a/tests/internal_calls.rs b/tests/internal_calls.rs index 08c47299f..62ed69d71 100644 --- a/tests/internal_calls.rs +++ b/tests/internal_calls.rs @@ -1,8 +1,10 @@ #![deny(warnings)] +use std::sync::Arc; + use cairo_vm::felt::Felt252; use num_traits::Zero; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -13,13 +15,11 @@ use starknet_in_rust::{ state::{in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager}, utils::{calculate_sn_keccak, Address, ClassHash}, }; -use std::path::PathBuf; #[test] fn test_internal_calls() { - let contract_class = - ContractClass::try_from(PathBuf::from("starknet_programs/internal_calls.json")) - .expect("Could not load contract from JSON"); + let contract_class = ContractClass::from_path("starknet_programs/internal_calls.json") + .expect("Could not load contract from JSON"); let block_context = BlockContext::default(); let mut tx_execution_context = TransactionExecutionContext::create_for_testing( @@ -46,7 +46,7 @@ fn test_internal_calls() { .insert(storage_entry, storage); let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some([([0x01; 32], contract_class)].into_iter().collect()), None, ); @@ -72,9 +72,12 @@ fn test_internal_calls() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .expect("Could not execute contract"); + let call_info = call_info.call_info.unwrap(); + assert_eq!(call_info.internal_calls.len(), 1); assert_eq!(call_info.internal_calls[0].internal_calls.len(), 1); assert!(call_info.internal_calls[0].internal_calls[0] diff --git a/tests/internals.rs b/tests/internals.rs index ed10d5abc..d24129a95 100644 --- a/tests/internals.rs +++ b/tests/internals.rs @@ -11,8 +11,10 @@ use cairo_vm::vm::{ }; use lazy_static::lazy_static; use num_bigint::BigUint; -use num_traits::{Num, One, ToPrimitive, Zero}; -use starknet_contract_class::EntryPointType; +use num_traits::{FromPrimitive, Num, One, Zero}; +use starknet_in_rust::core::contract_address::{ + compute_casm_class_hash, compute_sierra_class_hash, +}; use starknet_in_rust::core::errors::state_errors::StateError; use starknet_in_rust::definitions::constants::{ DEFAULT_CAIRO_RESOURCE_FEE_WEIGHTS, VALIDATE_ENTRY_POINT_SELECTOR, @@ -21,8 +23,10 @@ use starknet_in_rust::execution::execution_entry_point::ExecutionEntryPoint; use starknet_in_rust::execution::TransactionExecutionContext; use starknet_in_rust::services::api::contract_classes::deprecated_contract_class::ContractClass; use starknet_in_rust::state::ExecutionResourcesManager; +use starknet_in_rust::transaction::fee::calculate_tx_fee; use starknet_in_rust::transaction::{DeclareV2, Deploy}; use starknet_in_rust::CasmContractClass; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{ block_context::{BlockContext, StarknetChainId, StarknetOsConfig}, @@ -49,10 +53,8 @@ use starknet_in_rust::{ }, utils::{calculate_sn_keccak, felt_to_hash, Address, ClassHash}, }; -use std::{ - collections::{HashMap, HashSet}, - path::PathBuf, -}; +use std::collections::{HashMap, HashSet}; +use std::sync::Arc; const ACCOUNT_CONTRACT_PATH: &str = "starknet_programs/account_without_validation.json"; const ERC20_CONTRACT_PATH: &str = "starknet_programs/ERC20.json"; @@ -75,9 +77,11 @@ lazy_static! { static ref TEST_CLASS_HASH: Felt252 = felt_str!("272"); static ref TEST_EMPTY_CONTRACT_CLASS_HASH: Felt252 = felt_str!("274"); static ref TEST_ERC20_CONTRACT_CLASS_HASH: Felt252 = felt_str!("4112"); - static ref TEST_FIB_COMPILED_CONTRACT_CLASS_HASH: Felt252 = felt_str!("27727"); + static ref TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO1: Felt252 = felt_str!("1948962768849191111780391610229754715773924969841143100991524171924131413970"); + static ref TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO2: Felt252 = felt_str!("2889767417435368609058888822622483550637539736178264636938129582300971548553"); // Storage keys. + // NOTE: this key corresponds to the lower 128 bits of an U256 static ref TEST_ERC20_ACCOUNT_BALANCE_KEY: Felt252 = felt_str!("1192211877881866289306604115402199097887041303917861778777990838480655617515"); static ref TEST_ERC20_SEQUENCER_BALANCE_KEY: Felt252 = @@ -91,15 +95,8 @@ lazy_static! { felt_str!("2542253978940891427830343982984992363331567580652119103860970381451088310289"); // Others. - // Blockifier had this value hardcoded to 2. - static ref ACTUAL_FEE: Felt252 = Felt252::zero(); -} - -fn get_contract_class

(path: P) -> Result> -where - P: Into, -{ - Ok(ContractClass::try_from(path.into())?) + static ref INITIAL_BALANCE: Felt252 = Felt252::from_u128(100000).unwrap(); + static ref GAS_PRICE: u128 = 1; } pub fn new_starknet_block_context_for_testing() -> BlockContext { @@ -107,7 +104,7 @@ pub fn new_starknet_block_context_for_testing() -> BlockContext { StarknetOsConfig::new( StarknetChainId::TestNet, TEST_ERC20_CONTRACT_ADDRESS.clone(), - 0, + *GAS_PRICE, ), 0, 0, @@ -130,15 +127,15 @@ fn create_account_tx_test_state( let class_hash_to_class = HashMap::from([ ( test_account_contract_class_hash, - get_contract_class(ACCOUNT_CONTRACT_PATH)?, + ContractClass::from_path(ACCOUNT_CONTRACT_PATH)?, ), ( test_contract_class_hash, - get_contract_class(TEST_CONTRACT_PATH)?, + ContractClass::from_path(TEST_CONTRACT_PATH)?, ), ( test_erc20_class_hash, - get_contract_class(ERC20_CONTRACT_PATH)?, + ContractClass::from_path(ERC20_CONTRACT_PATH)?, ), ]); @@ -161,7 +158,7 @@ fn create_account_tx_test_state( let storage_view = HashMap::from([( (test_erc20_address, test_erc20_account_balance_key), - ACTUAL_FEE.clone(), + INITIAL_BALANCE.clone(), )]); let cached_state = CachedState::new( @@ -194,7 +191,7 @@ fn create_account_tx_test_state( .class_hash_to_contract_class_mut() .insert(class_hash, contract_class); } - state_reader + Arc::new(state_reader) }, Some(HashMap::new()), Some(HashMap::new()), @@ -209,39 +206,39 @@ fn expected_state_before_tx() -> CachedState { let state_cache = ContractClassCache::new(); CachedState::new( - in_memory_state_reader, + Arc::new(in_memory_state_reader), Some(state_cache), Some(HashMap::new()), ) } -fn expected_state_after_tx() -> CachedState { +fn expected_state_after_tx(fee: u128) -> CachedState { let in_memory_state_reader = initial_in_memory_state_reader(); let contract_classes_cache = ContractClassCache::from([ ( felt_to_hash(&TEST_CLASS_HASH.clone()), - get_contract_class(TEST_CONTRACT_PATH).unwrap(), + ContractClass::from_path(TEST_CONTRACT_PATH).unwrap(), ), ( felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH.clone()), - get_contract_class(ACCOUNT_CONTRACT_PATH).unwrap(), + ContractClass::from_path(ACCOUNT_CONTRACT_PATH).unwrap(), ), ( felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH.clone()), - get_contract_class(ERC20_CONTRACT_PATH).unwrap(), + ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap(), ), ]); CachedState::new_for_testing( - in_memory_state_reader, + Arc::new(in_memory_state_reader), Some(contract_classes_cache), - state_cache_after_invoke_tx(), + state_cache_after_invoke_tx(fee), Some(HashMap::new()), ) } -fn state_cache_after_invoke_tx() -> StateCache { +fn state_cache_after_invoke_tx(fee: u128) -> StateCache { let class_hash_initial_values = HashMap::from([ ( TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), @@ -273,7 +270,7 @@ fn state_cache_after_invoke_tx() -> StateCache { TEST_ERC20_CONTRACT_ADDRESS.clone(), felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY.clone()), ), - Felt252::zero(), + INITIAL_BALANCE.clone(), ), ( ( @@ -301,14 +298,14 @@ fn state_cache_after_invoke_tx() -> StateCache { TEST_ERC20_CONTRACT_ADDRESS.clone(), felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY.clone()), ), - Felt252::from(0), + Felt252::from(fee), ), ( ( TEST_ERC20_CONTRACT_ADDRESS.clone(), felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY.clone()), ), - Felt252::from(0), + INITIAL_BALANCE.clone() - Felt252::from(fee), ), ( ( @@ -369,20 +366,20 @@ fn initial_in_memory_state_reader() -> InMemoryStateReader { TEST_ERC20_CONTRACT_ADDRESS.clone(), felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY.clone()), ), - Felt252::from(0), + INITIAL_BALANCE.clone(), )]), HashMap::from([ ( felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH), - get_contract_class(ERC20_CONTRACT_PATH).unwrap(), + ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap(), ), ( felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH), - get_contract_class(ACCOUNT_CONTRACT_PATH).unwrap(), + ContractClass::from_path(ACCOUNT_CONTRACT_PATH).unwrap(), ), ( felt_to_hash(&TEST_CLASS_HASH), - get_contract_class(TEST_CONTRACT_PATH).unwrap(), + ContractClass::from_path(TEST_CONTRACT_PATH).unwrap(), ), ]), HashMap::new(), @@ -465,7 +462,7 @@ fn expected_fee_transfer_call_info( ], ]), storage_read_values: vec![ - Felt252::zero(), + INITIAL_BALANCE.clone(), Felt252::zero(), Felt252::zero(), Felt252::zero(), @@ -485,8 +482,8 @@ fn expected_fee_transfer_call_info( fn validate_final_balances( state: &mut S, block_context: &BlockContext, - expected_sequencer_balance: Felt252, erc20_account_balance_storage_key: &ClassHash, + fee: u128, ) where S: State + StateReader, { @@ -499,7 +496,10 @@ fn validate_final_balances( *erc20_account_balance_storage_key, )) .unwrap(); - assert_eq!(account_balance, Felt252::zero()); + assert_eq!( + account_balance, + INITIAL_BALANCE.clone() - Felt252::from(fee) + ); let sequencer_balance = state .get_storage_at(&( @@ -510,12 +510,12 @@ fn validate_final_balances( felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY), )) .unwrap(); - assert_eq!(sequencer_balance, expected_sequencer_balance); + assert_eq!(sequencer_balance, fee.into()); } #[test] fn test_create_account_tx_test_state() { - let (block_context, mut state) = create_account_tx_test_state().unwrap(); + let (block_context, state) = create_account_tx_test_state().unwrap(); assert_eq!(state, expected_state_before_tx()); @@ -528,7 +528,7 @@ fn test_create_account_tx_test_state() { felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY), )) .unwrap(); - assert_eq!(value, *ACTUAL_FEE); + assert_eq!(value, *INITIAL_BALANCE); let class_hash = state.get_class_hash_at(&TEST_CONTRACT_ADDRESS).unwrap(); assert_eq!(class_hash, felt_to_hash(&TEST_CLASS_HASH)); @@ -540,7 +540,7 @@ fn test_create_account_tx_test_state() { .unwrap(); assert_eq!( contract_class, - get_contract_class(ERC20_CONTRACT_PATH).unwrap() + ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap() ); } @@ -548,18 +548,17 @@ fn invoke_tx(calldata: Vec) -> InvokeFunction { InvokeFunction::new( TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), EXECUTE_ENTRY_POINT_SELECTOR.clone(), - 2, + 5000, TRANSACTION_VERSION.clone(), calldata, vec![], StarknetChainId::TestNet.to_felt(), Some(Felt252::zero()), - None, ) .unwrap() } -fn expected_fee_transfer_info() -> CallInfo { +fn expected_fee_transfer_info(fee: u128) -> CallInfo { CallInfo { failure_flag: false, gas_consumed: 0, @@ -570,7 +569,7 @@ fn expected_fee_transfer_info() -> CallInfo { class_hash: Some(felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH)), entry_point_selector: Some(TRANSFER_ENTRY_POINT_SELECTOR.clone()), entry_point_type: Some(EntryPointType::External), - calldata: vec![Felt252::from(4096), Felt252::zero(), Felt252::zero()], + calldata: vec![Felt252::from(4096), Felt252::from(fee), Felt252::zero()], retdata: vec![Felt252::from(1)], execution_resources: ExecutionResources { n_steps: 525, @@ -588,12 +587,12 @@ fn expected_fee_transfer_info() -> CallInfo { data: vec![ Felt252::from(257), Felt252::from(4096), - Felt252::zero(), + Felt252::from(fee), Felt252::zero(), ], }], storage_read_values: vec![ - Felt252::zero(), + INITIAL_BALANCE.clone(), Felt252::zero(), Felt252::zero(), Felt252::zero(), @@ -619,7 +618,7 @@ fn expected_fee_transfer_info() -> CallInfo { } } -fn expected_fib_fee_transfer_info() -> CallInfo { +fn expected_fib_fee_transfer_info(fee: u128) -> CallInfo { CallInfo { failure_flag: false, gas_consumed: 0, @@ -630,7 +629,7 @@ fn expected_fib_fee_transfer_info() -> CallInfo { class_hash: Some(felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH)), entry_point_selector: Some(TRANSFER_ENTRY_POINT_SELECTOR.clone()), entry_point_type: Some(EntryPointType::External), - calldata: vec![Felt252::from(4096), Felt252::zero(), Felt252::zero()], + calldata: vec![Felt252::from(4096), Felt252::from(fee), Felt252::zero()], retdata: vec![Felt252::from(1)], execution_resources: ExecutionResources { n_steps: 525, @@ -648,14 +647,14 @@ fn expected_fib_fee_transfer_info() -> CallInfo { data: vec![ Felt252::from(257), Felt252::from(4096), - Felt252::zero(), + Felt252::from(fee), Felt252::zero(), ], }], storage_read_values: vec![ + INITIAL_BALANCE.clone() - Felt252::from(24), Felt252::zero(), - Felt252::zero(), - Felt252::zero(), + Felt252::from(24), Felt252::zero(), ], accessed_storage_keys: HashSet::from([ @@ -681,13 +680,13 @@ fn expected_fib_fee_transfer_info() -> CallInfo { fn declare_tx() -> Declare { Declare { - contract_class: get_contract_class(TEST_EMPTY_CONTRACT_PATH).unwrap(), + contract_class: ContractClass::from_path(TEST_EMPTY_CONTRACT_PATH).unwrap(), class_hash: felt_to_hash(&TEST_EMPTY_CONTRACT_CLASS_HASH), sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), tx_type: TransactionType::Declare, validate_entry_point_selector: VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(), version: 1.into(), - max_fee: 2, + max_fee: 100000, signature: vec![], nonce: 0.into(), hash_value: 0.into(), @@ -703,19 +702,24 @@ fn declarev2_tx() -> DeclareV2 { #[cfg(feature = "cairo_1_tests")] let program_data = include_bytes!("../starknet_programs/cairo1/fibonacci.sierra"); let sierra_contract_class: SierraContractClass = serde_json::from_slice(program_data).unwrap(); + let sierra_class_hash = compute_sierra_class_hash(&sierra_contract_class).unwrap(); + let casm_class = + CasmContractClass::from_contract_class(sierra_contract_class.clone(), true).unwrap(); + let casm_class_hash = compute_casm_class_hash(&casm_class).unwrap(); DeclareV2 { sender_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), tx_type: TransactionType::Declare, validate_entry_point_selector: VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone(), version: 1.into(), - max_fee: 2, + max_fee: 5000, signature: vec![], nonce: 0.into(), hash_value: 0.into(), - compiled_class_hash: TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), + compiled_class_hash: casm_class_hash, sierra_contract_class, - casm_class: Default::default(), + sierra_class_hash, + casm_class: casm_class.into(), skip_execute: false, skip_fee_transfer: false, skip_validate: false, @@ -723,12 +727,21 @@ fn declarev2_tx() -> DeclareV2 { } fn deploy_fib_syscall() -> Deploy { + let contract_hash; + #[cfg(not(feature = "cairo_1_tests"))] + { + contract_hash = felt_to_hash(&TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO2.clone()) + } + #[cfg(feature = "cairo_1_tests")] + { + contract_hash = felt_to_hash(&TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO1.clone()) + } Deploy { hash_value: 0.into(), version: 1.into(), contract_address: TEST_FIB_CONTRACT_ADDRESS.clone(), contract_address_salt: 0.into(), - contract_hash: felt_to_hash(&TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone()), + contract_hash, constructor_calldata: Vec::new(), tx_type: TransactionType::Deploy, skip_execute: false, @@ -737,7 +750,7 @@ fn deploy_fib_syscall() -> Deploy { } } -fn expected_declare_fee_transfer_info() -> CallInfo { +fn expected_declare_fee_transfer_info(fee: u128) -> CallInfo { CallInfo { caller_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), call_type: Some(CallType::Call), @@ -747,7 +760,7 @@ fn expected_declare_fee_transfer_info() -> CallInfo { entry_point_type: Some(EntryPointType::External), calldata: vec![ TEST_SEQUENCER_ADDRESS.0.clone(), - Felt252::zero(), + Felt252::from(fee), Felt252::zero(), ], retdata: vec![1.into()], @@ -759,12 +772,12 @@ fn expected_declare_fee_transfer_info() -> CallInfo { vec![ TEST_ACCOUNT_CONTRACT_ADDRESS.clone().0, TEST_SEQUENCER_ADDRESS.clone().0, - 0.into(), + Felt252::from(fee), 0.into(), ], )], storage_read_values: vec![ - Felt252::zero(), + INITIAL_BALANCE.clone(), Felt252::zero(), Felt252::zero(), Felt252::zero(), @@ -811,6 +824,14 @@ fn test_declare_tx() { // Check ContractClass is set after the declare_tx assert!(state.get_contract_class(&declare_tx.class_hash).is_ok()); + let resources = HashMap::from([ + ("n_steps".to_string(), 2348), + ("range_check_builtin".to_string(), 57), + ("pedersen_builtin".to_string(), 15), + ("l1_gas_usage".to_string(), 0), + ]); + let fee = calculate_tx_fee(&resources, *GAS_PRICE, &block_context).unwrap(); + let expected_execution_info = TransactionExecutionInfo::new( Some(CallInfo { call_type: Some(CallType::Call), @@ -826,13 +847,10 @@ fn test_declare_tx() { ..Default::default() }), None, - Some(expected_declare_fee_transfer_info()), - 0, - HashMap::from([ - ("range_check_builtin".to_string(), 57), - ("pedersen_builtin".to_string(), 15), - ("l1_gas_usage".to_string(), 0), - ]), + None, + Some(expected_declare_fee_transfer_info(fee)), + fee, + resources, Some(TransactionType::Declare), ); @@ -855,6 +873,23 @@ fn test_declarev2_tx() { .get_contract_class(&declare_tx.compiled_class_hash.to_be_bytes()) .is_ok()); + let resources = HashMap::from([ + ("n_steps".to_string(), 2348), + ("range_check_builtin".to_string(), 57), + ("pedersen_builtin".to_string(), 15), + ("l1_gas_usage".to_string(), 0), + ]); + let fee = calculate_tx_fee(&resources, *GAS_PRICE, &block_context).unwrap(); + + let contract_hash; + #[cfg(not(feature = "cairo_1_tests"))] + { + contract_hash = TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO2.clone(); + } + #[cfg(feature = "cairo_1_tests")] + { + contract_hash = TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO1.clone(); + } let expected_execution_info = TransactionExecutionInfo::new( Some(CallInfo { call_type: Some(CallType::Call), @@ -862,7 +897,7 @@ fn test_declarev2_tx() { class_hash: Some(felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH)), entry_point_selector: Some(VALIDATE_DECLARE_ENTRY_POINT_SELECTOR.clone()), entry_point_type: Some(EntryPointType::External), - calldata: vec![TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone()], + calldata: vec![contract_hash], execution_resources: ExecutionResources { n_steps: 12, ..Default::default() @@ -870,13 +905,10 @@ fn test_declarev2_tx() { ..Default::default() }), None, - Some(expected_declare_fee_transfer_info()), - 0, - HashMap::from([ - ("range_check_builtin".to_string(), 57), - ("pedersen_builtin".to_string(), 15), - ("l1_gas_usage".to_string(), 0), - ]), + None, + Some(expected_declare_fee_transfer_info(fee)), + fee, + resources, Some(TransactionType::Declare), ); @@ -940,6 +972,15 @@ fn expected_execute_call_info() -> CallInfo { } fn expected_fib_execute_call_info() -> CallInfo { + let contract_hash; + #[cfg(not(feature = "cairo_1_tests"))] + { + contract_hash = felt_to_hash(&TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO2.clone()); + } + #[cfg(feature = "cairo_1_tests")] + { + contract_hash = felt_to_hash(&TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO1.clone()); + } CallInfo { caller_address: Address(Felt252::zero()), call_type: Some(CallType::Call), @@ -962,14 +1003,14 @@ fn expected_fib_execute_call_info() -> CallInfo { n_steps: 157, #[cfg(feature = "cairo_1_tests")] n_steps: 160, - n_memory_holes: 1, + n_memory_holes: 0, builtin_instance_counter: HashMap::from([("range_check_builtin".to_string(), 4)]), }, l2_to_l1_messages: vec![], internal_calls: vec![CallInfo { caller_address: TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), call_type: Some(CallType::Call), - class_hash: Some(felt_to_hash(&TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone())), + class_hash: Some(contract_hash), entry_point_selector: Some(Felt252::from_bytes_be(&calculate_sn_keccak(b"fib"))), entry_point_type: Some(EntryPointType::External), calldata: vec![Felt252::from(42), Felt252::from(0), Felt252::from(0)], @@ -988,7 +1029,7 @@ fn expected_fib_execute_call_info() -> CallInfo { n_steps: 118, #[cfg(feature = "cairo_1_tests")] n_steps: 121, - n_memory_holes: 1, + n_memory_holes: 0, builtin_instance_counter: HashMap::from([("range_check_builtin".to_string(), 3)]), }, ..Default::default() @@ -1050,39 +1091,58 @@ fn expected_fib_validate_call_info_2() -> CallInfo { } } -fn expected_transaction_execution_info() -> TransactionExecutionInfo { +fn expected_transaction_execution_info(block_context: &BlockContext) -> TransactionExecutionInfo { + let resources = HashMap::from([ + ("n_steps".to_string(), 2921), + ("pedersen_builtin".to_string(), 16), + ("l1_gas_usage".to_string(), 0), + ("range_check_builtin".to_string(), 72), + ]); + let fee = calculate_tx_fee(&resources, *GAS_PRICE, block_context).unwrap(); TransactionExecutionInfo::new( Some(expected_validate_call_info_2()), Some(expected_execute_call_info()), - Some(expected_fee_transfer_info()), - 0, - HashMap::from([ - ("pedersen_builtin".to_string(), 16), - ("l1_gas_usage".to_string(), 0), - ("range_check_builtin".to_string(), 72), - ]), + None, + Some(expected_fee_transfer_info(fee)), + fee, + resources, Some(TransactionType::InvokeFunction), ) } -fn expected_fib_transaction_execution_info() -> TransactionExecutionInfo { +fn expected_fib_transaction_execution_info( + block_context: &BlockContext, +) -> TransactionExecutionInfo { + let n_steps; + #[cfg(not(feature = "cairo_1_tests"))] + { + n_steps = 3017; + } + #[cfg(feature = "cairo_1_tests")] + { + n_steps = 3020; + } + let resources = HashMap::from([ + ("n_steps".to_string(), n_steps), + ("l1_gas_usage".to_string(), 4896), + ("pedersen_builtin".to_string(), 16), + ("range_check_builtin".to_string(), 75), + ]); + let fee = calculate_tx_fee(&resources, *GAS_PRICE, block_context).unwrap(); TransactionExecutionInfo::new( Some(expected_fib_validate_call_info_2()), Some(expected_fib_execute_call_info()), - Some(expected_fib_fee_transfer_info()), - 0, - HashMap::from([ - ("pedersen_builtin".to_string(), 16), - ("l1_gas_usage".to_string(), 0), - ("range_check_builtin".to_string(), 75), - ]), + None, + Some(expected_fib_fee_transfer_info(fee)), + fee, + resources, Some(TransactionType::InvokeFunction), ) } #[test] fn test_invoke_tx() { - let (starknet_general_context, state) = &mut create_account_tx_test_state().unwrap(); + let (block_context, state) = &mut create_account_tx_test_state().unwrap(); let Address(test_contract_address) = TEST_CONTRACT_ADDRESS.clone(); let calldata = vec![ test_contract_address, // CONTRACT_ADDRESS @@ -1094,10 +1154,8 @@ fn test_invoke_tx() { // Extract invoke transaction fields for testing, as it is consumed when creating an account // transaction. - let result = invoke_tx - .execute(state, starknet_general_context, 0) - .unwrap(); - let expected_execution_info = expected_transaction_execution_info(); + let result = invoke_tx.execute(state, block_context, 0).unwrap(); + let expected_execution_info = expected_transaction_execution_info(block_context); assert_eq!(result, expected_execution_info); } @@ -1117,11 +1175,11 @@ fn test_invoke_tx_state() { ]; let invoke_tx = invoke_tx(calldata); - invoke_tx + let result = invoke_tx .execute(state, starknet_general_context, 0) .unwrap(); - let expected_final_state = expected_state_after_tx(); + let expected_final_state = expected_state_after_tx(result.actual_fee); assert_eq!(*state, expected_final_state); } @@ -1151,12 +1209,12 @@ fn test_invoke_with_declarev2_tx() { ]; let invoke_tx = invoke_tx(calldata); - let expected_gas_consumed = 4380; + let expected_gas_consumed = 4908; let result = invoke_tx .execute(state, block_context, expected_gas_consumed) .unwrap(); - let expected_execution_info = expected_fib_transaction_execution_info(); + let expected_execution_info = expected_fib_transaction_execution_info(block_context); assert_eq!(result, expected_execution_info); } @@ -1164,16 +1222,17 @@ fn test_invoke_with_declarev2_tx() { fn test_deploy_account() { let (block_context, mut state) = create_account_tx_test_state().unwrap(); + let expected_fee = 3684; + let deploy_account_tx = DeployAccount::new( felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH), - 2, + expected_fee, TRANSACTION_VERSION.clone(), Default::default(), Default::default(), Default::default(), Default::default(), StarknetChainId::TestNet.to_felt(), - None, ) .unwrap(); @@ -1183,9 +1242,9 @@ fn test_deploy_account() { .starknet_os_config() .fee_token_address() .clone(), - TEST_ERC20_DEPLOYED_ACCOUNT_BALANCE_KEY.to_be_bytes(), + felt_to_hash(&TEST_ERC20_DEPLOYED_ACCOUNT_BALANCE_KEY), ), - ACTUAL_FEE.clone(), + INITIAL_BALANCE.clone(), ); let (state_before, state_after) = expected_deploy_account_states(); @@ -1202,7 +1261,13 @@ fn test_deploy_account() { .execute(&mut state, &block_context) .unwrap(); - assert_eq!(state, state_after); + assert_eq!(state.contract_classes(), state_after.contract_classes()); + assert_eq!( + state.casm_contract_classes(), + state_after.casm_contract_classes() + ); + assert_eq!(state.state_reader, state_after.state_reader); + assert_eq!(state.cache(), state_after.cache()); let expected_validate_call_info = expected_validate_call_info( VALIDATE_DEPLOY_ENTRY_POINT_SELECTOR.clone(), @@ -1231,24 +1296,29 @@ fn test_deploy_account() { let expected_fee_transfer_call_info = expected_fee_transfer_call_info( &block_context, deploy_account_tx.contract_address(), - ACTUAL_FEE.to_u64().unwrap(), + expected_fee as u64, ); + let resources = HashMap::from([ + ("n_steps".to_string(), 3111), + ("range_check_builtin".to_string(), 74), + ("pedersen_builtin".to_string(), 23), + ("l1_gas_usage".to_string(), 3672), + ]); + + let fee = calculate_tx_fee(&resources, *GAS_PRICE, &block_context).unwrap(); + + assert_eq!(fee, 3704); + let expected_execution_info = TransactionExecutionInfo::new( expected_validate_call_info.into(), expected_execute_call_info.into(), + None, expected_fee_transfer_call_info.into(), - ACTUAL_FEE.to_u128().unwrap(), + expected_fee, // Entry **not** in blockifier. // Default::default(), - [ - ("l1_gas_usage", 3672), - ("range_check_builtin", 74), - ("pedersen_builtin", 23), - ] - .into_iter() - .map(|(k, v)| (k.to_string(), v)) - .collect(), + resources, TransactionType::DeployAccount.into(), ); assert_eq!(tx_info, expected_execution_info); @@ -1260,7 +1330,7 @@ fn test_deploy_account() { let hash = TEST_ERC20_DEPLOYED_ACCOUNT_BALANCE_KEY.to_be_bytes(); - validate_final_balances(&mut state, &block_context, Felt252::zero(), &hash); + validate_final_balances(&mut state, &block_context, &hash, expected_fee); let class_hash_from_state = state .get_class_hash_at(deploy_account_tx.contract_address()) @@ -1272,61 +1342,52 @@ fn expected_deploy_account_states() -> ( CachedState, CachedState, ) { + let fee = Felt252::from(3684); let mut state_before = CachedState::new( - InMemoryStateReader::new( + Arc::new(InMemoryStateReader::new( HashMap::from([ + (Address(0x101.into()), felt_to_hash(&0x111.into())), + (Address(0x100.into()), felt_to_hash(&0x110.into())), + (Address(0x1001.into()), felt_to_hash(&0x1010.into())), + ]), + HashMap::from([ + (Address(0x101.into()), Default::default()), + (Address(0x100.into()), Default::default()), + (Address(0x1001.into()), Default::default()), + ]), + HashMap::from([( ( - Address(0x101.into()), - felt_to_hash(&0x111.into()), + Address(0x1001.into()), + felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY), ), + INITIAL_BALANCE.clone(), + )]), + HashMap::from([ ( - Address(0x100.into()), felt_to_hash(&0x110.into()), + ContractClass::from_path(TEST_CONTRACT_PATH).unwrap(), + ), + ( + felt_to_hash(&0x111.into()), + ContractClass::from_path(ACCOUNT_CONTRACT_PATH).unwrap(), ), ( - Address(0x1001.into()), felt_to_hash(&0x1010.into()), - )]), - - HashMap::from([ - ( - Address(0x101.into()), - Default::default(), - ), - ( - Address(0x100.into()), - Default::default(), - ), - ( - Address(0x1001.into()), - Default::default(), - )]), - HashMap::from([ - ( - (Address(0x1001.into()), - felt_to_hash(&felt_str!("1192211877881866289306604115402199097887041303917861778777990838480655617515"))), - Felt252::zero(), - ), - ]), - HashMap::from([ - (felt_to_hash(&0x110.into()), ContractClass::try_from(PathBuf::from(TEST_CONTRACT_PATH)).unwrap()), - (felt_to_hash(&0x111.into()), ContractClass::try_from(PathBuf::from(ACCOUNT_CONTRACT_PATH)).unwrap()), - (felt_to_hash(&0x1010.into()), ContractClass::try_from(PathBuf::from(ERC20_CONTRACT_PATH)).unwrap()), + ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap(), + ), ]), HashMap::new(), - HashMap::new() - ), + HashMap::new(), + )), Some(ContractClassCache::new()), - Some(HashMap::new()) + Some(HashMap::new()), ); state_before.set_storage_at( &( Address(0x1001.into()), - felt_to_hash(&felt_str!( - "2542253978940891427830343982984992363331567580652119103860970381451088310289" - )), + felt_to_hash(&TEST_ERC20_DEPLOYED_ACCOUNT_BALANCE_KEY), ), - 0.into(), + INITIAL_BALANCE.clone(), ); let mut state_after = state_before.clone(); @@ -1368,9 +1429,7 @@ fn expected_deploy_account_states() -> ( state_after.cache_mut().storage_initial_values_mut().insert( ( Address(0x1001.into()), - felt_to_hash(&felt_str!( - "3229073099929281304021185011369329892856197542079132996799046100564060768274" - )), + felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY), ), Felt252::zero(), ); @@ -1398,11 +1457,9 @@ fn expected_deploy_account_states() -> ( state_after.cache_mut().storage_writes_mut().insert( ( Address(0x1001.into()), - felt_to_hash(&felt_str!( - "2542253978940891427830343982984992363331567580652119103860970381451088310289" - )), + felt_to_hash(&TEST_ERC20_DEPLOYED_ACCOUNT_BALANCE_KEY), ), - Felt252::zero(), + INITIAL_BALANCE.clone() - &fee, ); state_after.cache_mut().storage_writes_mut().insert( ( @@ -1414,22 +1471,20 @@ fn expected_deploy_account_states() -> ( state_after.cache_mut().storage_writes_mut().insert( ( Address(0x1001.into()), - felt_to_hash(&felt_str!( - "3229073099929281304021185011369329892856197542079132996799046100564060768274" - )), + felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY), ), - Felt252::zero(), + fee, ); state_after .set_contract_class( &felt_to_hash(&0x1010.into()), - &ContractClass::try_from(PathBuf::from(ERC20_CONTRACT_PATH)).unwrap(), + &ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap(), ) .unwrap(); state_after .set_contract_class( &felt_to_hash(&0x111.into()), - &ContractClass::try_from(PathBuf::from(ACCOUNT_CONTRACT_PATH)).unwrap(), + &ContractClass::from_path(ACCOUNT_CONTRACT_PATH).unwrap(), ) .unwrap(); @@ -1455,11 +1510,11 @@ fn test_state_for_declare_tx() { .is_one()); // Check state.state_reader - let mut state_reader = state.state_reader().clone(); + let state_reader = state.state_reader.clone(); assert_eq!( - state_reader.address_to_class_hash_mut(), - &mut HashMap::from([ + state_reader.address_to_class_hash, + HashMap::from([ ( TEST_ERC20_CONTRACT_ADDRESS.clone(), felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH) @@ -1476,8 +1531,8 @@ fn test_state_for_declare_tx() { ); assert_eq!( - state_reader.address_to_nonce_mut(), - &mut HashMap::from([ + state_reader.address_to_nonce, + HashMap::from([ (TEST_ERC20_CONTRACT_ADDRESS.clone(), Felt252::zero()), (TEST_CONTRACT_ADDRESS.clone(), Felt252::zero()), (TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), Felt252::zero()), @@ -1485,34 +1540,36 @@ fn test_state_for_declare_tx() { ); assert_eq!( - state_reader.address_to_storage_mut(), - &mut HashMap::from([( + state_reader.address_to_storage, + HashMap::from([( ( TEST_ERC20_CONTRACT_ADDRESS.clone(), felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY) ), - Felt252::zero() + INITIAL_BALANCE.clone() ),]), ); assert_eq!( - state_reader.class_hash_to_contract_class_mut(), - &mut HashMap::from([ + state_reader.class_hash_to_contract_class, + HashMap::from([ ( felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH), - get_contract_class(ERC20_CONTRACT_PATH).unwrap() + ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap() ), ( felt_to_hash(&TEST_CLASS_HASH), - get_contract_class(TEST_CONTRACT_PATH).unwrap() + ContractClass::from_path(TEST_CONTRACT_PATH).unwrap() ), ( felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH), - get_contract_class(ACCOUNT_CONTRACT_PATH).unwrap() + ContractClass::from_path(ACCOUNT_CONTRACT_PATH).unwrap() ), ]) ); + let fee = Felt252::from(24); + // Check state.cache assert_eq!( state.cache(), @@ -1528,74 +1585,68 @@ fn test_state_for_declare_tx() { ) ]), HashMap::new(), - HashMap::from([( - TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), - 0.into() - )]), + HashMap::from([(TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), 0.into())]), HashMap::from([ ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&felt_str!("3229073099929281304021185011369329892856197542079132996799046100564060768275")) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_BALANCE_KEY_2) ), 0.into() ), ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&felt_str!("1192211877881866289306604115402199097887041303917861778777990838480655617516")) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_BALANCE_KEY_1) ), 0.into() ), ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY) ), 0.into() ), ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY) ), - 0.into() + INITIAL_BALANCE.clone() ) ]), HashMap::new(), HashMap::new(), - HashMap::from([( - TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), - 1.into() - )]), + HashMap::from([(TEST_ACCOUNT_CONTRACT_ADDRESS.clone(), 1.into())]), HashMap::from([ ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&felt_str!("3229073099929281304021185011369329892856197542079132996799046100564060768275")) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_BALANCE_KEY_2) ), 0.into() ), ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&felt_str!("1192211877881866289306604115402199097887041303917861778777990838480655617516")) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_BALANCE_KEY_1) ), 0.into() ), ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_SEQUENCER_BALANCE_KEY) ), - 0.into() //Fee, 2 in blockifier + fee.clone(), ), ( ( - TEST_ERC20_CONTRACT_ADDRESS.clone(), - felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY) + TEST_ERC20_CONTRACT_ADDRESS.clone(), + felt_to_hash(&TEST_ERC20_ACCOUNT_BALANCE_KEY) ), - 0.into() + INITIAL_BALANCE.clone() - &fee, ), ]), HashMap::new() @@ -1608,15 +1659,15 @@ fn test_state_for_declare_tx() { &Some(HashMap::from([ ( felt_to_hash(&TEST_EMPTY_CONTRACT_CLASS_HASH), - get_contract_class(TEST_EMPTY_CONTRACT_PATH).unwrap() + ContractClass::from_path(TEST_EMPTY_CONTRACT_PATH).unwrap() ), ( felt_to_hash(&TEST_ERC20_CONTRACT_CLASS_HASH), - get_contract_class(ERC20_CONTRACT_PATH).unwrap() + ContractClass::from_path(ERC20_CONTRACT_PATH).unwrap() ), ( felt_to_hash(&TEST_ACCOUNT_CONTRACT_CLASS_HASH), - get_contract_class(ACCOUNT_CONTRACT_PATH).unwrap() + ContractClass::from_path(ACCOUNT_CONTRACT_PATH).unwrap() ), ])) ); @@ -1671,7 +1722,6 @@ fn test_invoke_tx_wrong_entrypoint() { vec![], StarknetChainId::TestNet.to_felt(), Some(Felt252::zero()), - None, ) .unwrap(); @@ -1697,7 +1747,6 @@ fn test_deploy_undeclared_account() { Default::default(), Default::default(), StarknetChainId::TestNet.to_felt(), - None, ) .unwrap(); @@ -1770,9 +1819,18 @@ fn test_library_call_with_declare_v2() { ) }; + let casm_contract_hash; + #[cfg(not(feature = "cairo_1_tests"))] + { + casm_contract_hash = TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO2.clone() + } + #[cfg(feature = "cairo_1_tests")] + { + casm_contract_hash = TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO1.clone() + } // Create an execution entry point let calldata = vec![ - TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone(), + casm_contract_hash, Felt252::from_bytes_be(&calculate_sn_keccak(b"fib")), 1.into(), 1.into(), @@ -1805,14 +1863,25 @@ fn test_library_call_with_declare_v2() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); + let casm_contract_hash; + #[cfg(not(feature = "cairo_1_tests"))] + { + casm_contract_hash = TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO2.clone() + } + #[cfg(feature = "cairo_1_tests")] + { + casm_contract_hash = TEST_FIB_COMPILED_CONTRACT_CLASS_HASH_CAIRO1.clone() + } + let expected_internal_call_info = CallInfo { caller_address: Address(0.into()), call_type: Some(CallType::Delegate), contract_address: address.clone(), - class_hash: Some(TEST_FIB_COMPILED_CONTRACT_CLASS_HASH.clone().to_be_bytes()), + class_hash: Some(casm_contract_hash.to_be_bytes()), entry_point_selector: Some(external_entrypoint_selector.into()), entry_point_type: Some(EntryPointType::External), #[cfg(not(feature = "cairo_1_tests"))] @@ -1826,7 +1895,7 @@ fn test_library_call_with_declare_v2() { n_steps: 368, #[cfg(feature = "cairo_1_tests")] n_steps: 371, - n_memory_holes: 1, + n_memory_holes: 0, builtin_instance_counter: HashMap::from([("range_check_builtin".to_string(), 13)]), }, ..Default::default() @@ -1850,12 +1919,12 @@ fn test_library_call_with_declare_v2() { n_steps: 578, #[cfg(feature = "cairo_1_tests")] n_steps: 587, - n_memory_holes: 3, + n_memory_holes: 1, builtin_instance_counter: HashMap::from([("range_check_builtin".to_string(), 16)]), }, internal_calls: vec![expected_internal_call_info], ..Default::default() }; - assert_eq!(call_info, expected_call_info); + assert_eq!(call_info.call_info.unwrap(), expected_call_info); } diff --git a/tests/storage.rs b/tests/storage.rs index d0f9e0d75..19d03359e 100644 --- a/tests/storage.rs +++ b/tests/storage.rs @@ -1,7 +1,7 @@ use cairo_vm::felt::Felt252; use cairo_vm::vm::runners::cairo_runner::ExecutionResources; use num_traits::Zero; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, execution::{ @@ -12,6 +12,7 @@ use starknet_in_rust::{ state::{in_memory_state_reader::InMemoryStateReader, ExecutionResourcesManager}, utils::{calculate_sn_keccak, Address}, }; +use std::sync::Arc; use std::{ collections::{HashMap, HashSet}, path::PathBuf, @@ -24,7 +25,7 @@ fn integration_storage_test() { // --------------------------------------------------------- let path = PathBuf::from("starknet_programs/storage.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let entry_points_by_type = contract_class.entry_points_by_type().clone(); let storage_entrypoint_selector = entry_points_by_type @@ -65,7 +66,7 @@ fn integration_storage_test() { //* Create state with previous data //* --------------------------------------- - let mut state = CachedState::new(state_reader, Some(contract_class_cache), None); + let mut state = CachedState::new(Arc::new(state_reader), Some(contract_class_cache), None); //* ------------------------------------ //* Create execution entry point @@ -132,7 +133,10 @@ fn integration_storage_test() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps() ) + .unwrap() + .call_info .unwrap(), expected_call_info ); diff --git a/tests/syscalls.rs b/tests/syscalls.rs index 2d5e34230..3cbc0417b 100644 --- a/tests/syscalls.rs +++ b/tests/syscalls.rs @@ -10,7 +10,7 @@ use cairo_vm::{ }, }; use num_traits::{Num, One, Zero}; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ definitions::{ block_context::{BlockContext, StarknetChainId}, @@ -34,6 +34,7 @@ use std::{ collections::{HashMap, HashSet}, iter::empty, path::{Path, PathBuf}, + sync::Arc, }; #[allow(clippy::too_many_arguments)] @@ -62,8 +63,8 @@ fn test_contract<'a>( return_data: impl Into>, execution_resources: ExecutionResources, ) { - let contract_class = ContractClass::try_from(contract_path.as_ref().to_path_buf()) - .expect("Could not load contract from JSON"); + let contract_class = + ContractClass::from_path(contract_path).expect("Could not load contract from JSON"); let mut tx_execution_context = tx_execution_context_option.unwrap_or_else(|| { TransactionExecutionContext::create_for_testing( @@ -93,7 +94,7 @@ fn test_contract<'a>( let mut contract_class_cache = ContractClassCache::new(); for (class_hash, contract_path, contract_address) in extra_contracts { - let contract_class = ContractClass::try_from(contract_path.to_path_buf()) + let contract_class = ContractClass::from_path(contract_path) .expect("Could not load extra contract from JSON"); contract_class_cache.insert(class_hash, contract_class.clone()); @@ -115,7 +116,7 @@ fn test_contract<'a>( Some(contract_class_cache) }; - let mut state = CachedState::new(state_reader, contract_class_cache, None); + let mut state = CachedState::new(Arc::new(state_reader), contract_class_cache, None); storage_entries .into_iter() .for_each(|(a, b, c)| state.set_storage_at(&(a, b), c)); @@ -143,8 +144,11 @@ fn test_contract<'a>( &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) - .expect("Could not execute contract"); + .expect("Could not execute contract") + .call_info + .unwrap(); assert_eq!(result.contract_address, contract_address); assert_eq!(result.contract_address, contract_address); @@ -1058,9 +1062,8 @@ fn test_deploy_and_call_contract_syscall() { #[test] fn deploy_cairo1_from_cairo0_with_constructor() { // Create the deploy contract class - let contract_path = Path::new("starknet_programs/syscalls.json"); - let contract_class: ContractClass = - ContractClass::try_from(contract_path.to_path_buf()).unwrap(); + let contract_path = "starknet_programs/syscalls.json"; + let contract_class: ContractClass = ContractClass::from_path(contract_path).unwrap(); let entrypoint_selector = Felt252::from_bytes_be(&calculate_sn_keccak( "test_deploy_with_constructor".as_bytes(), )); @@ -1097,7 +1100,7 @@ fn deploy_cairo1_from_cairo0_with_constructor() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(contract_class_cache), Some(casm_contract_class_cache), ); @@ -1140,6 +1143,7 @@ fn deploy_cairo1_from_cairo0_with_constructor() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert!(call_info.is_ok()); @@ -1160,9 +1164,8 @@ fn deploy_cairo1_from_cairo0_with_constructor() { #[test] fn deploy_cairo1_from_cairo0_without_constructor() { // Create the deploy contract class - let contract_path = Path::new("starknet_programs/syscalls.json"); - let contract_class: ContractClass = - ContractClass::try_from(contract_path.to_path_buf()).unwrap(); + let contract_path = "starknet_programs/syscalls.json"; + let contract_class: ContractClass = ContractClass::from_path(contract_path).unwrap(); let entrypoint_selector = Felt252::from_bytes_be(&calculate_sn_keccak("test_deploy".as_bytes())); @@ -1198,7 +1201,7 @@ fn deploy_cairo1_from_cairo0_without_constructor() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(contract_class_cache), Some(casm_contract_class_cache), ); @@ -1242,6 +1245,7 @@ fn deploy_cairo1_from_cairo0_without_constructor() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) .unwrap(); @@ -1263,9 +1267,8 @@ fn deploy_cairo1_from_cairo0_without_constructor() { #[test] fn deploy_cairo1_and_invoke() { // Create the deploy contract class - let contract_path = Path::new("starknet_programs/syscalls.json"); - let contract_class: ContractClass = - ContractClass::try_from(contract_path.to_path_buf()).unwrap(); + let contract_path = "starknet_programs/syscalls.json"; + let contract_class: ContractClass = ContractClass::from_path(contract_path).unwrap(); let entrypoint_selector = Felt252::from_bytes_be(&calculate_sn_keccak("test_deploy".as_bytes())); @@ -1301,7 +1304,7 @@ fn deploy_cairo1_and_invoke() { // Create state from the state_reader and contract cache. let mut state = CachedState::new( - state_reader, + Arc::new(state_reader), Some(contract_class_cache), Some(casm_contract_class_cache), ); @@ -1344,6 +1347,7 @@ fn deploy_cairo1_and_invoke() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert!(call_info.is_ok()); @@ -1382,7 +1386,10 @@ fn deploy_cairo1_and_invoke() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) + .unwrap() + .call_info .unwrap(); let retdata = call_info.retdata; @@ -1395,7 +1402,7 @@ fn deploy_cairo1_and_invoke() { fn send_messages_to_l1_different_contract_calls() { // Create program and entry point types for contract class let path = PathBuf::from("starknet_programs/send_messages_contract_call.json"); - let contract_class = ContractClass::try_from(path).unwrap(); + let contract_class = ContractClass::from_path(path).unwrap(); let entrypoint_selector = &contract_class.entry_points_by_type()[&EntryPointType::External][0] .selector() .to_owned(); @@ -1419,7 +1426,7 @@ fn send_messages_to_l1_different_contract_calls() { // Add send_message_to_l1 contract to the state let path = PathBuf::from("starknet_programs/send_message_to_l1.json"); - let send_msg_contract_class = ContractClass::try_from(path).unwrap(); + let send_msg_contract_class = ContractClass::from_path(path).unwrap(); let send_msg_address = Address(1.into()); //Hardcoded in contract let send_msg_class_hash: ClassHash = [2; 32]; @@ -1434,7 +1441,11 @@ fn send_messages_to_l1_different_contract_calls() { .insert(send_msg_address, send_msg_nonce); // Create state from the state_reader and contract cache. - let mut state = CachedState::new(state_reader, Some(deprecated_contract_class_cache), None); + let mut state = CachedState::new( + Arc::new(state_reader), + Some(deprecated_contract_class_cache), + None, + ); // Create an execution entry point let calldata = [25.into(), 50.into(), 75.into()].to_vec(); @@ -1472,7 +1483,10 @@ fn send_messages_to_l1_different_contract_calls() { &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ) + .unwrap() + .call_info .unwrap(); let l1_to_l2_messages = call_info.get_sorted_l2_to_l1_messages().unwrap(); assert_eq!( diff --git a/tests/syscalls_errors.rs b/tests/syscalls_errors.rs index c9ccbc4b7..17d85bb1f 100644 --- a/tests/syscalls_errors.rs +++ b/tests/syscalls_errors.rs @@ -1,7 +1,8 @@ #![deny(warnings)] use cairo_vm::felt::Felt252; -use starknet_contract_class::EntryPointType; +use starknet_in_rust::utils::felt_to_hash; +use starknet_in_rust::EntryPointType; use starknet_in_rust::{ core::errors::state_errors::StateError, definitions::{block_context::BlockContext, constants::TRANSACTION_VERSION}, @@ -17,6 +18,7 @@ use starknet_in_rust::{ utils::{calculate_sn_keccak, Address, ClassHash}, }; use std::path::Path; +use std::sync::Arc; use assert_matches::assert_matches; @@ -39,8 +41,8 @@ fn test_contract<'a>( arguments: impl Into>, error_msg: &str, ) { - let contract_class = ContractClass::try_from(contract_path.as_ref().to_path_buf()) - .expect("Could not load contract from JSON"); + let contract_class = + ContractClass::from_path(contract_path).expect("Could not load contract from JSON"); let mut tx_execution_context = tx_execution_context_option.unwrap_or_else(|| { TransactionExecutionContext::create_for_testing( @@ -70,7 +72,7 @@ fn test_contract<'a>( let mut contract_class_cache = ContractClassCache::new(); for (class_hash, contract_path, contract_address) in extra_contracts { - let contract_class = ContractClass::try_from(contract_path.to_path_buf()) + let contract_class = ContractClass::from_path(contract_path) .expect("Could not load extra contract from JSON"); contract_class_cache.insert(class_hash, contract_class.clone()); @@ -95,7 +97,7 @@ fn test_contract<'a>( Some(contract_class_cache) }; - let mut state = CachedState::new(state_reader, contract_class_cache, None); + let mut state = CachedState::new(Arc::new(state_reader), contract_class_cache, None); storage_entries .into_iter() .for_each(|(a, b, c)| state.set_storage_at(&(a, b), c)); @@ -122,6 +124,7 @@ fn test_contract<'a>( &mut resources_manager, &mut tx_execution_context, false, + block_context.invoke_tx_max_n_steps(), ); assert_matches!(result, Err(e) if e.to_string().contains(error_msg)); @@ -151,6 +154,11 @@ fn call_contract_with_extra_arguments() { #[test] fn call_contract_not_deployed() { let contract_address = Address(2222.into()); + let wrong_address = contract_address.0.clone() - Felt252::new(2); // another address + let error_msg = format!( + "Contract address {:?} is not deployed", + felt_to_hash(&wrong_address) + ); test_contract( "starknet_programs/syscalls.json", "test_call_contract", @@ -162,11 +170,11 @@ fn call_contract_not_deployed() { [( [2u8; 32], Path::new("starknet_programs/syscalls-lib.json"), - Some((contract_address.clone(), vec![("lib_state", 10.into())])), + Some((contract_address, vec![("lib_state", 10.into())])), )] .into_iter(), - [contract_address.0 - Felt252::new(2)], // Wrong address - "Contract address [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] is not deployed", + [wrong_address], + &error_msg, ); }