diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml index f3443d5f68..cf4a54a96d 100644 --- a/.github/workflows/bench.yml +++ b/.github/workflows/bench.yml @@ -15,7 +15,7 @@ jobs: runs-on: ubuntu-20.04 steps: - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 with: components: rustfmt, clippy - uses: actions/checkout@v3 diff --git a/.github/workflows/cairo_1_programs.yml b/.github/workflows/cairo_1_programs.yml index d8a4c1f3f4..c2872a03b4 100644 --- a/.github/workflows/cairo_1_programs.yml +++ b/.github/workflows/cairo_1_programs.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Set up Cargo cache uses: Swatinem/rust-cache@v2 - name: Checkout diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 657974f5a9..75d450dcd7 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -13,4 +13,4 @@ jobs: steps: - uses: dangoslen/changelog-enforcer@v3 with: - skipLabels: pipelines,coverage + skipLabels: pipelines,tests,documentation diff --git a/.github/workflows/fresh_run.yml b/.github/workflows/fresh_run.yml index f733076e77..fd523f7c75 100644 --- a/.github/workflows/fresh_run.yml +++ b/.github/workflows/fresh_run.yml @@ -38,7 +38,7 @@ jobs: uses: actions/checkout@v3 - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Install Pyenv uses: "gabrielfalcao/pyenv-action@v13" diff --git a/.github/workflows/hint_accountant.yml b/.github/workflows/hint_accountant.yml index 4a3a1e023f..3bd9ca4ff0 100644 --- a/.github/workflows/hint_accountant.yml +++ b/.github/workflows/hint_accountant.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Rust toolchain - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Set up Cargo cache uses: Swatinem/rust-cache@v2 - name: Checkout diff --git a/.github/workflows/hyperfine.yml b/.github/workflows/hyperfine.yml index 87bf26f3e3..6fb098b6a6 100644 --- a/.github/workflows/hyperfine.yml +++ b/.github/workflows/hyperfine.yml @@ -74,7 +74,7 @@ jobs: - name: Install Rust if: ${{ steps.cache.outputs.cache-hit != 'true' }} - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Checkout if: ${{ steps.cache.outputs.cache-hit != 'true' }} diff --git a/.github/workflows/iai_main.yml b/.github/workflows/iai_main.yml index e1217085ba..f61eef7e3e 100644 --- a/.github/workflows/iai_main.yml +++ b/.github/workflows/iai_main.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - name: Python3 Build diff --git a/.github/workflows/iai_pr.yml b/.github/workflows/iai_pr.yml index db446adeb9..afb9e3a97c 100644 --- a/.github/workflows/iai_pr.yml +++ b/.github/workflows/iai_pr.yml @@ -23,7 +23,7 @@ jobs: - name: Install Rust if: ${{ steps.cache-iai-results.outputs.cache-hit != 'true' }} - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Set up cargo cache if: ${{ steps.cache-iai-results.outputs.cache-hit != 'true' }} uses: Swatinem/rust-cache@v2 @@ -51,7 +51,7 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - name: Python3 Build diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f4ea9e2193..a06efe8806 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -13,7 +13,7 @@ jobs: - name: Checkout sources uses: actions/checkout@v2 - name: Install stable toolchain - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Publish crate cairo-vm env: CRATES_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }} diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index a6a7a38f43..3e13f56f9b 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -22,7 +22,23 @@ env: PROPTEST_CASES: 100 jobs: + + # We need to use the same files across all jobs or else hashing will fail + upload_proof_programs_symlinks: + runs-on: ubuntu-22.04 + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + - name: Create proof_programs symlinks + run: make create-proof-programs-symlinks + - uses: actions/upload-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/*.cairo + build-programs: + needs: upload_proof_programs_symlinks strategy: matrix: # NOTE: we build cairo_bench_programs so clippy can check the benchmarks too @@ -41,6 +57,11 @@ jobs: with: fetch-depth: 0 + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Fetch from cache uses: actions/cache@v3 id: cache-programs @@ -91,6 +112,11 @@ jobs: steps: - name: Checkout uses: actions/checkout@v3 + + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ - name: Fetch test programs uses: actions/cache/restore@v3 @@ -135,7 +161,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 with: components: rustfmt, clippy - name: Set up cargo cache @@ -143,9 +169,15 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Format run: make check-fmt + - name: Fetch programs uses: actions/cache/restore@v3 with: @@ -165,7 +197,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 with: targets: wasm32-unknown-unknown @@ -181,6 +213,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Fetch programs uses: actions/cache/restore@v3 with: @@ -220,7 +257,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 with: components: llvm-tools-preview - name: Set up cargo cache @@ -228,6 +265,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Fetch programs uses: actions/cache/restore@v3 with: @@ -281,7 +323,7 @@ jobs: runs-on: ubuntu-22.04 steps: - name: Install Rust - uses: dtolnay/rust-toolchain@1.70.0 + uses: dtolnay/rust-toolchain@1.74.1 - name: Set up cargo cache uses: Swatinem/rust-cache@v2 - name: Checkout @@ -314,6 +356,11 @@ jobs: with: fetch-depth: 0 + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Check cache uses: actions/cache@v3 id: trace-cache @@ -381,6 +428,11 @@ jobs: path: target/release/cairo-vm-cli fail-on-cache-miss: true + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Fetch programs uses: actions/cache/restore@v3 with: @@ -496,6 +548,11 @@ jobs: - name: Checkout uses: actions/checkout@v3 + - uses: actions/download-artifact@master + with: + name: proof_programs + path: cairo_programs/proof_programs/ + - name: Fetch traces for cairo-lang uses: actions/cache/restore@v3 with: diff --git a/.gitignore b/.gitignore index a6f4053583..c2c0ebea83 100644 --- a/.gitignore +++ b/.gitignore @@ -22,5 +22,6 @@ cairo-vm-pypy-env/* cairo1-run/corelib/ cairo-vm-cli/air_input.pub ensure-no_std/Cargo.lock +cairo_programs/proof_programs/*.cairo !vm/src/tests/cairo_pie_test_output.json diff --git a/CHANGELOG.md b/CHANGELOG.md index e764150f68..b020db2a92 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,47 @@ #### Upcoming Changes +* feat: Add cairo1-run output pretty-printing for felts, arrays/spans and dicts [#1630](https://github.com/lambdaclass/cairo-vm/pull/1630) + +#### [1.0.0-rc1] - 2024-02-23 + +* Bump `starknet-types-core` dependency version to 0.0.9 [#1628](https://github.com/lambdaclass/cairo-vm/pull/1628) + +* feat: Implement `Display` for `MemorySegmentManager`[#1606](https://github.com/lambdaclass/cairo-vm/pull/1606) + +* fix: make Felt252DictEntryUpdate work with MaybeRelocatable instead of only Felt [#1624](https://github.com/lambdaclass/cairo-vm/pull/1624). + +* chore: bump `cairo-lang-` dependencies to 2.5.4 [#1629](https://github.com/lambdaclass/cairo-vm/pull/1629) + +* chore: bump `cairo-lang-` dependencies to 2.5.3 [#1596](https://github.com/lambdaclass/cairo-vm/pull/1596) + +* refactor: Refactor `cairo1-run` crate [#1601](https://github.com/lambdaclass/cairo-vm/pull/1601) + * Add function `cairo_run_program` & struct `Cairo1RunConfig` in `cairo1-run::cairo_run` module. + * Function `serialize_output` & structs `FuncArg` and `Error` in crate `cairo1-run` are now public. + +* feat(BREAKING): Add `allow_missing_builtins` flag [#1600](https://github.com/lambdaclass/cairo-vm/pull/1600) + + This new flag will skip the check that all builtins used by the program need to be present in the selected layout if enabled. It will also be enabled by default when running in proof_mode. + + * Add `allow_missing_builtins` flag to `cairo-vm-cli` crate + * Add `allow_missing_builtins` field to `CairoRunConfig` struct + * Add `allow_missing_builtins` boolean argument to `CairoRunner` methods `initialize` & `initialize_builtins` + +* feat: Append return values to the output segment when running cairo1-run in proof_mode [#1597](https://github.com/lambdaclass/cairo-vm/pull/1597) + * Add instructions to the proof_mode header to copy return values to the output segment before initiating the infinite loop + * Output builtin is now always included when running cairo 1 programs in proof_mode + +* feat: deserialize AIR private input [#1589](https://github.com/lambdaclass/cairo-vm/pull/1589) + +* feat(BREAKING): Remove unecessary conversion functions between `Felt` & `BigUint`/`BigInt` [#1562](https://github.com/lambdaclass/cairo-vm/pull/1562) + * Remove the following functions: + * felt_from_biguint + * felt_from_bigint + * felt_to_biguint + * felt_to_bigint + +* perf: optimize instruction cache allocations by using `VirtualMachine::load_data` [#1441](https://github.com/lambdaclass/cairo-vm/pull/1441) + * feat: Add `print_output` flag to `cairo-1` crate [#1575] (https://github.com/lambdaclass/cairo-vm/pull/1575) * bugfixes(BREAKING): Fix memory hole count inconsistencies #[1585] (https://github.com/lambdaclass/cairo-vm/pull/1585) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0811b93ec7..fea1f676b7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -138,6 +138,15 @@ Enhancement suggestions are tracked as [GitHub issues](https://github.com/lambda - `merge` - `wip` +### Labels + +We recommend using the corresponding labels for each PR's purpose, the most commonly used labels include: + +- `documentation`: Improvements or additions to documentation +- `tests`: Implementation of tests +- `pipelines`: Improving CI/CD workflows +- `enhancement`: Implementation of new features +- `performance`: Performance-related improvements ## Attribution This guide is based on the **contributing.md**. [Make your own](https://contributing.md/)! diff --git a/Cargo.lock b/Cargo.lock index 4c72f36e19..6fc683d8c4 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -10,9 +10,9 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "aes" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" dependencies = [ "cfg-if", "cipher", @@ -21,9 +21,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.7.7" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9" dependencies = [ "getrandom", "once_cell", @@ -32,9 +32,9 @@ dependencies = [ [[package]] name = "ahash" -version = "0.8.6" +version = "0.8.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "d713b3834d76b85304d4d525563c1276e2e30dc97cc67bfb4585a4a29fc2c89f" dependencies = [ "cfg-if", "once_cell", @@ -65,9 +65,9 @@ checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299" [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -79,43 +79,43 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "317b9a89c1868f5ea6ff1d9539a69f45dffc21ce321ac1fd1160dfa48c8e2140" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" dependencies = [ "utf8parse", ] [[package]] name = "anstyle-query" -version = "1.0.0" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" dependencies = [ - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anstyle-wincon" -version = "3.0.1" +version = "3.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0699d10d2f4d628a98ee7b57b289abbc98ff3bad977cb3152709d4bf2330628" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" dependencies = [ "anstyle", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.80" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" [[package]] name = "arbitrary" @@ -140,7 +140,7 @@ dependencies = [ "digest", "itertools 0.10.5", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "paste", "rustc_version", "zeroize", @@ -163,7 +163,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565" dependencies = [ "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "proc-macro2", "quote", "syn 1.0.109", @@ -186,7 +186,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185" dependencies = [ - "num-traits 0.2.17", + "num-traits 0.2.18", "rand", ] @@ -255,9 +255,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" [[package]] name = "bitvec" @@ -282,9 +282,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" [[package]] name = "byte-slice-cast" @@ -321,39 +321,36 @@ dependencies = [ [[package]] name = "cairo-felt" -version = "0.8.7" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5972097b8800ca5dffb458040e74c724a2ac4fa4b5b480b50f5b96c7e67d6427" +checksum = "ae932292b9ba497a4e892b56aa4e0c6f329a455180fdbdc132700dfe68d9b153" dependencies = [ "lazy_static", "num-bigint", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", "serde", ] [[package]] name = "cairo-lang-casm" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24abd6752c41f3d2276fba63fa0434875ccf6e7cbcdebfebc790db1201eb0892" +checksum = "8ceb71a4cbf5b474bd671c79b2c05e8168a97199bfea1c01ef63b1bdaac3db03" dependencies = [ "cairo-lang-utils", "indoc", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "parity-scale-codec", - "parity-scale-codec-derive", - "schemars", "serde", - "thiserror", ] [[package]] name = "cairo-lang-compiler" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5699f44b183ddc2982976efdd72bbdfafc13a64f9593b44eb86f8a335f3b90da" +checksum = "95c1aab3213462c5b7c21508f1a4330bdf0766c90e6dd4ed79b0002c2b96a715" dependencies = [ "anyhow", "cairo-lang-defs", @@ -367,25 +364,24 @@ dependencies = [ "cairo-lang-sierra-generator", "cairo-lang-syntax", "cairo-lang-utils", - "itertools 0.11.0", "salsa", "thiserror", ] [[package]] name = "cairo-lang-debug" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a52b381fab22b723818692fa93aafc2e1490a79a4c8bd856e8996f1253f16a8" +checksum = "03623ba892200c6b3c55fab260d4aa0bff833d6bcecdb1fb022565ac00d5a683" dependencies = [ "cairo-lang-utils", ] [[package]] name = "cairo-lang-defs" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d436dcaa5a3ea69f60b990036d23dc3e54adc623c14cff824cb1230f974ce44" +checksum = "09131755b08a485322656e061ad05602215a198dd4a2daf3897e64dc76e7544e" dependencies = [ "cairo-lang-debug", "cairo-lang-diagnostics", @@ -400,9 +396,9 @@ dependencies = [ [[package]] name = "cairo-lang-diagnostics" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07771c7268044b6a7be828a4f4938bb823944efe6668a974bf5e52a6801ef366" +checksum = "3b8185cc9472c648ac9db970ce558595c71259eebd55d25a502fe569cb871448" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", @@ -412,9 +408,9 @@ dependencies = [ [[package]] name = "cairo-lang-eq-solver" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53fc8c224c0aaadc01c961fac234e8d8d3563a8fbb8544186a69969765a0c2a5" +checksum = "8ae71750096b64d4dd54dd2c39ef50651bb4aff4bc829e3d07549a5035620e0a" dependencies = [ "cairo-lang-utils", "good_lp", @@ -422,9 +418,9 @@ dependencies = [ [[package]] name = "cairo-lang-filesystem" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d62a519bd68f158cd1b5ee2f1f1dc2aa916a8dcb14914444846d39ff8fb33789" +checksum = "1819ef5a5396df695dcec993500c46bc44c309590b503da26965c873dfe8a84a" dependencies = [ "cairo-lang-debug", "cairo-lang-utils", @@ -436,9 +432,9 @@ dependencies = [ [[package]] name = "cairo-lang-lowering" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989744e09f351ff24a0bc076dba8e3420ab957b99edc46acde58a484ebb09ed9" +checksum = "0968f0da6117dca1a70d6ac7d2e252d8b1710f333458c54ce08dbef1c0323881" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -450,11 +446,10 @@ dependencies = [ "cairo-lang-syntax", "cairo-lang-utils", "id-arena", - "indexmap 2.1.0", "itertools 0.11.0", "log", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "once_cell", "salsa", "smol_str", @@ -462,9 +457,9 @@ dependencies = [ [[package]] name = "cairo-lang-parser" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7be5b262ae2d11b4d5783a8b66d8e31cbeab45bb4e14d6ddb13ba280e9c41824" +checksum = "ae556e49c0a90d30e52f068b0fb5ed4d419766661d3713a1644f3894a9255a5a" dependencies = [ "cairo-lang-diagnostics", "cairo-lang-filesystem", @@ -474,7 +469,7 @@ dependencies = [ "colored", "itertools 0.11.0", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "salsa", "smol_str", "unescaper", @@ -482,9 +477,9 @@ dependencies = [ [[package]] name = "cairo-lang-plugins" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebcfe1e269ab2027bad187d9c61c7e1e324374c722b75f3a7d7fba77c977f8ca" +checksum = "a8d319f3e84ff679159f97e3baa1d918d369ba9e3ade5ad490e0a9e4eca19591" dependencies = [ "cairo-lang-defs", "cairo-lang-diagnostics", @@ -501,20 +496,20 @@ dependencies = [ [[package]] name = "cairo-lang-proc-macros" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9bc4f93f28bda29d879acb9b9e26b32108591225a507ffb5aff9bbf58524c4f" +checksum = "fef002aac874d76492eb9577dab663f9a84fe4584b4215c7ebfda7d025fcadae" dependencies = [ "cairo-lang-debug", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] name = "cairo-lang-project" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d490a3d00dd45228c1691c390f177449b45a907a2cb4b3ad8f305faea82a0c" +checksum = "7f384c26e6907de9c94b44051e386498159e8c9e1567b9b1eae9c22e16ff17e5" dependencies = [ "cairo-lang-filesystem", "cairo-lang-utils", @@ -526,9 +521,9 @@ dependencies = [ [[package]] name = "cairo-lang-semantic" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bcc25adf813972129dcac6c7d87026d47644f3d4e975c042d27e1166a2a0489" +checksum = "311434caae9542b7c442ac69a04e3c8eaa477654f215abe0bd7dfd3c0de70669" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -543,7 +538,7 @@ dependencies = [ "indoc", "itertools 0.11.0", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "once_cell", "salsa", "smol_str", @@ -551,11 +546,12 @@ dependencies = [ [[package]] name = "cairo-lang-sierra" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cc9571dbb143e33979fc02d38bbb4d7b608d6f53cde585b08551bbedfb0c217" +checksum = "52c00c34fcaf97bbc4111d1631af8c65838841a38b3502b5bbc04355b7d46982" dependencies = [ "anyhow", + "cairo-felt", "cairo-lang-utils", "const-fnv1a-hash", "convert_case", @@ -564,7 +560,7 @@ dependencies = [ "lalrpop", "lalrpop-util", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "regex", "salsa", "serde", @@ -576,37 +572,39 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-ap-change" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16894bfe0072f82b549e4b2be42c7dc8f0611ac5049dfb069b95b10c51ec7cb5" +checksum = "c99a0be021b359c51383cce4372cb1061f7d53438d80f208c56af2154583c98e" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", "cairo-lang-sierra-type-size", "cairo-lang-utils", "itertools 0.11.0", + "num-traits 0.2.18", "thiserror", ] [[package]] name = "cairo-lang-sierra-gas" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71fbc8baef18b3c315d3fb7a0cf59f0ee14df5cefc7dd147598248cdb7b2252d" +checksum = "f273d4de9d30e556e72ebe2751f9ed6bf3d84a70f6c76f52b178c24cddb12e43" dependencies = [ "cairo-lang-eq-solver", "cairo-lang-sierra", "cairo-lang-sierra-type-size", "cairo-lang-utils", "itertools 0.11.0", + "num-traits 0.2.18", "thiserror", ] [[package]] name = "cairo-lang-sierra-generator" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75700bf5fd1c1cdd8ca29af338c65de8b03c905472f9bdce22b3034f3f3755d9" +checksum = "734f72e9e8b1ec7a96208aa8dfba87ca1614188e3646ae67c519afe707569490" dependencies = [ "cairo-lang-debug", "cairo-lang-defs", @@ -618,7 +616,6 @@ dependencies = [ "cairo-lang-sierra", "cairo-lang-syntax", "cairo-lang-utils", - "indexmap 2.1.0", "itertools 0.11.0", "num-bigint", "once_cell", @@ -628,9 +625,9 @@ dependencies = [ [[package]] name = "cairo-lang-sierra-to-casm" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0bc8edaf95bdb9577c6b801c36b24538ec08042e1d74b98fc08d50621427061" +checksum = "842ae37ee3f1cd06b926aceb480fd70b84300aae82e9606b876678d30c21649a" dependencies = [ "assert_matches", "cairo-felt", @@ -643,15 +640,15 @@ dependencies = [ "indoc", "itertools 0.11.0", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "thiserror", ] [[package]] name = "cairo-lang-sierra-type-size" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50b028f3e06e150005e82b07500d4ea509ee8350f841d5645fbcf00bb49c4537" +checksum = "f969cbaf81f3beb1dc693674fc792a815bf8fc13471227020a5faf309d5faf80" dependencies = [ "cairo-lang-sierra", "cairo-lang-utils", @@ -659,9 +656,9 @@ dependencies = [ [[package]] name = "cairo-lang-starknet" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f55ffe2cbd277b6f3040e23bde028ae0b68e8e4910a9dd1c2f78ed668974d2a" +checksum = "67cd2d120f39369c7bd7d124dee638c250495054030d01d4e1d1b88f0063bd80" dependencies = [ "anyhow", "cairo-felt", @@ -671,6 +668,7 @@ dependencies = [ "cairo-lang-diagnostics", "cairo-lang-filesystem", "cairo-lang-lowering", + "cairo-lang-plugins", "cairo-lang-semantic", "cairo-lang-sierra", "cairo-lang-sierra-generator", @@ -684,7 +682,7 @@ dependencies = [ "itertools 0.11.0", "num-bigint", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", "once_cell", "serde", "serde_json", @@ -696,15 +694,15 @@ dependencies = [ [[package]] name = "cairo-lang-syntax" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6d745c72ac1cef893239d36bc749742d2622136ffc1434a2c70b07096d02de0" +checksum = "552d3438fec55832976bc7c7d7490100e8ce7385d3f3f1539f9a46fffa2197c6" dependencies = [ "cairo-lang-debug", "cairo-lang-filesystem", "cairo-lang-utils", "num-bigint", - "num-traits 0.2.17", + "num-traits 0.2.18", "salsa", "smol_str", "unescaper", @@ -712,9 +710,9 @@ dependencies = [ [[package]] name = "cairo-lang-syntax-codegen" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7c9f119185b736b5318325e7a0fc1378b706116c1c558e1ced1bdf55367813b" +checksum = "9dab4d07bd78658f0fdc3fd20f1236bc3e6ebdd8a8fc72ece95a5dd03b7a09da" dependencies = [ "genco", "xshell", @@ -722,22 +720,22 @@ dependencies = [ [[package]] name = "cairo-lang-utils" -version = "2.4.3" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "343ac08a5b9d34c9f4bbac7249453a31edad4cf4ff54487197cc344f8293dc4f" +checksum = "12d0939f42d40fb1d975cae073d7d4f82d83de4ba2149293115525245425f909" dependencies = [ - "indexmap 2.1.0", + "hashbrown 0.14.3", + "indexmap 2.2.3", "itertools 0.11.0", "num-bigint", - "num-traits 0.2.17", - "parity-scale-codec", + "num-traits 0.2.18", "schemars", "serde", ] [[package]] name = "cairo-vm" -version = "1.0.0-rc0" +version = "1.0.0-rc1" dependencies = [ "anyhow", "arbitrary", @@ -750,7 +748,7 @@ dependencies = [ "cairo-lang-starknet", "criterion", "generic-array", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "hex", "iai-callgrind", "keccak", @@ -760,7 +758,7 @@ dependencies = [ "num-bigint", "num-integer", "num-prime", - "num-traits 0.2.17", + "num-traits 0.2.18", "proptest", "rand", "rstest", @@ -777,7 +775,7 @@ dependencies = [ [[package]] name = "cairo-vm-cli" -version = "1.0.0-rc0" +version = "1.0.0-rc1" dependencies = [ "assert_matches", "bincode", @@ -791,7 +789,7 @@ dependencies = [ [[package]] name = "cairo1-run" -version = "1.0.0-rc0" +version = "1.0.0-rc1" dependencies = [ "assert_matches", "bincode", @@ -819,11 +817,10 @@ checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5" [[package]] name = "cc" -version = "1.0.83" +version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "7f9fa1897e4325be0d68d48df6aa1a71ac2ed4d27723887e7754192705350730" dependencies = [ - "jobserver", "libc", ] @@ -835,9 +832,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "ciborium" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "effd91f6c78e5a4ace8a5d3c0b6bfaec9e2baaef55f3efc00e45fb2e477ee926" +checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e" dependencies = [ "ciborium-io", "ciborium-ll", @@ -846,15 +843,15 @@ dependencies = [ [[package]] name = "ciborium-io" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdf919175532b369853f5d5e20b26b43112613fd6fe7aee757e35f7a44642656" +checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757" [[package]] name = "ciborium-ll" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defaa24ecc093c77630e6c15e17c51f5e187bf35ee514f4e2d67baaa96dae22b" +checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9" dependencies = [ "ciborium-io", "half", @@ -872,9 +869,9 @@ dependencies = [ [[package]] name = "clap" -version = "4.4.8" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2275f18819641850fa26c89acc84d465c1bf91ce57bc2748b28c420473352f64" +checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da" dependencies = [ "clap_builder", "clap_derive", @@ -882,9 +879,9 @@ dependencies = [ [[package]] name = "clap_builder" -version = "4.4.8" +version = "4.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07cdf1b148b25c1e1f7a42225e30a0d99a615cd4637eae7365548dd4529b95bc" +checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb" dependencies = [ "anstream", "anstyle", @@ -894,21 +891,21 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.4.7" +version = "4.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" +checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47" dependencies = [ "heck 0.4.1", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] name = "clap_lex" -version = "0.6.0" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" +checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce" [[package]] name = "colorchoice" @@ -918,13 +915,12 @@ checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" [[package]] name = "colored" -version = "2.0.4" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2674ec482fbc38012cf31e6c42ba0177b431a0cb6f15fe40efa5aab1bda516f6" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" dependencies = [ - "is-terminal", "lazy_static", - "windows-sys", + "windows-sys 0.48.0", ] [[package]] @@ -980,18 +976,18 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] [[package]] name = "crc32fast" -version = "1.3.2" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" dependencies = [ "cfg-if", ] @@ -1009,7 +1005,7 @@ dependencies = [ "criterion-plot", "is-terminal", "itertools 0.10.5", - "num-traits 0.2.17", + "num-traits 0.2.18", "once_cell", "oorandom", "plotters", @@ -1034,36 +1030,28 @@ dependencies = [ [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crunchy" @@ -1120,7 +1108,7 @@ checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] @@ -1169,9 +1157,9 @@ checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" [[package]] name = "either" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" [[package]] name = "ena" @@ -1190,12 +1178,12 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.7" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f258a7194e7f7c2a7837a8913aeab7fd8c383457034fa20ce4dd3dcb813e8eb8" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -1234,9 +1222,9 @@ checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" [[package]] name = "futures" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" +checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0" dependencies = [ "futures-channel", "futures-core", @@ -1249,9 +1237,9 @@ dependencies = [ [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", "futures-sink", @@ -1259,15 +1247,15 @@ dependencies = [ [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1276,44 +1264,44 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-timer" -version = "3.0.2" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c" +checksum = "f288b0a4f20f9a56b5d1da57e2227c661b7b16168e2f72365f57b63326e29b24" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ "futures-channel", "futures-core", @@ -1346,7 +1334,7 @@ checksum = "d4cf186fea4af17825116f72932fe52cce9a13bae39ff63b4dc0cfdb3fb4bde1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] @@ -1361,9 +1349,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "js-sys", @@ -1384,9 +1372,13 @@ dependencies = [ [[package]] name = "half" -version = "1.8.2" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eabb4a44450da02c90444cf74558da904edde8fb4e9035a9a6a4e15445af0bd7" +checksum = "bc52e53916c08643f1b56ec082790d1e86a32e58dc5268f897f313fbae7b4872" +dependencies = [ + "cfg-if", + "crunchy", +] [[package]] name = "hashbrown" @@ -1394,16 +1386,16 @@ version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" dependencies = [ - "ahash 0.7.7", + "ahash 0.7.8", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" dependencies = [ - "ahash 0.8.6", + "ahash 0.8.9", "allocator-api2", "serde", ] @@ -1425,9 +1417,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "bd5256b483761cd23699d0da46cc6fd2ee3be420bbe6d020ae4a091e70b7e9fd" [[package]] name = "hex" @@ -1437,7 +1429,7 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" [[package]] name = "hint_accountant" -version = "1.0.0-rc0" +version = "1.0.0-rc1" dependencies = [ "cairo-vm", "serde", @@ -1495,12 +1487,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "serde", ] @@ -1530,13 +1522,13 @@ dependencies = [ [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" dependencies = [ "hermit-abi", - "rustix", - "windows-sys", + "libc", + "windows-sys 0.52.0", ] [[package]] @@ -1559,33 +1551,24 @@ dependencies = [ [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "jobserver" -version = "0.1.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" -dependencies = [ - "libc", -] +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] [[package]] name = "keccak" -version = "0.1.4" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f6d5ed8676d904364de097082f4e7d240b571b67989ced0240f08b7f966f940" +checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654" dependencies = [ "cpufeatures", ] @@ -1622,13 +1605,26 @@ dependencies = [ "regex", ] +[[package]] +name = "lambdaworks-crypto" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d4c222d5b2fdc0faf702d3ab361d14589b097f40eac9dc550e27083483edc65" +dependencies = [ + "lambdaworks-math", + "serde", + "sha2", + "sha3", +] + [[package]] name = "lambdaworks-math" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c6c4d0ddd1fcd235be5196b1bcc404f89ad3e911f4c190fa01459e05dbf40f8" +checksum = "9ee7dcab3968c71896b8ee4dc829147acc918cffe897af6265b1894527fe3add" dependencies = [ - "thiserror", + "serde", + "serde_json", ] [[package]] @@ -1642,9 +1638,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libm" @@ -1668,16 +1664,16 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", "redox_syscall 0.4.1", ] [[package]] name = "linux-raw-sys" -version = "0.4.11" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "969488b55f8ac402214f3f5fd243ebb7206cf82de60d3172994707a4bcc2b829" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -1715,18 +1711,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" - -[[package]] -name = "memoffset" -version = "0.9.0" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" -dependencies = [ - "autocfg", -] +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "mimalloc" @@ -1755,9 +1742,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", ] @@ -1771,7 +1758,7 @@ dependencies = [ "matrixmultiply", "num-complex", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", "rawpointer", ] @@ -1799,7 +1786,7 @@ checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", "rand", "serde", ] @@ -1811,17 +1798,22 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" dependencies = [ "autocfg", - "num-traits 0.2.17", + "num-traits 0.2.18", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" -version = "0.1.45" +version = "0.1.46" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" dependencies = [ - "autocfg", - "num-traits 0.2.17", + "num-traits 0.2.18", ] [[package]] @@ -1832,7 +1824,7 @@ checksum = "64a5fe11d4135c3bcdf3a95b18b194afa9608a5f6ff034f5d857bc9a27fb0119" dependencies = [ "num-bigint", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", ] [[package]] @@ -1847,7 +1839,7 @@ dependencies = [ "num-bigint", "num-integer", "num-modular", - "num-traits 0.2.17", + "num-traits 0.2.18", "rand", ] @@ -1857,14 +1849,14 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" dependencies = [ - "num-traits 0.2.17", + "num-traits 0.2.18", ] [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", "libm", @@ -1872,9 +1864,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "oorandom" @@ -1884,22 +1876,23 @@ checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "881331e34fa842a2fb61cc2db9643a8fedc615e47cfcc52597d1af0db9a7e8fe" dependencies = [ "arrayvec", "bitvec", "byte-slice-cast", "impl-trait-for-tuples", + "parity-scale-codec-derive", "serde", ] [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "be30eaf4b0a9fba5336683b38de57bb86d179a35862ba6bfcf57625d006bde5b" dependencies = [ "proc-macro-crate", "proc-macro2", @@ -1952,7 +1945,7 @@ dependencies = [ "libc", "redox_syscall 0.4.1", "smallvec", - "windows-targets", + "windows-targets 0.48.5", ] [[package]] @@ -1997,7 +1990,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset", - "indexmap 2.1.0", + "indexmap 2.2.3", ] [[package]] @@ -2029,9 +2022,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkg-config" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" [[package]] name = "plotters" @@ -2039,7 +2032,7 @@ version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45" dependencies = [ - "num-traits 0.2.17", + "num-traits 0.2.18", "plotters-backend", "plotters-svg", "wasm-bindgen", @@ -2081,19 +2074,18 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" [[package]] name = "proc-macro-crate" -version = "1.3.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "once_cell", - "toml_edit 0.19.15", + "toml_edit 0.20.7", ] [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] @@ -2106,9 +2098,9 @@ checksum = "31b476131c3c86cb68032fdc5cb6d5a1045e3e42d96b69fa599fd77701e1f5bf" dependencies = [ "bit-set", "bit-vec", - "bitflags 2.4.1", + "bitflags 2.4.2", "lazy_static", - "num-traits 0.2.17", + "num-traits 0.2.18", "rand", "rand_chacha", "rand_xorshift", @@ -2126,9 +2118,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] @@ -2186,9 +2178,9 @@ checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3" [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -2196,9 +2188,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -2235,9 +2227,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", @@ -2247,9 +2239,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -2270,9 +2262,9 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" [[package]] name = "relative-path" -version = "1.9.0" +version = "1.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c707298afce11da2efef2f600116fa93ffa7a032b5d7b628aa17711ec81383ca" +checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc" [[package]] name = "rfc6979" @@ -2327,15 +2319,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.25" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc99bc2d4f1fed22595588a013687477aedf3cdcfb26558c559edb67b4d9b22e" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", "linux-raw-sys", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2358,9 +2350,9 @@ dependencies = [ [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" [[package]] name = "salsa" @@ -2439,28 +2431,28 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "semver" -version = "1.0.20" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" [[package]] name = "serde" -version = "1.0.193" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.193" +version = "1.0.197" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] @@ -2476,9 +2468,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.114" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0" dependencies = [ "itoa", "ryu", @@ -2487,9 +2479,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] @@ -2543,15 +2535,15 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.2" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smol_str" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c" +checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" dependencies = [ "serde", ] @@ -2584,7 +2576,7 @@ dependencies = [ "hmac", "num-bigint", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", "rfc6979", "sha2", "starknet-crypto-codegen", @@ -2601,23 +2593,23 @@ checksum = "af6527b845423542c8a16e060ea1bc43f67229848e7cd4c4d80be994a84220ce" dependencies = [ "starknet-curve", "starknet-ff", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] name = "starknet-curve" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a68a0d87ae56572abf83ddbfd44259a7c90dbeeee1629a1ffe223e7f9a8f3052" +checksum = "63c454fecadfb3fe56ee82c405439d663c8a037667cc9d8e4acb1fb17e15b1af" dependencies = [ "starknet-ff", ] [[package]] name = "starknet-ff" -version = "0.3.5" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7584bc732e4d2a8ccebdd1dda8236f7940a79a339e30ebf338d45c329659e36c" +checksum = "067419451efdea1ee968df8438369960c167e0e905c05b84afd074f50e1d6f3d" dependencies = [ "ark-ff", "crypto-bigint", @@ -2627,17 +2619,18 @@ dependencies = [ [[package]] name = "starknet-types-core" -version = "0.0.6" +version = "0.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b6b868f545d43b474c2c00e9349c489fdeb7ff17eb00cdf339744ac4cae0930" +checksum = "6d53160556d1f23425100f42b3230df747ea05763efee685a2cd939dfb640701" dependencies = [ "arbitrary", "bitvec", + "lambdaworks-crypto", "lambdaworks-math", "lazy_static", "num-bigint", "num-integer", - "num-traits 0.2.17", + "num-traits 0.2.18", "serde", ] @@ -2656,9 +2649,9 @@ dependencies = [ [[package]] name = "strsim" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" +checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01" [[package]] name = "subtle" @@ -2679,9 +2672,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.50" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "74f1bdc9872430ce9b75da68329d1c1746faf50ffac5f19e02b71e37ff881ffb" dependencies = [ "proc-macro2", "quote", @@ -2696,15 +2689,14 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand", - "redox_syscall 0.4.1", "rustix", - "windows-sys", + "windows-sys 0.52.0", ] [[package]] @@ -2720,22 +2712,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] @@ -2760,11 +2752,12 @@ dependencies = [ [[package]] name = "time" -version = "0.3.31" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f657ba42c3f86e7680e53c8cd3af8abbe56b5491790b46e22e19c0d57463583e" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", + "num-conv", "powerfmt", "serde", "time-core", @@ -2797,14 +2790,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.8" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a195ec8c9da26928f773888e0742ca3ca1040c6cd859c919c9f59c1954ab35" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.21.0", + "toml_edit 0.22.6", ] [[package]] @@ -2818,26 +2811,26 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.20.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] name = "toml_edit" -version = "0.21.0" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03" +checksum = "2c1b5fd4128cc8d3e0cb74d4ed9a9cc7c7284becd4df68f5f940e1ad123606f6" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.3", "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.6.2", ] [[package]] @@ -2854,9 +2847,9 @@ checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" [[package]] name = "unescaper" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8f0f68e58d297ba8b22b8b5a96a87b863ba6bb46aaf51e19a4b02c5a6dd5b7f" +checksum = "0adf6ad32eb5b3cadff915f7b770faaac8f7ff0476633aa29eb0d9584d889d34" dependencies = [ "thiserror", ] @@ -2869,9 +2862,9 @@ checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "unicode-xid" @@ -2918,9 +2911,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -2928,24 +2921,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -2955,9 +2948,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -2965,28 +2958,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "wasm-bindgen-test" -version = "0.3.38" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6433b7c56db97397842c46b67e11873eda263170afeb3a2dc74a7cb370fee0d" +checksum = "143ddeb4f833e2ed0d252e618986e18bfc7b0e52f2d28d77d05b2f045dd8eb61" dependencies = [ "console_error_panic_hook", "js-sys", @@ -2998,18 +2991,18 @@ dependencies = [ [[package]] name = "wasm-bindgen-test-macro" -version = "0.3.38" +version = "0.3.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "493fcbab756bb764fa37e6bee8cec2dd709eb4273d06d0c282a5e74275ded735" +checksum = "a5211b7550606857312bba1d978a8ec75692eae187becc5e680444fffc5e6f89" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] name = "wasm-demo" -version = "1.0.0-rc0" +version = "1.0.0-rc1" dependencies = [ "cairo-vm", "console_error_panic_hook", @@ -3020,9 +3013,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -3065,7 +3058,16 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.3", ] [[package]] @@ -3074,13 +3076,28 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm", - "windows_aarch64_msvc", - "windows_i686_gnu", - "windows_i686_msvc", - "windows_x86_64_gnu", - "windows_x86_64_gnullvm", - "windows_x86_64_msvc", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d380ba1dc7187569a8a9e91ed34b8ccfc33123bbacb8c0aed2d1ad7f3ef2dc5f" +dependencies = [ + "windows_aarch64_gnullvm 0.52.3", + "windows_aarch64_msvc 0.52.3", + "windows_i686_gnu 0.52.3", + "windows_i686_msvc 0.52.3", + "windows_x86_64_gnu 0.52.3", + "windows_x86_64_gnullvm 0.52.3", + "windows_x86_64_msvc 0.52.3", ] [[package]] @@ -3089,47 +3106,98 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68e5dcfb9413f53afd9c8f86e56a7b4d86d9a2fa26090ea2dc9e40fba56c6ec6" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dab469ebbc45798319e69eebf92308e541ce46760b49b18c6b3fe5e8965b30f" + [[package]] name = "windows_i686_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a4e9b6a7cac734a8b4138a4e1044eac3404d8326b6c0f939276560687a033fb" + [[package]] name = "windows_i686_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28b0ec9c422ca95ff34a78755cfa6ad4a51371da2a5ace67500cf7ca5f232c58" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "704131571ba93e89d7cd43482277d6632589b18ecf4468f591fbae0a8b101614" + [[package]] name = "windows_x86_64_gnullvm" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42079295511643151e98d61c38c0acc444e52dd42ab456f7ccfd5152e8ecf21c" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0770833d60a970638e989b3fa9fd2bb1aaadcf88963d1659fd7d9990196ed2d6" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + [[package]] name = "winnow" -version = "0.5.19" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "7a4191c47f15cc3ec71fcb4913cb83d58def65dd3787610213c649283b5ce178" dependencies = [ "memchr", ] @@ -3160,22 +3228,22 @@ checksum = "7e2c411759b501fb9501aac2b1b2d287a6e93e5bdcf13c25306b23e1b716dd0e" [[package]] name = "zerocopy" -version = "0.7.26" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e97e415490559a91254a2979b4829267a57d2fcd741a98eee8b722fb57289aa0" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.26" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] @@ -3195,7 +3263,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.50", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 426e992ca6..45b7340838 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -18,7 +18,7 @@ exclude = ["ensure-no_std"] resolver = "2" [workspace.package] -version = "1.0.0-rc0" +version = "1.0.0-rc1" edition = "2021" license = "Apache-2.0" repository = "https://github.com/lambdaclass/cairo-vm/" @@ -26,7 +26,7 @@ readme = "README.md" keywords = ["starknet", "cairo", "vm", "wasm", "no_std"] [workspace.dependencies] -cairo-vm = { path = "./vm", version = "1.0.0-rc0", default-features = false } +cairo-vm = { path = "./vm", version = "1.0.0-rc1", default-features = false } mimalloc = { version = "0.1.37", default-features = false } num-bigint = { version = "0.4", default-features = false, features = [ "serde", @@ -63,14 +63,14 @@ thiserror-no-std = { version = "2.0.2", default-features = false } bitvec = { version = "1", default-features = false, features = ["alloc"] } # Dependencies for cairo-1-hints feature -cairo-lang-starknet = { version = "2.4.2", default-features = false } -cairo-lang-casm = { version = "2.4.2", default-features = false } +cairo-lang-starknet = { version = "2.5.4", default-features = false } +cairo-lang-casm = { version = "2.5.4", default-features = false } -cairo-lang-compiler = { version = "2.4.2", default-features = false } -cairo-lang-sierra-to-casm = { version = "2.4.2", default-features = false } -cairo-lang-sierra = { version = "2.4.2", default-features = false } -cairo-lang-runner = { version = "2.4.2", default-features = false } -cairo-lang-utils = { version = "2.4.2", default-features = false } +cairo-lang-compiler = { version = "2.5.4", default-features = false } +cairo-lang-sierra-to-casm = { version = "2.5.4", default-features = false } +cairo-lang-sierra = { version = "2.5.4", default-features = false } +cairo-lang-runner = { version = "2.5.4", default-features = false } +cairo-lang-utils = { version = "2.5.4", default-features = false } # TODO: check these dependencies for wasm compatibility ark-ff = { version = "0.4.2", default-features = false } diff --git a/Makefile b/Makefile index 18c7774bc9..5467a61bbf 100644 --- a/Makefile +++ b/Makefile @@ -13,13 +13,13 @@ ifndef PROPTEST_CASES endif .PHONY: build-cairo-1-compiler build-cairo-1-compiler-macos build-cairo-2-compiler build-cairo-2-compiler-macos \ - deps deps-macos cargo-deps build run check test clippy coverage benchmark \ + deps deps-macos cargo-deps build run check test clippy coverage benchmark flamegraph\ compare_benchmarks_deps compare_benchmarks docs clean \ compare_trace_memory compare_trace compare_memory compare_pie compare_all_no_proof \ compare_trace_memory_proof compare_all_proof compare_trace_proof compare_memory_proof compare_air_public_input compare_air_private_input\ cairo_bench_programs cairo_proof_programs cairo_test_programs cairo_1_test_contracts cairo_2_test_contracts \ cairo_trace cairo-vm_trace cairo_proof_trace cairo-vm_proof_trace \ - fuzzer-deps fuzzer-run-cairo-compiled fuzzer-run-hint-diff build-cairo-lang hint-accountant \ + fuzzer-deps fuzzer-run-cairo-compiled fuzzer-run-hint-diff build-cairo-lang hint-accountant \ create-proof-programs-symlinks \ $(RELBIN) $(DBGBIN) # Proof mode consumes too much memory with cairo-lang to execute @@ -168,7 +168,7 @@ $(CAIRO_2_CONTRACTS_TEST_DIR)/%.casm: $(CAIRO_2_CONTRACTS_TEST_DIR)/%.sierra # ====================== CAIRO_2_REPO_DIR = cairo2 -CAIRO_2_VERSION = 2.4.2 +CAIRO_2_VERSION = 2.5.4 build-cairo-2-compiler-macos: @if [ ! -d "$(CAIRO_2_REPO_DIR)" ]; then \ @@ -187,17 +187,16 @@ build-cairo-2-compiler: cargo-deps: cargo install --version 0.3.1 iai-callgrind-runner cargo install --version 1.1.0 cargo-criterion - # Temporarily removed due to version issues. Installing cargo flamegraph pumps an error in rust 1.70 - # cargo install --version 0.6.1 flamegraph + cargo install --version 0.6.1 flamegraph --locked cargo install --version 1.14.0 hyperfine - cargo install --version 0.9.49 cargo-nextest + cargo install --version 0.9.49 cargo-nextest --locked cargo install --version 0.5.9 cargo-llvm-cov - cargo install --version 0.12.1 wasm-pack + cargo install --version 0.12.1 wasm-pack --locked cairo1-run-deps: cd cairo1-run; make deps -deps: cargo-deps build-cairo-1-compiler build-cairo-2-compiler cairo1-run-deps +deps: create-proof-programs-symlinks cargo-deps build-cairo-1-compiler build-cairo-2-compiler cairo1-run-deps pyenv install -s pypy3.9-7.3.9 PYENV_VERSION=pypy3.9-7.3.9 python -m venv cairo-vm-pypy-env . cairo-vm-pypy-env/bin/activate ; \ @@ -207,7 +206,7 @@ deps: cargo-deps build-cairo-1-compiler build-cairo-2-compiler cairo1-run-deps . cairo-vm-env/bin/activate ; \ pip install -r requirements.txt ; \ -deps-macos: cargo-deps build-cairo-1-compiler-macos build-cairo-2-compiler-macos cairo1-run-deps +deps-macos: create-proof-programs-symlinks cargo-deps build-cairo-1-compiler-macos build-cairo-2-compiler-macos cairo1-run-deps arch -x86_64 pyenv install -s pypy3.9-7.3.9 PYENV_VERSION=pypy3.9-7.3.9 python -m venv cairo-vm-pypy-env . cairo-vm-pypy-env/bin/activate ; \ @@ -279,9 +278,8 @@ benchmark-action: cairo_bench_programs iai-benchmark-action: cairo_bench_programs cargo bench --bench iai_benchmark -# Temporarily removed due to version issues. Installing cargo flamegraph pumps an error in rust 1.70 -# flamegraph: -# cargo flamegraph --root --bench criterion_benchmark -- --bench +flamegraph: + cargo flamegraph --root --bench criterion_benchmark -- --bench compare_benchmarks: cairo_bench_programs cd bench && ./run_benchmarks.sh @@ -333,6 +331,7 @@ clean: rm -f $(PRINT_TEST_DIR)/*.json rm -f $(CAIRO_1_CONTRACTS_TEST_DIR)/*.sierra rm -f $(CAIRO_1_CONTRACTS_TEST_DIR)/*.casm + rm -f $(TEST_PROOF_DIR)/*.cairo rm -f $(CAIRO_2_CONTRACTS_TEST_DIR)/*.sierra rm -f $(CAIRO_2_CONTRACTS_TEST_DIR)/*.casm rm -f $(TEST_PROOF_DIR)/*.json @@ -374,3 +373,5 @@ build-cairo-lang: | $(CAIRO_LANG_REPO_DIR) hint-accountant: build-cairo-lang cargo r -p hint_accountant +create-proof-programs-symlinks: + cd cairo_programs/proof_programs; ln -s ../*.cairo . diff --git a/README.md b/README.md index ccfd424138..d076edd945 100644 --- a/README.md +++ b/README.md @@ -56,9 +56,9 @@ Cargo doesn't comply with [semver](https://semver.org/), so we advise to pin the Cairo VM is the virtual machine for the [Cairo language](https://www.cairo-lang.org/). -There's an older version of [Cairo VM](https://github.com/starkware-libs/cairo-lang) written in Python, which is **currently in production**. +Previously, there was a version of [Cairo VM](https://github.com/starkware-libs/cairo-lang) written in Python, which **was used in production**. -This repository contains the newer version, written in Rust. It's faster and has safer and more expressive typing. Once completed, it will replace the older one as the sole Cairo VM. +This repository contains the newer version, written in Rust. It's faster and has safer and more expressive typing. Now in production, it has replaced the older Python version to become the primary Cairo VM. ### The Cairo language @@ -74,7 +74,7 @@ It's Turing-complete and it was created by [Starkware](https://starkware.co/) as These are needed in order to compile and use the project. -- [Rust 1.70.0 or newer](https://www.rust-lang.org/tools/install) +- [Rust 1.74.1 or newer](https://www.rust-lang.org/tools/install) - Cargo #### Optional @@ -107,21 +107,17 @@ You can then activate this environment by running You can add the following to your rust project's `Cargo.toml`: ```toml -cairo-vm = { version = '0.7.0', features = ["lambdaworks-felt"] } +cairo-vm = { version = '0.7.0'} ``` -The `features = ["lambdaworks-felt"]` part adds usage of [`lambdaworks-math`](https://github.com/lambdaclass/lambdaworks) as the backend for `Felt252`. This improves performance by more than 20%, and will be the default in the future. - ### Running cairo-vm from CLI To run programs from the command line, first compile the repository from the cairo-vm-cli folder: ```bash -cd cairo-vm-cli; cargo build --release -F lambdaworks-felt; cd .. +cd cairo-vm-cli; cargo build --release; cd .. ``` -The `-F lambdaworks-felt` part adds usage of [`lambdaworks-math`](https://github.com/lambdaclass/lambdaworks) as the backend for `Felt252`. This improves performance by more than 20%, and will be the default in the future. - Once the binary is built, it can be found in `target/release/` under the name `cairo-vm-cli`. In order to compile Cairo programs you need to activate the environment created while installing dependencies. To start it, run: @@ -171,7 +167,7 @@ The cairo-vm-cli supports the following optional arguments: - `--proof_mode`: Runs the program in proof_mode -- `--secure_run`: Runs security checks after execution. Enabled by default when not in proof_mode +- `--secure_run`: Runs security checks after execution. Enabled by default when not in proof_mode. - `--air_public_input `: Receives the name of a file and outputs the AIR public inputs into it. Can only be used if proof_mode is also enabled. @@ -179,6 +175,8 @@ The cairo-vm-cli supports the following optional arguments: - `--cairo_pie_output `: Receives the name of a file and outputs the Cairo PIE into it. Can only be used if proof_mode, is not enabled. +- `--allow_missing_builtins`: Disables the check that all builtins used by the program need to be included in the selected layout. Enabled by default when in proof_mode. + For example, to obtain the air public inputs from a fibonacci program run, we can run : ```bash diff --git a/bench/criterion_benchmark.rs b/bench/criterion_benchmark.rs index d1f4029a4f..5f4c4c1193 100644 --- a/bench/criterion_benchmark.rs +++ b/bench/criterion_benchmark.rs @@ -52,7 +52,9 @@ fn load_program_data(c: &mut Criterion) { VirtualMachine::new(false), ) }, - |(mut runner, mut vm)| _ = black_box(runner.initialize(black_box(&mut vm)).unwrap()), + |(mut runner, mut vm)| { + _ = black_box(runner.initialize(black_box(&mut vm), false).unwrap()) + }, BatchSize::SmallInput, ) }); diff --git a/bench/iai_benchmark.rs b/bench/iai_benchmark.rs index b12c209514..07fcf214b8 100644 --- a/bench/iai_benchmark.rs +++ b/bench/iai_benchmark.rs @@ -51,7 +51,7 @@ fn build_runner_helper() -> (CairoRunner, VirtualMachine) { #[inline(never)] fn load_program_data() { let (mut runner, mut vm) = build_runner_helper(); - _ = black_box(runner.initialize(black_box(&mut vm)).unwrap()); + _ = black_box(runner.initialize(black_box(&mut vm), false).unwrap()); } main!( diff --git a/cairo-vm-cli/src/main.rs b/cairo-vm-cli/src/main.rs index a3c349d79a..276dd6b70b 100644 --- a/cairo-vm-cli/src/main.rs +++ b/cairo-vm-cli/src/main.rs @@ -52,6 +52,8 @@ struct Args { conflicts_with_all = ["proof_mode", "air_private_input", "air_public_input"] )] cairo_pie_output: Option, + #[structopt(long = "allow_missing_builtins")] + allow_missing_builtins: Option, } fn validate_layout(value: &str) -> Result { @@ -132,6 +134,7 @@ fn run(args: impl Iterator) -> Result<(), Error> { layout: &args.layout, proof_mode: args.proof_mode, secure_run: args.secure_run, + allow_missing_builtins: args.allow_missing_builtins, ..Default::default() }; diff --git a/cairo1-run/Cargo.toml b/cairo1-run/Cargo.toml index 34138ce983..391774f86a 100644 --- a/cairo1-run/Cargo.toml +++ b/cairo1-run/Cargo.toml @@ -11,10 +11,10 @@ keywords.workspace = true [dependencies] cairo-vm = {workspace = true, features = ["std", "cairo-1-hints"]} -cairo-lang-sierra-type-size = { version = "2.3.1", default-features = false } -cairo-lang-sierra-ap-change = { version = "2.3.1", default-features = false } -cairo-lang-sierra-gas = { version = "2.3.1", default-features = false } -cairo-lang-sierra-to-casm.workspace = true +cairo-lang-sierra-type-size = { version = "2.5.4", default-features = false } +cairo-lang-sierra-ap-change = { version = "2.5.4", default-features = false } +cairo-lang-sierra-gas = { version = "2.5.4", default-features = false } +cairo-lang-sierra-to-casm.workspace = true cairo-lang-compiler.workspace = true cairo-lang-sierra.workspace = true cairo-lang-utils.workspace = true diff --git a/cairo1-run/Makefile b/cairo1-run/Makefile index 26b9b9341a..c2869d9972 100644 --- a/cairo1-run/Makefile +++ b/cairo1-run/Makefile @@ -15,14 +15,14 @@ MEMORY:=$(patsubst $(CAIRO_1_FOLDER)/%.cairo, $(CAIRO_1_FOLDER)/%.memory, $(CAIR deps: git clone https://github.com/starkware-libs/cairo.git \ && cd cairo \ - && git checkout v2.4.2 \ + && git checkout v2.5.4 \ && cd .. \ && mv cairo/corelib/ . \ && rm -rf cairo/ run: $(TRACES) $(MEMORY) -test: +test: cargo test clean: diff --git a/cairo1-run/src/cairo_run.rs b/cairo1-run/src/cairo_run.rs new file mode 100644 index 0000000000..5dbda6c672 --- /dev/null +++ b/cairo1-run/src/cairo_run.rs @@ -0,0 +1,766 @@ +use cairo_lang_casm::{casm, casm_extend, hints::Hint, instructions::Instruction}; +use cairo_lang_sierra::{ + extensions::{ + bitwise::BitwiseType, + core::{CoreLibfunc, CoreType}, + ec::EcOpType, + gas::{CostTokenType, GasBuiltinType}, + pedersen::PedersenType, + poseidon::PoseidonType, + range_check::RangeCheckType, + segment_arena::SegmentArenaType, + starknet::syscalls::SystemType, + ConcreteType, NamedType, + }, + ids::ConcreteTypeId, + program::{Function, Program as SierraProgram}, + program_registry::ProgramRegistry, +}; +use cairo_lang_sierra_ap_change::calc_ap_changes; +use cairo_lang_sierra_gas::gas_info::GasInfo; +use cairo_lang_sierra_to_casm::{ + compiler::CairoProgram, + metadata::{calc_metadata, Metadata, MetadataComputationConfig, MetadataError}, +}; +use cairo_lang_sierra_type_size::get_type_size_map; +use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; +use cairo_vm::{ + hint_processor::cairo_1_hint_processor::hint_processor::Cairo1HintProcessor, + serde::deserialize_program::{ + ApTracking, BuiltinName, FlowTrackingData, HintParams, ReferenceManager, + }, + types::{program::Program, relocatable::MaybeRelocatable}, + vm::{ + errors::{runner_errors::RunnerError, vm_errors::VirtualMachineError}, + runners::{ + builtin_runner::{ + BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, HASH_BUILTIN_NAME, OUTPUT_BUILTIN_NAME, + POSEIDON_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, + }, + cairo_runner::{CairoRunner, RunResources, RunnerMode}, + }, + vm_core::VirtualMachine, + }, + Felt252, +}; +use itertools::chain; +use std::collections::HashMap; + +use crate::{Error, FuncArg}; + +#[derive(Debug)] +pub struct Cairo1RunConfig<'a> { + pub args: &'a [FuncArg], + pub trace_enabled: bool, + pub relocate_mem: bool, + pub layout: &'a str, + pub proof_mode: bool, + // Should be true if either air_public_input or cairo_pie_output are needed + // Sets builtins stop_ptr by calling `final_stack` on each builtin + pub finalize_builtins: bool, +} + +impl Default for Cairo1RunConfig<'_> { + fn default() -> Self { + Self { + args: Default::default(), + trace_enabled: false, + relocate_mem: false, + layout: "plain", + proof_mode: false, + finalize_builtins: false, + } + } +} + +// Runs a Cairo 1 program +// Returns the runner & VM after execution + the return values +pub fn cairo_run_program( + sierra_program: &SierraProgram, + cairo_run_config: Cairo1RunConfig, +) -> Result<(CairoRunner, VirtualMachine, Vec), Error> { + let metadata = create_metadata(sierra_program, Some(Default::default()))?; + let sierra_program_registry = ProgramRegistry::::new(sierra_program)?; + let type_sizes = + get_type_size_map(sierra_program, &sierra_program_registry).unwrap_or_default(); + let casm_program = + cairo_lang_sierra_to_casm::compiler::compile(sierra_program, &metadata, true)?; + + let main_func = find_function(sierra_program, "::main")?; + + let initial_gas = 9999999999999_usize; + + // Modified entry code to be compatible with custom cairo1 Proof Mode. + // This adds code that's needed for dictionaries, adjusts ap for builtin pointers, adds initial gas for the gas builtin if needed, and sets up other necessary code for cairo1 + let (entry_code, builtins) = create_entry_code( + &sierra_program_registry, + &casm_program, + &type_sizes, + main_func, + initial_gas, + cairo_run_config.proof_mode, + cairo_run_config.args, + )?; + + // Fetch return type data + let return_type_id = main_func + .signature + .ret_types + .last() + .ok_or(Error::NoRetTypesInSignature)?; + let return_type_size = type_sizes + .get(return_type_id) + .cloned() + .ok_or_else(|| Error::NoTypeSizeForId(return_type_id.clone()))?; + + // This footer is used by lib funcs + let libfunc_footer = create_code_footer(); + + // Header used to initiate the infinite loop after executing the program + // Also appends return values to output segment + let proof_mode_header = if cairo_run_config.proof_mode { + create_proof_mode_header(builtins.len() as i16, return_type_size) + } else { + casm! {}.instructions + }; + + // This is the program we are actually running/proving + // With (embedded proof mode), cairo1 header and the libfunc footer + let instructions = chain!( + proof_mode_header.iter(), + entry_code.iter(), + casm_program.instructions.iter(), + libfunc_footer.iter(), + ); + + let (processor_hints, program_hints) = build_hints_vec(instructions.clone()); + + let mut hint_processor = Cairo1HintProcessor::new(&processor_hints, RunResources::default()); + + let data: Vec = instructions + .flat_map(|inst| inst.assemble().encode()) + .map(|x| Felt252::from(&x)) + .map(MaybeRelocatable::from) + .collect(); + + let data_len = data.len(); + + let program = if cairo_run_config.proof_mode { + Program::new_for_proof( + builtins, + data, + 0, + // Proof mode is on top + // jmp rel 0 is on PC == 2 + 2, + program_hints, + ReferenceManager { + references: Vec::new(), + }, + HashMap::new(), + vec![], + None, + )? + } else { + Program::new( + builtins, + data, + Some(0), + program_hints, + ReferenceManager { + references: Vec::new(), + }, + HashMap::new(), + vec![], + None, + )? + }; + + let runner_mode = if cairo_run_config.proof_mode { + RunnerMode::ProofModeCairo1 + } else { + RunnerMode::ExecutionMode + }; + + let mut runner = CairoRunner::new_v2(&program, cairo_run_config.layout, runner_mode)?; + let mut vm = VirtualMachine::new(cairo_run_config.trace_enabled); + let end = runner.initialize(&mut vm, cairo_run_config.proof_mode)?; + + additional_initialization(&mut vm, data_len)?; + + // Run it until the end / infinite loop in proof_mode + runner.run_until_pc(end, &mut vm, &mut hint_processor)?; + if cairo_run_config.proof_mode { + // As we will be inserting the return values into the output segment after running the main program (right before the infinite loop) the computed size for the output builtin will be 0 + // We need to manually set the segment size for the output builtin's segment so memory hole counting doesn't fail due to having a higher accessed address count than the segment's size + vm.segments + .segment_sizes + .insert(2, return_type_size as usize); + } + runner.end_run(false, false, &mut vm, &mut hint_processor)?; + + // Fetch return values + let return_values = fetch_return_values(return_type_size, return_type_id, &vm)?; + + // Set stop pointers for builtins so we can obtain the air public input + if cairo_run_config.finalize_builtins { + finalize_builtins( + cairo_run_config.proof_mode, + &main_func.signature.ret_types, + &type_sizes, + &mut vm, + )?; + + // Build execution public memory + if cairo_run_config.proof_mode { + // As the output builtin is not used by the program we need to compute it's stop ptr manually + vm.set_output_stop_ptr_offset(return_type_size as usize); + + runner.finalize_segments(&mut vm)?; + } + } + + runner.relocate(&mut vm, true)?; + + Ok((runner, vm, return_values)) +} + +fn additional_initialization(vm: &mut VirtualMachine, data_len: usize) -> Result<(), Error> { + // Create the builtin cost segment + let builtin_cost_segment = vm.add_memory_segment(); + for token_type in CostTokenType::iter_precost() { + vm.insert_value( + (builtin_cost_segment + (token_type.offset_in_builtin_costs() as usize)) + .map_err(VirtualMachineError::Math)?, + Felt252::default(), + )? + } + // Put a pointer to the builtin cost segment at the end of the program (after the + // additional `ret` statement). + vm.insert_value( + (vm.get_pc() + data_len).map_err(VirtualMachineError::Math)?, + builtin_cost_segment, + )?; + + Ok(()) +} + +#[allow(clippy::type_complexity)] +fn build_hints_vec<'b>( + instructions: impl Iterator, +) -> (Vec<(usize, Vec)>, HashMap>) { + let mut hints: Vec<(usize, Vec)> = Vec::new(); + let mut program_hints: HashMap> = HashMap::new(); + + let mut hint_offset = 0; + + for instruction in instructions { + if !instruction.hints.is_empty() { + hints.push((hint_offset, instruction.hints.clone())); + program_hints.insert( + hint_offset, + vec![HintParams { + code: hint_offset.to_string(), + accessible_scopes: Vec::new(), + flow_tracking_data: FlowTrackingData { + ap_tracking: ApTracking::default(), + reference_ids: HashMap::new(), + }, + }], + ); + } + hint_offset += instruction.body.op_size(); + } + (hints, program_hints) +} + +/// Finds first function ending with `name_suffix`. +fn find_function<'a>( + sierra_program: &'a SierraProgram, + name_suffix: &'a str, +) -> Result<&'a Function, RunnerError> { + sierra_program + .funcs + .iter() + .find(|f| { + if let Some(name) = &f.id.debug_name { + name.ends_with(name_suffix) + } else { + false + } + }) + .ok_or_else(|| RunnerError::MissingMain) +} + +/// Creates a list of instructions that will be appended to the program's bytecode. +fn create_code_footer() -> Vec { + casm! { + // Add a `ret` instruction used in libfuncs that retrieve the current value of the `fp` + // and `pc` registers. + ret; + } + .instructions +} + +// Create proof_mode specific instructions +// Including the "canonical" proof mode instructions (the ones added by the compiler in cairo 0) +// wich call the firt program instruction and then initiate an infinite loop. +// And also appending the return values to the output builtin's memory segment +fn create_proof_mode_header(builtin_count: i16, return_type_size: i16) -> Vec { + // As the output builtin is not used by cairo 1 (we forced it for this purpose), it's segment is always empty + // so we can start writing values directly from it's base, which is located relative to the fp before the other builtin's bases + let output_fp_offset: i16 = -(builtin_count + 2); // The 2 here represents the return_fp & end segments + + // The pc offset where the original program should start + // Without this header it should start at 0, but we add 2 for each call and jump instruction (as both of them use immediate values) + // and also 1 for each instruction added to copy each return value into the output segment + let program_start_offset: i16 = 4 + return_type_size; + + let mut ctx = casm! {}; + casm_extend! {ctx, + call rel program_start_offset; // Begin program execution by calling the first instruction in the original program + }; + // Append each return value to the output segment + for (i, j) in (1..return_type_size + 1).rev().enumerate() { + casm_extend! {ctx, + // [ap -j] is where each return value is located in memory + // [[fp + output_fp_offet] + 0] is the base of the output segment + [ap - j] = [[fp + output_fp_offset] + i as i16]; + }; + } + casm_extend! {ctx, + jmp rel 0; // Infinite loop + }; + ctx.instructions +} + +/// Returns the instructions to add to the beginning of the code to successfully call the main +/// function, as well as the builtins required to execute the program. +fn create_entry_code( + sierra_program_registry: &ProgramRegistry, + casm_program: &CairoProgram, + type_sizes: &UnorderedHashMap, + func: &Function, + initial_gas: usize, + proof_mode: bool, + args: &[FuncArg], +) -> Result<(Vec, Vec), Error> { + let mut ctx = casm! {}; + // The builtins in the formatting expected by the runner. + let (builtins, builtin_offset) = get_function_builtins(func, proof_mode); + + // Load all vecs to memory. + // Load all array args content to memory. + let mut array_args_data = vec![]; + let mut ap_offset: i16 = 0; + for arg in args { + let FuncArg::Array(values) = arg else { + continue; + }; + array_args_data.push(ap_offset); + casm_extend! {ctx, + %{ memory[ap + 0] = segments.add() %} + ap += 1; + } + for (i, v) in values.iter().enumerate() { + let arr_at = (i + 1) as i16; + casm_extend! {ctx, + [ap + 0] = (v.to_bigint()); + [ap + 0] = [[ap - arr_at] + (i as i16)], ap++; + }; + } + ap_offset += (1 + values.len()) as i16; + } + let mut array_args_data_iter = array_args_data.iter(); + let after_arrays_data_offset = ap_offset; + let mut arg_iter = args.iter().enumerate(); + let mut param_index = 0; + let mut expected_arguments_size = 0; + if func.signature.param_types.iter().any(|ty| { + get_info(sierra_program_registry, ty) + .map(|x| x.long_id.generic_id == SegmentArenaType::ID) + .unwrap_or_default() + }) { + casm_extend! {ctx, + // SegmentArena segment. + %{ memory[ap + 0] = segments.add() %} + // Infos segment. + %{ memory[ap + 1] = segments.add() %} + ap += 2; + [ap + 0] = 0, ap++; + // Write Infos segment, n_constructed (0), and n_destructed (0) to the segment. + [ap - 2] = [[ap - 3]]; + [ap - 1] = [[ap - 3] + 1]; + [ap - 1] = [[ap - 3] + 2]; + } + ap_offset += 3; + } + for ty in func.signature.param_types.iter() { + let info = get_info(sierra_program_registry, ty) + .ok_or_else(|| Error::NoInfoForType(ty.clone()))?; + let generic_ty = &info.long_id.generic_id; + if let Some(offset) = builtin_offset.get(generic_ty) { + let mut offset = *offset; + if proof_mode { + // Everything is off by 2 due to the proof mode header + offset += 2; + } + casm_extend! {ctx, + [ap + 0] = [fp - offset], ap++; + } + ap_offset += 1; + } else if generic_ty == &SystemType::ID { + casm_extend! {ctx, + %{ memory[ap + 0] = segments.add() %} + ap += 1; + } + ap_offset += 1; + } else if generic_ty == &GasBuiltinType::ID { + casm_extend! {ctx, + [ap + 0] = initial_gas, ap++; + } + ap_offset += 1; + } else if generic_ty == &SegmentArenaType::ID { + let offset = -ap_offset + after_arrays_data_offset; + casm_extend! {ctx, + [ap + 0] = [ap + offset] + 3, ap++; + } + ap_offset += 1; + } else { + let ty_size = type_sizes[ty]; + let param_ap_offset_end = ap_offset + ty_size; + expected_arguments_size += ty_size; + while ap_offset < param_ap_offset_end { + let Some((arg_index, arg)) = arg_iter.next() else { + break; + }; + match arg { + FuncArg::Single(value) => { + casm_extend! {ctx, + [ap + 0] = (value.to_bigint()), ap++; + } + ap_offset += 1; + } + FuncArg::Array(values) => { + let offset = -ap_offset + array_args_data_iter.next().unwrap(); + casm_extend! {ctx, + [ap + 0] = [ap + (offset)], ap++; + [ap + 0] = [ap - 1] + (values.len()), ap++; + } + ap_offset += 2; + if ap_offset > param_ap_offset_end { + return Err(Error::ArgumentUnaligned { + param_index, + arg_index, + }); + } + } + } + } + param_index += 1; + }; + } + let actual_args_size = args + .iter() + .map(|arg| match arg { + FuncArg::Single(_) => 1, + FuncArg::Array(_) => 2, + }) + .sum::(); + if expected_arguments_size != actual_args_size { + return Err(Error::ArgumentsSizeMismatch { + expected: expected_arguments_size, + actual: actual_args_size, + }); + } + + let before_final_call = ctx.current_code_offset; + let final_call_size = 3; + let offset = final_call_size + + casm_program.debug_info.sierra_statement_info[func.entry_point.0].code_offset; + + casm_extend! {ctx, + call rel offset; + ret; + } + assert_eq!(before_final_call + final_call_size, ctx.current_code_offset); + + Ok((ctx.instructions, builtins)) +} + +fn get_info<'a>( + sierra_program_registry: &'a ProgramRegistry, + ty: &'a cairo_lang_sierra::ids::ConcreteTypeId, +) -> Option<&'a cairo_lang_sierra::extensions::types::TypeInfo> { + sierra_program_registry + .get_type(ty) + .ok() + .map(|ctc| ctc.info()) +} + +/// Creates the metadata required for a Sierra program lowering to casm. +fn create_metadata( + sierra_program: &cairo_lang_sierra::program::Program, + metadata_config: Option, +) -> Result { + if let Some(metadata_config) = metadata_config { + calc_metadata(sierra_program, metadata_config).map_err(|err| match err { + MetadataError::ApChangeError(_) => VirtualMachineError::Unexpected, + MetadataError::CostError(_) => VirtualMachineError::Unexpected, + }) + } else { + Ok(Metadata { + ap_change_info: calc_ap_changes(sierra_program, |_, _| 0) + .map_err(|_| VirtualMachineError::Unexpected)?, + gas_info: GasInfo { + variable_values: Default::default(), + function_costs: Default::default(), + }, + }) + } +} + +/// Type representing the Output builtin. +#[derive(Default)] +pub struct OutputType {} +impl cairo_lang_sierra::extensions::NoGenericArgsGenericType for OutputType { + const ID: cairo_lang_sierra::ids::GenericTypeId = + cairo_lang_sierra::ids::GenericTypeId::new_inline("Output"); + const STORABLE: bool = true; + const DUPLICATABLE: bool = false; + const DROPPABLE: bool = false; + const ZERO_SIZED: bool = false; +} + +fn get_function_builtins( + func: &Function, + proof_mode: bool, +) -> ( + Vec, + HashMap, +) { + let entry_params = &func.signature.param_types; + let mut builtins = Vec::new(); + let mut builtin_offset: HashMap = HashMap::new(); + let mut current_offset = 3; + // Fetch builtins from the entry_params in the standard order + if entry_params + .iter() + .any(|ti| ti.debug_name == Some("Poseidon".into())) + { + builtins.push(BuiltinName::poseidon); + builtin_offset.insert(PoseidonType::ID, current_offset); + current_offset += 1; + } + if entry_params + .iter() + .any(|ti| ti.debug_name == Some("EcOp".into())) + { + builtins.push(BuiltinName::ec_op); + builtin_offset.insert(EcOpType::ID, current_offset); + current_offset += 1 + } + if entry_params + .iter() + .any(|ti| ti.debug_name == Some("Bitwise".into())) + { + builtins.push(BuiltinName::bitwise); + builtin_offset.insert(BitwiseType::ID, current_offset); + current_offset += 1; + } + if entry_params + .iter() + .any(|ti| ti.debug_name == Some("RangeCheck".into())) + { + builtins.push(BuiltinName::range_check); + builtin_offset.insert(RangeCheckType::ID, current_offset); + current_offset += 1; + } + if entry_params + .iter() + .any(|ti| ti.debug_name == Some("Pedersen".into())) + { + builtins.push(BuiltinName::pedersen); + builtin_offset.insert(PedersenType::ID, current_offset); + current_offset += 1; + } + // Force an output builtin so that we can write the program output into it's segment + if proof_mode { + builtins.push(BuiltinName::output); + builtin_offset.insert(OutputType::ID, current_offset); + } + builtins.reverse(); + (builtins, builtin_offset) +} + +fn fetch_return_values( + return_type_size: i16, + return_type_id: &ConcreteTypeId, + vm: &VirtualMachine, +) -> Result, Error> { + let mut return_values = vm.get_return_values(return_type_size as usize)?; + // Check if this result is a Panic result + if return_type_id + .debug_name + .as_ref() + .ok_or_else(|| Error::TypeIdNoDebugName(return_type_id.clone()))? + .starts_with("core::panics::PanicResult::") + { + // Check the failure flag (aka first return value) + if return_values.first() != Some(&MaybeRelocatable::from(0)) { + // In case of failure, extract the error from the return values (aka last two values) + let panic_data_end = return_values + .last() + .ok_or(Error::FailedToExtractReturnValues)? + .get_relocatable() + .ok_or(Error::FailedToExtractReturnValues)?; + let panic_data_start = return_values + .get(return_values.len() - 2) + .ok_or(Error::FailedToExtractReturnValues)? + .get_relocatable() + .ok_or(Error::FailedToExtractReturnValues)?; + let panic_data = vm.get_integer_range( + panic_data_start, + (panic_data_end - panic_data_start).map_err(VirtualMachineError::Math)?, + )?; + return Err(Error::RunPanic( + panic_data.iter().map(|c| *c.as_ref()).collect(), + )); + } else { + if return_values.len() < 3 { + return Err(Error::FailedToExtractReturnValues); + } + return_values = return_values[2..].to_vec() + } + } + Ok(return_values) +} + +// Calculates builtins' final_stack setting each stop_ptr +// Calling this function is a must if either air_public_input or cairo_pie are needed +fn finalize_builtins( + proof_mode: bool, + main_ret_types: &[ConcreteTypeId], + type_sizes: &UnorderedHashMap, + vm: &mut VirtualMachine, +) -> Result<(), Error> { + // Set stop pointers for builtins so we can obtain the air public input + // Cairo 1 programs have other return values aside from the used builtin's final pointers, so we need to hand-pick them + let ret_types_sizes = main_ret_types + .iter() + .map(|id| type_sizes.get(id).cloned().unwrap_or_default()); + let ret_types_and_sizes = main_ret_types.iter().zip(ret_types_sizes.clone()); + + let full_ret_types_size: i16 = ret_types_sizes.sum(); + let mut stack_pointer = (vm.get_ap() - (full_ret_types_size as usize).saturating_sub(1)) + .map_err(VirtualMachineError::Math)?; + + // Calculate the stack_ptr for each return builtin in the return values + let mut builtin_name_to_stack_pointer = HashMap::new(); + for (id, size) in ret_types_and_sizes { + if let Some(ref name) = id.debug_name { + let builtin_name = match &*name.to_string() { + "RangeCheck" => RANGE_CHECK_BUILTIN_NAME, + "Poseidon" => POSEIDON_BUILTIN_NAME, + "EcOp" => EC_OP_BUILTIN_NAME, + "Bitwise" => BITWISE_BUILTIN_NAME, + "Pedersen" => HASH_BUILTIN_NAME, + "Output" => OUTPUT_BUILTIN_NAME, + "Ecdsa" => SIGNATURE_BUILTIN_NAME, + _ => { + stack_pointer.offset += size as usize; + continue; + } + }; + builtin_name_to_stack_pointer.insert(builtin_name, stack_pointer); + } + stack_pointer.offset += size as usize; + } + + // Set stop pointer for each builtin + vm.builtins_final_stack_from_stack_pointer_dict(&builtin_name_to_stack_pointer, proof_mode)?; + Ok(()) +} + +#[cfg(test)] +mod tests { + use std::path::Path; + + use super::*; + use cairo_lang_compiler::{compile_cairo_project_at_path, CompilerConfig}; + use cairo_vm::types::relocatable::Relocatable; + use rstest::rstest; + + fn compile_to_sierra(filename: &str) -> SierraProgram { + let compiler_config = CompilerConfig { + replace_ids: true, + ..CompilerConfig::default() + }; + + compile_cairo_project_at_path(Path::new(filename), compiler_config).unwrap() + } + + fn main_hash_panic_result(sierra_program: &SierraProgram) -> bool { + let main_func = find_function(sierra_program, "::main").unwrap(); + main_func + .signature + .ret_types + .last() + .and_then(|rt| { + rt.debug_name + .as_ref() + .map(|n| n.as_ref().starts_with("core::panics::PanicResult::")) + }) + .unwrap_or_default() + } + + #[rstest] + #[case("../cairo_programs/cairo-1-programs/array_append.cairo")] + #[case("../cairo_programs/cairo-1-programs/array_get.cairo")] + #[case("../cairo_programs/cairo-1-programs/dictionaries.cairo")] + #[case("../cairo_programs/cairo-1-programs/enum_flow.cairo")] + #[case("../cairo_programs/cairo-1-programs/enum_match.cairo")] + #[case("../cairo_programs/cairo-1-programs/factorial.cairo")] + #[case("../cairo_programs/cairo-1-programs/fibonacci.cairo")] + #[case("../cairo_programs/cairo-1-programs/hello.cairo")] + #[case("../cairo_programs/cairo-1-programs/pedersen_example.cairo")] + #[case("../cairo_programs/cairo-1-programs/poseidon.cairo")] + #[case("../cairo_programs/cairo-1-programs/print.cairo")] + #[case("../cairo_programs/cairo-1-programs/array_append.cairo")] + #[case("../cairo_programs/cairo-1-programs/recursion.cairo")] + #[case("../cairo_programs/cairo-1-programs/sample.cairo")] + #[case("../cairo_programs/cairo-1-programs/simple_struct.cairo")] + #[case("../cairo_programs/cairo-1-programs/simple.cairo")] + #[case("../cairo_programs/cairo-1-programs/struct_span_return.cairo")] + fn check_append_ret_values_to_output_segment(#[case] filename: &str) { + // Compile to sierra + let sierra_program = compile_to_sierra(filename); + // Set proof_mode + let cairo_run_config = Cairo1RunConfig { + proof_mode: true, + layout: "all_cairo", + ..Default::default() + }; + // Run program + let (_, vm, return_values) = cairo_run_program(&sierra_program, cairo_run_config).unwrap(); + // When the return type is a PanicResult, we remove the panic wrapper when returning the ret values + // And handle the panics returning an error, so we need to add it here + let return_values = if main_hash_panic_result(&sierra_program) { + let mut rv = vec![Felt252::ZERO.into(), Felt252::ZERO.into()]; + rv.extend_from_slice(&return_values); + rv + } else { + return_values + }; + // Check that the output segment contains the return values + // The output builtin will always be the first builtin, so we know it's segment is 2 + let output_builtin_segment = vm + .get_continuous_range((2, 0).into(), return_values.len()) + .unwrap(); + assert_eq!(output_builtin_segment, return_values, "{}", filename); + // Just for consistency, we will check that there are no values in the output segment after the return values + assert!(vm + .get_maybe(&Relocatable::from((2_isize, return_values.len()))) + .is_none()); + } +} diff --git a/cairo1-run/src/main.rs b/cairo1-run/src/main.rs index 002f42129c..c970d113cb 100644 --- a/cairo1-run/src/main.rs +++ b/cairo1-run/src/main.rs @@ -1,81 +1,30 @@ -#![allow(unused_imports)] use bincode::enc::write::Writer; -use cairo_lang_casm::casm; -use cairo_lang_casm::casm_extend; -use cairo_lang_casm::hints::Hint; -use cairo_lang_casm::instructions::Instruction; -use cairo_lang_compiler::db; use cairo_lang_compiler::{compile_cairo_project_at_path, CompilerConfig}; -use cairo_lang_sierra::extensions::bitwise::BitwiseType; -use cairo_lang_sierra::extensions::core::{CoreLibfunc, CoreType}; -use cairo_lang_sierra::extensions::ec::EcOpType; -use cairo_lang_sierra::extensions::gas::GasBuiltinType; -use cairo_lang_sierra::extensions::pedersen::PedersenType; -use cairo_lang_sierra::extensions::poseidon::PoseidonType; -use cairo_lang_sierra::extensions::range_check::RangeCheckType; -use cairo_lang_sierra::extensions::segment_arena::SegmentArenaType; -use cairo_lang_sierra::extensions::starknet::syscalls::SystemType; -use cairo_lang_sierra::extensions::ConcreteType; -use cairo_lang_sierra::extensions::NamedType; -use cairo_lang_sierra::ids::ConcreteTypeId; -use cairo_lang_sierra::program::Function; -use cairo_lang_sierra::program::Program as SierraProgram; -use cairo_lang_sierra::program_registry::{ProgramRegistry, ProgramRegistryError}; -use cairo_lang_sierra::{extensions::gas::CostTokenType, ProgramParser}; -use cairo_lang_sierra_ap_change::calc_ap_changes; -use cairo_lang_sierra_gas::gas_info::GasInfo; -use cairo_lang_sierra_to_casm::compiler::CairoProgram; -use cairo_lang_sierra_to_casm::compiler::CompilationError; -use cairo_lang_sierra_to_casm::metadata::Metadata; -use cairo_lang_sierra_to_casm::metadata::MetadataComputationConfig; -use cairo_lang_sierra_to_casm::metadata::MetadataError; -use cairo_lang_sierra_to_casm::{compiler::compile, metadata::calc_metadata}; -use cairo_lang_sierra_type_size::get_type_size_map; -use cairo_lang_utils::extract_matches; -use cairo_lang_utils::ordered_hash_map::OrderedHashMap; -use cairo_lang_utils::unordered_hash_map::UnorderedHashMap; -use cairo_vm::air_public_input::PublicInputError; -use cairo_vm::cairo_run; -use cairo_vm::cairo_run::EncodeTraceError; -use cairo_vm::hint_processor::cairo_1_hint_processor::hint_processor::Cairo1HintProcessor; -use cairo_vm::serde::deserialize_program::BuiltinName; -use cairo_vm::serde::deserialize_program::{ApTracking, FlowTrackingData, HintParams}; -use cairo_vm::types::errors::program_errors::ProgramError; -use cairo_vm::types::relocatable::Relocatable; -use cairo_vm::utils::bigint_to_felt; -use cairo_vm::vm::decoding::decoder::decode_instruction; -use cairo_vm::vm::errors::cairo_run_errors::CairoRunError; -use cairo_vm::vm::errors::memory_errors::MemoryError; -use cairo_vm::vm::errors::runner_errors::RunnerError; -use cairo_vm::vm::errors::trace_errors::TraceError; -use cairo_vm::vm::errors::vm_errors::VirtualMachineError; -use cairo_vm::vm::runners::builtin_runner::{ - BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, HASH_BUILTIN_NAME, OUTPUT_BUILTIN_NAME, - POSEIDON_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, -}; -use cairo_vm::vm::runners::cairo_runner::CairoArg; -use cairo_vm::vm::runners::cairo_runner::RunnerMode; -use cairo_vm::vm::vm_memory::memory::Memory; +use cairo_lang_sierra::{ids::ConcreteTypeId, program_registry::ProgramRegistryError}; +use cairo_lang_sierra_to_casm::{compiler::CompilationError, metadata::MetadataError}; +use cairo_run::Cairo1RunConfig; use cairo_vm::{ - serde::deserialize_program::ReferenceManager, - types::{program::Program, relocatable::MaybeRelocatable}, - vm::{ - runners::cairo_runner::{CairoRunner, RunResources}, - vm_core::VirtualMachine, + air_public_input::PublicInputError, + cairo_run::EncodeTraceError, + types::errors::program_errors::ProgramError, + vm::errors::{ + memory_errors::MemoryError, runner_errors::RunnerError, trace_errors::TraceError, + vm_errors::VirtualMachineError, }, Felt252, }; -use clap::{CommandFactory, Parser, ValueHint}; -use itertools::{chain, Itertools}; -use std::borrow::Cow; -use std::io::BufWriter; -use std::io::Write; -use std::iter::Peekable; -use std::path::PathBuf; -use std::slice::Iter; -use std::{collections::HashMap, io, path::Path}; +use clap::{Parser, ValueHint}; +use itertools::Itertools; +use serialize_output::serialize_output; +use std::{ + io::{self, Write}, + path::PathBuf, +}; use thiserror::Error; +pub mod cairo_run; +pub mod serialize_output; + #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] struct Args { @@ -112,7 +61,7 @@ struct Args { } #[derive(Debug, Clone)] -enum FuncArg { +pub enum FuncArg { Array(Vec), Single(Felt252), } @@ -171,7 +120,7 @@ fn validate_layout(value: &str) -> Result { } #[derive(Debug, Error)] -enum Error { +pub enum Error { #[error("Invalid arguments")] Cli(#[from] clap::Error), #[error("Failed to interact with the file system")] @@ -255,176 +204,25 @@ impl FileWriter { fn run(args: impl Iterator) -> Result, Error> { let args = Args::try_parse_from(args)?; + let cairo_run_config = Cairo1RunConfig { + proof_mode: args.proof_mode, + relocate_mem: args.memory_file.is_some() || args.air_public_input.is_some(), + layout: &args.layout, + trace_enabled: args.trace_file.is_some() || args.air_public_input.is_some(), + args: &args.args.0, + finalize_builtins: args.air_private_input.is_some() || args.cairo_pie_output.is_some(), + }; + let compiler_config = CompilerConfig { replace_ids: true, ..CompilerConfig::default() }; + let sierra_program = compile_cairo_project_at_path(&args.filename, compiler_config) .map_err(|err| Error::SierraCompilation(err.to_string()))?; - let metadata_config = Some(Default::default()); - - let gas_usage_check = metadata_config.is_some(); - let metadata = create_metadata(&sierra_program, metadata_config)?; - let sierra_program_registry = ProgramRegistry::::new(&sierra_program)?; - let type_sizes = - get_type_size_map(&sierra_program, &sierra_program_registry).unwrap_or_default(); - let casm_program = - cairo_lang_sierra_to_casm::compiler::compile(&sierra_program, &metadata, gas_usage_check)?; - - let main_func = find_function(&sierra_program, "::main")?; - - let initial_gas = 9999999999999_usize; - - // Modified entry code to be compatible with custom cairo1 Proof Mode. - // This adds code that's needed for dictionaries, adjusts ap for builtin pointers, adds initial gas for the gas builtin if needed, and sets up other necessary code for cairo1 - let (entry_code, builtins) = create_entry_code( - &sierra_program_registry, - &casm_program, - &type_sizes, - main_func, - initial_gas, - args.proof_mode, - &args.args.0, - )?; - - // Get the user program instructions - let program_instructions = casm_program.instructions.iter(); - - // This footer is used by lib funcs - let libfunc_footer = create_code_footer(); - - let proof_mode_header = if args.proof_mode { - println!("Compiling with proof mode and running ..."); - - // This information can be useful for the users using the prover. - println!("Builtins used: {:?}", builtins); - - // Prepare "canonical" proof mode instructions. These are usually added by the compiler in cairo 0 - let mut ctx = casm! {}; - casm_extend! {ctx, - call rel 4; - jmp rel 0; - }; - ctx.instructions - } else { - casm! {}.instructions - }; - - // This is the program we are actually running/proving - // With (embedded proof mode), cairo1 header and the libfunc footer - let instructions = chain!( - proof_mode_header.iter(), - entry_code.iter(), - program_instructions, - libfunc_footer.iter() - ); - - let (processor_hints, program_hints) = build_hints_vec(instructions.clone()); - - let mut hint_processor = Cairo1HintProcessor::new(&processor_hints, RunResources::default()); - - let data: Vec = instructions - .flat_map(|inst| inst.assemble().encode()) - .map(|x| bigint_to_felt(&x).unwrap_or_default()) - .map(MaybeRelocatable::from) - .collect(); - - let data_len = data.len(); - - let program = if args.proof_mode { - Program::new_for_proof( - builtins, - data, - 0, - // Proof mode is on top - // jmp rel 0 is on PC == 2 - 2, - program_hints, - ReferenceManager { - references: Vec::new(), - }, - HashMap::new(), - vec![], - None, - )? - } else { - Program::new( - builtins, - data, - Some(0), - program_hints, - ReferenceManager { - references: Vec::new(), - }, - HashMap::new(), - vec![], - None, - )? - }; - - let runner_mode = if args.proof_mode { - RunnerMode::ProofModeCairo1 - } else { - RunnerMode::ExecutionMode - }; - - let mut runner = CairoRunner::new_v2(&program, &args.layout, runner_mode)?; - let mut vm = VirtualMachine::new(args.trace_file.is_some() || args.air_public_input.is_some()); - let end = runner.initialize(&mut vm)?; - - additional_initialization(&mut vm, data_len)?; - - // Run it until the end/ infinite loop in proof_mode - runner.run_until_pc(end, &mut vm, &mut hint_processor)?; - runner.end_run(false, false, &mut vm, &mut hint_processor)?; - - // Fetch return type data - let return_type_id = main_func - .signature - .ret_types - .last() - .ok_or(Error::NoRetTypesInSignature)?; - let return_type_size = type_sizes - .get(return_type_id) - .cloned() - .ok_or_else(|| Error::NoTypeSizeForId(return_type_id.clone()))?; - - let mut return_values = vm.get_return_values(return_type_size as usize)?; - // Check if this result is a Panic result - if return_type_id - .debug_name - .as_ref() - .ok_or_else(|| Error::TypeIdNoDebugName(return_type_id.clone()))? - .starts_with("core::panics::PanicResult::") - { - // Check the failure flag (aka first return value) - if return_values.first() != Some(&MaybeRelocatable::from(0)) { - // In case of failure, extract the error from the return values (aka last two values) - let panic_data_end = return_values - .last() - .ok_or(Error::FailedToExtractReturnValues)? - .get_relocatable() - .ok_or(Error::FailedToExtractReturnValues)?; - let panic_data_start = return_values - .get(return_values.len() - 2) - .ok_or(Error::FailedToExtractReturnValues)? - .get_relocatable() - .ok_or(Error::FailedToExtractReturnValues)?; - let panic_data = vm.get_integer_range( - panic_data_start, - (panic_data_end - panic_data_start).map_err(VirtualMachineError::Math)?, - )?; - return Err(Error::RunPanic( - panic_data.iter().map(|c| *c.as_ref()).collect(), - )); - } else { - if return_values.len() < 3 { - return Err(Error::FailedToExtractReturnValues); - } - return_values = return_values[2..].to_vec() - } - } + let (runner, vm, return_values) = + cairo_run::cairo_run_program(&sierra_program, cairo_run_config)?; let output_string = if args.print_output { Some(serialize_output(&vm, &return_values)) @@ -432,56 +230,6 @@ fn run(args: impl Iterator) -> Result, Error> { None }; - // Set stop pointers for builtins so we can obtain the air public input - if args.air_public_input.is_some() || args.cairo_pie_output.is_some() { - // Cairo 1 programs have other return values aside from the used builtin's final pointers, so we need to hand-pick them - let ret_types_sizes = main_func - .signature - .ret_types - .iter() - .map(|id| type_sizes.get(id).cloned().unwrap_or_default()); - let ret_types_and_sizes = main_func - .signature - .ret_types - .iter() - .zip(ret_types_sizes.clone()); - - let full_ret_types_size: i16 = ret_types_sizes.sum(); - let mut stack_pointer = (vm.get_ap() - (full_ret_types_size as usize).saturating_sub(1)) - .map_err(VirtualMachineError::Math)?; - - // Calculate the stack_ptr for each return builtin in the return values - let mut builtin_name_to_stack_pointer = HashMap::new(); - for (id, size) in ret_types_and_sizes { - if let Some(ref name) = id.debug_name { - let builtin_name = match &*name.to_string() { - "RangeCheck" => RANGE_CHECK_BUILTIN_NAME, - "Poseidon" => POSEIDON_BUILTIN_NAME, - "EcOp" => EC_OP_BUILTIN_NAME, - "Bitwise" => BITWISE_BUILTIN_NAME, - "Pedersen" => HASH_BUILTIN_NAME, - "Output" => OUTPUT_BUILTIN_NAME, - "Ecdsa" => SIGNATURE_BUILTIN_NAME, - _ => { - stack_pointer.offset += size as usize; - continue; - } - }; - builtin_name_to_stack_pointer.insert(builtin_name, stack_pointer); - } - stack_pointer.offset += size as usize; - } - // Set stop pointer for each builtin - vm.builtins_final_stack_from_stack_pointer_dict(&builtin_name_to_stack_pointer)?; - - // Build execution public memory - if args.proof_mode { - runner.finalize_segments(&mut vm)?; - } - } - - runner.relocate(&mut vm, true)?; - if let Some(file_path) = args.air_public_input { let json = runner.get_air_public_input(&vm)?.serialize_json()?; std::fs::write(file_path, json)?; @@ -526,7 +274,7 @@ fn run(args: impl Iterator) -> Result, Error> { let mut trace_writer = FileWriter::new(io::BufWriter::with_capacity(3 * 1024 * 1024, trace_file)); - cairo_run::write_encoded_trace(&relocated_trace, &mut trace_writer)?; + cairo_vm::cairo_run::write_encoded_trace(&relocated_trace, &mut trace_writer)?; trace_writer.flush()?; } if let Some(memory_path) = args.memory_file { @@ -534,39 +282,19 @@ fn run(args: impl Iterator) -> Result, Error> { let mut memory_writer = FileWriter::new(io::BufWriter::with_capacity(5 * 1024 * 1024, memory_file)); - cairo_run::write_encoded_memory(&runner.relocated_memory, &mut memory_writer)?; + cairo_vm::cairo_run::write_encoded_memory(&runner.relocated_memory, &mut memory_writer)?; memory_writer.flush()?; } Ok(output_string) } -fn additional_initialization(vm: &mut VirtualMachine, data_len: usize) -> Result<(), Error> { - // Create the builtin cost segment - let builtin_cost_segment = vm.add_memory_segment(); - for token_type in CostTokenType::iter_precost() { - vm.insert_value( - (builtin_cost_segment + (token_type.offset_in_builtin_costs() as usize)) - .map_err(VirtualMachineError::Math)?, - Felt252::default(), - )? - } - // Put a pointer to the builtin cost segment at the end of the program (after the - // additional `ret` statement). - vm.insert_value( - (vm.get_pc() + data_len).map_err(VirtualMachineError::Math)?, - builtin_cost_segment, - )?; - - Ok(()) -} - fn main() -> Result<(), Error> { match run(std::env::args()) { Err(Error::Cli(err)) => err.exit(), Ok(output) => { if let Some(output_string) = output { - println!("Program Output : {}", output_string); + println!("{}", output_string); } Ok(()) } @@ -592,345 +320,8 @@ fn main() -> Result<(), Error> { } } -#[allow(clippy::type_complexity)] -fn build_hints_vec<'b>( - instructions: impl Iterator, -) -> (Vec<(usize, Vec)>, HashMap>) { - let mut hints: Vec<(usize, Vec)> = Vec::new(); - let mut program_hints: HashMap> = HashMap::new(); - - let mut hint_offset = 0; - - for instruction in instructions { - if !instruction.hints.is_empty() { - hints.push((hint_offset, instruction.hints.clone())); - program_hints.insert( - hint_offset, - vec![HintParams { - code: hint_offset.to_string(), - accessible_scopes: Vec::new(), - flow_tracking_data: FlowTrackingData { - ap_tracking: ApTracking::default(), - reference_ids: HashMap::new(), - }, - }], - ); - } - hint_offset += instruction.body.op_size(); - } - (hints, program_hints) -} - -/// Finds first function ending with `name_suffix`. -fn find_function<'a>( - sierra_program: &'a SierraProgram, - name_suffix: &'a str, -) -> Result<&'a Function, RunnerError> { - sierra_program - .funcs - .iter() - .find(|f| { - if let Some(name) = &f.id.debug_name { - name.ends_with(name_suffix) - } else { - false - } - }) - .ok_or_else(|| RunnerError::MissingMain) -} - -/// Creates a list of instructions that will be appended to the program's bytecode. -fn create_code_footer() -> Vec { - casm! { - // Add a `ret` instruction used in libfuncs that retrieve the current value of the `fp` - // and `pc` registers. - ret; - } - .instructions -} - -/// Returns the instructions to add to the beginning of the code to successfully call the main -/// function, as well as the builtins required to execute the program. -fn create_entry_code( - sierra_program_registry: &ProgramRegistry, - casm_program: &CairoProgram, - type_sizes: &UnorderedHashMap, - func: &Function, - initial_gas: usize, - proof_mode: bool, - args: &Vec, -) -> Result<(Vec, Vec), Error> { - let mut ctx = casm! {}; - // The builtins in the formatting expected by the runner. - let (builtins, builtin_offset) = get_function_builtins(func); - // Load all vecs to memory. - // Load all array args content to memory. - let mut array_args_data = vec![]; - let mut ap_offset: i16 = 0; - for arg in args { - let FuncArg::Array(values) = arg else { continue }; - array_args_data.push(ap_offset); - casm_extend! {ctx, - %{ memory[ap + 0] = segments.add() %} - ap += 1; - } - for (i, v) in values.iter().enumerate() { - let arr_at = (i + 1) as i16; - casm_extend! {ctx, - [ap + 0] = (v.to_bigint()); - [ap + 0] = [[ap - arr_at] + (i as i16)], ap++; - }; - } - ap_offset += (1 + values.len()) as i16; - } - let mut array_args_data_iter = array_args_data.iter(); - let after_arrays_data_offset = ap_offset; - let mut arg_iter = args.iter().enumerate(); - let mut param_index = 0; - let mut expected_arguments_size = 0; - if func.signature.param_types.iter().any(|ty| { - get_info(sierra_program_registry, ty) - .map(|x| x.long_id.generic_id == SegmentArenaType::ID) - .unwrap_or_default() - }) { - casm_extend! {ctx, - // SegmentArena segment. - %{ memory[ap + 0] = segments.add() %} - // Infos segment. - %{ memory[ap + 1] = segments.add() %} - ap += 2; - [ap + 0] = 0, ap++; - // Write Infos segment, n_constructed (0), and n_destructed (0) to the segment. - [ap - 2] = [[ap - 3]]; - [ap - 1] = [[ap - 3] + 1]; - [ap - 1] = [[ap - 3] + 2]; - } - ap_offset += 3; - } - for ty in func.signature.param_types.iter() { - let info = get_info(sierra_program_registry, ty) - .ok_or_else(|| Error::NoInfoForType(ty.clone()))?; - let generic_ty = &info.long_id.generic_id; - if let Some(offset) = builtin_offset.get(generic_ty) { - let mut offset = *offset; - if proof_mode { - // Everything is off by 2 due to the proof mode header - offset += 2; - } - casm_extend! {ctx, - [ap + 0] = [fp - offset], ap++; - } - ap_offset += 1; - } else if generic_ty == &SystemType::ID { - casm_extend! {ctx, - %{ memory[ap + 0] = segments.add() %} - ap += 1; - } - ap_offset += 1; - } else if generic_ty == &GasBuiltinType::ID { - casm_extend! {ctx, - [ap + 0] = initial_gas, ap++; - } - ap_offset += 1; - } else if generic_ty == &SegmentArenaType::ID { - let offset = -ap_offset + after_arrays_data_offset; - casm_extend! {ctx, - [ap + 0] = [ap + offset] + 3, ap++; - } - ap_offset += 1; - } else { - let ty_size = type_sizes[ty]; - let param_ap_offset_end = ap_offset + ty_size; - expected_arguments_size += ty_size; - while ap_offset < param_ap_offset_end { - let Some((arg_index, arg)) = arg_iter.next() else { - break; - }; - match arg { - FuncArg::Single(value) => { - casm_extend! {ctx, - [ap + 0] = (value.to_bigint()), ap++; - } - ap_offset += 1; - } - FuncArg::Array(values) => { - let offset = -ap_offset + array_args_data_iter.next().unwrap(); - casm_extend! {ctx, - [ap + 0] = [ap + (offset)], ap++; - [ap + 0] = [ap - 1] + (values.len()), ap++; - } - ap_offset += 2; - if ap_offset > param_ap_offset_end { - return Err(Error::ArgumentUnaligned { - param_index, - arg_index, - }); - } - } - } - } - param_index += 1; - }; - } - let actual_args_size = args - .iter() - .map(|arg| match arg { - FuncArg::Single(_) => 1, - FuncArg::Array(_) => 2, - }) - .sum::(); - if expected_arguments_size != actual_args_size { - return Err(Error::ArgumentsSizeMismatch { - expected: expected_arguments_size, - actual: actual_args_size, - }); - } - - let before_final_call = ctx.current_code_offset; - let final_call_size = 3; - let offset = final_call_size - + casm_program.debug_info.sierra_statement_info[func.entry_point.0].code_offset; - - casm_extend! {ctx, - call rel offset; - ret; - } - assert_eq!(before_final_call + final_call_size, ctx.current_code_offset); - - Ok((ctx.instructions, builtins)) -} - -fn get_info<'a>( - sierra_program_registry: &'a ProgramRegistry, - ty: &'a cairo_lang_sierra::ids::ConcreteTypeId, -) -> Option<&'a cairo_lang_sierra::extensions::types::TypeInfo> { - sierra_program_registry - .get_type(ty) - .ok() - .map(|ctc| ctc.info()) -} - -/// Creates the metadata required for a Sierra program lowering to casm. -fn create_metadata( - sierra_program: &cairo_lang_sierra::program::Program, - metadata_config: Option, -) -> Result { - if let Some(metadata_config) = metadata_config { - calc_metadata(sierra_program, metadata_config).map_err(|err| match err { - MetadataError::ApChangeError(_) => VirtualMachineError::Unexpected, - MetadataError::CostError(_) => VirtualMachineError::Unexpected, - }) - } else { - Ok(Metadata { - ap_change_info: calc_ap_changes(sierra_program, |_, _| 0) - .map_err(|_| VirtualMachineError::Unexpected)?, - gas_info: GasInfo { - variable_values: Default::default(), - function_costs: Default::default(), - }, - }) - } -} - -fn get_function_builtins( - func: &Function, -) -> ( - Vec, - HashMap, -) { - let entry_params = &func.signature.param_types; - let mut builtins = Vec::new(); - let mut builtin_offset: HashMap = HashMap::new(); - let mut current_offset = 3; - // Fetch builtins from the entry_params in the standard order - if entry_params - .iter() - .any(|ti| ti.debug_name == Some("Poseidon".into())) - { - builtins.push(BuiltinName::poseidon); - builtin_offset.insert(PoseidonType::ID, current_offset); - current_offset += 1; - } - if entry_params - .iter() - .any(|ti| ti.debug_name == Some("EcOp".into())) - { - builtins.push(BuiltinName::ec_op); - builtin_offset.insert(EcOpType::ID, current_offset); - current_offset += 1 - } - if entry_params - .iter() - .any(|ti| ti.debug_name == Some("Bitwise".into())) - { - builtins.push(BuiltinName::bitwise); - builtin_offset.insert(BitwiseType::ID, current_offset); - current_offset += 1; - } - if entry_params - .iter() - .any(|ti| ti.debug_name == Some("RangeCheck".into())) - { - builtins.push(BuiltinName::range_check); - builtin_offset.insert(RangeCheckType::ID, current_offset); - current_offset += 1; - } - if entry_params - .iter() - .any(|ti| ti.debug_name == Some("Pedersen".into())) - { - builtins.push(BuiltinName::pedersen); - builtin_offset.insert(PedersenType::ID, current_offset); - } - builtins.reverse(); - (builtins, builtin_offset) -} - -fn serialize_output(vm: &VirtualMachine, return_values: &[MaybeRelocatable]) -> String { - let mut output_string = String::new(); - let mut return_values_iter: Peekable> = return_values.iter().peekable(); - serialize_output_inner(&mut return_values_iter, &mut output_string, vm); - fn serialize_output_inner( - iter: &mut Peekable>, - output_string: &mut String, - vm: &VirtualMachine, - ) { - while let Some(val) = iter.next() { - if let MaybeRelocatable::RelocatableValue(x) = val { - // Check if the next value is a relocatable of the same index - if let Some(MaybeRelocatable::RelocatableValue(y)) = iter.peek() { - // Check if the two relocatable values represent a valid array in memory - if x.segment_index == y.segment_index && x.offset <= y.offset { - // Fetch the y value from the iterator so we don't serialize it twice - iter.next(); - // Fetch array - maybe_add_whitespace(output_string); - output_string.push('['); - let array = vm.get_continuous_range(*x, y.offset - x.offset).unwrap(); - let mut array_iter: Peekable> = - array.iter().peekable(); - serialize_output_inner(&mut array_iter, output_string, vm); - output_string.push(']'); - continue; - } - } - } - maybe_add_whitespace(output_string); - output_string.push_str(&val.to_string()); - } - } - - fn maybe_add_whitespace(string: &mut String) { - if !string.is_empty() && !string.ends_with('[') { - string.push(' '); - } - } - output_string -} - #[cfg(test)] mod tests { - #![allow(clippy::too_many_arguments)] use super::*; use assert_matches::assert_matches; use rstest::rstest; @@ -1103,6 +494,14 @@ mod tests { assert_matches!(run(args), Ok(Some(res)) if res == "12"); } + #[rstest] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/struct_span_return.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--cairo_pie_output", "/dev/null"].as_slice())] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/struct_span_return.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--proof_mode", "--air_public_input", "/dev/null", "--air_private_input", "/dev/null"].as_slice())] + fn test_struct_span_return(#[case] args: &[&str]) { + let args = args.iter().cloned().map(String::from); + assert_matches!(run(args), Ok(Some(res)) if res == "[[4 3] [2 1]]"); + } + #[rstest] #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/with_input/tensor.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--cairo_pie_output", "/dev/null", "--args", "[2 2] [1 2 3 4]"].as_slice())] #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/with_input/tensor.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--proof_mode", "--air_public_input", "/dev/null", "--air_private_input", "/dev/null", "--args", "[2 2] [1 2 3 4]"].as_slice())] @@ -1110,4 +509,30 @@ mod tests { let args = args.iter().cloned().map(String::from); assert_matches!(run(args), Ok(Some(res)) if res == "1"); } + + #[rstest] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/nullable_dict.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--cairo_pie_output", "/dev/null"].as_slice())] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/nullable_dict.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--proof_mode", "--air_public_input", "/dev/null", "--air_private_input", "/dev/null"].as_slice())] + fn test_run_nullable_dict_ok(#[case] args: &[&str]) { + let args = args.iter().cloned().map(String::from); + assert_matches!(run(args), Ok(Some(res)) if res.is_empty()); + } + + #[rstest] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/felt_dict.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--cairo_pie_output", "/dev/null"].as_slice())] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/felt_dict.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--proof_mode", "--air_public_input", "/dev/null", "--air_private_input", "/dev/null"].as_slice())] + fn test_run_felt_dict(#[case] args: &[&str]) { + let args = args.iter().cloned().map(String::from); + let expected_output = "{\n\t0x10473: [0x8,0x9,0xa,0xb,],\n\t0x10474: [0x1,0x2,0x3,],\n}\n"; + assert_matches!(run(args), Ok(Some(res)) if res == expected_output); + } + + #[rstest] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/felt_span.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--cairo_pie_output", "/dev/null"].as_slice())] + #[case(["cairo1-run", "../cairo_programs/cairo-1-programs/felt_span.cairo", "--print_output", "--trace_file", "/dev/null", "--memory_file", "/dev/null", "--layout", "all_cairo", "--proof_mode", "--air_public_input", "/dev/null", "--air_private_input", "/dev/null"].as_slice())] + fn test_run_felt_span(#[case] args: &[&str]) { + let args = args.iter().cloned().map(String::from); + let expected_output = "[0x8,0x9,0xa,0xb,]"; + assert_matches!(run(args), Ok(Some(res)) if res == expected_output); + } } diff --git a/cairo1-run/src/serialize_output.rs b/cairo1-run/src/serialize_output.rs new file mode 100644 index 0000000000..562f2dc832 --- /dev/null +++ b/cairo1-run/src/serialize_output.rs @@ -0,0 +1,169 @@ +use cairo_vm::{ + types::relocatable::{MaybeRelocatable, Relocatable}, + vm::{errors::memory_errors::MemoryError, vm_core::VirtualMachine}, + Felt252, +}; +use itertools::Itertools; +use std::{collections::HashMap, iter::Peekable, slice::Iter}; +use thiserror::Error; + +#[derive(Debug)] +pub(crate) enum Output { + Felt(Felt252), + FeltSpan(Vec), + FeltDict(HashMap), +} + +#[derive(Debug, Error)] +pub struct FormatError; + +impl std::fmt::Display for FormatError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Format error") + } +} + +impl Output { + pub fn from_memory( + vm: &VirtualMachine, + relocatable: &Relocatable, + ) -> Result { + match vm.get_relocatable(*relocatable) { + Ok(relocatable_value) => { + let segment_size = vm + .get_segment_size(relocatable_value.segment_index as usize) + .ok_or(FormatError)?; + let segment_data = vm + .get_continuous_range(relocatable_value, segment_size) + .map_err(|_| FormatError)?; + + // check if the segment data is a valid array of felts + if segment_data + .iter() + .all(|v| matches!(v, MaybeRelocatable::Int(_))) + { + let span_segment: Vec = segment_data + .iter() + .map(|v| Output::Felt(v.get_int().unwrap())) + .collect(); + Ok(Output::FeltSpan(span_segment)) + } else { + Err(FormatError) + } + } + Err(MemoryError::UnknownMemoryCell(relocatable_value)) => { + // here we assume that the value is a dictionary + let mut felt252dict: HashMap = HashMap::new(); + + let segment_size = vm + .get_segment_size(relocatable_value.segment_index as usize) + .ok_or(FormatError)?; + let mut segment_start = relocatable_value.clone(); + segment_start.offset = 0; + let segment_data = vm + .get_continuous_range(*segment_start, segment_size) + .map_err(|_| FormatError)?; + + for (dict_key, _, value_relocatable) in segment_data.iter().tuples() { + let key = dict_key.get_int().ok_or(FormatError)?; + let value_segment = value_relocatable.get_relocatable().ok_or(FormatError)?; + let value = Output::from_memory(vm, &value_segment)?; + felt252dict.insert(key, value); + } + Ok(Output::FeltDict(felt252dict)) + } + _ => Err(FormatError), + } + } +} + +impl std::fmt::Display for Output { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Output::Felt(felt) => write!(f, "{}", felt.to_hex_string()), + Output::FeltSpan(span) => { + write!(f, "[")?; + for elem in span { + write!(f, "{}", elem)?; + write!(f, ",")?; + } + write!(f, "]")?; + Ok(()) + } + Output::FeltDict(felt_dict) => { + let mut keys: Vec<_> = felt_dict.keys().collect(); + keys.sort(); + writeln!(f, "{{")?; + for key in keys { + writeln!(f, "\t{}: {},", key.to_hex_string(), felt_dict[key])?; + } + writeln!(f, "}}")?; + Ok(()) + } + } + } +} + +pub(crate) fn serialize_output(vm: &VirtualMachine, return_values: &[MaybeRelocatable]) -> String { + let mut output_string = String::new(); + let mut return_values_iter: Peekable> = return_values.iter().peekable(); + let result = serialize_output_inner(&mut return_values_iter, &mut output_string, vm); + if result.is_err() { + return result.err().unwrap().to_string(); + } + + output_string +} + +fn maybe_add_whitespace(string: &mut String) { + if !string.is_empty() && !string.ends_with('[') { + string.push(' '); + } +} + +fn serialize_output_inner( + iter: &mut Peekable>, + output_string: &mut String, + vm: &VirtualMachine, +) -> Result<(), FormatError> { + while let Some(val) = iter.next() { + match val { + MaybeRelocatable::Int(x) => { + maybe_add_whitespace(output_string); + output_string.push_str(&x.to_string()); + continue; + } + MaybeRelocatable::RelocatableValue(x) if ((iter.len() + 1) % 2) == 0 /* felt array */ => { + // Check if the next value is a relocatable of the same index + let y = iter.next().unwrap().get_relocatable().ok_or(FormatError)?; + // Check if the two relocatable values represent a valid array in memory + if x.segment_index == y.segment_index && x.offset <= y.offset { + // Fetch array + maybe_add_whitespace(output_string); + output_string.push('['); + let array = vm.get_continuous_range(*x, y.offset - x.offset).map_err(|_| FormatError)?; + let mut array_iter: Peekable> = + array.iter().peekable(); + serialize_output_inner(&mut array_iter, output_string, vm)?; + output_string.push(']'); + continue; + } + }, + MaybeRelocatable::RelocatableValue(x) if iter.len() > 1 => { + let mut segment_start = *x; + segment_start.offset = 0; + for elem in iter.into_iter() { + let output_value = Output::from_memory(vm, &elem.get_relocatable().ok_or(FormatError)?)?; + output_string.push_str(output_value.to_string().as_str()) + } + } + MaybeRelocatable::RelocatableValue(x) => { + match Output::from_memory(vm, x) { + Ok(output_value) => output_string.push_str(format!("{}", output_value).as_str()), + Err(_) => output_string.push_str("The output could not be formatted"), + } + } + } + } + Ok(()) +} diff --git a/cairo_programs/cairo-1-programs/array_append.cairo b/cairo_programs/cairo-1-programs/array_append.cairo index 81d7f2fc9f..f17418ef7b 100644 --- a/cairo_programs/cairo-1-programs/array_append.cairo +++ b/cairo_programs/cairo-1-programs/array_append.cairo @@ -4,6 +4,6 @@ fn main() -> Array { let mut numbers = ArrayTrait::new(); numbers.append(4_u32); numbers.append(2_u32); - numbers.pop_front(); + let _x = numbers.pop_front(); numbers } diff --git a/cairo_programs/cairo-1-programs/dictionaries.cairo b/cairo_programs/cairo-1-programs/dictionaries.cairo index 56176777b5..67465ee2d1 100644 --- a/cairo_programs/cairo-1-programs/dictionaries.cairo +++ b/cairo_programs/cairo-1-programs/dictionaries.cairo @@ -3,13 +3,13 @@ use dict::Felt252DictTrait; fn main() -> felt252 { let mut dict_u8 = felt252_dict_new::(); let mut dict_felt = felt252_dict_new::(); - let mut dict_felt2 = felt252_dict_new::(); + let _dict_felt2 = felt252_dict_new::(); dict_u8.insert(10, 110); dict_u8.insert(10, 110); - let val10 = dict_u8[10]; // 110 - let val11 = dict_felt[11]; // 0 + let _val10 = dict_u8[10]; // 110 + let _val11 = dict_felt[11]; // 0 dict_felt.insert(11, 1024); dict_felt[11] // 1024 } diff --git a/cairo_programs/cairo-1-programs/enum_flow.cairo b/cairo_programs/cairo-1-programs/enum_flow.cairo index 17d4e5a56b..38b99f4489 100644 --- a/cairo_programs/cairo-1-programs/enum_flow.cairo +++ b/cairo_programs/cairo-1-programs/enum_flow.cairo @@ -26,9 +26,9 @@ fn main() -> felt252 { match_long(el1); let el2 = MyEnumLong::c(22); match_long(el2); - let eg1: MyEnumGeneric<(), felt252> = MyEnumGeneric::<(), felt252>::a(30); - let eg2: MyEnumGeneric<(), felt252> = MyEnumGeneric::<(), felt252>::b(()); - let eg3: MyEnumGeneric<(), felt252> = MyEnumGeneric::<(), felt252>::c(32); + let _eg1: MyEnumGeneric<(), felt252> = MyEnumGeneric::<(), felt252>::a(30); + let _eg2: MyEnumGeneric<(), felt252> = MyEnumGeneric::<(), felt252>::b(()); + let _eg3: MyEnumGeneric<(), felt252> = MyEnumGeneric::<(), felt252>::c(32); 300 } diff --git a/cairo_programs/cairo-1-programs/felt_dict.cairo b/cairo_programs/cairo-1-programs/felt_dict.cairo new file mode 100644 index 0000000000..9934d4dcc9 --- /dev/null +++ b/cairo_programs/cairo-1-programs/felt_dict.cairo @@ -0,0 +1,15 @@ +use core::nullable::{nullable_from_box, match_nullable, FromNullableResult}; + +fn main() -> Felt252Dict>> { + // Create the dictionary + let mut d: Felt252Dict>> = Default::default(); + + // Create the array to insert + let a = array![8, 9, 10, 11]; + let b = array![1, 2, 3]; + + // Insert it as a `Span` + d.insert(66675, nullable_from_box(BoxTrait::new(a.span()))); + d.insert(66676, nullable_from_box(BoxTrait::new(b.span()))); + d +} diff --git a/cairo_programs/cairo-1-programs/felt_span.cairo b/cairo_programs/cairo-1-programs/felt_span.cairo new file mode 100644 index 0000000000..a1a9d708fe --- /dev/null +++ b/cairo_programs/cairo-1-programs/felt_span.cairo @@ -0,0 +1,6 @@ +use core::nullable::{nullable_from_box, match_nullable, FromNullableResult}; + +fn main() -> Nullable> { + let a = array![8, 9, 10, 11]; + nullable_from_box(BoxTrait::new(a.span())) +} diff --git a/cairo_programs/cairo-1-programs/nullable_dict.cairo b/cairo_programs/cairo-1-programs/nullable_dict.cairo new file mode 100644 index 0000000000..969e16bb0f --- /dev/null +++ b/cairo_programs/cairo-1-programs/nullable_dict.cairo @@ -0,0 +1,12 @@ +use core::nullable::{nullable_from_box, match_nullable, FromNullableResult}; + +fn main() { + // Create the dictionary + let mut d: Felt252Dict>> = Default::default(); + + // Create the array to insert + let a = array![8, 9, 10]; + + // Insert it as a `Span` + d.insert(0, nullable_from_box(BoxTrait::new(a.span()))); +} diff --git a/cairo_programs/cairo-2-contracts/uint256_div_mod.cairo b/cairo_programs/cairo-2-contracts/uint256_div_mod.cairo index e06dec4ed7..4855c7fa35 100644 --- a/cairo_programs/cairo-2-contracts/uint256_div_mod.cairo +++ b/cairo_programs/cairo-2-contracts/uint256_div_mod.cairo @@ -16,7 +16,7 @@ mod TestUint256DivMod { #[storage] struct Storage {} - #[external(v0)] + #[abi(embed_v0)] impl TestUint256DivMod of super::ITestUint256DivMod { fn test_uint256_div_mod_max(ref self: ContractState) { let a = BoundedInt::max(); diff --git a/cairo_programs/proof_programs/.gitkeep b/cairo_programs/proof_programs/.gitkeep new file mode 100644 index 0000000000..e69de29bb2 diff --git a/cairo_programs/proof_programs/abs_value_array.cairo b/cairo_programs/proof_programs/abs_value_array.cairo deleted file mode 120000 index 0094c34916..0000000000 --- a/cairo_programs/proof_programs/abs_value_array.cairo +++ /dev/null @@ -1 +0,0 @@ -../abs_value_array.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/array_sum.cairo b/cairo_programs/proof_programs/array_sum.cairo deleted file mode 120000 index 81a03089e0..0000000000 --- a/cairo_programs/proof_programs/array_sum.cairo +++ /dev/null @@ -1 +0,0 @@ -../array_sum.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/assert_250_bit_element_array.cairo b/cairo_programs/proof_programs/assert_250_bit_element_array.cairo deleted file mode 120000 index 1b3b523a17..0000000000 --- a/cairo_programs/proof_programs/assert_250_bit_element_array.cairo +++ /dev/null @@ -1 +0,0 @@ -../assert_250_bit_element_array.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/assert_le_felt_hint.cairo b/cairo_programs/proof_programs/assert_le_felt_hint.cairo deleted file mode 120000 index 24ab14a6b2..0000000000 --- a/cairo_programs/proof_programs/assert_le_felt_hint.cairo +++ /dev/null @@ -1 +0,0 @@ -../assert_le_felt_hint.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/assert_le_felt_old.cairo b/cairo_programs/proof_programs/assert_le_felt_old.cairo deleted file mode 120000 index 578084defe..0000000000 --- a/cairo_programs/proof_programs/assert_le_felt_old.cairo +++ /dev/null @@ -1 +0,0 @@ -../assert_le_felt_old.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/assert_lt_felt.cairo b/cairo_programs/proof_programs/assert_lt_felt.cairo deleted file mode 120000 index c904928089..0000000000 --- a/cairo_programs/proof_programs/assert_lt_felt.cairo +++ /dev/null @@ -1 +0,0 @@ -../assert_lt_felt.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/assert_nn.cairo b/cairo_programs/proof_programs/assert_nn.cairo deleted file mode 120000 index 3a651e8db7..0000000000 --- a/cairo_programs/proof_programs/assert_nn.cairo +++ /dev/null @@ -1 +0,0 @@ -../assert_nn.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/assert_not_zero.cairo b/cairo_programs/proof_programs/assert_not_zero.cairo deleted file mode 120000 index 1a988d387d..0000000000 --- a/cairo_programs/proof_programs/assert_not_zero.cairo +++ /dev/null @@ -1 +0,0 @@ -../assert_not_zero.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/big_struct.cairo b/cairo_programs/proof_programs/big_struct.cairo deleted file mode 120000 index ce2ed42bd0..0000000000 --- a/cairo_programs/proof_programs/big_struct.cairo +++ /dev/null @@ -1 +0,0 @@ -../big_struct.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/bigint.cairo b/cairo_programs/proof_programs/bigint.cairo deleted file mode 120000 index 81d408cee4..0000000000 --- a/cairo_programs/proof_programs/bigint.cairo +++ /dev/null @@ -1 +0,0 @@ -../bigint.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/bitand_hint.cairo b/cairo_programs/proof_programs/bitand_hint.cairo deleted file mode 120000 index 1ba1561a2d..0000000000 --- a/cairo_programs/proof_programs/bitand_hint.cairo +++ /dev/null @@ -1 +0,0 @@ -../bitand_hint.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/bitwise_builtin_test.cairo b/cairo_programs/proof_programs/bitwise_builtin_test.cairo deleted file mode 120000 index 36126fb09b..0000000000 --- a/cairo_programs/proof_programs/bitwise_builtin_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../bitwise_builtin_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/bitwise_output.cairo b/cairo_programs/proof_programs/bitwise_output.cairo deleted file mode 120000 index eade6ee7ce..0000000000 --- a/cairo_programs/proof_programs/bitwise_output.cairo +++ /dev/null @@ -1 +0,0 @@ -../bitwise_output.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/bitwise_recursion.cairo b/cairo_programs/proof_programs/bitwise_recursion.cairo deleted file mode 120000 index 081e16d5b5..0000000000 --- a/cairo_programs/proof_programs/bitwise_recursion.cairo +++ /dev/null @@ -1 +0,0 @@ -../bitwise_recursion.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/blake2s_felts.cairo b/cairo_programs/proof_programs/blake2s_felts.cairo deleted file mode 120000 index e04d6b2caf..0000000000 --- a/cairo_programs/proof_programs/blake2s_felts.cairo +++ /dev/null @@ -1 +0,0 @@ -../blake2s_felts.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/blake2s_hello_world_hash.cairo b/cairo_programs/proof_programs/blake2s_hello_world_hash.cairo deleted file mode 120000 index 8b8f951db8..0000000000 --- a/cairo_programs/proof_programs/blake2s_hello_world_hash.cairo +++ /dev/null @@ -1 +0,0 @@ -../blake2s_hello_world_hash.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/blake2s_integration_tests.cairo b/cairo_programs/proof_programs/blake2s_integration_tests.cairo deleted file mode 120000 index e96d8f88fb..0000000000 --- a/cairo_programs/proof_programs/blake2s_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../blake2s_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/cairo_finalize_keccak.cairo b/cairo_programs/proof_programs/cairo_finalize_keccak.cairo deleted file mode 120000 index c3191e2201..0000000000 --- a/cairo_programs/proof_programs/cairo_finalize_keccak.cairo +++ /dev/null @@ -1 +0,0 @@ -../cairo_finalize_keccak.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/cairo_finalize_keccak_block_size_1000.cairo b/cairo_programs/proof_programs/cairo_finalize_keccak_block_size_1000.cairo deleted file mode 120000 index 69fa41ec38..0000000000 --- a/cairo_programs/proof_programs/cairo_finalize_keccak_block_size_1000.cairo +++ /dev/null @@ -1 +0,0 @@ -../cairo_finalize_keccak_block_size_1000.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/call_function_assign_param_by_name.cairo b/cairo_programs/proof_programs/call_function_assign_param_by_name.cairo deleted file mode 120000 index cd1fd2cc14..0000000000 --- a/cairo_programs/proof_programs/call_function_assign_param_by_name.cairo +++ /dev/null @@ -1 +0,0 @@ -../call_function_assign_param_by_name.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/chained_ec_op.cairo b/cairo_programs/proof_programs/chained_ec_op.cairo deleted file mode 120000 index 562981744b..0000000000 --- a/cairo_programs/proof_programs/chained_ec_op.cairo +++ /dev/null @@ -1 +0,0 @@ -../chained_ec_op.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/common_signature.cairo b/cairo_programs/proof_programs/common_signature.cairo deleted file mode 120000 index 9a92f8aa35..0000000000 --- a/cairo_programs/proof_programs/common_signature.cairo +++ /dev/null @@ -1 +0,0 @@ -../common_signature.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/compare_arrays.cairo b/cairo_programs/proof_programs/compare_arrays.cairo deleted file mode 120000 index dd23ad1a38..0000000000 --- a/cairo_programs/proof_programs/compare_arrays.cairo +++ /dev/null @@ -1 +0,0 @@ -../compare_arrays.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/compare_different_arrays.cairo b/cairo_programs/proof_programs/compare_different_arrays.cairo deleted file mode 120000 index 1688f8e5c9..0000000000 --- a/cairo_programs/proof_programs/compare_different_arrays.cairo +++ /dev/null @@ -1 +0,0 @@ -../compare_different_arrays.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/compare_greater_array.cairo b/cairo_programs/proof_programs/compare_greater_array.cairo deleted file mode 120000 index d3b8a39554..0000000000 --- a/cairo_programs/proof_programs/compare_greater_array.cairo +++ /dev/null @@ -1 +0,0 @@ -../compare_greater_array.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/compare_lesser_array.cairo b/cairo_programs/proof_programs/compare_lesser_array.cairo deleted file mode 120000 index b72440deab..0000000000 --- a/cairo_programs/proof_programs/compare_lesser_array.cairo +++ /dev/null @@ -1 +0,0 @@ -../compare_lesser_array.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/compute_doubling_slope_v2.cairo b/cairo_programs/proof_programs/compute_doubling_slope_v2.cairo deleted file mode 120000 index e3400f66cb..0000000000 --- a/cairo_programs/proof_programs/compute_doubling_slope_v2.cairo +++ /dev/null @@ -1 +0,0 @@ -../compute_doubling_slope_v2.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/compute_slope_v2.cairo b/cairo_programs/proof_programs/compute_slope_v2.cairo deleted file mode 120000 index 99e22890e9..0000000000 --- a/cairo_programs/proof_programs/compute_slope_v2.cairo +++ /dev/null @@ -1 +0,0 @@ -../compute_slope_v2.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/dict.cairo b/cairo_programs/proof_programs/dict.cairo deleted file mode 120000 index a1a9c2277d..0000000000 --- a/cairo_programs/proof_programs/dict.cairo +++ /dev/null @@ -1 +0,0 @@ -../dict.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/dict_integration_tests.cairo b/cairo_programs/proof_programs/dict_integration_tests.cairo deleted file mode 120000 index e13fe2fab5..0000000000 --- a/cairo_programs/proof_programs/dict_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../dict_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/dict_squash.cairo b/cairo_programs/proof_programs/dict_squash.cairo deleted file mode 120000 index 2191191a74..0000000000 --- a/cairo_programs/proof_programs/dict_squash.cairo +++ /dev/null @@ -1 +0,0 @@ -../dict_squash.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/dict_store_cast_ptr.cairo b/cairo_programs/proof_programs/dict_store_cast_ptr.cairo deleted file mode 120000 index 8d1e6a7409..0000000000 --- a/cairo_programs/proof_programs/dict_store_cast_ptr.cairo +++ /dev/null @@ -1 +0,0 @@ -../dict_store_cast_ptr.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/dict_update.cairo b/cairo_programs/proof_programs/dict_update.cairo deleted file mode 120000 index 268649e28a..0000000000 --- a/cairo_programs/proof_programs/dict_update.cairo +++ /dev/null @@ -1 +0,0 @@ -../dict_update.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/div_mod_n.cairo b/cairo_programs/proof_programs/div_mod_n.cairo deleted file mode 120000 index e262b1292a..0000000000 --- a/cairo_programs/proof_programs/div_mod_n.cairo +++ /dev/null @@ -1 +0,0 @@ -../div_mod_n.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ec_double_assign_new_x_v3.cairo b/cairo_programs/proof_programs/ec_double_assign_new_x_v3.cairo deleted file mode 120000 index 8a7e7d4150..0000000000 --- a/cairo_programs/proof_programs/ec_double_assign_new_x_v3.cairo +++ /dev/null @@ -1 +0,0 @@ -../ec_double_assign_new_x_v3.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ec_double_slope.cairo b/cairo_programs/proof_programs/ec_double_slope.cairo deleted file mode 120000 index ff9fbd912f..0000000000 --- a/cairo_programs/proof_programs/ec_double_slope.cairo +++ /dev/null @@ -1 +0,0 @@ -../ec_double_slope.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ec_double_v4.cairo b/cairo_programs/proof_programs/ec_double_v4.cairo deleted file mode 120000 index ec8291916a..0000000000 --- a/cairo_programs/proof_programs/ec_double_v4.cairo +++ /dev/null @@ -1 +0,0 @@ -../ec_double_v4.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ec_negate.cairo b/cairo_programs/proof_programs/ec_negate.cairo deleted file mode 120000 index c8a8af8d5c..0000000000 --- a/cairo_programs/proof_programs/ec_negate.cairo +++ /dev/null @@ -1 +0,0 @@ -../ec_negate.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ec_op.cairo b/cairo_programs/proof_programs/ec_op.cairo deleted file mode 120000 index ed20b661af..0000000000 --- a/cairo_programs/proof_programs/ec_op.cairo +++ /dev/null @@ -1 +0,0 @@ -../ec_op.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ec_recover.cairo b/cairo_programs/proof_programs/ec_recover.cairo deleted file mode 120000 index a0629529c6..0000000000 --- a/cairo_programs/proof_programs/ec_recover.cairo +++ /dev/null @@ -1 +0,0 @@ -../ec_recover.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ed25519_ec.cairo b/cairo_programs/proof_programs/ed25519_ec.cairo deleted file mode 120000 index d60a0f17c4..0000000000 --- a/cairo_programs/proof_programs/ed25519_ec.cairo +++ /dev/null @@ -1 +0,0 @@ -../ed25519_ec.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/ed25519_field.cairo b/cairo_programs/proof_programs/ed25519_field.cairo deleted file mode 120000 index 55fb9bae0e..0000000000 --- a/cairo_programs/proof_programs/ed25519_field.cairo +++ /dev/null @@ -1 +0,0 @@ -../ed25519_field.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/efficient_secp256r1_ec.cairo b/cairo_programs/proof_programs/efficient_secp256r1_ec.cairo deleted file mode 120000 index cd0e2fb3f9..0000000000 --- a/cairo_programs/proof_programs/efficient_secp256r1_ec.cairo +++ /dev/null @@ -1 +0,0 @@ -../efficient_secp256r1_ec.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/example_blake2s.cairo b/cairo_programs/proof_programs/example_blake2s.cairo deleted file mode 120000 index 77d4b53f0f..0000000000 --- a/cairo_programs/proof_programs/example_blake2s.cairo +++ /dev/null @@ -1 +0,0 @@ -../example_blake2s.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/example_program.cairo b/cairo_programs/proof_programs/example_program.cairo deleted file mode 120000 index 9bf1899363..0000000000 --- a/cairo_programs/proof_programs/example_program.cairo +++ /dev/null @@ -1 +0,0 @@ -../example_program.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/factorial.cairo b/cairo_programs/proof_programs/factorial.cairo deleted file mode 120000 index 5ba977181a..0000000000 --- a/cairo_programs/proof_programs/factorial.cairo +++ /dev/null @@ -1 +0,0 @@ -../factorial.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/fast_ec_add_v2.cairo b/cairo_programs/proof_programs/fast_ec_add_v2.cairo deleted file mode 120000 index a6012da8d3..0000000000 --- a/cairo_programs/proof_programs/fast_ec_add_v2.cairo +++ /dev/null @@ -1 +0,0 @@ -../fast_ec_add_v2.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/fast_ec_add_v3.cairo b/cairo_programs/proof_programs/fast_ec_add_v3.cairo deleted file mode 120000 index ed334949da..0000000000 --- a/cairo_programs/proof_programs/fast_ec_add_v3.cairo +++ /dev/null @@ -1 +0,0 @@ -../fast_ec_add_v3.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/fibonacci.cairo b/cairo_programs/proof_programs/fibonacci.cairo deleted file mode 120000 index 713038ee51..0000000000 --- a/cairo_programs/proof_programs/fibonacci.cairo +++ /dev/null @@ -1 +0,0 @@ -../fibonacci.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/field_arithmetic.cairo b/cairo_programs/proof_programs/field_arithmetic.cairo deleted file mode 120000 index 2ad65272a2..0000000000 --- a/cairo_programs/proof_programs/field_arithmetic.cairo +++ /dev/null @@ -1 +0,0 @@ -../field_arithmetic.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/finalize_blake2s.cairo b/cairo_programs/proof_programs/finalize_blake2s.cairo deleted file mode 120000 index cb5922050e..0000000000 --- a/cairo_programs/proof_programs/finalize_blake2s.cairo +++ /dev/null @@ -1 +0,0 @@ -../finalize_blake2s.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/finalize_blake2s_v2_hint.cairo b/cairo_programs/proof_programs/finalize_blake2s_v2_hint.cairo deleted file mode 120000 index 36ff9954b3..0000000000 --- a/cairo_programs/proof_programs/finalize_blake2s_v2_hint.cairo +++ /dev/null @@ -1 +0,0 @@ -../finalize_blake2s_v2_hint.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/find_element.cairo b/cairo_programs/proof_programs/find_element.cairo deleted file mode 120000 index 66d8ee0928..0000000000 --- a/cairo_programs/proof_programs/find_element.cairo +++ /dev/null @@ -1 +0,0 @@ -../find_element.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/fq.cairo b/cairo_programs/proof_programs/fq.cairo deleted file mode 120000 index d67bd7ebd5..0000000000 --- a/cairo_programs/proof_programs/fq.cairo +++ /dev/null @@ -1 +0,0 @@ -../fq.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/fq_test.cairo b/cairo_programs/proof_programs/fq_test.cairo deleted file mode 120000 index 7d8b5f7573..0000000000 --- a/cairo_programs/proof_programs/fq_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../fq_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/function_return.cairo b/cairo_programs/proof_programs/function_return.cairo deleted file mode 120000 index 03d33cbdf4..0000000000 --- a/cairo_programs/proof_programs/function_return.cairo +++ /dev/null @@ -1 +0,0 @@ -../function_return.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/function_return_if_print.cairo b/cairo_programs/proof_programs/function_return_if_print.cairo deleted file mode 120000 index 8501e61e92..0000000000 --- a/cairo_programs/proof_programs/function_return_if_print.cairo +++ /dev/null @@ -1 +0,0 @@ -../function_return_if_print.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/function_return_to_variable.cairo b/cairo_programs/proof_programs/function_return_to_variable.cairo deleted file mode 120000 index da13eb840b..0000000000 --- a/cairo_programs/proof_programs/function_return_to_variable.cairo +++ /dev/null @@ -1 +0,0 @@ -../function_return_to_variable.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/garaga.cairo b/cairo_programs/proof_programs/garaga.cairo deleted file mode 120000 index 2c29bb6184..0000000000 --- a/cairo_programs/proof_programs/garaga.cairo +++ /dev/null @@ -1 +0,0 @@ -../garaga.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/highest_bitlen.cairo b/cairo_programs/proof_programs/highest_bitlen.cairo deleted file mode 120000 index 1b72bcb0b6..0000000000 --- a/cairo_programs/proof_programs/highest_bitlen.cairo +++ /dev/null @@ -1 +0,0 @@ -../highest_bitlen.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/if_and_prime.cairo b/cairo_programs/proof_programs/if_and_prime.cairo deleted file mode 120000 index b784d11400..0000000000 --- a/cairo_programs/proof_programs/if_and_prime.cairo +++ /dev/null @@ -1 +0,0 @@ -../if_and_prime.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/if_in_function.cairo b/cairo_programs/proof_programs/if_in_function.cairo deleted file mode 120000 index b7b49c33e5..0000000000 --- a/cairo_programs/proof_programs/if_in_function.cairo +++ /dev/null @@ -1 +0,0 @@ -../if_in_function.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/if_list.cairo b/cairo_programs/proof_programs/if_list.cairo deleted file mode 120000 index 0c7f81ccc4..0000000000 --- a/cairo_programs/proof_programs/if_list.cairo +++ /dev/null @@ -1 +0,0 @@ -../if_list.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/if_reloc_equal.cairo b/cairo_programs/proof_programs/if_reloc_equal.cairo deleted file mode 120000 index bec0afd84d..0000000000 --- a/cairo_programs/proof_programs/if_reloc_equal.cairo +++ /dev/null @@ -1 +0,0 @@ -../if_reloc_equal.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/integration.cairo b/cairo_programs/proof_programs/integration.cairo deleted file mode 120000 index 73e75a2630..0000000000 --- a/cairo_programs/proof_programs/integration.cairo +++ /dev/null @@ -1 +0,0 @@ -../integration.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/integration_with_alloc_locals.cairo b/cairo_programs/proof_programs/integration_with_alloc_locals.cairo deleted file mode 120000 index c81a4016ce..0000000000 --- a/cairo_programs/proof_programs/integration_with_alloc_locals.cairo +++ /dev/null @@ -1 +0,0 @@ -../integration_with_alloc_locals.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/inv_mod_p_uint512.cairo b/cairo_programs/proof_programs/inv_mod_p_uint512.cairo deleted file mode 120000 index cc8662e6db..0000000000 --- a/cairo_programs/proof_programs/inv_mod_p_uint512.cairo +++ /dev/null @@ -1 +0,0 @@ -../inv_mod_p_uint512.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/is_quad_residue_test.cairo b/cairo_programs/proof_programs/is_quad_residue_test.cairo deleted file mode 120000 index 1ea92a4976..0000000000 --- a/cairo_programs/proof_programs/is_quad_residue_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../is_quad_residue_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/is_zero.cairo b/cairo_programs/proof_programs/is_zero.cairo deleted file mode 120000 index c564d75006..0000000000 --- a/cairo_programs/proof_programs/is_zero.cairo +++ /dev/null @@ -1 +0,0 @@ -../is_zero.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/is_zero_pack.cairo b/cairo_programs/proof_programs/is_zero_pack.cairo deleted file mode 120000 index afa37d803c..0000000000 --- a/cairo_programs/proof_programs/is_zero_pack.cairo +++ /dev/null @@ -1 +0,0 @@ -../is_zero_pack.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/jmp.cairo b/cairo_programs/proof_programs/jmp.cairo deleted file mode 120000 index 64d4cc6476..0000000000 --- a/cairo_programs/proof_programs/jmp.cairo +++ /dev/null @@ -1 +0,0 @@ -../jmp.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/jmp_if_condition.cairo b/cairo_programs/proof_programs/jmp_if_condition.cairo deleted file mode 120000 index 4fba05b1a5..0000000000 --- a/cairo_programs/proof_programs/jmp_if_condition.cairo +++ /dev/null @@ -1 +0,0 @@ -../jmp_if_condition.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak.cairo b/cairo_programs/proof_programs/keccak.cairo deleted file mode 120000 index 85e66e5a21..0000000000 --- a/cairo_programs/proof_programs/keccak.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak_add_uint256.cairo b/cairo_programs/proof_programs/keccak_add_uint256.cairo deleted file mode 120000 index d0fb471b98..0000000000 --- a/cairo_programs/proof_programs/keccak_add_uint256.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak_add_uint256.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak_alternative_hint.cairo b/cairo_programs/proof_programs/keccak_alternative_hint.cairo deleted file mode 120000 index 6960b2186f..0000000000 --- a/cairo_programs/proof_programs/keccak_alternative_hint.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak_alternative_hint.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak_builtin.cairo b/cairo_programs/proof_programs/keccak_builtin.cairo deleted file mode 120000 index 71b14b43ff..0000000000 --- a/cairo_programs/proof_programs/keccak_builtin.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak_builtin.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak_copy_inputs.cairo b/cairo_programs/proof_programs/keccak_copy_inputs.cairo deleted file mode 120000 index 8e8e429ccd..0000000000 --- a/cairo_programs/proof_programs/keccak_copy_inputs.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak_copy_inputs.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak_integration_tests.cairo b/cairo_programs/proof_programs/keccak_integration_tests.cairo deleted file mode 120000 index 5f2e6d3225..0000000000 --- a/cairo_programs/proof_programs/keccak_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/keccak_uint256.cairo b/cairo_programs/proof_programs/keccak_uint256.cairo deleted file mode 120000 index a2da091a09..0000000000 --- a/cairo_programs/proof_programs/keccak_uint256.cairo +++ /dev/null @@ -1 +0,0 @@ -../keccak_uint256.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/math_cmp.cairo b/cairo_programs/proof_programs/math_cmp.cairo deleted file mode 120000 index 431fdeccff..0000000000 --- a/cairo_programs/proof_programs/math_cmp.cairo +++ /dev/null @@ -1 +0,0 @@ -../math_cmp.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/math_cmp_and_pow_integration_tests.cairo b/cairo_programs/proof_programs/math_cmp_and_pow_integration_tests.cairo deleted file mode 120000 index d2c2d9c790..0000000000 --- a/cairo_programs/proof_programs/math_cmp_and_pow_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../math_cmp_and_pow_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/math_integration_tests.cairo b/cairo_programs/proof_programs/math_integration_tests.cairo deleted file mode 120000 index 041d4ae8c5..0000000000 --- a/cairo_programs/proof_programs/math_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../math_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/memcpy_test.cairo b/cairo_programs/proof_programs/memcpy_test.cairo deleted file mode 120000 index 8fe365be61..0000000000 --- a/cairo_programs/proof_programs/memcpy_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../memcpy_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/memory_holes.cairo b/cairo_programs/proof_programs/memory_holes.cairo deleted file mode 120000 index e1fadbb4fb..0000000000 --- a/cairo_programs/proof_programs/memory_holes.cairo +++ /dev/null @@ -1 +0,0 @@ -../memory_holes.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/memory_integration_tests.cairo b/cairo_programs/proof_programs/memory_integration_tests.cairo deleted file mode 120000 index bfe860f09c..0000000000 --- a/cairo_programs/proof_programs/memory_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../memory_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/memset.cairo b/cairo_programs/proof_programs/memset.cairo deleted file mode 120000 index 72599c1ecb..0000000000 --- a/cairo_programs/proof_programs/memset.cairo +++ /dev/null @@ -1 +0,0 @@ -../memset.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/mul_s_inv.cairo b/cairo_programs/proof_programs/mul_s_inv.cairo deleted file mode 120000 index e1a7cd0deb..0000000000 --- a/cairo_programs/proof_programs/mul_s_inv.cairo +++ /dev/null @@ -1 +0,0 @@ -../mul_s_inv.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/multiplicative_inverse.cairo b/cairo_programs/proof_programs/multiplicative_inverse.cairo deleted file mode 120000 index e281f13e2d..0000000000 --- a/cairo_programs/proof_programs/multiplicative_inverse.cairo +++ /dev/null @@ -1 +0,0 @@ -../multiplicative_inverse.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/n_bit.cairo b/cairo_programs/proof_programs/n_bit.cairo deleted file mode 120000 index 49b68729a0..0000000000 --- a/cairo_programs/proof_programs/n_bit.cairo +++ /dev/null @@ -1 +0,0 @@ -../n_bit.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/nondet_bigint3_v2.cairo b/cairo_programs/proof_programs/nondet_bigint3_v2.cairo deleted file mode 120000 index 62d24de45b..0000000000 --- a/cairo_programs/proof_programs/nondet_bigint3_v2.cairo +++ /dev/null @@ -1 +0,0 @@ -../nondet_bigint3_v2.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/normalize_address.cairo b/cairo_programs/proof_programs/normalize_address.cairo deleted file mode 120000 index 52b57a98f6..0000000000 --- a/cairo_programs/proof_programs/normalize_address.cairo +++ /dev/null @@ -1 +0,0 @@ -../normalize_address.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/not_main.cairo b/cairo_programs/proof_programs/not_main.cairo deleted file mode 120000 index 38ec87e9b2..0000000000 --- a/cairo_programs/proof_programs/not_main.cairo +++ /dev/null @@ -1 +0,0 @@ -../not_main.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/operations_with_data_structures.cairo b/cairo_programs/proof_programs/operations_with_data_structures.cairo deleted file mode 120000 index 34c73ce7f6..0000000000 --- a/cairo_programs/proof_programs/operations_with_data_structures.cairo +++ /dev/null @@ -1 +0,0 @@ -../operations_with_data_structures.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/packed_sha256.cairo b/cairo_programs/proof_programs/packed_sha256.cairo deleted file mode 120000 index d98488a7d2..0000000000 --- a/cairo_programs/proof_programs/packed_sha256.cairo +++ /dev/null @@ -1 +0,0 @@ -../packed_sha256.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/packed_sha256_test.cairo b/cairo_programs/proof_programs/packed_sha256_test.cairo deleted file mode 120000 index dfb0a9b318..0000000000 --- a/cairo_programs/proof_programs/packed_sha256_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../packed_sha256_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/pedersen_test.cairo b/cairo_programs/proof_programs/pedersen_test.cairo deleted file mode 120000 index fb98bd6900..0000000000 --- a/cairo_programs/proof_programs/pedersen_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../pedersen_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/pointers.cairo b/cairo_programs/proof_programs/pointers.cairo deleted file mode 120000 index 799b56b537..0000000000 --- a/cairo_programs/proof_programs/pointers.cairo +++ /dev/null @@ -1 +0,0 @@ -../pointers.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/poseidon_builtin.cairo b/cairo_programs/proof_programs/poseidon_builtin.cairo deleted file mode 120000 index bc4fb83e23..0000000000 --- a/cairo_programs/proof_programs/poseidon_builtin.cairo +++ /dev/null @@ -1 +0,0 @@ -../poseidon_builtin.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/poseidon_hash.cairo b/cairo_programs/proof_programs/poseidon_hash.cairo deleted file mode 120000 index 190a72caae..0000000000 --- a/cairo_programs/proof_programs/poseidon_hash.cairo +++ /dev/null @@ -1 +0,0 @@ -../poseidon_hash.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/poseidon_multirun.cairo b/cairo_programs/proof_programs/poseidon_multirun.cairo deleted file mode 120000 index 30c32a782d..0000000000 --- a/cairo_programs/proof_programs/poseidon_multirun.cairo +++ /dev/null @@ -1 +0,0 @@ -../poseidon_multirun.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/pow.cairo b/cairo_programs/proof_programs/pow.cairo deleted file mode 120000 index 501ee61467..0000000000 --- a/cairo_programs/proof_programs/pow.cairo +++ /dev/null @@ -1 +0,0 @@ -../pow.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/print.cairo b/cairo_programs/proof_programs/print.cairo deleted file mode 120000 index 38c1608575..0000000000 --- a/cairo_programs/proof_programs/print.cairo +++ /dev/null @@ -1 +0,0 @@ -../print.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/recover_y.cairo b/cairo_programs/proof_programs/recover_y.cairo deleted file mode 120000 index 4fdd3f9e3d..0000000000 --- a/cairo_programs/proof_programs/recover_y.cairo +++ /dev/null @@ -1 +0,0 @@ -../recover_y.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/reduce.cairo b/cairo_programs/proof_programs/reduce.cairo deleted file mode 120000 index 42dbc59c35..0000000000 --- a/cairo_programs/proof_programs/reduce.cairo +++ /dev/null @@ -1 +0,0 @@ -../reduce.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/relocate_segments.cairo b/cairo_programs/proof_programs/relocate_segments.cairo deleted file mode 120000 index 44ad753198..0000000000 --- a/cairo_programs/proof_programs/relocate_segments.cairo +++ /dev/null @@ -1 +0,0 @@ -../relocate_segments.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/relocate_segments_with_offset.cairo b/cairo_programs/proof_programs/relocate_segments_with_offset.cairo deleted file mode 120000 index 71dd71fe10..0000000000 --- a/cairo_programs/proof_programs/relocate_segments_with_offset.cairo +++ /dev/null @@ -1 +0,0 @@ -../relocate_segments_with_offset.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/relocate_temporary_segment_append.cairo b/cairo_programs/proof_programs/relocate_temporary_segment_append.cairo deleted file mode 120000 index 1f0e8ac7cf..0000000000 --- a/cairo_programs/proof_programs/relocate_temporary_segment_append.cairo +++ /dev/null @@ -1 +0,0 @@ -../relocate_temporary_segment_append.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/relocate_temporary_segment_into_new.cairo b/cairo_programs/proof_programs/relocate_temporary_segment_into_new.cairo deleted file mode 120000 index 02d22be9c6..0000000000 --- a/cairo_programs/proof_programs/relocate_temporary_segment_into_new.cairo +++ /dev/null @@ -1 +0,0 @@ -../relocate_temporary_segment_into_new.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/return.cairo b/cairo_programs/proof_programs/return.cairo deleted file mode 120000 index 4f0747ca34..0000000000 --- a/cairo_programs/proof_programs/return.cairo +++ /dev/null @@ -1 +0,0 @@ -../return.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/reversed_register_instructions.cairo b/cairo_programs/proof_programs/reversed_register_instructions.cairo deleted file mode 120000 index 6f68fd0a23..0000000000 --- a/cairo_programs/proof_programs/reversed_register_instructions.cairo +++ /dev/null @@ -1 +0,0 @@ -../reversed_register_instructions.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/search_sorted_lower.cairo b/cairo_programs/proof_programs/search_sorted_lower.cairo deleted file mode 120000 index b95d849382..0000000000 --- a/cairo_programs/proof_programs/search_sorted_lower.cairo +++ /dev/null @@ -1 +0,0 @@ -../search_sorted_lower.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/secp.cairo b/cairo_programs/proof_programs/secp.cairo deleted file mode 120000 index cd957092e2..0000000000 --- a/cairo_programs/proof_programs/secp.cairo +++ /dev/null @@ -1 +0,0 @@ -../secp.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/secp256r1_div_mod_n.cairo b/cairo_programs/proof_programs/secp256r1_div_mod_n.cairo deleted file mode 120000 index 2049ea105b..0000000000 --- a/cairo_programs/proof_programs/secp256r1_div_mod_n.cairo +++ /dev/null @@ -1 +0,0 @@ -../secp256r1_div_mod_n.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/secp256r1_fast_ec_add.cairo b/cairo_programs/proof_programs/secp256r1_fast_ec_add.cairo deleted file mode 120000 index 9e8a00dff3..0000000000 --- a/cairo_programs/proof_programs/secp256r1_fast_ec_add.cairo +++ /dev/null @@ -1 +0,0 @@ -../secp256r1_fast_ec_add.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/secp256r1_slope.cairo b/cairo_programs/proof_programs/secp256r1_slope.cairo deleted file mode 120000 index 7e44c983fa..0000000000 --- a/cairo_programs/proof_programs/secp256r1_slope.cairo +++ /dev/null @@ -1 +0,0 @@ -../secp256r1_slope.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/secp_ec.cairo b/cairo_programs/proof_programs/secp_ec.cairo deleted file mode 120000 index 1426f88cee..0000000000 --- a/cairo_programs/proof_programs/secp_ec.cairo +++ /dev/null @@ -1 +0,0 @@ -../secp_ec.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/secp_integration_tests.cairo b/cairo_programs/proof_programs/secp_integration_tests.cairo deleted file mode 120000 index 5b1fd2cc64..0000000000 --- a/cairo_programs/proof_programs/secp_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../secp_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/set_add.cairo b/cairo_programs/proof_programs/set_add.cairo deleted file mode 120000 index 8732851995..0000000000 --- a/cairo_programs/proof_programs/set_add.cairo +++ /dev/null @@ -1 +0,0 @@ -../set_add.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/set_integration_tests.cairo b/cairo_programs/proof_programs/set_integration_tests.cairo deleted file mode 120000 index 95aaa7e749..0000000000 --- a/cairo_programs/proof_programs/set_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../set_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/sha256.cairo b/cairo_programs/proof_programs/sha256.cairo deleted file mode 120000 index 05f56ec086..0000000000 --- a/cairo_programs/proof_programs/sha256.cairo +++ /dev/null @@ -1 +0,0 @@ -../sha256.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/sha256_test.cairo b/cairo_programs/proof_programs/sha256_test.cairo deleted file mode 120000 index 63f8a51ea5..0000000000 --- a/cairo_programs/proof_programs/sha256_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../sha256_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/signature.cairo b/cairo_programs/proof_programs/signature.cairo deleted file mode 120000 index fa2f440398..0000000000 --- a/cairo_programs/proof_programs/signature.cairo +++ /dev/null @@ -1 +0,0 @@ -../signature.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/signed_div_rem.cairo b/cairo_programs/proof_programs/signed_div_rem.cairo deleted file mode 120000 index 2013d6439b..0000000000 --- a/cairo_programs/proof_programs/signed_div_rem.cairo +++ /dev/null @@ -1 +0,0 @@ -../signed_div_rem.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/simple_print.cairo b/cairo_programs/proof_programs/simple_print.cairo deleted file mode 120000 index 0352f30c9d..0000000000 --- a/cairo_programs/proof_programs/simple_print.cairo +++ /dev/null @@ -1 +0,0 @@ -../simple_print.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/split_felt.cairo b/cairo_programs/proof_programs/split_felt.cairo deleted file mode 120000 index ba534b7ce1..0000000000 --- a/cairo_programs/proof_programs/split_felt.cairo +++ /dev/null @@ -1 +0,0 @@ -../split_felt.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/split_int.cairo b/cairo_programs/proof_programs/split_int.cairo deleted file mode 120000 index 98218d4d99..0000000000 --- a/cairo_programs/proof_programs/split_int.cairo +++ /dev/null @@ -1 +0,0 @@ -../split_int.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/split_int_big.cairo b/cairo_programs/proof_programs/split_int_big.cairo deleted file mode 120000 index 4ab22844b8..0000000000 --- a/cairo_programs/proof_programs/split_int_big.cairo +++ /dev/null @@ -1 +0,0 @@ -../split_int_big.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/split_xx_hint.cairo b/cairo_programs/proof_programs/split_xx_hint.cairo deleted file mode 120000 index a816a67cf3..0000000000 --- a/cairo_programs/proof_programs/split_xx_hint.cairo +++ /dev/null @@ -1 +0,0 @@ -../split_xx_hint.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/sqrt.cairo b/cairo_programs/proof_programs/sqrt.cairo deleted file mode 120000 index 5c171547ee..0000000000 --- a/cairo_programs/proof_programs/sqrt.cairo +++ /dev/null @@ -1 +0,0 @@ -../sqrt.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/squash_dict.cairo b/cairo_programs/proof_programs/squash_dict.cairo deleted file mode 120000 index 1c22456028..0000000000 --- a/cairo_programs/proof_programs/squash_dict.cairo +++ /dev/null @@ -1 +0,0 @@ -../squash_dict.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/struct.cairo b/cairo_programs/proof_programs/struct.cairo deleted file mode 120000 index 4eb4120348..0000000000 --- a/cairo_programs/proof_programs/struct.cairo +++ /dev/null @@ -1 +0,0 @@ -../struct.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/test_addition_if.cairo b/cairo_programs/proof_programs/test_addition_if.cairo deleted file mode 120000 index 5689bff959..0000000000 --- a/cairo_programs/proof_programs/test_addition_if.cairo +++ /dev/null @@ -1 +0,0 @@ -../test_addition_if.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/test_reverse_if.cairo b/cairo_programs/proof_programs/test_reverse_if.cairo deleted file mode 120000 index afdc5ee805..0000000000 --- a/cairo_programs/proof_programs/test_reverse_if.cairo +++ /dev/null @@ -1 +0,0 @@ -../test_reverse_if.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/test_subtraction_if.cairo b/cairo_programs/proof_programs/test_subtraction_if.cairo deleted file mode 120000 index 367f1ba841..0000000000 --- a/cairo_programs/proof_programs/test_subtraction_if.cairo +++ /dev/null @@ -1 +0,0 @@ -../test_subtraction_if.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint256.cairo b/cairo_programs/proof_programs/uint256.cairo deleted file mode 120000 index 13750cfcfa..0000000000 --- a/cairo_programs/proof_programs/uint256.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint256.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint256_improvements.cairo b/cairo_programs/proof_programs/uint256_improvements.cairo deleted file mode 120000 index d44d558e6d..0000000000 --- a/cairo_programs/proof_programs/uint256_improvements.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint256_improvements.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint256_integration_tests.cairo b/cairo_programs/proof_programs/uint256_integration_tests.cairo deleted file mode 120000 index 08f7ce05e4..0000000000 --- a/cairo_programs/proof_programs/uint256_integration_tests.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint256_integration_tests.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint384.cairo b/cairo_programs/proof_programs/uint384.cairo deleted file mode 120000 index 1bf594c3ae..0000000000 --- a/cairo_programs/proof_programs/uint384.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint384.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint384_extension.cairo b/cairo_programs/proof_programs/uint384_extension.cairo deleted file mode 120000 index aa817df393..0000000000 --- a/cairo_programs/proof_programs/uint384_extension.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint384_extension.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint384_extension_test.cairo b/cairo_programs/proof_programs/uint384_extension_test.cairo deleted file mode 120000 index 74fd0c8187..0000000000 --- a/cairo_programs/proof_programs/uint384_extension_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint384_extension_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/uint384_test.cairo b/cairo_programs/proof_programs/uint384_test.cairo deleted file mode 120000 index d956e6dae8..0000000000 --- a/cairo_programs/proof_programs/uint384_test.cairo +++ /dev/null @@ -1 +0,0 @@ -../uint384_test.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/unsafe_keccak.cairo b/cairo_programs/proof_programs/unsafe_keccak.cairo deleted file mode 120000 index 847d284f83..0000000000 --- a/cairo_programs/proof_programs/unsafe_keccak.cairo +++ /dev/null @@ -1 +0,0 @@ -../unsafe_keccak.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/unsafe_keccak_finalize.cairo b/cairo_programs/proof_programs/unsafe_keccak_finalize.cairo deleted file mode 120000 index 892b2bb4e5..0000000000 --- a/cairo_programs/proof_programs/unsafe_keccak_finalize.cairo +++ /dev/null @@ -1 +0,0 @@ -../unsafe_keccak_finalize.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/unsigned_div_rem.cairo b/cairo_programs/proof_programs/unsigned_div_rem.cairo deleted file mode 120000 index d814de6b45..0000000000 --- a/cairo_programs/proof_programs/unsigned_div_rem.cairo +++ /dev/null @@ -1 +0,0 @@ -../unsigned_div_rem.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/use_imported_module.cairo b/cairo_programs/proof_programs/use_imported_module.cairo deleted file mode 120000 index a413a84acf..0000000000 --- a/cairo_programs/proof_programs/use_imported_module.cairo +++ /dev/null @@ -1 +0,0 @@ -../use_imported_module.cairo \ No newline at end of file diff --git a/cairo_programs/proof_programs/usort.cairo b/cairo_programs/proof_programs/usort.cairo deleted file mode 120000 index 4a7e19e63f..0000000000 --- a/cairo_programs/proof_programs/usort.cairo +++ /dev/null @@ -1 +0,0 @@ -../usort.cairo \ No newline at end of file diff --git a/docs/hint_processor/README.md b/docs/hint_processor/README.md index 5b51765b77..a616cc0bfd 100644 --- a/docs/hint_processor/README.md +++ b/docs/hint_processor/README.md @@ -24,11 +24,10 @@ The purpose of this method is to organize the data related to hints in the way i ### `execute_hint` This method is called at the start of each VM step when there is a hint to execute. -It receives the dynamic structure created by `compile_hint` along with the program constants and a set of proxies containing a limited access to the VM's Internals: +It receives the dynamic structure created by `compile_hint` along with the program constants and a some of the VM's Internals: -* `exec_scopes_proxy` is the hint's gateway to interact with the execution_scopes in the VM and share data between hints without inserting them into the cairo execution. It provides methods to create and remove scopes and to modify the current scope, along with several helper methods to allow inserting and retrieving variables of specific types. This proxy only allows modifying the current scope, which is the last available scope before the hint's execution (Note that calling enter_scope and exit_scope won't change the current scope for the duration of the hint´s execution) -* `vm_proxy` is the hint's gateway to the internal values of the VM, it provides mutable references to the memory segment manager and the run context, and immutable references to the builtin runners and the program's prime, it also contains a memory proxy: -* `MemoryProxy`: It grants a more limited access to the VM's memory, providing the necessary methods to modify it in a controlled manner. +* `exec_scopes` Allows sharing data between hints without inserting them into the cairo execution. It provides methods to create and remove scopes and to modify the current scope, along with several helper methods to allow inserting and retrieving variables. It only allows modifying the current scope, which is the last available scope before the hint's execution (Note that calling enter_scope and exit_scope won't change the current scope for the duration of the hint´s execution) +* `vm` a mutable reference to the `VirtualMachine`, interaction with it is limited to its public fields and methods allowing to mutate it in a controlled manner The purpose of this method is to carry out the execution of the hint, given the data from `compile_hint` @@ -92,15 +91,15 @@ impl HintProcessor for MyHintProcessor { fn execute_hint( &mut self, - vm_proxy: &mut VMProxy, - exec_scopes_proxy: &mut ExecutionScopesProxy, + vm: &mut VirtualMachine, + exec_scopes: &mut ExecutionScopes, hint_data: &Box, ) -> Result<(), VirtualMachineError> { let hint_data = hint_data .downcast_ref::() .ok_or(VirtualMachineError::WrongHintData)?; match &*hint_data.code { - SPLIT_FELT => split_felt(vm_proxy, &hint_data.ids_data, &hint_data.ap_tracking), + SPLIT_FELT => split_felt(vm, &hint_data.ids_data, &hint_data.ap_tracking), _ => Err(VirtualMachineError::UnknownHint(code.to_string())), } } @@ -133,14 +132,14 @@ fn get_ids_data( This is the hint's implementation using the provided data and helpers: ```rust pub fn split_felt( - vm_proxy: &mut VMProxy, + vm: &mut VirtualMachine, ids_data: &HashMap, ap_tracking: &ApTracking, ) -> Result<(), VirtualMachineError> { - let value = get_integer_from_reference(vm_proxy, ids_data.get("value")?, ap_tracking)?; + let value = get_integer_from_reference(vm, ids_data.get("value")?, ap_tracking)?; let low: BigInt = value & ((bigint!(1).shl(128_u8)) - bigint!(1)); let high: BigInt = value.shr(128_u8); - insert_value_from_reference(high, vm_proxy, ids_data.get("high")?, ap_tracking)?; - insert_value_from_reference(low, vm_proxy, ids_data.get("low")?, ap_tracking) + insert_value_from_reference(high, vm, ids_data.get("high")?, ap_tracking)?; + insert_value_from_reference(low, vm, ids_data.get("low")?, ap_tracking) } ``` diff --git a/fuzzer/Cargo.lock b/fuzzer/Cargo.lock index 236551e8c5..7d61c3263c 100644 --- a/fuzzer/Cargo.lock +++ b/fuzzer/Cargo.lock @@ -2,6 +2,23 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aes" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac1f845298e95f983ff1944b728ae08b8cebab80d684f0a832ed0fc74dfa27e2" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + [[package]] name = "ahash" version = "0.7.7" @@ -116,6 +133,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" +[[package]] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" + [[package]] name = "bincode" version = "2.0.0-rc.3" @@ -158,6 +181,33 @@ version = "3.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bzip2" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdb116a6ef3f6c3698828873ad02c3014b3c85cadb88496095628e3ef1e347f8" +dependencies = [ + "bzip2-sys", + "libc", +] + +[[package]] +name = "bzip2-sys" +version = "0.1.11+1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "736a955f3fa7875102d57c82b8cac37ec45224a07fd32d58f9f7a186b6cd4cdc" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + [[package]] name = "cairo-vm" version = "1.0.0-rc0" @@ -185,6 +235,7 @@ dependencies = [ "starknet-crypto", "starknet-types-core", "thiserror-no-std", + "zip", ] [[package]] @@ -203,6 +254,22 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" + [[package]] name = "cpufeatures" version = "0.2.11" @@ -212,6 +279,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + [[package]] name = "crypto-bigint" version = "0.5.5" @@ -233,6 +315,15 @@ dependencies = [ "typenum", ] +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", +] + [[package]] name = "derivative" version = "2.2.0" @@ -272,6 +363,16 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "flate2" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + [[package]] name = "funty" version = "2.0.0" @@ -368,6 +469,15 @@ version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306" +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + [[package]] name = "itertools" version = "0.10.5" @@ -519,6 +629,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", +] + [[package]] name = "nom" version = "7.1.3" @@ -542,6 +661,12 @@ dependencies = [ "serde", ] +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + [[package]] name = "num-integer" version = "0.1.45" @@ -617,12 +742,47 @@ dependencies = [ "windows-targets", ] +[[package]] +name = "password-hash" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" +dependencies = [ + "base64ct", + "rand_core", + "subtle", +] + [[package]] name = "paste" version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" +[[package]] +name = "pbkdf2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83a0692ec44e4cf1ef28ca317f14f8f07da2d95ec3fa01f86e4467b725e60917" +dependencies = [ + "digest", + "hmac", + "password-hash", + "sha2", +] + +[[package]] +name = "pkg-config" +version = "0.3.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -820,6 +980,17 @@ dependencies = [ "serde", ] +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + [[package]] name = "sha2" version = "0.10.8" @@ -1001,6 +1172,25 @@ dependencies = [ "thiserror-impl-no-std", ] +[[package]] +name = "time" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" +dependencies = [ + "deranged", + "num-conv", + "powerfmt", + "serde", + "time-core", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + [[package]] name = "typenum" version = "1.17.0" @@ -1190,3 +1380,52 @@ dependencies = [ "quote", "syn 2.0.39", ] + +[[package]] +name = "zip" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "760394e246e4c28189f19d488c058bf16f564016aefac5d32bb1f3b51d5e9261" +dependencies = [ + "aes", + "byteorder", + "bzip2", + "constant_time_eq", + "crc32fast", + "crossbeam-utils", + "flate2", + "hmac", + "pbkdf2", + "sha1", + "time", + "zstd", +] + +[[package]] +name = "zstd" +version = "0.11.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cc960326ece64f010d2d2107537f26dc589a6573a316bd5b1dba685fa5fde4" +dependencies = [ + "zstd-safe", +] + +[[package]] +name = "zstd-safe" +version = "5.0.2+zstd.1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2a5585e04f9eea4b2a3d1eca508c4dee9592a89ef6f450c11719da0726f4db" +dependencies = [ + "libc", + "zstd-sys", +] + +[[package]] +name = "zstd-sys" +version = "2.0.9+zstd.1.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +dependencies = [ + "cc", + "pkg-config", +] diff --git a/rust-toolchain b/rust-toolchain index 2d24a1e077..4da0ec7b8e 100644 --- a/rust-toolchain +++ b/rust-toolchain @@ -1,4 +1,4 @@ [toolchain] -channel = "1.70.0" +channel = "1.74.1" components = ["rustfmt", "clippy"] profile = "minimal" diff --git a/vm/Cargo.toml b/vm/Cargo.toml index 6c33144a20..fca39d4aee 100644 --- a/vm/Cargo.toml +++ b/vm/Cargo.toml @@ -63,7 +63,7 @@ keccak = { workspace = true } hashbrown = { workspace = true } anyhow = { workspace = true } thiserror-no-std = { workspace = true } -starknet-types-core = { version = "0.0.6", default-features = false, features = ["serde", "curve", "num-traits"] } +starknet-types-core = { version = "0.0.9", default-features = false, features = ["serde", "curve", "num-traits"] } # only for std num-prime = { version = "0.4.3", features = ["big-int"], optional = true } diff --git a/vm/src/air_private_input.rs b/vm/src/air_private_input.rs index 4ea30d0d44..6429da0673 100644 --- a/vm/src/air_private_input.rs +++ b/vm/src/air_private_input.rs @@ -135,8 +135,103 @@ impl AirPrivateInput { } } +impl From for AirPrivateInput { + fn from(private_input: AirPrivateInputSerializable) -> Self { + Self(HashMap::from([ + (HASH_BUILTIN_NAME, private_input.pedersen), + (RANGE_CHECK_BUILTIN_NAME, private_input.range_check), + (SIGNATURE_BUILTIN_NAME, private_input.ecdsa), + (BITWISE_BUILTIN_NAME, private_input.bitwise), + (EC_OP_BUILTIN_NAME, private_input.ec_op), + (KECCAK_BUILTIN_NAME, private_input.keccak), + (POSEIDON_BUILTIN_NAME, private_input.poseidon), + ])) + } +} + impl AirPrivateInputSerializable { pub fn serialize_json(&self) -> Result { serde_json::to_string_pretty(&self) } } + +#[cfg(test)] +mod tests { + #[cfg(feature = "std")] + use { + super::*, + crate::air_private_input::{AirPrivateInput, AirPrivateInputSerializable}, + crate::vm::runners::builtin_runner::{ + BITWISE_BUILTIN_NAME, EC_OP_BUILTIN_NAME, HASH_BUILTIN_NAME, KECCAK_BUILTIN_NAME, + POSEIDON_BUILTIN_NAME, RANGE_CHECK_BUILTIN_NAME, SIGNATURE_BUILTIN_NAME, + }, + assert_matches::assert_matches, + }; + + #[cfg(feature = "std")] + #[test] + fn test_from_serializable() { + let serializable_private_input = AirPrivateInputSerializable { + trace_path: "trace.bin".to_string(), + memory_path: "memory.bin".to_string(), + pedersen: vec![PrivateInput::Pair(PrivateInputPair { + index: 0, + x: Felt252::from(100), + y: Felt252::from(200), + })], + range_check: vec![PrivateInput::Value(PrivateInputValue { + index: 10000, + value: Felt252::from(8000), + })], + ecdsa: vec![PrivateInput::Signature(PrivateInputSignature { + index: 0, + pubkey: Felt252::from(123), + msg: Felt252::from(456), + signature_input: SignatureInput { + r: Felt252::from(654), + w: Felt252::from(321), + }, + })], + bitwise: vec![PrivateInput::Pair(PrivateInputPair { + index: 4, + x: Felt252::from(7), + y: Felt252::from(8), + })], + ec_op: vec![PrivateInput::EcOp(PrivateInputEcOp { + index: 1, + p_x: Felt252::from(10), + p_y: Felt252::from(10), + m: Felt252::from(100), + q_x: Felt252::from(11), + q_y: Felt252::from(14), + })], + keccak: vec![PrivateInput::KeccakState(PrivateInputKeccakState { + index: 0, + input_s0: Felt252::from(0), + input_s1: Felt252::from(1), + input_s2: Felt252::from(2), + input_s3: Felt252::from(3), + input_s4: Felt252::from(4), + input_s5: Felt252::from(5), + input_s6: Felt252::from(6), + input_s7: Felt252::from(7), + })], + poseidon: vec![PrivateInput::PoseidonState(PrivateInputPoseidonState { + index: 42, + input_s0: Felt252::from(1), + input_s1: Felt252::from(2), + input_s2: Felt252::from(3), + })], + }; + + let private_input = AirPrivateInput::from(serializable_private_input.clone()); + + assert_matches!(private_input.0.get(HASH_BUILTIN_NAME), Some(data) if *data == serializable_private_input.pedersen); + assert_matches!(private_input.0.get(RANGE_CHECK_BUILTIN_NAME), Some(data) if *data == serializable_private_input.range_check); + assert_matches!(private_input.0.get(SIGNATURE_BUILTIN_NAME), Some(data) if *data == serializable_private_input.ecdsa); + assert_matches!(private_input.0.get(BITWISE_BUILTIN_NAME), Some(data) if *data == serializable_private_input.bitwise); + assert_matches!(private_input.0.get(EC_OP_BUILTIN_NAME), Some(data) if *data == serializable_private_input.ec_op); + assert_matches!(private_input.0.get(KECCAK_BUILTIN_NAME), Some(data) if *data == serializable_private_input.keccak); + assert_matches!(private_input.0.get(POSEIDON_BUILTIN_NAME), Some(data) if *data == serializable_private_input.poseidon); + } +} diff --git a/vm/src/cairo_run.rs b/vm/src/cairo_run.rs index 2ddb1c0de2..8293bc9625 100644 --- a/vm/src/cairo_run.rs +++ b/vm/src/cairo_run.rs @@ -28,6 +28,7 @@ pub struct CairoRunConfig<'a> { pub proof_mode: bool, pub secure_run: Option, pub disable_trace_padding: bool, + pub allow_missing_builtins: Option, } #[cfg(feature = "arbitrary")] @@ -56,6 +57,7 @@ impl<'a> Default for CairoRunConfig<'a> { proof_mode: false, secure_run: None, disable_trace_padding: false, + allow_missing_builtins: None, } } } @@ -69,6 +71,10 @@ pub fn cairo_run_program( .secure_run .unwrap_or(!cairo_run_config.proof_mode); + let allow_missing_builtins = cairo_run_config + .allow_missing_builtins + .unwrap_or(cairo_run_config.proof_mode); + let mut cairo_runner = CairoRunner::new( program, cairo_run_config.layout, @@ -76,7 +82,7 @@ pub fn cairo_run_program( )?; let mut vm = VirtualMachine::new(cairo_run_config.trace_enabled); - let end = cairo_runner.initialize(&mut vm)?; + let end = cairo_runner.initialize(&mut vm, allow_missing_builtins)?; // check step calculation cairo_runner @@ -133,7 +139,12 @@ pub fn cairo_run_fuzzed_program( let mut vm = VirtualMachine::new(cairo_run_config.trace_enabled); - let _end = cairo_runner.initialize(&mut vm)?; + let _end = cairo_runner.initialize( + &mut vm, + cairo_run_config + .allow_missing_builtins + .unwrap_or(cairo_run_config.proof_mode), + )?; let res = match cairo_runner.run_until_steps(steps_limit, &mut vm, hint_executor) { Err(VirtualMachineError::EndOfProgram(_remaining)) => Ok(()), // program ran OK but ended before steps limit @@ -230,7 +241,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(true); let end = cairo_runner - .initialize(&mut vm) + .initialize(&mut vm, false) .map_err(CairoRunError::Runner)?; assert!(cairo_runner @@ -252,7 +263,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_ok()); @@ -372,7 +383,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_ok()); diff --git a/vm/src/hint_processor/builtin_hint_processor/ec_utils.rs b/vm/src/hint_processor/builtin_hint_processor/ec_utils.rs index 08f211b5a8..e3f29091e8 100644 --- a/vm/src/hint_processor/builtin_hint_processor/ec_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/ec_utils.rs @@ -1,5 +1,5 @@ use crate::stdlib::{borrow::Cow, boxed::Box, collections::HashMap, prelude::*}; -use crate::utils::{bigint_to_felt, biguint_to_felt, felt_to_biguint, CAIRO_PRIME}; +use crate::utils::CAIRO_PRIME; use crate::Felt252; use crate::{ hint_processor::{ @@ -144,10 +144,10 @@ pub fn recover_y_hint( let p_x = get_integer_from_var_name("x", vm, ids_data, ap_tracking)?.into_owned(); let p_addr = get_relocatable_from_var_name("p", vm, ids_data, ap_tracking)?; vm.insert_value(p_addr, p_x)?; - let p_y = biguint_to_felt( - &recover_y(&felt_to_biguint(p_x)) + let p_y = Felt252::from( + &recover_y(&p_x.to_biguint()) .ok_or_else(|| HintError::RecoverYPointNotOnCurve(Box::new(p_x)))?, - )?; + ); vm.insert_value((p_addr + 1)?, p_y)?; Ok(()) } @@ -174,8 +174,8 @@ fn random_ec_point_seeded(seed_bytes: Vec) -> Result<(Felt252, Felt252), Hin if let Some(y) = y { // Conversion from BigUint to BigInt doesnt fail return Ok(( - biguint_to_felt(&x)?, - bigint_to_felt(&(y.to_bigint().unwrap() * y_coef))?, + Felt252::from(&x), + Felt252::from(&(y.to_bigint().unwrap() * y_coef)), )); } } @@ -188,7 +188,7 @@ lazy_static! { 10 ) .unwrap(); - static ref FELT_MAX_HALVED: BigUint = felt_to_biguint(Felt252::MAX) / 2_u32; + static ref FELT_MAX_HALVED: BigUint = Felt252::MAX.to_biguint() / 2_u32; } // Recovers the corresponding y coordinate on the elliptic curve @@ -198,7 +198,7 @@ lazy_static! { fn recover_y(x: &BigUint) -> Option { let y_squared: BigUint = x.modpow(&BigUint::from(3_u32), &CAIRO_PRIME) + ALPHA * x + &*BETA; if is_quad_residue(&y_squared) { - Some(felt_to_biguint(biguint_to_felt(&y_squared).ok()?.sqrt()?)) + Some(Felt252::from(&y_squared).sqrt()?.to_biguint()) } else { None } diff --git a/vm/src/hint_processor/builtin_hint_processor/find_element_hint.rs b/vm/src/hint_processor/builtin_hint_processor/find_element_hint.rs index 7837a7ea91..ea00247250 100644 --- a/vm/src/hint_processor/builtin_hint_processor/find_element_hint.rs +++ b/vm/src/hint_processor/builtin_hint_processor/find_element_hint.rs @@ -167,7 +167,7 @@ mod tests { vm.segments.add(); } - let addresses = vec![ + let addresses = [ Relocatable::from((1, 0)), Relocatable::from((1, 1)), Relocatable::from((1, 2)), diff --git a/vm/src/hint_processor/builtin_hint_processor/math_utils.rs b/vm/src/hint_processor/builtin_hint_processor/math_utils.rs index 1265c8ed8f..80c326394b 100644 --- a/vm/src/hint_processor/builtin_hint_processor/math_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/math_utils.rs @@ -3,7 +3,6 @@ use crate::{ math_utils::signed_felt, stdlib::{boxed::Box, collections::HashMap, prelude::*}, types::errors::math_errors::MathError, - utils::{bigint_to_felt, biguint_to_felt, felt_to_bigint, felt_to_biguint}, }; use lazy_static::lazy_static; use num_traits::{Signed, Zero}; @@ -112,8 +111,8 @@ pub fn assert_le_felt( let prime_over_2_high = constants .get(PRIME_OVER_2_HIGH) .ok_or_else(|| HintError::MissingConstant(Box::new(PRIME_OVER_2_HIGH)))?; - let a = felt_to_biguint(*get_integer_from_var_name("a", vm, ids_data, ap_tracking)?); - let b = felt_to_biguint(*get_integer_from_var_name("b", vm, ids_data, ap_tracking)?); + let a = get_integer_from_var_name("a", vm, ids_data, ap_tracking)?.to_biguint(); + let b = get_integer_from_var_name("b", vm, ids_data, ap_tracking)?.to_biguint(); let range_check_ptr = get_ptr_from_var_name("range_check_ptr", vm, ids_data, ap_tracking)?; // TODO: use UnsignedInteger for this @@ -122,8 +121,8 @@ pub fn assert_le_felt( if a > b { return Err(HintError::NonLeFelt252(Box::new(( - biguint_to_felt(&a)?, - biguint_to_felt(&b)?, + Felt252::from(&a), + Felt252::from(&b), )))); } @@ -134,23 +133,23 @@ pub fn assert_le_felt( // TODO: I believe this check can be removed if lengths_and_indices[0].0 > &prime_div3 || lengths_and_indices[1].0 > &prime_div2 { return Err(HintError::ArcTooBig(Box::new(( - biguint_to_felt(&lengths_and_indices[0].0.clone())?, - biguint_to_felt(&prime_div2)?, - biguint_to_felt(&lengths_and_indices[1].0.clone())?, - biguint_to_felt(&prime_div3)?, + Felt252::from(&lengths_and_indices[0].0.clone()), + Felt252::from(&prime_div2), + Felt252::from(&lengths_and_indices[1].0.clone()), + Felt252::from(&prime_div3), )))); } let excluded = lengths_and_indices[2].1; exec_scopes.assign_or_update_variable("excluded", any_box!(Felt252::from(excluded))); - let (q_0, r_0) = (lengths_and_indices[0].0).div_mod_floor(&felt_to_biguint(*prime_over_3_high)); - let (q_1, r_1) = (lengths_and_indices[1].0).div_mod_floor(&felt_to_biguint(*prime_over_2_high)); + let (q_0, r_0) = (lengths_and_indices[0].0).div_mod_floor(&prime_over_3_high.to_biguint()); + let (q_1, r_1) = (lengths_and_indices[1].0).div_mod_floor(&prime_over_2_high.to_biguint()); - vm.insert_value(range_check_ptr, biguint_to_felt(&r_0)?)?; - vm.insert_value((range_check_ptr + 1_i32)?, biguint_to_felt(&q_0)?)?; - vm.insert_value((range_check_ptr + 2_i32)?, biguint_to_felt(&r_1)?)?; - vm.insert_value((range_check_ptr + 3_i32)?, biguint_to_felt(&q_1)?)?; + vm.insert_value(range_check_ptr, Felt252::from(&r_0))?; + vm.insert_value((range_check_ptr + 1_i32)?, Felt252::from(&q_0))?; + vm.insert_value((range_check_ptr + 2_i32)?, Felt252::from(&r_1))?; + vm.insert_value((range_check_ptr + 3_i32)?, Felt252::from(&q_1))?; Ok(()) } @@ -383,7 +382,7 @@ pub fn is_positive( let (sign, abs_value) = value_as_int.into_parts(); //Main logic (assert a is positive) match &range_check_builtin._bound { - Some(bound) if abs_value > felt_to_biguint(*bound) => { + Some(bound) if abs_value > bound.to_biguint() => { return Err(HintError::ValueOutsideValidRange(Box::new( value.into_owned(), ))) @@ -457,7 +456,7 @@ pub fn sqrt( #[allow(deprecated)] insert_value_from_var_name( "root", - biguint_to_felt(&isqrt(&felt_to_biguint(*mod_value))?)?, + Felt252::from(&isqrt(&mod_value.to_biguint())?), vm, ids_data, ap_tracking, @@ -491,22 +490,22 @@ pub fn signed_div_rem( } let int_value = signed_felt(*value); - let int_div = felt_to_bigint(*div); - let int_bound = felt_to_bigint(*bound); + let int_div = div.to_bigint(); + let int_bound = bound.to_bigint(); let (q, r) = int_value.div_mod_floor(&int_div); if int_bound.abs() < q.abs() { return Err(HintError::OutOfValidRange(Box::new(( - bigint_to_felt(&q)?, + Felt252::from(&q), bound.into_owned(), )))); } let biased_q = q + int_bound; - insert_value_from_var_name("r", bigint_to_felt(&r)?, vm, ids_data, ap_tracking)?; + insert_value_from_var_name("r", Felt252::from(&r), vm, ids_data, ap_tracking)?; insert_value_from_var_name( "biased_q", - bigint_to_felt(&biased_q)?, + Felt252::from(&biased_q), vm, ids_data, ap_tracking, @@ -576,12 +575,12 @@ pub fn assert_250_bit( let shift = constants .get(SHIFT) .map_or_else(|| get_constant_from_var_name("SHIFT", constants), Ok)?; - let value = bigint_to_felt(&signed_felt(*get_integer_from_var_name( + let value = Felt252::from(&signed_felt(*get_integer_from_var_name( "value", vm, ids_data, ap_tracking, - )?))?; + )?)); //Main logic if &value > upper_bound { return Err(HintError::ValueOutside250BitRange(Box::new(value))); @@ -625,11 +624,10 @@ pub fn is_addr_bounded( ) -> Result<(), HintError> { let addr = get_integer_from_var_name("addr", vm, ids_data, ap_tracking)?; - let addr_bound = felt_to_biguint( - *constants - .get(ADDR_BOUND) - .ok_or_else(|| HintError::MissingConstant(Box::new(ADDR_BOUND)))?, - ); + let addr_bound = constants + .get(ADDR_BOUND) + .ok_or_else(|| HintError::MissingConstant(Box::new(ADDR_BOUND)))? + .to_biguint(); let lower_bound = BigUint::one() << 250_usize; let upper_bound = BigUint::one() << 251_usize; @@ -650,7 +648,7 @@ pub fn is_addr_bounded( } // Main logic: ids.is_small = 1 if ids.addr < ADDR_BOUND else 0 - let is_small = Felt252::from((addr.as_ref() < &biguint_to_felt(&addr_bound)?) as u8); + let is_small = Felt252::from((addr.as_ref() < &Felt252::from(&addr_bound)) as u8); insert_value_from_var_name("is_small", is_small, vm, ids_data, ap_tracking) } @@ -714,9 +712,8 @@ pub fn is_quad_residue( fn div_prime_by_bound(bound: Felt252) -> Result { let prime: &BigUint = &CAIRO_PRIME; - #[allow(deprecated)] - let limit = prime / felt_to_biguint(bound); - Ok(biguint_to_felt(&limit)?) + let limit = prime / bound.to_biguint(); + Ok(Felt252::from(&limit)) } fn prime_div_constant(bound: u32) -> Result { @@ -780,7 +777,7 @@ pub fn split_xx( ) -> Result<(), HintError> { let xx = Uint256::from_var_name("xx", vm, ids_data, ap_tracking)?; let x_addr = get_relocatable_from_var_name("x", vm, ids_data, ap_tracking)?; - let xx: BigUint = felt_to_biguint(*xx.low) + felt_to_biguint(*xx.high * pow2_const(128)); + let xx: BigUint = xx.low.to_biguint() + (*xx.high * pow2_const(128)).to_biguint(); let mut x = xx.modpow( &(&*SPLIT_XX_PRIME + 3_u32).div_floor(&BigUint::from(8_u32)), &SPLIT_XX_PRIME, @@ -794,9 +791,9 @@ pub fn split_xx( vm.insert_value( x_addr, - biguint_to_felt(&(&x & &BigUint::from(u128::max_value())))?, + Felt252::from(&(&x & &BigUint::from(u128::max_value()))), )?; - vm.insert_value((x_addr + 1)?, biguint_to_felt(&(x >> 128_u32))?)?; + vm.insert_value((x_addr + 1)?, Felt252::from(&(x >> 128_u32)))?; Ok(()) } diff --git a/vm/src/hint_processor/builtin_hint_processor/print.rs b/vm/src/hint_processor/builtin_hint_processor/print.rs index a73f8e8950..12a3e2c1df 100644 --- a/vm/src/hint_processor/builtin_hint_processor/print.rs +++ b/vm/src/hint_processor/builtin_hint_processor/print.rs @@ -12,7 +12,6 @@ use crate::stdlib::collections::HashMap; use crate::types::exec_scope::ExecutionScopes; use crate::types::relocatable::MaybeRelocatable; -use crate::utils::felt_to_bigint; use crate::vm::errors::hint_errors::HintError; use crate::{ hint_processor::hint_processor_definition::HintReference, vm::vm_core::VirtualMachine, @@ -34,7 +33,7 @@ fn print_name( ap_tracking: &ApTracking, ) -> Result<(), HintError> { let name = get_integer_from_var_name("name", vm, ids_data, ap_tracking)?; - let name = String::from_utf8(felt_to_bigint(*name.as_ref()).to_signed_bytes_be()) + let name = String::from_utf8(name.as_ref().to_bigint().to_signed_bytes_be()) .map_err(|err| HintError::CustomHint(err.to_string().into_boxed_str()))?; println!("{name}"); Ok(()) diff --git a/vm/src/hint_processor/builtin_hint_processor/secp/bigint_utils.rs b/vm/src/hint_processor/builtin_hint_processor/secp/bigint_utils.rs index c0e4a6d07a..5b32f4e691 100644 --- a/vm/src/hint_processor/builtin_hint_processor/secp/bigint_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/secp/bigint_utils.rs @@ -3,8 +3,6 @@ use core::ops::Shl; use crate::hint_processor::builtin_hint_processor::uint_utils::{pack, split}; use crate::math_utils::signed_felt; use crate::stdlib::{borrow::Cow, boxed::Box, collections::HashMap, prelude::*}; -use crate::types::errors::math_errors::MathError; -use crate::utils::biguint_to_felt; use crate::Felt252; use crate::{ hint_processor::{ @@ -130,8 +128,8 @@ pub fn nondet_bigint3( .ok_or(HintError::BigIntToBigUintFail)?; let arg: Vec = bigint3_split(&value)? .into_iter() - .map(|ref n| biguint_to_felt(n).map(MaybeRelocatable::from)) - .collect::, MathError>>()?; + .map(|ref n| Felt252::from(n).into()) + .collect::>(); vm.write_arg(res_reloc, &arg).map_err(HintError::Memory)?; Ok(()) } diff --git a/vm/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs b/vm/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs index 700c5778ea..d4dbc3b910 100644 --- a/vm/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/secp/ec_utils.rs @@ -1,4 +1,3 @@ -use crate::utils::{biguint_to_felt, felt_to_biguint}; use crate::Felt252; use crate::{ hint_processor::{ @@ -503,7 +502,7 @@ pub fn n_pair_bits( return Err(HintError::NPairBitsTooLowM); } - let (scalar_v, scalar_u) = (felt_to_biguint(*scalar_v), felt_to_biguint(*scalar_u)); + let (scalar_v, scalar_u) = (scalar_v.to_biguint(), scalar_u.to_biguint()); // Each step, fetches the bits in mth position for v and u, // and appends them to the accumulator. i.e: @@ -512,7 +511,7 @@ pub fn n_pair_bits( // 1010101__ -> 101010110 let get_bit = |x: &BigUint, i| m.checked_sub(i).map(|i| x.bit(i.into())).unwrap_or(false) as u32; - let res: Felt252 = biguint_to_felt( + let res = Felt252::from( &(0..number_of_pairs) .map(|i| { // This code is definitely verbose, but it's the only way I found to avoid a `panic` @@ -527,7 +526,7 @@ pub fn n_pair_bits( acc += x; acc }), - )?; + ); /* ids.quad_bit = ( 8 * ((ids.scalar_v >> ids.m) & 1) diff --git a/vm/src/hint_processor/builtin_hint_processor/secp/field_utils.rs b/vm/src/hint_processor/builtin_hint_processor/secp/field_utils.rs index 8f34b1bead..fb620f6eab 100644 --- a/vm/src/hint_processor/builtin_hint_processor/secp/field_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/secp/field_utils.rs @@ -1,4 +1,3 @@ -use crate::utils::bigint_to_felt; use crate::Felt252; use crate::{ hint_processor::{ @@ -42,7 +41,7 @@ pub fn verify_zero( return Err(HintError::SecpVerifyZero(Box::new(val))); } - insert_value_from_var_name("q", bigint_to_felt(&q)?, vm, ids_data, ap_tracking) + insert_value_from_var_name("q", Felt252::from(&q), vm, ids_data, ap_tracking) } /* @@ -68,7 +67,7 @@ pub fn verify_zero_with_external_const( return Err(HintError::SecpVerifyZero(Box::new(val))); } - insert_value_from_var_name("q", bigint_to_felt(&q)?, vm, ids_data, ap_tracking) + insert_value_from_var_name("q", Felt252::from(&q), vm, ids_data, ap_tracking) } /* diff --git a/vm/src/hint_processor/builtin_hint_processor/secp/signature.rs b/vm/src/hint_processor/builtin_hint_processor/secp/signature.rs index f8000d465b..aee4450cc9 100644 --- a/vm/src/hint_processor/builtin_hint_processor/secp/signature.rs +++ b/vm/src/hint_processor/builtin_hint_processor/secp/signature.rs @@ -1,4 +1,3 @@ -use crate::utils::{felt_to_bigint, felt_to_biguint}; use crate::Felt252; use crate::{ any_box, @@ -111,11 +110,10 @@ pub fn get_point_from_x( ) -> Result<(), HintError> { exec_scopes.insert_value("SECP_P", SECP_P.clone()); #[allow(deprecated)] - let beta = felt_to_bigint( - *constants - .get(BETA) - .ok_or_else(|| HintError::MissingConstant(Box::new(BETA)))?, - ); + let beta = constants + .get(BETA) + .ok_or_else(|| HintError::MissingConstant(Box::new(BETA)))? + .to_bigint(); let x_cube_int = Uint384::from_var_name("x_cube", vm, ids_data, ap_tracking)? .pack86() @@ -125,7 +123,7 @@ pub fn get_point_from_x( let mut y = y_cube_int.modpow(&(&*SECP_P + 1_u32).shr(2_u32), &SECP_P); #[allow(deprecated)] - let v = felt_to_biguint(*get_integer_from_var_name("v", vm, ids_data, ap_tracking)?); + let v = get_integer_from_var_name("v", vm, ids_data, ap_tracking)?.to_bigint(); if v.is_even() != y.is_even() { y = &*SECP_P - y; } diff --git a/vm/src/hint_processor/builtin_hint_processor/uint256_utils.rs b/vm/src/hint_processor/builtin_hint_processor/uint256_utils.rs index 1416fec21d..30fc0d6396 100644 --- a/vm/src/hint_processor/builtin_hint_processor/uint256_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/uint256_utils.rs @@ -1,4 +1,3 @@ -use crate::utils::{biguint_to_felt, felt_to_biguint}; use crate::Felt252; use crate::{ hint_processor::builtin_hint_processor::hint_utils::{ @@ -76,13 +75,13 @@ impl<'a> Uint256<'a> { } pub(crate) fn pack(self) -> BigUint { - (felt_to_biguint(*self.high) << 128) + felt_to_biguint(*self.low) + (self.high.to_biguint() << 128) + self.low.to_biguint() } pub(crate) fn split(num: &BigUint) -> Self { let mask_low: BigUint = u128::MAX.into(); - let low = biguint_to_felt(&(num & mask_low)).unwrap(); - let high = biguint_to_felt(&(num >> 128)).unwrap(); + let low = Felt252::from(&(num & mask_low)); + let high = Felt252::from(&(num >> 128)); Self::from_values(low, high) } } @@ -292,7 +291,7 @@ pub fn uint256_sqrt( )); } - let root = biguint_to_felt(&root)?; + let root = Felt252::from(&root); if only_low { insert_value_from_var_name("root", root, vm, ids_data, ap_tracking)?; @@ -394,8 +393,8 @@ pub fn uint256_offseted_unsigned_div_rem( //ids.remainder.low = remainder & ((1 << 128) - 1) //ids.remainder.high = remainder >> 128 - let a = (felt_to_biguint(*a_high) << 128_u32) + felt_to_biguint(*a_low); - let div = (felt_to_biguint(*div_high) << 128_u32) + felt_to_biguint(*div_low); + let a = (a_high.to_biguint() << 128_u32) + a_low.to_biguint(); + let div = (div_high.to_biguint() << 128_u32) + div_low.to_biguint(); //a and div will always be positive numbers //Then, Rust div_rem equals Python divmod let (quotient, remainder) = div_rem(a, div); @@ -453,9 +452,9 @@ pub fn uint256_mul_div_mod( let div_high = div_high.as_ref(); // Main Logic - let a = felt_to_biguint(*a_high).shl(128_usize) + felt_to_biguint(*a_low); - let b = felt_to_biguint(*b_high).shl(128_usize) + felt_to_biguint(*b_low); - let div = felt_to_biguint(*div_high).shl(128_usize) + felt_to_biguint(*div_low); + let a = a_high.to_biguint().shl(128_usize) + a_low.to_biguint(); + let b = b_high.to_biguint().shl(128_usize) + b_low.to_biguint(); + let div = div_high.to_biguint().shl(128_usize) + div_low.to_biguint(); if div.is_zero() { return Err(MathError::DividedByZero.into()); } @@ -464,32 +463,32 @@ pub fn uint256_mul_div_mod( // ids.quotient_low.low vm.insert_value( quotient_low_addr, - biguint_to_felt(&("ient & &BigUint::from(u128::MAX)))?, + Felt252::from(&("ient & &BigUint::from(u128::MAX))), )?; // ids.quotient_low.high vm.insert_value( (quotient_low_addr + 1)?, - biguint_to_felt(&(("ient).shr(128_u32) & &BigUint::from(u128::MAX)))?, + Felt252::from(&(("ient).shr(128_u32) & &BigUint::from(u128::MAX))), )?; // ids.quotient_high.low vm.insert_value( quotient_high_addr, - biguint_to_felt(&(("ient).shr(256_u32) & &BigUint::from(u128::MAX)))?, + Felt252::from(&(("ient).shr(256_u32) & &BigUint::from(u128::MAX))), )?; // ids.quotient_high.high vm.insert_value( (quotient_high_addr + 1)?, - biguint_to_felt(&(("ient).shr(384_u32)))?, + Felt252::from(&(("ient).shr(384_u32))), )?; //ids.remainder.low vm.insert_value( remainder_addr, - biguint_to_felt(&(&remainder & &BigUint::from(u128::MAX)))?, + Felt252::from(&(&remainder & &BigUint::from(u128::MAX))), )?; //ids.remainder.high vm.insert_value( (remainder_addr + 1)?, - biguint_to_felt(&remainder.shr(128_u32))?, + Felt252::from(&remainder.shr(128_u32)), )?; Ok(()) diff --git a/vm/src/hint_processor/builtin_hint_processor/uint384.rs b/vm/src/hint_processor/builtin_hint_processor/uint384.rs index c7d6ba3465..c3a9f35683 100644 --- a/vm/src/hint_processor/builtin_hint_processor/uint384.rs +++ b/vm/src/hint_processor/builtin_hint_processor/uint384.rs @@ -1,5 +1,5 @@ -use crate::utils::felt_to_biguint; use crate::Felt252; +use num_bigint::BigUint; use num_integer::Integer; use num_traits::Zero; @@ -107,21 +107,31 @@ pub fn add_no_uint384_check( let a = Uint384::from_var_name("a", vm, ids_data, ap_tracking)?; let b = Uint384::from_var_name("b", vm, ids_data, ap_tracking)?; // This hint is not from the cairo commonlib, and its lib can be found under different paths, so we cant rely on a full path name - let shift = felt_to_biguint(*get_constant_from_var_name("SHIFT", constants)?); - - let sum_d0 = felt_to_biguint(*a.limbs[0].as_ref()) + felt_to_biguint(*b.limbs[0].as_ref()); - let carry_d0 = Felt252::from((sum_d0 >= shift) as usize); - let sum_d1 = felt_to_biguint(*a.limbs[1].as_ref()) - + felt_to_biguint(*b.limbs[1].as_ref()) - + felt_to_biguint(carry_d0); - let carry_d1 = Felt252::from((sum_d1 >= shift) as usize); - let sum_d2 = felt_to_biguint(*a.limbs[2].as_ref()) - + felt_to_biguint(*b.limbs[2].as_ref()) - + felt_to_biguint(carry_d1); + let shift = get_constant_from_var_name("SHIFT", constants)?.to_biguint(); + + let sum_d0 = (a.limbs[0].as_ref().to_biguint()) + (b.limbs[0].as_ref().to_biguint()); + let carry_d0 = BigUint::from((sum_d0 >= shift) as usize); + let sum_d1 = + (a.limbs[1].as_ref().to_biguint()) + (b.limbs[1].as_ref().to_biguint()) + &carry_d0; + let carry_d1 = BigUint::from((sum_d1 >= shift) as usize); + let sum_d2 = + (a.limbs[2].as_ref().to_biguint()) + (b.limbs[2].as_ref().to_biguint()) + &carry_d1; let carry_d2 = Felt252::from((sum_d2 >= shift) as usize); - insert_value_from_var_name("carry_d0", carry_d0, vm, ids_data, ap_tracking)?; - insert_value_from_var_name("carry_d1", carry_d1, vm, ids_data, ap_tracking)?; + insert_value_from_var_name( + "carry_d0", + Felt252::from(&carry_d0), + vm, + ids_data, + ap_tracking, + )?; + insert_value_from_var_name( + "carry_d1", + Felt252::from(&carry_d1), + vm, + ids_data, + ap_tracking, + )?; insert_value_from_var_name("carry_d2", carry_d2, vm, ids_data, ap_tracking) } diff --git a/vm/src/hint_processor/builtin_hint_processor/uint_utils.rs b/vm/src/hint_processor/builtin_hint_processor/uint_utils.rs index 7db0b95593..ac2018bd3a 100644 --- a/vm/src/hint_processor/builtin_hint_processor/uint_utils.rs +++ b/vm/src/hint_processor/builtin_hint_processor/uint_utils.rs @@ -1,7 +1,4 @@ -use crate::{ - utils::{biguint_to_felt, felt_to_biguint}, - Felt252, -}; +use crate::Felt252; use num_bigint::BigUint; use num_traits::One; @@ -11,7 +8,7 @@ pub(crate) fn split(num: &BigUint, num_bits_shift: u32) -> [Felt [0; N].map(|_| { let a = &num & bitmask; num >>= num_bits_shift; - biguint_to_felt(&a).unwrap() + Felt252::from(&a) }) } @@ -22,6 +19,6 @@ pub(crate) fn pack( limbs .into_iter() .enumerate() - .map(|(i, limb)| felt_to_biguint(*limb.as_ref()) << (i * num_bits_shift)) + .map(|(i, limb)| limb.as_ref().to_biguint() << (i * num_bits_shift)) .sum() } diff --git a/vm/src/hint_processor/builtin_hint_processor/vrf/inv_mod_p_uint512.rs b/vm/src/hint_processor/builtin_hint_processor/vrf/inv_mod_p_uint512.rs index 8854c15a34..ef8748a1bc 100644 --- a/vm/src/hint_processor/builtin_hint_processor/vrf/inv_mod_p_uint512.rs +++ b/vm/src/hint_processor/builtin_hint_processor/vrf/inv_mod_p_uint512.rs @@ -1,7 +1,7 @@ use crate::hint_processor::builtin_hint_processor::secp::bigint_utils::Uint512; use crate::hint_processor::builtin_hint_processor::uint256_utils::Uint256; use crate::stdlib::prelude::String; -use crate::utils::bigint_to_felt; +use crate::Felt252; use crate::{ hint_processor::hint_processor_definition::HintReference, math_utils::div_mod, serde::deserialize_program::ApTracking, stdlib::collections::HashMap, @@ -38,11 +38,11 @@ pub fn inv_mod_p_uint512( let p = Uint256::from_var_name("p", vm, ids_data, ap_tracking)?.pack(); - let x_inverse_mod_p = bigint_to_felt(&div_mod( + let x_inverse_mod_p = Felt252::from(&div_mod( &BigInt::one(), &BigInt::from(x), &BigInt::from(p), - )?)?; + )?); let x_inverse_mod_p = Uint256::from(x_inverse_mod_p); x_inverse_mod_p.insert_from_var_name("x_inverse_mod_p", vm, ids_data, ap_tracking)?; diff --git a/vm/src/hint_processor/cairo_1_hint_processor/dict_manager.rs b/vm/src/hint_processor/cairo_1_hint_processor/dict_manager.rs index 69a8e77b36..fe04c1f71a 100644 --- a/vm/src/hint_processor/cairo_1_hint_processor/dict_manager.rs +++ b/vm/src/hint_processor/cairo_1_hint_processor/dict_manager.rs @@ -3,6 +3,7 @@ use num_traits::One; use crate::stdlib::collections::HashMap; use crate::stdlib::prelude::*; +use crate::types::relocatable::MaybeRelocatable; use crate::vm::errors::hint_errors::HintError; use crate::Felt252; use crate::{types::relocatable::Relocatable, vm::vm_core::VirtualMachine}; @@ -10,7 +11,7 @@ use crate::{types::relocatable::Relocatable, vm::vm_core::VirtualMachine}; /// Stores the data of a specific dictionary. pub struct DictTrackerExecScope { /// The data of the dictionary. - data: HashMap, + data: HashMap, /// The index of the dictionary in the dict_infos segment. #[allow(dead_code)] idx: usize, @@ -80,13 +81,22 @@ impl DictManagerExecScope { } /// Inserts a value to the dict tracker corresponding to a given pointer to a dict segment. - pub fn insert_to_tracker(&mut self, dict_end: Relocatable, key: Felt252, value: Felt252) { + pub fn insert_to_tracker( + &mut self, + dict_end: Relocatable, + key: Felt252, + value: MaybeRelocatable, + ) { self.get_dict_tracker_mut(dict_end).data.insert(key, value); } /// Gets a value from the dict tracker corresponding to a given pointer to a dict segment. /// None if the key does not exist in the tracker data. - pub fn get_from_tracker(&self, dict_end: Relocatable, key: &Felt252) -> Option { + pub fn get_from_tracker( + &self, + dict_end: Relocatable, + key: &Felt252, + ) -> Option { self.get_dict_tracker(dict_end).ok()?.data.get(key).cloned() } } diff --git a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs index b97107f865..864c6277d1 100644 --- a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs +++ b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor.rs @@ -4,9 +4,7 @@ use crate::any_box; use crate::hint_processor::cairo_1_hint_processor::dict_manager::DictSquashExecScope; use crate::hint_processor::hint_processor_definition::HintReference; use crate::stdlib::{boxed::Box, collections::HashMap, prelude::*}; -use crate::types::relocatable::Relocatable; -use crate::utils::biguint_to_felt; -use crate::utils::felt_to_biguint; +use crate::types::relocatable::{MaybeRelocatable, Relocatable}; use crate::vm::runners::cairo_runner::ResourceTracker; use crate::vm::runners::cairo_runner::RunResources; use crate::Felt252; @@ -278,9 +276,9 @@ impl Cairo1HintProcessor { value: &ResOperand, dst: &CellRef, ) -> Result<(), HintError> { - let value = felt_to_biguint(res_operand_get_val(vm, value)?); + let value = res_operand_get_val(vm, value)?.to_biguint(); let result = value.sqrt(); - vm.insert_value(cell_ref_to_relocatable(dst, vm)?, biguint_to_felt(&result)?) + vm.insert_value(cell_ref_to_relocatable(dst, vm)?, Felt252::from(&result)) .map_err(HintError::from) } @@ -309,7 +307,7 @@ impl Cairo1HintProcessor { ) -> Result<(), HintError> { let a_val = res_operand_get_val(vm, a)?; let b_val = res_operand_get_val(vm, b)?; - let mut lengths_and_indices = vec![ + let mut lengths_and_indices = [ (a_val, 0), (b_val - a_val, 1), (Felt252::from(-1) - b_val, 2), @@ -324,19 +322,19 @@ impl Cairo1HintProcessor { let range_check_ptr = get_ptr(vm, range_check_base, &range_check_offset)?; vm.insert_value( range_check_ptr, - biguint_to_felt(&(felt_to_biguint(lengths_and_indices[0].0) % prime_over_3_high))?, + Felt252::from(&(lengths_and_indices[0].0.to_biguint() % prime_over_3_high)), )?; vm.insert_value( (range_check_ptr + 1)?, - biguint_to_felt(&(felt_to_biguint(lengths_and_indices[0].0) / prime_over_3_high))?, + Felt252::from(&(lengths_and_indices[0].0.to_biguint() / prime_over_3_high)), )?; vm.insert_value( (range_check_ptr + 2)?, - biguint_to_felt(&(felt_to_biguint(lengths_and_indices[1].0) % prime_over_2_high))?, + Felt252::from(&(lengths_and_indices[1].0.to_biguint() % prime_over_2_high)), )?; vm.insert_value( (range_check_ptr + 3)?, - biguint_to_felt(&(felt_to_biguint(lengths_and_indices[1].0) / prime_over_2_high))?, + Felt252::from(&(lengths_and_indices[1].0.to_biguint() / prime_over_2_high)), ) .map_err(HintError::from) } @@ -371,10 +369,10 @@ impl Cairo1HintProcessor { quotient: &CellRef, remainder: &CellRef, ) -> Result<(), HintError> { - let lhs_value = felt_to_biguint(res_operand_get_val(vm, lhs)?); - let rhs_value = felt_to_biguint(res_operand_get_val(vm, rhs)?); - let quotient_value = biguint_to_felt(&(&lhs_value / &rhs_value))?; - let remainder_value = biguint_to_felt(&(lhs_value % rhs_value))?; + let lhs_value = res_operand_get_val(vm, lhs)?.to_biguint(); + let rhs_value = res_operand_get_val(vm, rhs)?.to_biguint(); + let quotient_value = Felt252::from(&(&lhs_value / &rhs_value)); + let remainder_value = Felt252::from(&(lhs_value % rhs_value)); vm.insert_value(cell_ref_to_relocatable(quotient, vm)?, quotient_value)?; vm.insert_value(cell_ref_to_relocatable(remainder, vm)?, remainder_value) .map_err(HintError::from) @@ -412,30 +410,30 @@ impl Cairo1HintProcessor { remainder1: &CellRef, ) -> Result<(), HintError> { let pow_2_128 = BigUint::from(u128::MAX) + 1u32; - let dividend0 = felt_to_biguint(get_val(vm, dividend0)?); - let dividend1 = felt_to_biguint(get_val(vm, dividend1)?); - let divisor0 = felt_to_biguint(get_val(vm, divisor0)?); - let divisor1 = felt_to_biguint(get_val(vm, divisor1)?); + let dividend0 = get_val(vm, dividend0)?.to_biguint(); + let dividend1 = get_val(vm, dividend1)?.to_biguint(); + let divisor0 = get_val(vm, divisor0)?.to_biguint(); + let divisor1 = get_val(vm, divisor1)?.to_biguint(); let dividend: BigUint = dividend0 + dividend1.shl(128); let divisor = divisor0 + divisor1.shl(128); let (quotient, remainder) = dividend.div_rem(&divisor); let (limb1, limb0) = quotient.div_rem(&pow_2_128); vm.insert_value( cell_ref_to_relocatable(quotient0, vm)?, - biguint_to_felt(&limb0)?, + Felt252::from(&limb0), )?; vm.insert_value( cell_ref_to_relocatable(quotient1, vm)?, - biguint_to_felt(&limb1)?, + Felt252::from(&limb1), )?; let (limb1, limb0) = remainder.div_rem(&pow_2_128); vm.insert_value( cell_ref_to_relocatable(remainder0, vm)?, - biguint_to_felt(&limb0)?, + Felt252::from(&limb0), )?; vm.insert_value( cell_ref_to_relocatable(remainder1, vm)?, - biguint_to_felt(&limb1)?, + Felt252::from(&limb1), )?; Ok(()) @@ -462,15 +460,15 @@ impl Cairo1HintProcessor { x: &CellRef, y: &CellRef, ) -> Result<(), HintError> { - let value = felt_to_biguint(res_operand_get_val(vm, value)?); - let scalar = felt_to_biguint(res_operand_get_val(vm, scalar)?); - let max_x = felt_to_biguint(res_operand_get_val(vm, max_x)?); + let value = res_operand_get_val(vm, value)?.to_biguint(); + let scalar = res_operand_get_val(vm, scalar)?.to_biguint(); + let max_x = res_operand_get_val(vm, max_x)?.to_biguint(); let x_value = (&value / &scalar).min(max_x); let y_value = value - &x_value * &scalar; - vm.insert_value(cell_ref_to_relocatable(x, vm)?, biguint_to_felt(&x_value)?) + vm.insert_value(cell_ref_to_relocatable(x, vm)?, Felt252::from(&x_value)) .map_err(HintError::from)?; - vm.insert_value(cell_ref_to_relocatable(y, vm)?, biguint_to_felt(&y_value)?) + vm.insert_value(cell_ref_to_relocatable(y, vm)?, Felt252::from(&y_value)) .map_err(HintError::from)?; Ok(()) @@ -482,7 +480,7 @@ impl Cairo1HintProcessor { x: &CellRef, y: &CellRef, ) -> Result<(), HintError> { - let beta = Fq::from(felt_to_biguint(get_beta())); + let beta = Fq::from(get_beta().to_biguint()); let mut rng = ark_std::test_rng(); let (random_x, random_y_squared) = loop { @@ -502,8 +500,8 @@ impl Cairo1HintProcessor { .into_bigint() .into(); - vm.insert_value(cell_ref_to_relocatable(x, vm)?, biguint_to_felt(&x_bigint)?)?; - vm.insert_value(cell_ref_to_relocatable(y, vm)?, biguint_to_felt(&y_bigint)?)?; + vm.insert_value(cell_ref_to_relocatable(x, vm)?, Felt252::from(&x_bigint))?; + vm.insert_value(cell_ref_to_relocatable(y, vm)?, Felt252::from(&y_bigint))?; Ok(()) } @@ -590,7 +588,11 @@ impl Cairo1HintProcessor { let (dict_base, dict_offset) = extract_buffer(dict_ptr)?; let dict_address = get_ptr(vm, dict_base, &dict_offset)?; let key = res_operand_get_val(vm, key)?; - let value = res_operand_get_val(vm, value)?; + let value = if let ResOperand::Deref(cell) = value { + get_mayberelocatable(vm, cell)? + } else { + MaybeRelocatable::Int(res_operand_get_val(vm, value)?) + }; let dict_manager_exec_scope = exec_scopes.get_mut_ref::("dict_manager_exec_scope")?; @@ -621,12 +623,12 @@ impl Cairo1HintProcessor { remainder1: &CellRef, ) -> Result<(), HintError> { let pow_2_128 = BigUint::from(u128::MAX) + 1u32; - let dividend0 = felt_to_biguint(res_operand_get_val(vm, dividend0)?); - let dividend1 = felt_to_biguint(res_operand_get_val(vm, dividend1)?); - let dividend2 = felt_to_biguint(res_operand_get_val(vm, dividend2)?); - let dividend3 = felt_to_biguint(res_operand_get_val(vm, dividend3)?); - let divisor0 = felt_to_biguint(res_operand_get_val(vm, divisor0)?); - let divisor1 = felt_to_biguint(res_operand_get_val(vm, divisor1)?); + let dividend0 = res_operand_get_val(vm, dividend0)?.to_biguint(); + let dividend1 = res_operand_get_val(vm, dividend1)?.to_biguint(); + let dividend2 = res_operand_get_val(vm, dividend2)?.to_biguint(); + let dividend3 = res_operand_get_val(vm, dividend3)?.to_biguint(); + let divisor0 = res_operand_get_val(vm, divisor0)?.to_biguint(); + let divisor1 = res_operand_get_val(vm, divisor1)?.to_biguint(); let dividend: BigUint = dividend0 + dividend1.shl(128) + dividend2.shl(256) + dividend3.shl(384); let divisor = divisor0 + divisor1.shl(128); @@ -635,33 +637,33 @@ impl Cairo1HintProcessor { vm.insert_value( cell_ref_to_relocatable(quotient0, vm)?, - biguint_to_felt(&limb0)?, + Felt252::from(&limb0), )?; let (quotient, limb1) = quotient.div_rem(&pow_2_128); vm.insert_value( cell_ref_to_relocatable(quotient1, vm)?, - biguint_to_felt(&limb1)?, + Felt252::from(&limb1), )?; let (limb3, limb2) = quotient.div_rem(&pow_2_128); vm.insert_value( cell_ref_to_relocatable(quotient2, vm)?, - biguint_to_felt(&limb2)?, + Felt252::from(&limb2), )?; vm.insert_value( cell_ref_to_relocatable(quotient3, vm)?, - biguint_to_felt(&limb3)?, + Felt252::from(&limb3), )?; let (limb1, limb0) = remainder.div_rem(&pow_2_128); vm.insert_value( cell_ref_to_relocatable(remainder0, vm)?, - biguint_to_felt(&limb0)?, + Felt252::from(&limb0), )?; vm.insert_value( cell_ref_to_relocatable(remainder1, vm)?, - biguint_to_felt(&limb1)?, + Felt252::from(&limb1), )?; Ok(()) @@ -681,8 +683,8 @@ impl Cairo1HintProcessor { ) -> Result<(), HintError> { let pow_2_128 = BigUint::from(u128::MAX) + 1u32; let pow_2_64 = BigUint::from(u64::MAX) + 1u32; - let value_low = felt_to_biguint(res_operand_get_val(vm, value_low)?); - let value_high = felt_to_biguint(res_operand_get_val(vm, value_high)?); + let value_low = res_operand_get_val(vm, value_low)?.to_biguint(); + let value_high = res_operand_get_val(vm, value_high)?.to_biguint(); let value = value_low + value_high * pow_2_128.clone(); let sqrt = value.sqrt(); let remainder = value - sqrt.clone() * sqrt.clone(); @@ -693,22 +695,22 @@ impl Cairo1HintProcessor { let (sqrt1_val, sqrt0_val) = sqrt.div_rem(&pow_2_64); vm.insert_value( cell_ref_to_relocatable(sqrt0, vm)?, - biguint_to_felt(&sqrt0_val)?, + Felt252::from(&sqrt0_val), )?; vm.insert_value( cell_ref_to_relocatable(sqrt1, vm)?, - biguint_to_felt(&sqrt1_val)?, + Felt252::from(&sqrt1_val), )?; let (remainder_high_val, remainder_low_val) = remainder.div_rem(&pow_2_128); vm.insert_value( cell_ref_to_relocatable(remainder_low, vm)?, - biguint_to_felt(&remainder_low_val)?, + Felt252::from(&remainder_low_val), )?; vm.insert_value( cell_ref_to_relocatable(remainder_high, vm)?, - biguint_to_felt(&remainder_high_val)?, + Felt252::from(&remainder_high_val), )?; vm.insert_value( cell_ref_to_relocatable(sqrt_mul_2_minus_remainder_ge_u128, vm)?, @@ -831,7 +833,11 @@ impl Cairo1HintProcessor { let (dict_base, dict_offset) = extract_buffer(dict_ptr)?; let dict_address = get_ptr(vm, dict_base, &dict_offset)?; let key = get_double_deref_val(vm, dict_base, &(dict_offset + Felt252::from(-3)))?; - let value = res_operand_get_val(vm, value)?; + let value: MaybeRelocatable = if let ResOperand::Deref(cell) = value { + get_mayberelocatable(vm, cell)? + } else { + MaybeRelocatable::Int(res_operand_get_val(vm, value)?) + }; let dict_manager_exec_scope = exec_scopes .get_mut_ref::("dict_manager_exec_scope") .map_err(|_| { @@ -1024,7 +1030,7 @@ impl Cairo1HintProcessor { val: &ResOperand, sqrt: &CellRef, ) -> Result<(), HintError> { - let value = Fq::from(felt_to_biguint(res_operand_get_val(vm, val)?)); + let value = Fq::from(res_operand_get_val(vm, val)?.to_biguint()); let three_fq = Fq::from(BigUint::from(3_u32)); let res = if value.legendre().is_qr() { @@ -1036,7 +1042,7 @@ impl Cairo1HintProcessor { if let Some(root) = res.sqrt() { let root0: BigUint = root.into_bigint().into(); let root1: BigUint = (-root).into_bigint().into(); - let root = biguint_to_felt(&core::cmp::min(root0, root1))?; + let root = Felt252::from(&core::cmp::min(root0, root1)); vm.insert_value(cell_ref_to_relocatable(sqrt, vm)?, root) .map_err(HintError::from) } else { @@ -1055,16 +1061,16 @@ impl Cairo1HintProcessor { low: &CellRef, ) -> Result<(), HintError> { let mask128 = BigUint::from(u128::MAX); - let lhs_val = felt_to_biguint(res_operand_get_val(vm, lhs)?); - let rhs_val = felt_to_biguint(res_operand_get_val(vm, rhs)?); + let lhs_val = res_operand_get_val(vm, lhs)?.to_biguint(); + let rhs_val = res_operand_get_val(vm, rhs)?.to_biguint(); let prod = lhs_val * rhs_val; vm.insert_value( cell_ref_to_relocatable(high, vm)?, - biguint_to_felt(&(prod.clone() >> 128))?, + Felt252::from(&(prod.clone() >> 128)), )?; vm.insert_value( cell_ref_to_relocatable(low, vm)?, - biguint_to_felt(&(prod & mask128))?, + Felt252::from(&(prod & mask128)), ) .map_err(HintError::from) } diff --git a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor_utils.rs b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor_utils.rs index f549fc23a3..46abef74e9 100644 --- a/vm/src/hint_processor/cairo_1_hint_processor/hint_processor_utils.rs +++ b/vm/src/hint_processor/cairo_1_hint_processor/hint_processor_utils.rs @@ -1,6 +1,6 @@ use crate::stdlib::prelude::*; +use crate::types::relocatable::MaybeRelocatable; use crate::types::{errors::math_errors::MathError, relocatable::Relocatable}; -use crate::utils::bigint_to_felt; use crate::vm::errors::{hint_errors::HintError, vm_errors::VirtualMachineError}; use crate::vm::vm_core::VirtualMachine; use crate::Felt252; @@ -12,7 +12,7 @@ pub(crate) fn extract_buffer(buffer: &ResOperand) -> Result<(&CellRef, Felt252), ResOperand::Deref(cell) => (cell, 0.into()), ResOperand::BinOp(bin_op) => { if let DerefOrImmediate::Immediate(val) = &bin_op.b { - (&bin_op.a, bigint_to_felt(&val.value)?) + (&bin_op.a, Felt252::from(&val.value)) } else { return Err(HintError::CustomHint( "Failed to extract buffer, expected ResOperand of BinOp type to have Inmediate b value".to_owned().into_boxed_str() @@ -30,6 +30,16 @@ pub(crate) fn extract_buffer(buffer: &ResOperand) -> Result<(&CellRef, Felt252), Ok((cell, base_offset)) } +pub(crate) fn get_mayberelocatable( + vm: &VirtualMachine, + cell: &CellRef, +) -> Result { + let relocatable = cell_ref_to_relocatable(cell, vm)?; + vm.get_maybe(&relocatable).ok_or_else(|| { + VirtualMachineError::InvalidMemoryValueTemporaryAddress(Box::new(relocatable)) + }) +} + /// Fetches the value of `res_operand` from the vm. pub(crate) fn get_val( vm: &VirtualMachine, @@ -40,12 +50,12 @@ pub(crate) fn get_val( ResOperand::DoubleDeref(cell, offset) => { get_double_deref_val(vm, cell, &Felt252::from(*offset as i32)) } - ResOperand::Immediate(x) => Ok(bigint_to_felt(&x.value)?), + ResOperand::Immediate(x) => Ok(Felt252::from(&x.value)), ResOperand::BinOp(op) => { let a = get_cell_val(vm, &op.a)?; let b = match &op.b { DerefOrImmediate::Deref(cell) => get_cell_val(vm, cell)?, - DerefOrImmediate::Immediate(x) => bigint_to_felt(&x.value)?, + DerefOrImmediate::Immediate(x) => Felt252::from(&x.value), }; match op.op { Operation::Add => Ok(a + b), @@ -108,12 +118,12 @@ pub(crate) fn res_operand_get_val( ResOperand::DoubleDeref(cell, offset) => { get_double_deref_val(vm, cell, &Felt252::from(*offset as i32)) } - ResOperand::Immediate(x) => Ok(bigint_to_felt(&x.value)?), + ResOperand::Immediate(x) => Ok(Felt252::from(&x.value)), ResOperand::BinOp(op) => { let a = get_cell_val(vm, &op.a)?; let b = match &op.b { DerefOrImmediate::Deref(cell) => get_cell_val(vm, cell)?, - DerefOrImmediate::Immediate(x) => bigint_to_felt(&x.value)?, + DerefOrImmediate::Immediate(x) => Felt252::from(&x.value), }; match op.op { Operation::Add => Ok(a + b), diff --git a/vm/src/lib.rs b/vm/src/lib.rs index 88415c121c..36509273b3 100644 --- a/vm/src/lib.rs +++ b/vm/src/lib.rs @@ -8,7 +8,6 @@ //! - `with_mimalloc`: Use [`MiMalloc`](https://crates.io/crates/mimalloc) as the program global allocator. //! - `cairo-1-hints`: Enable hints that were introduced in Cairo 1. Not enabled by default. //! - `arbitrary`: Enables implementations of [`arbitrary::Arbitrary`](https://docs.rs/arbitrary/latest/arbitrary/) for some structs. Not enabled by default. -//! - `lambdaworks-felt`: Enables usage of the [**lambdaworks**](https://github.com/lambdaclass/lambdaworks) backend for [`felt::Felt252`]. Not enabled by default. #![cfg_attr(docsrs, feature(doc_cfg))] #![deny(warnings)] diff --git a/vm/src/math_utils/mod.rs b/vm/src/math_utils/mod.rs index 8381869321..c464cb7228 100644 --- a/vm/src/math_utils/mod.rs +++ b/vm/src/math_utils/mod.rs @@ -6,7 +6,7 @@ use core::cmp::min; use crate::stdlib::{boxed::Box, ops::Shr, prelude::Vec}; use crate::types::errors::math_errors::MathError; -use crate::utils::{felt_to_biguint, CAIRO_PRIME}; +use crate::utils::CAIRO_PRIME; use crate::Felt252; use lazy_static::lazy_static; use num_bigint::{BigInt, BigUint, RandBigInt, ToBigInt}; @@ -58,7 +58,7 @@ pub fn pow2_const_nz(n: u32) -> &'static NonZeroFelt { /// ``` pub fn signed_felt(felt: Felt252) -> BigInt { - let biguint = felt_to_biguint(felt); + let biguint = felt.to_biguint(); if biguint > *SIGNED_FELT_MAX { BigInt::from_biguint(num_bigint::Sign::Minus, &*CAIRO_PRIME - &biguint) } else { diff --git a/vm/src/serde/deserialize_utils.rs b/vm/src/serde/deserialize_utils.rs index d66e48e1c7..7462a53cb6 100644 --- a/vm/src/serde/deserialize_utils.rs +++ b/vm/src/serde/deserialize_utils.rs @@ -233,7 +233,7 @@ fn take_until_unbalanced( .ok_or_else(|| Err::Error(Error::from_error_kind(i, ErrorKind::TakeUntil)))? .chars(); match it.next().unwrap_or_default() { - c if c == '\\' => { + '\\' => { // Skip the escape char `\`. index += '\\'.len_utf8(); // Skip also the following char. diff --git a/vm/src/tests/cairo_1_run_from_entrypoint_tests.rs b/vm/src/tests/cairo_1_run_from_entrypoint_tests.rs index 4c5bf3fd50..7f42e94529 100644 --- a/vm/src/tests/cairo_1_run_from_entrypoint_tests.rs +++ b/vm/src/tests/cairo_1_run_from_entrypoint_tests.rs @@ -39,7 +39,7 @@ fn test_uint256_div_mod_hint() { run_cairo_1_entrypoint( program_data.as_slice(), - 104, + 102, &[36_usize.into(), 2_usize.into()], &[Felt252::from(18_usize)], ); diff --git a/vm/src/tests/mod.rs b/vm/src/tests/mod.rs index e30a01214d..bb80958789 100644 --- a/vm/src/tests/mod.rs +++ b/vm/src/tests/mod.rs @@ -47,24 +47,24 @@ mod skip_instruction_test; //For simple programs that should just succeed and have no special needs. //Checks memory holes == 0 -pub(self) fn run_program_simple(data: &[u8]) { +fn run_program_simple(data: &[u8]) { run_program(data, Some("all_cairo"), None, None) } //For simple programs that should just succeed but using small layout. -pub(self) fn run_program_small(data: &[u8]) { +fn run_program_small(data: &[u8]) { run_program(data, Some("small"), None, None) } -pub(self) fn run_program_with_trace(data: &[u8], trace: &[(usize, usize, usize)]) { +fn run_program_with_trace(data: &[u8], trace: &[(usize, usize, usize)]) { run_program(data, Some("all_cairo"), Some(trace), None) } -pub(self) fn run_program_with_error(data: &[u8], error: &str) { +fn run_program_with_error(data: &[u8], error: &str) { run_program(data, Some("all_cairo"), None, Some(error)) } -pub(self) fn run_program( +fn run_program( data: &[u8], layout: Option<&str>, trace: Option<&[(usize, usize, usize)]>, @@ -101,7 +101,7 @@ pub(self) fn run_program( #[cfg(feature = "cairo-1-hints")] // Runs a contract entrypoint with given arguments and checks its return values // Doesn't use a syscall_handler -pub(self) fn run_cairo_1_entrypoint( +fn run_cairo_1_entrypoint( program_content: &[u8], entrypoint_offset: usize, args: &[MaybeRelocatable], @@ -207,7 +207,7 @@ pub(self) fn run_cairo_1_entrypoint( #[cfg(feature = "cairo-1-hints")] /// Equals to fn run_cairo_1_entrypoint /// But with run_resources as an input -pub(self) fn run_cairo_1_entrypoint_with_run_resources( +fn run_cairo_1_entrypoint_with_run_resources( contract_class: CasmContractClass, entrypoint_offset: usize, hint_processor: &mut Cairo1HintProcessor, diff --git a/vm/src/types/program.rs b/vm/src/types/program.rs index 9601aee445..80747d80cf 100644 --- a/vm/src/types/program.rs +++ b/vm/src/types/program.rs @@ -13,8 +13,6 @@ use crate::{ #[cfg(feature = "cairo-1-hints")] use crate::serde::deserialize_program::{ApTracking, FlowTrackingData}; -#[cfg(feature = "cairo-1-hints")] -use crate::utils::biguint_to_felt; use crate::utils::PRIME_STR; use crate::Felt252; use crate::{ @@ -406,7 +404,7 @@ impl TryFrom for Program { let data = value .bytecode .iter() - .map(|x| MaybeRelocatable::from(biguint_to_felt(&x.value).unwrap_or_default())) + .map(|x| MaybeRelocatable::from(Felt252::from(&x.value))) .collect(); //Hint data is going to be hosted processor-side, hints field will only store the pc where hints are located. // Only one pc will be stored, so the hint processor will be responsible for executing all hints for a given pc diff --git a/vm/src/utils.rs b/vm/src/utils.rs index 7627779754..eeeec33894 100644 --- a/vm/src/utils.rs +++ b/vm/src/utils.rs @@ -1,9 +1,7 @@ +use crate::stdlib::prelude::*; use crate::types::relocatable::Relocatable; -use crate::{stdlib::prelude::*, types::errors::math_errors::MathError}; -use core::ops::Neg; use lazy_static::lazy_static; -use num_bigint::{BigInt, BigUint, Sign, ToBigInt}; -use num_integer::Integer; +use num_bigint::BigUint; use num_traits::Num; pub const PRIME_STR: &str = "0x800000000000011000000000000000000000000000000000000000000000001"; @@ -51,36 +49,6 @@ pub fn from_relocatable_to_indexes(relocatable: Relocatable) -> (usize, usize) { } } -pub fn felt_to_biguint(felt: crate::Felt252) -> BigUint { - let big_digits = felt - .to_le_digits() - .into_iter() - .flat_map(|limb| [limb as u32, (limb >> 32) as u32]) - .collect(); - BigUint::new(big_digits) -} - -pub fn felt_to_bigint(felt: crate::Felt252) -> BigInt { - felt_to_biguint(felt).to_bigint().unwrap() -} - -pub fn biguint_to_felt(biguint: &BigUint) -> Result { - // TODO This funtions should return a Felt252 instead of a Result - Ok(crate::Felt252::from_bytes_le_slice(&biguint.to_bytes_le())) -} - -pub fn bigint_to_felt(bigint: &BigInt) -> Result { - let (sign, bytes) = bigint - .mod_floor(&CAIRO_PRIME.to_bigint().unwrap()) - .to_bytes_le(); - let felt = crate::Felt252::from_bytes_le_slice(&bytes); - if sign == Sign::Minus { - Ok(felt.neg()) - } else { - Ok(felt) - } -} - #[cfg(test)] #[macro_use] pub mod test_utils { diff --git a/vm/src/vm/errors/vm_exception.rs b/vm/src/vm/errors/vm_exception.rs index 6e4e762ef4..f8ab67088c 100644 --- a/vm/src/vm/errors/vm_exception.rs +++ b/vm/src/vm/errors/vm_exception.rs @@ -659,7 +659,7 @@ mod test { let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -673,7 +673,7 @@ mod test { let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -711,7 +711,7 @@ cairo_programs/bad_programs/bad_usort.cairo:64:5: (pc=0:60) let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -870,7 +870,7 @@ cairo_programs/bad_programs/bad_range_check.cairo:11:5: (pc=0:6) let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); let error = cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .unwrap_err(); @@ -915,7 +915,7 @@ cairo_programs/bad_programs/bad_usort.cairo:64:5: (pc=0:60) let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); let error = cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .unwrap_err(); @@ -954,7 +954,7 @@ cairo_programs/bad_programs/ec_recover_product_mod_m_zero.cairo:11:5: (pc=0:18) let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); let error = cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .unwrap_err(); @@ -993,7 +993,7 @@ cairo_programs/bad_programs/ec_recover_div_mod_n_packed_n_zero.cairo:11:5: (pc=0 let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); let error = cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .unwrap_err(); @@ -1032,7 +1032,7 @@ cairo_programs/bad_programs/uint512_unsigned_div_rem_div_is_zero.cairo:15:2: (pc let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); let error = cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .unwrap_err(); @@ -1069,7 +1069,7 @@ cairo_programs/bad_programs/uint256_sub_b_gt_256.cairo:10:2: (pc=0:12) let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); let error = cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .unwrap_err(); diff --git a/vm/src/vm/hooks.rs b/vm/src/vm/hooks.rs index d2f88e7eb7..13c7bb86ce 100644 --- a/vm/src/vm/hooks.rs +++ b/vm/src/vm/hooks.rs @@ -131,7 +131,7 @@ mod tests { let mut vm = vm!(); vm.hooks = Hooks::new(None, None, None); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_ok()); @@ -179,7 +179,7 @@ mod tests { let mut vm = vm!(); vm.hooks = Hooks::new(Some(Arc::new(before_first_step_hook)), None, None); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -190,7 +190,7 @@ mod tests { let mut vm = vm!(); vm.hooks = Hooks::new(None, Some(Arc::new(pre_step_hook)), None); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -201,7 +201,7 @@ mod tests { let mut vm = vm!(); vm.hooks = Hooks::new(None, None, Some(Arc::new(post_step_hook))); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -252,7 +252,7 @@ mod tests { Some(Arc::new(post_step_hook)), ); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_ok()); diff --git a/vm/src/vm/runners/builtin_runner/bitwise.rs b/vm/src/vm/runners/builtin_runner/bitwise.rs index 825aab3942..ca9e1e01cc 100644 --- a/vm/src/vm/runners/builtin_runner/bitwise.rs +++ b/vm/src/vm/runners/builtin_runner/bitwise.rs @@ -77,7 +77,8 @@ impl BitwiseBuiltinRunner { let x_addr = (address - index)?; let y_addr = (x_addr + 1_usize)?; - let (Ok(num_x), Ok(num_y)) = (memory.get_integer(x_addr), memory.get_integer(y_addr)) else { + let (Ok(num_x), Ok(num_y)) = (memory.get_integer(x_addr), memory.get_integer(y_addr)) + else { return Ok(None); }; @@ -393,7 +394,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -438,7 +439,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/builtin_runner/ec_op.rs b/vm/src/vm/runners/builtin_runner/ec_op.rs index c824f0153d..37ec430e12 100644 --- a/vm/src/vm/runners/builtin_runner/ec_op.rs +++ b/vm/src/vm/runners/builtin_runner/ec_op.rs @@ -464,7 +464,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -509,7 +509,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/builtin_runner/hash.rs b/vm/src/vm/runners/builtin_runner/hash.rs index f8e8fbe333..3ec2aabf27 100644 --- a/vm/src/vm/runners/builtin_runner/hash.rs +++ b/vm/src/vm/runners/builtin_runner/hash.rs @@ -381,7 +381,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -425,7 +425,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/builtin_runner/keccak.rs b/vm/src/vm/runners/builtin_runner/keccak.rs index 244efa866d..17e6e3d638 100644 --- a/vm/src/vm/runners/builtin_runner/keccak.rs +++ b/vm/src/vm/runners/builtin_runner/keccak.rs @@ -421,7 +421,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/builtin_runner/mod.rs b/vm/src/vm/runners/builtin_runner/mod.rs index 99778c6333..78eed172a2 100644 --- a/vm/src/vm/runners/builtin_runner/mod.rs +++ b/vm/src/vm/runners/builtin_runner/mod.rs @@ -826,7 +826,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -873,7 +873,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -917,7 +917,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -961,7 +961,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/builtin_runner/output.rs b/vm/src/vm/runners/builtin_runner/output.rs index 1e3bfe3ad4..c774bb330d 100644 --- a/vm/src/vm/runners/builtin_runner/output.rs +++ b/vm/src/vm/runners/builtin_runner/output.rs @@ -114,6 +114,10 @@ impl OutputBuiltinRunner { attributes: HashMap::default(), }) } + + pub(crate) fn set_stop_ptr_offset(&mut self, offset: usize) { + self.stop_ptr = Some(offset) + } } impl Default for OutputBuiltinRunner { diff --git a/vm/src/vm/runners/builtin_runner/poseidon.rs b/vm/src/vm/runners/builtin_runner/poseidon.rs index a668ba324b..3bc28ab228 100644 --- a/vm/src/vm/runners/builtin_runner/poseidon.rs +++ b/vm/src/vm/runners/builtin_runner/poseidon.rs @@ -365,7 +365,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -409,7 +409,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/builtin_runner/range_check.rs b/vm/src/vm/runners/builtin_runner/range_check.rs index ba07f6f253..68809b8752 100644 --- a/vm/src/vm/runners/builtin_runner/range_check.rs +++ b/vm/src/vm/runners/builtin_runner/range_check.rs @@ -379,7 +379,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) @@ -423,7 +423,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); - let address = cairo_runner.initialize(&mut vm).unwrap(); + let address = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(address, &mut vm, &mut hint_processor) diff --git a/vm/src/vm/runners/cairo_pie.rs b/vm/src/vm/runners/cairo_pie.rs index a768893d02..5e3aba9571 100644 --- a/vm/src/vm/runners/cairo_pie.rs +++ b/vm/src/vm/runners/cairo_pie.rs @@ -186,6 +186,7 @@ mod serde_impl { seq_serializer.end() } + #[allow(clippy::format_collect)] pub fn serialize_memory( values: &[((usize, usize), MaybeRelocatable)], serializer: S, diff --git a/vm/src/vm/runners/cairo_runner.rs b/vm/src/vm/runners/cairo_runner.rs index 82fa3bcb30..cadc1d02ba 100644 --- a/vm/src/vm/runners/cairo_runner.rs +++ b/vm/src/vm/runners/cairo_runner.rs @@ -228,15 +228,27 @@ impl CairoRunner { } } - pub fn initialize(&mut self, vm: &mut VirtualMachine) -> Result { - self.initialize_builtins(vm)?; + pub fn initialize( + &mut self, + vm: &mut VirtualMachine, + allow_missing_builtins: bool, + ) -> Result { + self.initialize_builtins(vm, allow_missing_builtins)?; self.initialize_segments(vm, None); let end = self.initialize_main_entrypoint(vm)?; self.initialize_vm(vm)?; Ok(end) } - pub fn initialize_builtins(&self, vm: &mut VirtualMachine) -> Result<(), RunnerError> { + /// Creates the builtin runners according to the builtins used by the program and the selected layout + /// When running in proof_mode, all builtins in the layout will be created, and only those in the program will be included + /// When not running in proof_mode, only program builtins will be created and included + /// Unless `allow_missing_builtins` is set to true, an error will be returned if a builtin is included in the program but not on the layout + pub fn initialize_builtins( + &self, + vm: &mut VirtualMachine, + allow_missing_builtins: bool, + ) -> Result<(), RunnerError> { let builtin_ordered_list = vec![ BuiltinName::output, BuiltinName::pedersen, @@ -316,7 +328,7 @@ impl CairoRunner { .push(PoseidonBuiltinRunner::new(instance_def.ratio, included).into()); } } - if !program_builtins.is_empty() { + if !program_builtins.is_empty() && !allow_missing_builtins { return Err(RunnerError::NoBuiltinForInstance(Box::new(( program_builtins.iter().map(|n| n.name()).collect(), self.layout._name.clone(), @@ -429,8 +441,7 @@ impl CairoRunner { offset: prog_base.offset + entrypoint, }; self.initial_pc = Some(initial_pc); - vm.segments - .load_data(prog_base, &self.program.shared_program_data.data) + vm.load_data(prog_base, &self.program.shared_program_data.data) .map_err(RunnerError::MemoryInitializationError)?; // Mark all addresses from the program segment as accessed @@ -1564,7 +1575,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn check_memory_usage_ok_case() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::range_check, BuiltinName::output]; let cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1600,26 +1610,36 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_builtins_with_disordered_builtins() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::range_check, BuiltinName::output]; - let cairo_runner = cairo_runner!(program); + let cairo_runner = cairo_runner!(program, "plain"); let mut vm = vm!(); - assert!(cairo_runner.initialize_builtins(&mut vm).is_err()); + assert!(cairo_runner.initialize_builtins(&mut vm, false).is_err()); } #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] - fn create_cairo_runner_with_ordered_but_missing_builtins() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined + fn initialize_builtins_missing_builtins_no_allow_missing() { let program = program![BuiltinName::output, BuiltinName::ecdsa]; - //We only check that the creation doesnt panic - let _cairo_runner = cairo_runner!(program); + let cairo_runner = cairo_runner!(program, "plain"); + let mut vm = vm!(); + assert_matches!( + cairo_runner.initialize_builtins(&mut vm, false), + Err(RunnerError::NoBuiltinForInstance(_)) + ) + } + + #[test] + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] + fn initialize_builtins_missing_builtins_allow_missing() { + let program = program![BuiltinName::output, BuiltinName::ecdsa]; + let cairo_runner = cairo_runner!(program); + let mut vm = vm!(); + assert!(cairo_runner.initialize_builtins(&mut vm, true).is_ok()) } #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_segments_with_base() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1628,7 +1648,7 @@ mod tests { offset: 9, }); add_segments!(vm, 6); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, program_base); assert_eq!( cairo_runner.program_base, @@ -1653,11 +1673,10 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_segments_no_base() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); assert_eq!( cairo_runner.program_base, @@ -1682,14 +1701,13 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_state_empty_data_and_stack() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); cairo_runner.program_base = Some(relocatable!(1, 0)); cairo_runner.execution_base = Some(relocatable!(2, 0)); let stack = Vec::new(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_state(&mut vm, 1, stack).unwrap(); assert_eq!( cairo_runner.initial_pc, @@ -1703,7 +1721,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_state_some_data_empty_stack() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program!( builtins = vec![BuiltinName::output], data = vec_data!((4), (6)), @@ -1726,7 +1743,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_state_empty_data_some_stack() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1743,7 +1759,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_state_no_program_base() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1764,7 +1779,6 @@ mod tests { #[test] #[should_panic] fn initialize_state_no_execution_base() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1782,7 +1796,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_function_entrypoint_empty_stack() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1804,7 +1817,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_function_entrypoint_some_stack() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1831,7 +1843,6 @@ mod tests { #[test] #[should_panic] fn initialize_function_entrypoint_no_execution_base() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1845,7 +1856,6 @@ mod tests { #[test] #[should_panic] fn initialize_main_entrypoint_no_main() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1855,7 +1865,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_main_entrypoint() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program!(main = Some(1),); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1880,7 +1889,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize(&mut vm).unwrap(); + cairo_runner.initialize(&mut vm, false).unwrap(); assert_eq!( vm.segments .memory @@ -1892,7 +1901,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_vm_no_builtins() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program!(main = Some(1),); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -1909,14 +1917,13 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_vm_with_range_check_valid() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program!(builtins = vec![BuiltinName::range_check], main = Some(1),); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); cairo_runner.initial_pc = Some(relocatable!(0, 1)); cairo_runner.initial_ap = Some(relocatable!(1, 2)); cairo_runner.initial_fp = Some(relocatable!(1, 2)); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); vm.segments = segments![((2, 0), 23), ((2, 1), 233)]; assert_eq!(vm.builtin_runners[0].name(), RANGE_CHECK_BUILTIN_NAME); @@ -1938,14 +1945,13 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn initialize_vm_with_range_check_invalid() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program!(builtins = vec![BuiltinName::range_check], main = Some(1),); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); cairo_runner.initial_pc = Some(relocatable!(0, 1)); cairo_runner.initial_ap = Some(relocatable!(1, 2)); cairo_runner.initial_fp = Some(relocatable!(1, 2)); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); vm.segments = segments![((2, 1), 23), ((2, 4), (-1))]; @@ -2069,7 +2075,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -2158,7 +2164,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -2323,7 +2329,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -2438,7 +2444,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -2577,7 +2583,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -2815,7 +2821,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -2954,7 +2960,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -3074,7 +3080,7 @@ mod tests { let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); assert_eq!(vm.builtin_runners[0].name(), OUTPUT_BUILTIN_NAME); assert_eq!(vm.builtin_runners[0].base(), 2); @@ -3129,7 +3135,7 @@ mod tests { ); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -3170,7 +3176,7 @@ mod tests { ); let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let end = cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); cairo_runner.initialize_vm(&mut vm).unwrap(); @@ -3192,7 +3198,7 @@ mod tests { let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); assert_eq!(vm.builtin_runners[0].name(), OUTPUT_BUILTIN_NAME); assert_eq!(vm.builtin_runners[0].base(), 2); @@ -3246,7 +3252,7 @@ mod tests { let mut vm = vm!(); cairo_runner - .initialize_builtins(&mut vm) + .initialize_builtins(&mut vm, false) .expect("Couldn't initialize builtins."); // Swap the first and second builtins (first should be `output`). @@ -3284,7 +3290,7 @@ mod tests { ]; let cairo_runner = cairo_runner!(program); let mut vm = vm!(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); assert_eq!(vm.builtin_runners[0].name(), OUTPUT_BUILTIN_NAME); assert_eq!(vm.builtin_runners[1].name(), HASH_BUILTIN_NAME); assert_eq!(vm.builtin_runners[2].name(), RANGE_CHECK_BUILTIN_NAME); @@ -3342,7 +3348,7 @@ mod tests { let mut cairo_runner = cairo_runner!(&program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); @@ -3366,7 +3372,7 @@ mod tests { let mut cairo_runner = cairo_runner!(&program); let mut vm = vm!(true); assert_matches!( - cairo_runner.initialize(&mut vm), + cairo_runner.initialize(&mut vm, false), Err(RunnerError::MissingMain) ); } @@ -3421,7 +3427,7 @@ mod tests { let mut cairo_runner = cairo_runner!(&program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); @@ -3494,7 +3500,7 @@ mod tests { let mut cairo_runner = cairo_runner!(&program); let mut vm = vm!(true); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); cairo_runner.initialize_main_entrypoint(&mut vm).unwrap(); @@ -3766,7 +3772,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program, "all_cairo", true); let mut vm = vm!(true); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .expect("Call to `CairoRunner::run_until_pc()` failed."); @@ -4181,7 +4187,6 @@ mod tests { #[test] #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test)] fn get_initial_fp_can_be_obtained() { - //This test works with basic Program definition, will later be updated to use Program::new() when fully defined let program = program![BuiltinName::output]; let mut cairo_runner = cairo_runner!(program); let mut vm = vm!(); @@ -4447,7 +4452,7 @@ mod tests { let mut vm = vm!(); let cairo_runner = cairo_runner!(program, "plain"); assert_eq!( - cairo_runner.initialize_builtins(&mut vm), + cairo_runner.initialize_builtins(&mut vm, false), Err(RunnerError::NoBuiltinForInstance(Box::new(( HashSet::from([BuiltinName::output.name()]), String::from("plain") @@ -4462,7 +4467,7 @@ mod tests { let mut vm = vm!(); let cairo_runner = cairo_runner!(program, "plain"); assert_eq!( - cairo_runner.initialize_builtins(&mut vm), + cairo_runner.initialize_builtins(&mut vm, false), Err(RunnerError::NoBuiltinForInstance(Box::new(( HashSet::from([BuiltinName::output.name(), HASH_BUILTIN_NAME]), String::from("plain") @@ -4477,7 +4482,7 @@ mod tests { let mut vm = vm!(); let cairo_runner = cairo_runner!(program, "small"); assert_eq!( - cairo_runner.initialize_builtins(&mut vm), + cairo_runner.initialize_builtins(&mut vm, false), Err(RunnerError::NoBuiltinForInstance(Box::new(( HashSet::from([BuiltinName::bitwise.name()]), String::from("small") @@ -4515,7 +4520,7 @@ mod tests { let mut runner = cairo_runner!(program); runner.runner_mode = RunnerMode::ProofModeCanonical; let mut vm = vm!(); - runner.initialize_builtins(&mut vm).unwrap(); + runner.initialize_builtins(&mut vm, false).unwrap(); runner.initialize_segments(&mut vm, None); assert_eq!(runner.execution_base, Some(Relocatable::from((1, 0)))); assert_eq!(runner.program_base, Some(Relocatable::from((0, 0)))); @@ -4851,7 +4856,7 @@ mod tests { .pc .unwrap(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); assert_matches!( cairo_runner.run_from_entrypoint( @@ -4872,7 +4877,9 @@ mod tests { let mut new_vm = vm!(true); //this true expression dictates that the trace is enabled let mut hint_processor = BuiltinHintProcessor::new_empty(); - new_cairo_runner.initialize_builtins(&mut new_vm).unwrap(); + new_cairo_runner + .initialize_builtins(&mut new_vm, false) + .unwrap(); new_cairo_runner.initialize_segments(&mut new_vm, None); let fib_entrypoint = program @@ -5039,7 +5046,7 @@ mod tests { .pc .unwrap(); - cairo_runner.initialize_builtins(&mut vm).unwrap(); + cairo_runner.initialize_builtins(&mut vm, false).unwrap(); cairo_runner.initialize_segments(&mut vm, None); let result = cairo_runner.run_from_entrypoint( @@ -5072,7 +5079,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); runner .run_until_pc(end, &mut vm, &mut BuiltinHintProcessor::new_empty()) .unwrap(); @@ -5095,7 +5102,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); runner .run_until_pc(end, &mut vm, &mut BuiltinHintProcessor::new_empty()) .unwrap(); @@ -5118,7 +5125,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); runner .run_until_pc(end, &mut vm, &mut BuiltinHintProcessor::new_empty()) .unwrap(); @@ -5142,7 +5149,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); runner .run_until_pc(end, &mut vm, &mut BuiltinHintProcessor::new_empty()) .unwrap(); @@ -5230,7 +5237,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); // program takes 80 steps assert_matches!( @@ -5249,7 +5256,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); let mut hint_processor = BuiltinHintProcessor::new(HashMap::new(), RunResources::new(81)); // program takes 81 steps assert_matches!( @@ -5270,7 +5277,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); let mut hint_processor = BuiltinHintProcessor::new(HashMap::new(), RunResources::new(80)); // program takes 80 steps assert_matches!( @@ -5291,7 +5298,7 @@ mod tests { .unwrap(); let mut runner = cairo_runner!(program); let mut vm = vm!(); - let end = runner.initialize(&mut vm).unwrap(); + let end = runner.initialize(&mut vm, false).unwrap(); let mut hint_processor = BuiltinHintProcessor::new(HashMap::new(), RunResources::new(9)); // program takes 9 steps assert_matches!( diff --git a/vm/src/vm/security.rs b/vm/src/vm/security.rs index a18e43421a..2749fcf154 100644 --- a/vm/src/vm/security.rs +++ b/vm/src/vm/security.rs @@ -120,7 +120,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.segments.compute_effective_sizes(); assert_matches!(verify_secure_runner(&runner, true, None, &mut vm), Ok(())); } @@ -133,7 +133,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.segments = segments![((0, 0), 100)]; vm.segments.segment_used_sizes = Some(vec![1]); @@ -152,7 +152,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.segments = segments![((0, 0), 100)]; vm.segments.segment_used_sizes = Some(vec![1]); @@ -170,7 +170,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.builtin_runners[0].set_stop_ptr(0); vm.segments.memory = memory![((2, 0), 1)]; vm.segments.segment_used_sizes = Some(vec![0, 0, 0, 0]); @@ -188,7 +188,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); let mut hint_processor = BuiltinHintProcessor::new_empty(); runner .end_run(false, false, &mut vm, &mut hint_processor) @@ -217,7 +217,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.segments.memory = memory![ ((0, 0), (1, 0)), ((0, 1), (2, 1)), @@ -245,7 +245,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.segments.memory = memory![ ((0, 1), (1, 0)), ((0, 2), (2, 1)), @@ -273,7 +273,7 @@ mod test { let mut runner = cairo_runner!(program); let mut vm = vm!(); - runner.initialize(&mut vm).unwrap(); + runner.initialize(&mut vm, false).unwrap(); vm.segments.memory = memory![ ((0, 0), (1, 0)), ((0, 1), (2, 1)), diff --git a/vm/src/vm/vm_core.rs b/vm/src/vm/vm_core.rs index 38be9b1281..4dc6be0dcd 100644 --- a/vm/src/vm/vm_core.rs +++ b/vm/src/vm/vm_core.rs @@ -1082,8 +1082,12 @@ impl VirtualMachine { pub fn builtins_final_stack_from_stack_pointer_dict( &mut self, builtin_name_to_stack_pointer: &HashMap<&'static str, Relocatable>, + skip_output: bool, ) -> Result<(), RunnerError> { for builtin in self.builtin_runners.iter_mut() { + if matches!(builtin, BuiltinRunner::Output(_)) && skip_output { + continue; + } builtin.final_stack( &self.segments, builtin_name_to_stack_pointer @@ -1094,6 +1098,13 @@ impl VirtualMachine { } Ok(()) } + + #[doc(hidden)] + pub fn set_output_stop_ptr_offset(&mut self, offset: usize) { + if let Some(BuiltinRunner::Output(builtin)) = self.builtin_runners.first_mut() { + builtin.set_stop_ptr_offset(offset) + } + } } pub struct VirtualMachineBuilder { @@ -4255,7 +4266,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -4280,7 +4291,7 @@ mod tests { let mut cairo_runner = cairo_runner!(program, "all_cairo", false); let mut vm = vm!(); - let end = cairo_runner.initialize(&mut vm).unwrap(); + let end = cairo_runner.initialize(&mut vm, false).unwrap(); assert!(cairo_runner .run_until_pc(end, &mut vm, &mut hint_processor) .is_err()); @@ -4367,7 +4378,7 @@ mod tests { let mut hint_processor = BuiltinHintProcessor::new_empty(); let mut cairo_runner = cairo_runner!(program); let end = cairo_runner - .initialize(&mut virtual_machine_from_builder) + .initialize(&mut virtual_machine_from_builder, false) .unwrap(); assert!(cairo_runner diff --git a/vm/src/vm/vm_memory/memory.rs b/vm/src/vm/vm_memory/memory.rs index 6a3db35086..f50d5c11cd 100644 --- a/vm/src/vm/vm_memory/memory.rs +++ b/vm/src/vm/vm_memory/memory.rs @@ -551,7 +551,7 @@ impl fmt::Display for Memory { } } } - writeln!(f, "}}") + Ok(()) } } @@ -1424,7 +1424,7 @@ mod memory_tests { assert_eq!( format!("{}", memory), - "(-1,0) : -1:0\n(-1,1) : 8\n(-1,2) : 9\n(0,0) : 1\n(0,1) : -1:0\n(0,2) : 3\n(1,0) : -1:1\n(1,1) : 5\n(1,2) : -1:2\n}\n"); + "(-1,0) : -1:0\n(-1,1) : 8\n(-1,2) : 9\n(0,0) : 1\n(0,1) : -1:0\n(0,2) : 3\n(1,0) : -1:1\n(1,1) : 5\n(1,2) : -1:2\n"); } #[test] diff --git a/vm/src/vm/vm_memory/memory_segments.rs b/vm/src/vm/vm_memory/memory_segments.rs index 58e65589c1..cabba6266b 100644 --- a/vm/src/vm/vm_memory/memory_segments.rs +++ b/vm/src/vm/vm_memory/memory_segments.rs @@ -1,3 +1,5 @@ +use core::fmt; + use crate::stdlib::prelude::*; use crate::stdlib::{any::Any, collections::HashMap}; use crate::vm::runners::cairo_runner::CairoArg; @@ -269,6 +271,28 @@ impl Default for MemorySegmentManager { } } +impl fmt::Display for MemorySegmentManager { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + writeln!(f, "Memory:\n{}", self.memory)?; + if let Some(used_sizes) = &self.segment_used_sizes { + writeln!(f, "Segment Info:")?; + for (index, used_size) in used_sizes.iter().enumerate() { + writeln!( + f, + "Segment Number: {}, Used Size: {}, Size {}", + index, + used_size, + self.segment_sizes + .get(&index) + .map(|n| n.to_string()) + .unwrap_or(String::from("None")) + )?; + } + } + Ok(()) + } +} + #[cfg(test)] mod tests { use super::*;