diff --git a/.cargo/config.toml b/.cargo/config.toml
deleted file mode 100644
index 485a76e8b0f..00000000000
--- a/.cargo/config.toml
+++ /dev/null
@@ -1,18 +0,0 @@
-[env]
-# Enforce native_blockifier linking with pypy3.9.
-PYO3_PYTHON = "/usr/local/bin/pypy3.9"
-# Increase Rust stack size.
-# This should be large enough for `MAX_ENTRY_POINT_RECURSION_DEPTH` recursive entry point calls.
-RUST_MIN_STACK = "4194304" # 4 MiB
-
-[target.x86_64-apple-darwin]
-rustflags = [
- "-C", "link-arg=-undefined",
- "-C", "link-arg=dynamic_lookup",
- ]
-
-[target.aarch64-apple-darwin]
-rustflags = [
- "-C", "link-arg=-undefined",
- "-C", "link-arg=dynamic_lookup",
-]
diff --git a/.clippy.toml b/.clippy.toml
deleted file mode 100644
index ada6ea9b7e7..00000000000
--- a/.clippy.toml
+++ /dev/null
@@ -1,3 +0,0 @@
-# Place configuration for clippy lints here, when applicable (lints that can be configured
-# state so in clippy's documentation).
-# Note: only lint configurations can be placed here, lints must be placed in `.cargo/config.toml`.
diff --git a/.github/.codecov.yml b/.github/.codecov.yml
deleted file mode 100644
index c88b947e165..00000000000
--- a/.github/.codecov.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-ignore:
- - "crates/**/*test*.rs"
-coverage:
- status:
- project:
- default:
- target: auto # set the target coverage to the value of the parent commit
- threshold: 0% # pct of drop in coverage that is still considered as success
- informational: true # if true does not fail the CI is coverage is bellow the target value
- only_pulls: true # run only on PRs
- patch:
- default:
- target: 100%
- threshold: 0%
- informational: true
- only_pulls: true
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index e9e6c51b4df..00000000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,177 +0,0 @@
-name: CI
-
-on:
- push:
- branches:
- - main
- - main-v[0-9].**
- tags:
- - v[0-9].**
-
- pull_request:
- types:
- - opened
- - reopened
- - synchronize
- - auto_merge_enabled
- - edited
-
-jobs:
- commitlint:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
-
- - name: Install commitlint
- run: npm install --global @commitlint/cli @commitlint/config-conventional
-
- - name: Validate PR commits with commitlint
- if: github.event_name == 'pull_request' && !(contains(github.event.pull_request.title, '/merge-main') || contains(github.event.pull_request.title, '/merge main'))
- env:
- BASE_SHA: ${{ github.event.pull_request.base.sha }}
- HEAD_SHA: ${{ github.event.pull_request.head.sha }}
- run: commitlint --from "$BASE_SHA" --to "$HEAD_SHA" --verbose
-
- - name: Validate PR title with commitlint
- if: github.event_name != 'merge_group' && github.event_name != 'push' && !(contains(github.event.pull_request.title, '/merge-main') || contains(github.event.pull_request.title, '/merge main'))
- env:
- TITLE: ${{ github.event.pull_request.title }}
- run: echo "$TITLE" | commitlint --verbose
-
- format:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@master
- with:
- components: rustfmt
- toolchain: nightly-2024-04-29
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
- - run: scripts/rust_fmt.sh --check
-
- clippy:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- with:
- components: clippy
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
-
- # Setup pypy and link to the location expected by .cargo/config.toml.
- - uses: actions/setup-python@v5
- id: setup-pypy
- with:
- python-version: 'pypy3.9'
- - run: ln -s '${{ steps.setup-pypy.outputs.python-path }}' /usr/local/bin/pypy3.9
- - env:
- LD_LIBRARY_PATH: ${{ steps.setup-pypy.outputs.pythonLocation }}/bin
- run: echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV
-
- - run: scripts/clippy.sh
-
- featureless-build:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
- - run: cargo build -p blockifier
- - run: cargo test -p blockifier
-
- run-python-tests:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: actions/setup-python@v5
- with:
- python-version: '3.9'
- - run: |
- python -m pip install --upgrade pip
- pip install pytest
- - run: pytest scripts/merge_paths_test.py
-
- run-tests:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
-
- # Setup pypy and link to the location expected by .cargo/config.toml.
- - uses: actions/setup-python@v5
- id: setup-pypy
- with:
- python-version: 'pypy3.9'
- - run: ln -s '${{ steps.setup-pypy.outputs.python-path }}' /usr/local/bin/pypy3.9
- - env:
- LD_LIBRARY_PATH: ${{ env.Python3_ROOT_DIR }}/bin
- run: echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV
-
- - run: cargo test
- - run: cargo test --features concurrency
-
- native-blockifier-artifacts-push:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
-
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
-
- - name: Build native blockifier
- run: ./build_native_blockifier.sh
-
- # Commit hash on pull request event would be the head commit of the branch.
- - name: Get commit hash prefix for PR update
- if: ${{ github.event_name == 'pull_request' }}
- env:
- COMMIT_SHA: ${{ github.event.pull_request.head.sha }}
- run: echo "SHORT_HASH=${COMMIT_SHA:0:7}" >> $GITHUB_ENV
-
- # On push event (to main, for example) we should take the commit post-push.
- - name: Get commit hash prefix for merge
- if: ${{ github.event_name != 'pull_request' }}
- env:
- COMMIT_SHA: ${{ github.event.after }}
- run: echo "SHORT_HASH=${COMMIT_SHA:0:7}" >> $GITHUB_ENV
-
- # Rename is required; see https://pyo3.rs/v0.19.2/building_and_distribution#manual-builds.
- - name: Rename shared object
- run: |
- mv \
- target/release/libnative_blockifier.so \
- target/release/native_blockifier.pypy39-pp73-x86_64-linux-gnu.so
-
- - name: Authenticate with GCS
- uses: "google-github-actions/auth@v2"
- with:
- credentials_json: ${{ secrets.SA_NATIVE_BLOCKIFIER_ARTIFACTS_BUCKET_WRITER_ACCESS_KEY }}
-
- - name: Upload binary to GCP
- id: upload_file
- uses: "google-github-actions/upload-cloud-storage@v2"
- with:
- path: "target/release/native_blockifier.pypy39-pp73-x86_64-linux-gnu.so"
- destination: "native_blockifier_artifacts/${{ env.SHORT_HASH }}/release/"
-
- # Keep the name 'udeps' to match original action name, so we don't need to define specific branch
- # rules on Github for specific version branches.
- udeps:
- runs-on: ubuntu-latest
- steps:
- - uses: actions/checkout@v4
- - name: Run Machete (detect unused dependencies)
- uses: bnjbvr/cargo-machete@main
diff --git a/.github/workflows/compiled_cairo.yml b/.github/workflows/compiled_cairo.yml
deleted file mode 100644
index 847eb30b791..00000000000
--- a/.github/workflows/compiled_cairo.yml
+++ /dev/null
@@ -1,40 +0,0 @@
-name: CI
-
-on:
- push:
- branches:
- - main
- tags:
- - v[0-9].**
-
- pull_request:
- types:
- - opened
- - reopened
- - synchronize
- paths:
- - 'crates/blockifier/feature_contracts/cairo0/**'
-
-jobs:
- verify_cairo_file_dependencies:
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
-
- # Setup pypy and link to the location expected by .cargo/config.toml.
- - uses: actions/setup-python@v5
- id: setup-pypy
- with:
- python-version: 'pypy3.9'
- - run: ln -s '${{ steps.setup-pypy.outputs.python-path }}' /usr/local/bin/pypy3.9
- - env:
- LD_LIBRARY_PATH: ${{ env.Python3_ROOT_DIR }}/bin
- run: echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV
-
- - run:
- pip install -r crates/blockifier/tests/requirements.txt;
- cargo test verify_feature_contracts -- --include-ignored
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
deleted file mode 100644
index a92b63bfeba..00000000000
--- a/.github/workflows/coverage.yml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: Coverage
-
-on: [pull_request, push]
-
-jobs:
- coverage:
- runs-on: ubuntu-20.04
- env:
- CARGO_TERM_COLOR: always
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
-
- # Setup pypy and link to the location expected by .cargo/config.toml.
- - uses: actions/setup-python@v5
- id: setup-pypy
- with:
- python-version: 'pypy3.9'
- - run: ln -s '${{ steps.setup-pypy.outputs.python-path }}' /usr/local/bin/pypy3.9
- - env:
- LD_LIBRARY_PATH: ${{ steps.setup-pypy.outputs.pythonLocation }}/bin
- run: echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV
-
- - name: Install cargo-llvm-cov
- uses: taiki-e/install-action@cargo-llvm-cov
- # - name: Generate code coverage
- # run: cargo llvm-cov --codecov --output-path codecov.json
- # env:
- # SEED: 0
- # - name: Upload coverage to Codecov
- # uses: codecov/codecov-action@v3
- # with:
- # token: ${{ secrets.CODECOV_TOKEN }}
- # verbose: true
- # fail_ci_if_error: true
diff --git a/.github/workflows/post-merge.yml b/.github/workflows/post-merge.yml
deleted file mode 100644
index 0b42eeb4d0d..00000000000
--- a/.github/workflows/post-merge.yml
+++ /dev/null
@@ -1,30 +0,0 @@
-name: post-merge
-
-on:
- pull_request:
- types:
- - closed
-jobs:
- if_merged:
- if: github.event.pull_request.merged == true
- runs-on: ubuntu-20.04
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - uses: Swatinem/rust-cache@v2
- with:
- prefix-key: "v0-rust-ubuntu-20.04"
-
- # Setup pypy and link to the location expected by .cargo/config.toml.
- - uses: actions/setup-python@v5
- id: setup-pypy
- with:
- python-version: 'pypy3.9'
- - run: ln -s '${{ steps.setup-pypy.outputs.python-path }}' /usr/local/bin/pypy3.9
- - env:
- LD_LIBRARY_PATH: ${{ env.Python3_ROOT_DIR }}/bin
- run: echo "LD_LIBRARY_PATH=${LD_LIBRARY_PATH}" >> $GITHUB_ENV
-
- - run: |
- pip install -r crates/blockifier/tests/requirements.txt
- cargo test -- --include-ignored
diff --git a/.github/workflows/verify-deps.yml b/.github/workflows/verify-deps.yml
deleted file mode 100644
index 5e11b67b97e..00000000000
--- a/.github/workflows/verify-deps.yml
+++ /dev/null
@@ -1,20 +0,0 @@
-name: Nightly Latest Dependencies Check
-
-on:
- schedule:
- - cron: '0 0 * * *' # Runs at 00:00 UTC every day
-
-jobs:
- latest_deps:
- name: Latest Dependencies
- runs-on: ubuntu-20.04
- continue-on-error: true
- steps:
- - uses: actions/checkout@v4
- - uses: dtolnay/rust-toolchain@stable
- - name: Update Dependencies
- run: cargo update --verbose
- - name: Build
- run: cargo build --verbose
- - name: Test
- run: cargo test --verbose
diff --git a/.gitignore b/.gitignore
deleted file mode 100644
index e21a6d42309..00000000000
--- a/.gitignore
+++ /dev/null
@@ -1,11 +0,0 @@
-*.egg-info
-/data
-/logs
-build
-dist
-target
-*/.vscode/*
-*.DS_Store
-
-tmp_venv/*
-
diff --git a/.vscode/settings.json b/.vscode/settings.json
deleted file mode 100644
index 060d8ae1ac4..00000000000
--- a/.vscode/settings.json
+++ /dev/null
@@ -1,24 +0,0 @@
-{
- "editor.tokenColorCustomizations": {
- "textMateRules": [
- {
- "scope": "googletest.failed",
- "settings": {
- "foreground": "#f00"
- }
- },
- {
- "scope": "googletest.passed",
- "settings": {
- "foreground": "#0f0"
- }
- },
- {
- "scope": "googletest.run",
- "settings": {
- "foreground": "#0f0"
- }
- }
- ]
- }
-}
diff --git a/BUILD b/BUILD
deleted file mode 100644
index 0410bd87b6b..00000000000
--- a/BUILD
+++ /dev/null
@@ -1,2 +0,0 @@
-# Export the built artifact to allow local builds.
-exports_files(["target/release/libnative_blockifier.so"])
diff --git a/Cargo.lock b/Cargo.lock
deleted file mode 100644
index c78c59f4c8d..00000000000
--- a/Cargo.lock
+++ /dev/null
@@ -1,4435 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 3
-
-[[package]]
-name = "addr2line"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
-dependencies = [
- "gimli",
-]
-
-[[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.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0"
-dependencies = [
- "cfg-if",
- "cipher",
- "cpufeatures",
-]
-
-[[package]]
-name = "ahash"
-version = "0.7.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd"
-dependencies = [
- "getrandom",
- "once_cell",
- "version_check",
-]
-
-[[package]]
-name = "ahash"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01"
-dependencies = [
- "cfg-if",
- "once_cell",
- "version_check",
- "zerocopy",
-]
-
-[[package]]
-name = "aho-corasick"
-version = "1.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "allocator-api2"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
-
-[[package]]
-name = "anstream"
-version = "0.6.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
-dependencies = [
- "anstyle",
- "anstyle-parse",
- "anstyle-query",
- "anstyle-wincon",
- "colorchoice",
- "is_terminal_polyfill",
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
-
-[[package]]
-name = "anstyle-parse"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
-dependencies = [
- "utf8parse",
-]
-
-[[package]]
-name = "anstyle-query"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391"
-dependencies = [
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "anstyle-wincon"
-version = "3.0.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
-dependencies = [
- "anstyle",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "anyhow"
-version = "1.0.86"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da"
-
-[[package]]
-name = "arc-swap"
-version = "1.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457"
-
-[[package]]
-name = "ark-ec"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "defd9a439d56ac24968cca0571f598a61bc8c55f71d50a89cda591cb750670ba"
-dependencies = [
- "ark-ff",
- "ark-poly",
- "ark-serialize",
- "ark-std",
- "derivative",
- "hashbrown 0.13.2",
- "itertools 0.10.5",
- "num-traits 0.2.19",
- "zeroize",
-]
-
-[[package]]
-name = "ark-ff"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec847af850f44ad29048935519032c33da8aa03340876d351dfab5660d2966ba"
-dependencies = [
- "ark-ff-asm",
- "ark-ff-macros",
- "ark-serialize",
- "ark-std",
- "derivative",
- "digest",
- "itertools 0.10.5",
- "num-bigint",
- "num-traits 0.2.19",
- "paste",
- "rustc_version",
- "zeroize",
-]
-
-[[package]]
-name = "ark-ff-asm"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3ed4aa4fe255d0bc6d79373f7e31d2ea147bcf486cba1be5ba7ea85abdb92348"
-dependencies = [
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "ark-ff-macros"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7abe79b0e4288889c4574159ab790824d0033b9fdcb2a112a3182fac2e514565"
-dependencies = [
- "num-bigint",
- "num-traits 0.2.19",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "ark-poly"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d320bfc44ee185d899ccbadfa8bc31aab923ce1558716e1997a1e74057fe86bf"
-dependencies = [
- "ark-ff",
- "ark-serialize",
- "ark-std",
- "derivative",
- "hashbrown 0.13.2",
-]
-
-[[package]]
-name = "ark-secp256k1"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c02e954eaeb4ddb29613fee20840c2bbc85ca4396d53e33837e11905363c5f2"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
-[[package]]
-name = "ark-secp256r1"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3975a01b0a6e3eae0f72ec7ca8598a6620fc72fa5981f6f5cca33b7cd788f633"
-dependencies = [
- "ark-ec",
- "ark-ff",
- "ark-std",
-]
-
-[[package]]
-name = "ark-serialize"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "adb7b85a02b83d2f22f89bd5cac66c9c89474240cb6207cb1efc16d098e822a5"
-dependencies = [
- "ark-serialize-derive",
- "ark-std",
- "digest",
- "num-bigint",
-]
-
-[[package]]
-name = "ark-serialize-derive"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae3281bc6d0fd7e549af32b52511e1302185bd688fd3359fa36423346ff682ea"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "ark-std"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94893f1e0c6eeab764ade8dc4c0db24caf4fe7cbbaafc0eba0a9030f447b5185"
-dependencies = [
- "num-traits 0.2.19",
- "rand",
-]
-
-[[package]]
-name = "arrayvec"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
-
-[[package]]
-name = "ascii-canvas"
-version = "3.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8824ecca2e851cec16968d54a01dd372ef8f95b244fb84b84e70128be347c3c6"
-dependencies = [
- "term",
-]
-
-[[package]]
-name = "assert_matches"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9"
-
-[[package]]
-name = "async-trait"
-version = "0.1.77"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "atty"
-version = "0.2.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8"
-dependencies = [
- "hermit-abi 0.1.19",
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "autocfg"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
-
-[[package]]
-name = "backtrace"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
-dependencies = [
- "addr2line",
- "cc",
- "cfg-if",
- "libc",
- "miniz_oxide",
- "object",
- "rustc-demangle",
-]
-
-[[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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f11ea1a0346b94ef188834a65c068a03aec181c94896d481d7a0a40d85b0ce95"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "bindgen"
-version = "0.66.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f2b84e06fc203107bfbad243f4aba2af864eb7db3b1cf46ea0a023b0b433d2a7"
-dependencies = [
- "bitflags 2.4.1",
- "cexpr",
- "clang-sys",
- "lazy_static",
- "lazycell",
- "peeking_take_while",
- "proc-macro2",
- "quote",
- "regex",
- "rustc-hash",
- "shlex",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "bit-set"
-version = "0.5.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
-dependencies = [
- "bit-vec",
-]
-
-[[package]]
-name = "bit-vec"
-version = "0.6.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb"
-
-[[package]]
-name = "bitflags"
-version = "1.3.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
-
-[[package]]
-name = "bitflags"
-version = "2.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07"
-
-[[package]]
-name = "bitvec"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c"
-dependencies = [
- "funty",
- "radium",
- "tap",
- "wyz",
-]
-
-[[package]]
-name = "block-buffer"
-version = "0.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "blockifier"
-version = "0.8.0-rc.1"
-dependencies = [
- "anyhow",
- "ark-ec",
- "ark-ff",
- "ark-secp256k1",
- "ark-secp256r1",
- "assert_matches",
- "cached",
- "cairo-lang-casm",
- "cairo-lang-runner",
- "cairo-lang-starknet-classes",
- "cairo-lang-utils",
- "cairo-vm",
- "criterion",
- "derive_more",
- "glob",
- "indexmap 2.2.6",
- "itertools 0.10.5",
- "keccak",
- "log",
- "num-bigint",
- "num-integer",
- "num-rational",
- "num-traits 0.2.19",
- "once_cell",
- "paste",
- "phf",
- "pretty_assertions",
- "rand",
- "regex",
- "rstest",
- "serde",
- "serde_json",
- "sha2",
- "sha3",
- "starknet-types-core",
- "starknet_api",
- "strum",
- "strum_macros 0.24.3",
- "test-case",
- "thiserror",
- "tikv-jemallocator",
-]
-
-[[package]]
-name = "bstr"
-version = "1.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706"
-dependencies = [
- "memchr",
- "serde",
-]
-
-[[package]]
-name = "bumpalo"
-version = "3.14.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec"
-
-[[package]]
-name = "byte-slice-cast"
-version = "1.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c"
-
-[[package]]
-name = "byteorder"
-version = "1.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
-
-[[package]]
-name = "bytes"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
-
-[[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 = "cached"
-version = "0.44.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b195e4fbc4b6862bbd065b991a34750399c119797efff72492f28a5864de8700"
-dependencies = [
- "async-trait",
- "cached_proc_macro",
- "cached_proc_macro_types",
- "futures",
- "hashbrown 0.13.2",
- "instant",
- "once_cell",
- "thiserror",
- "tokio",
-]
-
-[[package]]
-name = "cached_proc_macro"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b48814962d2fd604c50d2b9433c2a41a0ab567779ee2c02f7fba6eca1221f082"
-dependencies = [
- "cached_proc_macro_types",
- "darling",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "cached_proc_macro_types"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663"
-
-[[package]]
-name = "cairo-lang-casm"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5abf875e93f696e783412d3f2a7c6f66e94e07c30b01559380b4d0707dc0050e"
-dependencies = [
- "cairo-lang-utils",
- "indoc 2.0.5",
- "num-bigint",
- "num-traits 0.2.19",
- "parity-scale-codec",
- "serde",
-]
-
-[[package]]
-name = "cairo-lang-compiler"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f135e1768e199e88b04f824e34b9411ff49fc31970e77cbf5c6f448170441d18"
-dependencies = [
- "anyhow",
- "cairo-lang-defs",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-lowering",
- "cairo-lang-parser",
- "cairo-lang-project",
- "cairo-lang-semantic",
- "cairo-lang-sierra",
- "cairo-lang-sierra-generator",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "indoc 2.0.5",
- "salsa",
- "smol_str",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-debug"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87e2bf0a6caf1e54938bc67ca082cbeb5385969784bfb1109c187ca9dc5e1806"
-dependencies = [
- "cairo-lang-utils",
-]
-
-[[package]]
-name = "cairo-lang-defs"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c65bb0e855afeb88d11585605f836bd0cd444375b234103e87342df2c91aba1b"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-parser",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "itertools 0.12.1",
- "salsa",
- "smol_str",
-]
-
-[[package]]
-name = "cairo-lang-diagnostics"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab96083f60a077d300d0b89bd4b9c31731c95f5db355a11c4657ee25f3acc198"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-filesystem",
- "cairo-lang-utils",
- "itertools 0.12.1",
-]
-
-[[package]]
-name = "cairo-lang-eq-solver"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3bf2aaa50fa5b15070b2bf02c60a62f917f9aa1ff6dedf5a2627ecafe8e33cfa"
-dependencies = [
- "cairo-lang-utils",
- "good_lp",
-]
-
-[[package]]
-name = "cairo-lang-filesystem"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8094bcf7e44204c2fc2f10760e7e2e5769a6267cba5d8a303c0331dd480d5663"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-utils",
- "path-clean",
- "salsa",
- "serde",
- "smol_str",
-]
-
-[[package]]
-name = "cairo-lang-formatter"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a1d92f1163b3b0e22e6392d22f7a275b9e64ab453f32b8b62bb1aeedbe73e04"
-dependencies = [
- "anyhow",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-parser",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "diffy",
- "ignore",
- "itertools 0.12.1",
- "salsa",
- "serde",
- "smol_str",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-lowering"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25eb629a773c07c2863717d1711fd3ecc17807c1fc094bb90cccac56061056a4"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-defs",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-parser",
- "cairo-lang-proc-macros",
- "cairo-lang-semantic",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "id-arena",
- "itertools 0.12.1",
- "log",
- "num-bigint",
- "num-traits 0.2.19",
- "once_cell",
- "salsa",
- "smol_str",
-]
-
-[[package]]
-name = "cairo-lang-parser"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff7b1d7af8e1bff971b8b9bbce796650a57de93dfb092bc0c17c2f85d915de6e"
-dependencies = [
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-syntax",
- "cairo-lang-syntax-codegen",
- "cairo-lang-utils",
- "colored",
- "itertools 0.12.1",
- "num-bigint",
- "num-traits 0.2.19",
- "salsa",
- "smol_str",
- "unescaper",
-]
-
-[[package]]
-name = "cairo-lang-plugins"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eccf06d643d155a72057dc93c40cf34dabe11e8c629dbf3111c528a3d750a66"
-dependencies = [
- "cairo-lang-defs",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-parser",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "indent",
- "indoc 2.0.5",
- "itertools 0.12.1",
- "salsa",
- "smol_str",
-]
-
-[[package]]
-name = "cairo-lang-proc-macros"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffa10434f9ce0828e8d77f3a13ae2f878da453345b14d54a66de3e196c0e4674"
-dependencies = [
- "cairo-lang-debug",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "cairo-lang-project"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4882d2263fb7c95dbab0c3b5578d8c0e2417fd680df8cc61aa50321b6a5a40d"
-dependencies = [
- "cairo-lang-filesystem",
- "cairo-lang-utils",
- "serde",
- "smol_str",
- "thiserror",
- "toml",
-]
-
-[[package]]
-name = "cairo-lang-runner"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "01ab7b0e0640adaed21b9d9b9b94b3edf7f7ab95514b1dd40c679317a33dabea"
-dependencies = [
- "ark-ff",
- "ark-secp256k1",
- "ark-secp256r1",
- "cairo-lang-casm",
- "cairo-lang-lowering",
- "cairo-lang-sierra",
- "cairo-lang-sierra-ap-change",
- "cairo-lang-sierra-generator",
- "cairo-lang-sierra-to-casm",
- "cairo-lang-sierra-type-size",
- "cairo-lang-starknet",
- "cairo-lang-utils",
- "cairo-vm",
- "itertools 0.12.1",
- "keccak",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "rand",
- "sha2",
- "smol_str",
- "starknet-types-core",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-semantic"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1ba49614f98322e1ccda33265f8193f66cbd88eff23b0deb94db981aa0666650"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-defs",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-parser",
- "cairo-lang-plugins",
- "cairo-lang-proc-macros",
- "cairo-lang-syntax",
- "cairo-lang-test-utils",
- "cairo-lang-utils",
- "id-arena",
- "indoc 2.0.5",
- "itertools 0.12.1",
- "num-bigint",
- "num-traits 0.2.19",
- "once_cell",
- "salsa",
- "smol_str",
- "toml",
-]
-
-[[package]]
-name = "cairo-lang-sierra"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81a41d56c6afebdbe2c5ffb4e216f60b07391c29c91fccf0a60790817f49ba68"
-dependencies = [
- "anyhow",
- "cairo-lang-utils",
- "const-fnv1a-hash",
- "convert_case 0.6.0",
- "derivative",
- "itertools 0.12.1",
- "lalrpop",
- "lalrpop-util",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "once_cell",
- "regex",
- "salsa",
- "serde",
- "serde_json",
- "sha3",
- "smol_str",
- "starknet-types-core",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-sierra-ap-change"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "667050b93db661ebce0b33c92ce44abffebde37c5645e4761722ad3c49a1c34f"
-dependencies = [
- "cairo-lang-eq-solver",
- "cairo-lang-sierra",
- "cairo-lang-sierra-type-size",
- "cairo-lang-utils",
- "itertools 0.12.1",
- "num-bigint",
- "num-traits 0.2.19",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-sierra-gas"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "27fcbf81e8ed4efe7e9c30bbdfa8074b9af01a5e16154999dd9527baba27f1fb"
-dependencies = [
- "cairo-lang-eq-solver",
- "cairo-lang-sierra",
- "cairo-lang-sierra-type-size",
- "cairo-lang-utils",
- "itertools 0.12.1",
- "num-bigint",
- "num-traits 0.2.19",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-sierra-generator"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "058c05d10913a130fb21964f0bf1a37b05eafcf2f50a73cd4aa3e11da7e4cfc7"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-defs",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-lowering",
- "cairo-lang-parser",
- "cairo-lang-semantic",
- "cairo-lang-sierra",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "itertools 0.12.1",
- "num-traits 0.2.19",
- "once_cell",
- "salsa",
- "serde",
- "serde_json",
- "smol_str",
-]
-
-[[package]]
-name = "cairo-lang-sierra-to-casm"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8607cc5cf16f3a930ad4b3799e986b0ca36ada2c0da1dd6bd2ef35cbb1eb9e74"
-dependencies = [
- "assert_matches",
- "cairo-lang-casm",
- "cairo-lang-sierra",
- "cairo-lang-sierra-ap-change",
- "cairo-lang-sierra-gas",
- "cairo-lang-sierra-type-size",
- "cairo-lang-utils",
- "indoc 2.0.5",
- "itertools 0.12.1",
- "num-bigint",
- "num-traits 0.2.19",
- "starknet-types-core",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-sierra-type-size"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "224624b1e279b3eea7693680f577335e66e6dd5fbfbd2576f4a7d0b5d697f61d"
-dependencies = [
- "cairo-lang-sierra",
- "cairo-lang-utils",
-]
-
-[[package]]
-name = "cairo-lang-starknet"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81a54ebea4ea990a33a2158ecdf46ffb3cb1af8fff6a79c3dd310c6a9ed43e82"
-dependencies = [
- "anyhow",
- "cairo-lang-compiler",
- "cairo-lang-defs",
- "cairo-lang-diagnostics",
- "cairo-lang-filesystem",
- "cairo-lang-lowering",
- "cairo-lang-plugins",
- "cairo-lang-semantic",
- "cairo-lang-sierra",
- "cairo-lang-sierra-generator",
- "cairo-lang-starknet-classes",
- "cairo-lang-syntax",
- "cairo-lang-utils",
- "const_format",
- "indent",
- "indoc 2.0.5",
- "itertools 0.12.1",
- "once_cell",
- "serde",
- "serde_json",
- "smol_str",
- "starknet-types-core",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-starknet-classes"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bb66ae799e1963318e1bab782848f53797787c396dfd590be539f3f12d56ac4"
-dependencies = [
- "cairo-lang-casm",
- "cairo-lang-sierra",
- "cairo-lang-sierra-to-casm",
- "cairo-lang-utils",
- "convert_case 0.6.0",
- "itertools 0.12.1",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "once_cell",
- "serde",
- "serde_json",
- "sha3",
- "smol_str",
- "starknet-types-core",
- "thiserror",
-]
-
-[[package]]
-name = "cairo-lang-syntax"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5e673dc1058a8639c094a330a701e8902cbd34defe659a3d95bcf6c3f3de249d"
-dependencies = [
- "cairo-lang-debug",
- "cairo-lang-filesystem",
- "cairo-lang-utils",
- "num-bigint",
- "num-traits 0.2.19",
- "salsa",
- "smol_str",
- "unescaper",
-]
-
-[[package]]
-name = "cairo-lang-syntax-codegen"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5d0dd466dbac4263573b81b83e22534285da30a4e7c15b888407fbb33d8accb9"
-dependencies = [
- "genco",
- "xshell",
-]
-
-[[package]]
-name = "cairo-lang-test-utils"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09431da22acc1cf081b1802b73ff484bdc75ca1cd5ad6fa9b84fba8753b2e08f"
-dependencies = [
- "cairo-lang-formatter",
- "cairo-lang-utils",
- "colored",
- "log",
- "pretty_assertions",
-]
-
-[[package]]
-name = "cairo-lang-utils"
-version = "2.7.0-rc.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97498c08958be8d569c16982cac431d785adc3effdfa6d0775c65aec578dfd91"
-dependencies = [
- "hashbrown 0.14.5",
- "indexmap 2.2.6",
- "itertools 0.12.1",
- "num-bigint",
- "num-traits 0.2.19",
- "parity-scale-codec",
- "schemars",
- "serde",
-]
-
-[[package]]
-name = "cairo-vm"
-version = "1.0.0-rc5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e09134ea1e0be6c1fbd330f0945df0512fa70944fd0b3ecc2f74a6008f01e9da"
-dependencies = [
- "anyhow",
- "bincode",
- "bitvec",
- "generic-array",
- "hashbrown 0.14.5",
- "hex",
- "keccak",
- "lazy_static",
- "nom",
- "num-bigint",
- "num-integer",
- "num-prime",
- "num-traits 0.2.19",
- "rand",
- "rust_decimal",
- "serde",
- "serde_json",
- "sha2",
- "sha3",
- "starknet-crypto 0.6.2",
- "starknet-types-core",
- "thiserror-no-std",
- "zip",
-]
-
-[[package]]
-name = "cast"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "37b2a672a2cb129a2e41c10b1224bb368f9f37a2b16b612598138befd7b37eb5"
-
-[[package]]
-name = "cc"
-version = "1.0.83"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
-dependencies = [
- "jobserver",
- "libc",
-]
-
-[[package]]
-name = "cexpr"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
-dependencies = [
- "nom",
-]
-
-[[package]]
-name = "cfg-if"
-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 = "clang-sys"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
-dependencies = [
- "glob",
- "libc",
- "libloading",
-]
-
-[[package]]
-name = "clap"
-version = "2.34.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0610544180c38b88101fecf2dd634b174a62eef6946f84dfc6a7127512b381c"
-dependencies = [
- "bitflags 1.3.2",
- "textwrap",
- "unicode-width",
-]
-
-[[package]]
-name = "clap"
-version = "4.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90bc066a67923782aa8515dbaea16946c5bcc5addbd668bb80af688e53e548a0"
-dependencies = [
- "clap_builder",
-]
-
-[[package]]
-name = "clap_builder"
-version = "4.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
-dependencies = [
- "anstream",
- "anstyle",
- "clap_lex",
- "strsim 0.11.1",
-]
-
-[[package]]
-name = "clap_lex"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
-
-[[package]]
-name = "colorchoice"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
-
-[[package]]
-name = "colored"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8"
-dependencies = [
- "lazy_static",
- "windows-sys 0.48.0",
-]
-
-[[package]]
-name = "const-fnv1a-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32b13ea120a812beba79e34316b3942a857c86ec1593cb34f27bb28272ce2cca"
-
-[[package]]
-name = "const_format"
-version = "0.2.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3a214c7af3d04997541b18d432afaff4c455e79e2029079647e72fc2bd27673"
-dependencies = [
- "const_format_proc_macros",
-]
-
-[[package]]
-name = "const_format_proc_macros"
-version = "0.2.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c7f6ff08fd20f4f299298a28e2dfa8a8ba1036e6cd2460ac1de7b425d76f2500"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-xid",
-]
-
-[[package]]
-name = "constant_time_eq"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc"
-
-[[package]]
-name = "convert_case"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
-
-[[package]]
-name = "convert_case"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec182b0ca2f35d8fc196cf3404988fd8b8c739a4d270ff118a398feb0cbec1ca"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "cpufeatures"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0"
-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 = "criterion"
-version = "0.3.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b01d6de93b2b6c65e17c634a26653a29d107b3c98c607c765bf38d041531cd8f"
-dependencies = [
- "atty",
- "cast",
- "clap 2.34.0",
- "criterion-plot",
- "csv",
- "itertools 0.10.5",
- "lazy_static",
- "num-traits 0.2.19",
- "oorandom",
- "plotters",
- "rayon",
- "regex",
- "serde",
- "serde_cbor",
- "serde_derive",
- "serde_json",
- "tinytemplate",
- "walkdir",
-]
-
-[[package]]
-name = "criterion-plot"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2673cc8207403546f45f5fd319a974b1e6983ad1a3ee7e6041650013be041876"
-dependencies = [
- "cast",
- "itertools 0.10.5",
-]
-
-[[package]]
-name = "crossbeam-deque"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-epoch"
-version = "0.9.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
-dependencies = [
- "crossbeam-utils",
-]
-
-[[package]]
-name = "crossbeam-utils"
-version = "0.8.18"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "crunchy"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
-
-[[package]]
-name = "crypto-bigint"
-version = "0.5.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0dc92fb57ca44df6db8059111ab3af99a63d5d0f8375d9972e319a379c6bab76"
-dependencies = [
- "generic-array",
- "subtle",
- "zeroize",
-]
-
-[[package]]
-name = "crypto-common"
-version = "0.1.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
-dependencies = [
- "generic-array",
- "typenum",
-]
-
-[[package]]
-name = "csv"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe"
-dependencies = [
- "csv-core",
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "csv-core"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "darling"
-version = "0.14.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b750cb3417fd1b327431a470f388520309479ab0bf5e323505daf0290cd3850"
-dependencies = [
- "darling_core",
- "darling_macro",
-]
-
-[[package]]
-name = "darling_core"
-version = "0.14.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "109c1ca6e6b7f82cc233a97004ea8ed7ca123a9af07a8230878fcfda9b158bf0"
-dependencies = [
- "fnv",
- "ident_case",
- "proc-macro2",
- "quote",
- "strsim 0.10.0",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "darling_macro"
-version = "0.14.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4aab4dbc9f7611d8b55048a3a16d2d010c2c8334e46304b40ac1cc14bf3b48e"
-dependencies = [
- "darling_core",
- "quote",
- "syn 1.0.109",
-]
-
-[[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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "derive_more"
-version = "0.99.17"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
-dependencies = [
- "convert_case 0.4.0",
- "proc-macro2",
- "quote",
- "rustc_version",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "diff"
-version = "0.1.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
-
-[[package]]
-name = "diffy"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e616e59155c92257e84970156f506287853355f58cd4a6eb167385722c32b790"
-dependencies = [
- "nu-ansi-term",
-]
-
-[[package]]
-name = "digest"
-version = "0.10.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
-dependencies = [
- "block-buffer",
- "crypto-common",
- "subtle",
-]
-
-[[package]]
-name = "dirs-next"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1"
-dependencies = [
- "cfg-if",
- "dirs-sys-next",
-]
-
-[[package]]
-name = "dirs-sys-next"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d"
-dependencies = [
- "libc",
- "redox_users",
- "winapi",
-]
-
-[[package]]
-name = "dyn-clone"
-version = "1.0.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d"
-
-[[package]]
-name = "either"
-version = "1.9.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07"
-
-[[package]]
-name = "ena"
-version = "0.14.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c533630cf40e9caa44bd91aadc88a75d75a4c3a12b4cfde353cbed41daa1e1f1"
-dependencies = [
- "log",
-]
-
-[[package]]
-name = "equivalent"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
-
-[[package]]
-name = "errno"
-version = "0.3.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
-dependencies = [
- "libc",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "fastrand"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a"
-
-[[package]]
-name = "fixed-hash"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534"
-dependencies = [
- "byteorder",
- "rand",
- "rustc-hex",
- "static_assertions",
-]
-
-[[package]]
-name = "fixedbitset"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
-
-[[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 = "fnv"
-version = "1.0.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
-
-[[package]]
-name = "form_urlencoded"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
-dependencies = [
- "percent-encoding",
-]
-
-[[package]]
-name = "funty"
-version = "2.0.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c"
-
-[[package]]
-name = "futures"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "645c6916888f6cb6350d2550b80fb63e734897a8498abe35cfb732b6487804b0"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-executor",
- "futures-io",
- "futures-sink",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-channel"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78"
-dependencies = [
- "futures-core",
- "futures-sink",
-]
-
-[[package]]
-name = "futures-core"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d"
-
-[[package]]
-name = "futures-executor"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d"
-dependencies = [
- "futures-core",
- "futures-task",
- "futures-util",
-]
-
-[[package]]
-name = "futures-io"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1"
-
-[[package]]
-name = "futures-macro"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "futures-sink"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5"
-
-[[package]]
-name = "futures-task"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004"
-
-[[package]]
-name = "futures-timer"
-version = "3.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e64b03909df88034c26dc1547e8970b91f98bdb65165d6a4e9110d94263dbb2c"
-
-[[package]]
-name = "futures-util"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48"
-dependencies = [
- "futures-channel",
- "futures-core",
- "futures-io",
- "futures-macro",
- "futures-sink",
- "futures-task",
- "memchr",
- "pin-project-lite",
- "pin-utils",
- "slab",
-]
-
-[[package]]
-name = "genco"
-version = "0.17.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "98d7af598790738fee616426e669360fa361273b1b9c9b7f30c92fa627605cad"
-dependencies = [
- "genco-macros",
- "relative-path",
- "smallvec",
-]
-
-[[package]]
-name = "genco-macros"
-version = "0.17.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d4cf186fea4af17825116f72932fe52cce9a13bae39ff63b4dc0cfdb3fb4bde1"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "generic-array"
-version = "0.14.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
-dependencies = [
- "typenum",
- "version_check",
-]
-
-[[package]]
-name = "getrandom"
-version = "0.2.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe9006bed769170c11f845cf00c7c1e9092aeb3f268e007c3e760ac68008070f"
-dependencies = [
- "cfg-if",
- "js-sys",
- "libc",
- "wasi",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "gimli"
-version = "0.28.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
-
-[[package]]
-name = "glob"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
-
-[[package]]
-name = "globset"
-version = "0.4.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1"
-dependencies = [
- "aho-corasick",
- "bstr",
- "log",
- "regex-automata",
- "regex-syntax 0.8.2",
-]
-
-[[package]]
-name = "good_lp"
-version = "1.8.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3198bd13dea84c76a64621d6ee8ee26a4960a9a0d538eca95ca8f1320a469ac9"
-dependencies = [
- "fnv",
- "minilp",
-]
-
-[[package]]
-name = "half"
-version = "1.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1b43ede17f21864e81be2fa654110bf1e793774238d86ef8555c37e6519c0403"
-
-[[package]]
-name = "hashbrown"
-version = "0.12.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
-dependencies = [
- "ahash 0.7.7",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.13.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
-dependencies = [
- "ahash 0.8.7",
-]
-
-[[package]]
-name = "hashbrown"
-version = "0.14.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
-dependencies = [
- "ahash 0.8.7",
- "allocator-api2",
- "serde",
-]
-
-[[package]]
-name = "heck"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c"
-dependencies = [
- "unicode-segmentation",
-]
-
-[[package]]
-name = "heck"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
-
-[[package]]
-name = "hermit-abi"
-version = "0.1.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "hermit-abi"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
-
-[[package]]
-name = "hex"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
-
-[[package]]
-name = "hmac"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
-dependencies = [
- "digest",
-]
-
-[[package]]
-name = "human_bytes"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "91f255a4535024abf7640cb288260811fc14794f62b063652ed349f9a6c2348e"
-
-[[package]]
-name = "id-arena"
-version = "2.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "25a2bc672d1148e28034f176e01fffebb08b35768468cc954630da77a1449005"
-
-[[package]]
-name = "ident_case"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39"
-
-[[package]]
-name = "idna"
-version = "0.2.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
-dependencies = [
- "matches",
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "idna"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
-dependencies = [
- "unicode-bidi",
- "unicode-normalization",
-]
-
-[[package]]
-name = "if_chain"
-version = "1.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb56e1aa765b4b4f3aadfab769793b7087bb03a4ea4920644a6d238e2df5b9ed"
-
-[[package]]
-name = "ignore"
-version = "0.4.22"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1"
-dependencies = [
- "crossbeam-deque",
- "globset",
- "log",
- "memchr",
- "regex-automata",
- "same-file",
- "walkdir",
- "winapi-util",
-]
-
-[[package]]
-name = "impl-codec"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f"
-dependencies = [
- "parity-scale-codec",
-]
-
-[[package]]
-name = "impl-serde"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "impl-trait-for-tuples"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "indent"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d9f1a0777d972970f204fdf8ef319f1f4f8459131636d7e3c96c5d59570d0fa6"
-
-[[package]]
-name = "indexmap"
-version = "1.9.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
-dependencies = [
- "autocfg",
- "hashbrown 0.12.3",
- "serde",
-]
-
-[[package]]
-name = "indexmap"
-version = "2.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
-dependencies = [
- "equivalent",
- "hashbrown 0.14.5",
- "serde",
-]
-
-[[package]]
-name = "indoc"
-version = "1.0.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa799dd5ed20a7e349f3b4639aa80d74549c81716d9ec4f994c9b5815598306"
-
-[[package]]
-name = "indoc"
-version = "2.0.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b248f5224d1d606005e02c97f5aa4e88eeb230488bcc03bc9ca4d7991399f2b5"
-
-[[package]]
-name = "inout"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5"
-dependencies = [
- "generic-array",
-]
-
-[[package]]
-name = "instant"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
-dependencies = [
- "cfg-if",
-]
-
-[[package]]
-name = "integer-encoding"
-version = "3.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02"
-
-[[package]]
-name = "is-terminal"
-version = "0.4.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455"
-dependencies = [
- "hermit-abi 0.3.3",
- "rustix",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "is_terminal_polyfill"
-version = "1.70.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
-
-[[package]]
-name = "itertools"
-version = "0.10.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itertools"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
-dependencies = [
- "either",
-]
-
-[[package]]
-name = "itoa"
-version = "1.0.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
-
-[[package]]
-name = "jobserver"
-version = "0.1.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "js-sys"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d"
-dependencies = [
- "wasm-bindgen",
-]
-
-[[package]]
-name = "keccak"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
-dependencies = [
- "cpufeatures",
-]
-
-[[package]]
-name = "lalrpop"
-version = "0.20.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da4081d44f4611b66c6dd725e6de3169f9f63905421e8626fcb86b6a898998b8"
-dependencies = [
- "ascii-canvas",
- "bit-set",
- "diff",
- "ena",
- "is-terminal",
- "itertools 0.10.5",
- "lalrpop-util",
- "petgraph",
- "pico-args",
- "regex",
- "regex-syntax 0.7.5",
- "string_cache",
- "term",
- "tiny-keccak",
- "unicode-xid",
-]
-
-[[package]]
-name = "lalrpop-util"
-version = "0.20.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "507460a910eb7b32ee961886ff48539633b788a36b65692b95f225b844c82553"
-dependencies = [
- "regex-automata",
-]
-
-[[package]]
-name = "lambdaworks-crypto"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7fb5d4f22241504f7c7b8d2c3a7d7835d7c07117f10bff2a7d96a9ef6ef217c3"
-dependencies = [
- "lambdaworks-math",
- "serde",
- "sha2",
- "sha3",
-]
-
-[[package]]
-name = "lambdaworks-math"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "358e172628e713b80a530a59654154bfc45783a6ed70ea284839800cebdf8f97"
-dependencies = [
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "lazy_static"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
-dependencies = [
- "spin",
-]
-
-[[package]]
-name = "lazycell"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55"
-
-[[package]]
-name = "libc"
-version = "0.2.155"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
-
-[[package]]
-name = "libloading"
-version = "0.8.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19"
-dependencies = [
- "cfg-if",
- "windows-targets 0.52.0",
-]
-
-[[package]]
-name = "libmdbx"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3f0bee397dc9a7003e7bd34fffc1dc2d4c4fdc96530a0c439a5f98c9402bc7bf"
-dependencies = [
- "bitflags 2.4.1",
- "byteorder",
- "derive_more",
- "indexmap 1.9.3",
- "libc",
- "lifetimed-bytes",
- "mdbx-sys",
- "parking_lot 0.12.1",
- "thiserror",
-]
-
-[[package]]
-name = "libredox"
-version = "0.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
-dependencies = [
- "bitflags 2.4.1",
- "libc",
- "redox_syscall 0.4.1",
-]
-
-[[package]]
-name = "lifetimed-bytes"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c970c8ea4c7b023a41cfa4af4c785a16694604c2f2a3b0d1f20a9bcb73fa550"
-dependencies = [
- "bytes",
-]
-
-[[package]]
-name = "linux-raw-sys"
-version = "0.4.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c4cd1a83af159aa67994778be9070f0ae1bd732942279cabb14f86f986a21456"
-
-[[package]]
-name = "lock_api"
-version = "0.4.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
-dependencies = [
- "autocfg",
- "scopeguard",
-]
-
-[[package]]
-name = "log"
-version = "0.4.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
-
-[[package]]
-name = "lru"
-version = "0.7.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e999beba7b6e8345721bd280141ed958096a2e4abdf74f67ff4ce49b4b54e47a"
-dependencies = [
- "hashbrown 0.12.3",
-]
-
-[[package]]
-name = "matches"
-version = "0.1.10"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5"
-
-[[package]]
-name = "matrixmultiply"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "916806ba0031cd542105d916a97c8572e1fa6dd79c9c51e7eb43a09ec2dd84c1"
-dependencies = [
- "rawpointer",
-]
-
-[[package]]
-name = "mdbx-sys"
-version = "0.12.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21a329f8d655fb646cc9511c00886eefcddb6ef131869ef2d4b02c24c66825ac"
-dependencies = [
- "bindgen",
- "cc",
- "libc",
-]
-
-[[package]]
-name = "memchr"
-version = "2.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
-
-[[package]]
-name = "memmap2"
-version = "0.8.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43a5a03cefb0d953ec0be133036f14e109412fa594edc2f77227249db66cc3ed"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "memoffset"
-version = "0.9.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "metrics"
-version = "0.21.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fde3af1a009ed76a778cb84fdef9e7dbbdf5775ae3e4cc1f434a6a307f6f76c5"
-dependencies = [
- "ahash 0.8.7",
- "metrics-macros",
- "portable-atomic",
-]
-
-[[package]]
-name = "metrics-macros"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b4faf00617defe497754acde3024865bc143d44a86799b24e191ecff91354f"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "minilp"
-version = "0.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "82a7750a9e5076c660b7bec5e6457b4dbff402b9863c8d112891434e18fd5385"
-dependencies = [
- "log",
- "sprs",
-]
-
-[[package]]
-name = "minimal-lexical"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
-
-[[package]]
-name = "miniz_oxide"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
-dependencies = [
- "adler",
-]
-
-[[package]]
-name = "native_blockifier"
-version = "0.8.0-rc.1"
-dependencies = [
- "blockifier",
- "cached",
- "cairo-lang-starknet-classes",
- "cairo-vm",
- "indexmap 2.2.6",
- "log",
- "num-bigint",
- "papyrus_storage",
- "pretty_assertions",
- "pyo3",
- "pyo3-log",
- "serde",
- "serde_json",
- "starknet-types-core",
- "starknet_api",
- "tempfile",
- "thiserror",
-]
-
-[[package]]
-name = "ndarray"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac06db03ec2f46ee0ecdca1a1c34a99c0d188a0d83439b84bf0cb4b386e4ab09"
-dependencies = [
- "matrixmultiply",
- "num-complex",
- "num-integer",
- "num-traits 0.2.19",
- "rawpointer",
-]
-
-[[package]]
-name = "new_debug_unreachable"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54"
-
-[[package]]
-name = "nom"
-version = "7.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
-dependencies = [
- "memchr",
- "minimal-lexical",
-]
-
-[[package]]
-name = "nu-ansi-term"
-version = "0.46.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84"
-dependencies = [
- "overload",
- "winapi",
-]
-
-[[package]]
-name = "num-bigint"
-version = "0.4.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7"
-dependencies = [
- "num-integer",
- "num-traits 0.2.19",
- "rand",
- "serde",
-]
-
-[[package]]
-name = "num-complex"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95"
-dependencies = [
- "autocfg",
- "num-traits 0.2.19",
-]
-
-[[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.46"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f"
-dependencies = [
- "num-traits 0.2.19",
-]
-
-[[package]]
-name = "num-modular"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "64a5fe11d4135c3bcdf3a95b18b194afa9608a5f6ff034f5d857bc9a27fb0119"
-dependencies = [
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
-]
-
-[[package]]
-name = "num-prime"
-version = "0.4.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5f4e3bc495f6e95bc15a6c0c55ac00421504a5a43d09e3cc455d1fea7015581d"
-dependencies = [
- "bitvec",
- "either",
- "lru",
- "num-bigint",
- "num-integer",
- "num-modular",
- "num-traits 0.2.19",
- "rand",
-]
-
-[[package]]
-name = "num-rational"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
-dependencies = [
- "autocfg",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "serde",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.1.43"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31"
-dependencies = [
- "num-traits 0.2.19",
-]
-
-[[package]]
-name = "num-traits"
-version = "0.2.19"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "object"
-version = "0.32.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "once_cell"
-version = "1.19.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
-
-[[package]]
-name = "oorandom"
-version = "11.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575"
-
-[[package]]
-name = "overload"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
-
-[[package]]
-name = "page_size"
-version = "0.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "30d5b2194ed13191c1999ae0704b7839fb18384fa22e49b57eeaa97d79ce40da"
-dependencies = [
- "libc",
- "winapi",
-]
-
-[[package]]
-name = "papyrus_common"
-version = "0.4.0-dev.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "253c374b2174d98425fdd5e2e0a1bfd9b9f880a37c45149926ff02548ca6fa56"
-dependencies = [
- "bitvec",
- "cairo-lang-starknet-classes",
- "hex",
- "indexmap 2.2.6",
- "itertools 0.10.5",
- "lazy_static",
- "rand",
- "serde",
- "serde_json",
- "sha3",
- "starknet-crypto 0.5.2",
- "starknet-types-core",
- "starknet_api",
- "thiserror",
-]
-
-[[package]]
-name = "papyrus_config"
-version = "0.4.0-dev.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "681c77c3036aa865206d874c5fbaa264713f22bfd0ef518c7881a1954fc3a045"
-dependencies = [
- "clap 4.5.4",
- "itertools 0.10.5",
- "serde",
- "serde_json",
- "strum_macros 0.25.3",
- "thiserror",
- "validator",
-]
-
-[[package]]
-name = "papyrus_proc_macros"
-version = "0.4.0-dev.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80ae7c26b3754c405b911a45d9304c10feebf237b6b91b3c3c0fc31cbad9692f"
-dependencies = [
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "papyrus_storage"
-version = "0.4.0-dev.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "92bd277d8c0f980cb9da4584b01cd43213309ed0d5dc73a627b24080fab89845"
-dependencies = [
- "byteorder",
- "cairo-lang-casm",
- "cairo-lang-starknet-classes",
- "cairo-lang-utils",
- "human_bytes",
- "indexmap 2.2.6",
- "integer-encoding",
- "libmdbx",
- "memmap2",
- "metrics",
- "num-bigint",
- "page_size",
- "papyrus_common",
- "papyrus_config",
- "papyrus_proc_macros",
- "parity-scale-codec",
- "primitive-types",
- "serde",
- "serde_json",
- "starknet-types-core",
- "starknet_api",
- "tempfile",
- "thiserror",
- "tracing",
- "validator",
- "zstd 0.13.1",
-]
-
-[[package]]
-name = "parity-scale-codec"
-version = "3.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "306800abfa29c7f16596b5970a588435e3d5b3149683d00c12b699cc19f895ee"
-dependencies = [
- "arrayvec",
- "bitvec",
- "byte-slice-cast",
- "impl-trait-for-tuples",
- "parity-scale-codec-derive",
- "serde",
-]
-
-[[package]]
-name = "parity-scale-codec-derive"
-version = "3.6.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d830939c76d294956402033aee57a6da7b438f2294eb94864c37b0569053a42c"
-dependencies = [
- "proc-macro-crate",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
-dependencies = [
- "instant",
- "lock_api",
- "parking_lot_core 0.8.6",
-]
-
-[[package]]
-name = "parking_lot"
-version = "0.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
-dependencies = [
- "lock_api",
- "parking_lot_core 0.9.9",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.8.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
-dependencies = [
- "cfg-if",
- "instant",
- "libc",
- "redox_syscall 0.2.16",
- "smallvec",
- "winapi",
-]
-
-[[package]]
-name = "parking_lot_core"
-version = "0.9.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
-dependencies = [
- "cfg-if",
- "libc",
- "redox_syscall 0.4.1",
- "smallvec",
- "windows-targets 0.48.5",
-]
-
-[[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.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
-
-[[package]]
-name = "path-clean"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "17359afc20d7ab31fdb42bb844c8b3bb1dabd7dcf7e68428492da7f16966fcef"
-
-[[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 = "peeking_take_while"
-version = "0.1.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
-
-[[package]]
-name = "percent-encoding"
-version = "2.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
-
-[[package]]
-name = "petgraph"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
-dependencies = [
- "fixedbitset",
- "indexmap 2.2.6",
-]
-
-[[package]]
-name = "phf"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc"
-dependencies = [
- "phf_macros",
- "phf_shared 0.11.2",
-]
-
-[[package]]
-name = "phf_generator"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0"
-dependencies = [
- "phf_shared 0.11.2",
- "rand",
-]
-
-[[package]]
-name = "phf_macros"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b"
-dependencies = [
- "phf_generator",
- "phf_shared 0.11.2",
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "phf_shared"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b"
-dependencies = [
- "siphasher",
-]
-
-[[package]]
-name = "pico-args"
-version = "0.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
-
-[[package]]
-name = "pin-project-lite"
-version = "0.2.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
-
-[[package]]
-name = "pin-utils"
-version = "0.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
-
-[[package]]
-name = "pkg-config"
-version = "0.3.30"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
-
-[[package]]
-name = "plotters"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d2c224ba00d7cadd4d5c660deaf2098e5e80e07846537c51f9cfa4be50c1fd45"
-dependencies = [
- "num-traits 0.2.19",
- "plotters-backend",
- "plotters-svg",
- "wasm-bindgen",
- "web-sys",
-]
-
-[[package]]
-name = "plotters-backend"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9e76628b4d3a7581389a35d5b6e2139607ad7c75b17aed325f210aa91f4a9609"
-
-[[package]]
-name = "plotters-svg"
-version = "0.3.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38f6d39893cca0701371e3c27294f09797214b86f1fb951b89ade8ec04e2abab"
-dependencies = [
- "plotters-backend",
-]
-
-[[package]]
-name = "portable-atomic"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7170ef9988bc169ba16dd36a7fa041e5c4cbeb6a35b76d4c03daded371eae7c0"
-
-[[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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
-
-[[package]]
-name = "precomputed-hash"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
-
-[[package]]
-name = "pretty_assertions"
-version = "1.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af7cee1a6c8a5b9208b3cb1061f10c0cb689087b3d8ce85fb9d2dd7a29b6ba66"
-dependencies = [
- "diff",
- "yansi",
-]
-
-[[package]]
-name = "primitive-types"
-version = "0.12.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2"
-dependencies = [
- "fixed-hash",
- "impl-codec",
- "impl-serde",
- "uint",
-]
-
-[[package]]
-name = "proc-macro-crate"
-version = "3.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284"
-dependencies = [
- "toml_edit 0.21.0",
-]
-
-[[package]]
-name = "proc-macro-error"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c"
-dependencies = [
- "proc-macro-error-attr",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro-error-attr"
-version = "1.0.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869"
-dependencies = [
- "proc-macro2",
- "quote",
- "version_check",
-]
-
-[[package]]
-name = "proc-macro2"
-version = "1.0.85"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "22244ce15aa966053a896d1accb3a6e68469b97c7f33f284b99f0d576879fc23"
-dependencies = [
- "unicode-ident",
-]
-
-[[package]]
-name = "pyo3"
-version = "0.19.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e681a6cfdc4adcc93b4d3cf993749a4552018ee0a9b65fc0ccfad74352c72a38"
-dependencies = [
- "cfg-if",
- "hashbrown 0.14.5",
- "indoc 1.0.9",
- "libc",
- "memoffset",
- "num-bigint",
- "parking_lot 0.12.1",
- "pyo3-build-config",
- "pyo3-ffi",
- "pyo3-macros",
- "unindent",
-]
-
-[[package]]
-name = "pyo3-build-config"
-version = "0.19.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "076c73d0bc438f7a4ef6fdd0c3bb4732149136abd952b110ac93e4edb13a6ba5"
-dependencies = [
- "once_cell",
- "target-lexicon",
-]
-
-[[package]]
-name = "pyo3-ffi"
-version = "0.19.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e53cee42e77ebe256066ba8aa77eff722b3bb91f3419177cf4cd0f304d3284d9"
-dependencies = [
- "libc",
- "pyo3-build-config",
-]
-
-[[package]]
-name = "pyo3-log"
-version = "0.8.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c09c2b349b6538d8a73d436ca606dab6ce0aaab4dad9e6b7bdd57a4f556c3bc3"
-dependencies = [
- "arc-swap",
- "log",
- "pyo3",
-]
-
-[[package]]
-name = "pyo3-macros"
-version = "0.19.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dfeb4c99597e136528c6dd7d5e3de5434d1ceaf487436a3f03b2d56b6fc9efd1"
-dependencies = [
- "proc-macro2",
- "pyo3-macros-backend",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "pyo3-macros-backend"
-version = "0.19.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "947dc12175c254889edc0c02e399476c2f652b4b9ebd123aa655c224de259536"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "quote"
-version = "1.0.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
-dependencies = [
- "proc-macro2",
-]
-
-[[package]]
-name = "radium"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09"
-
-[[package]]
-name = "rand"
-version = "0.8.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
-dependencies = [
- "libc",
- "rand_chacha",
- "rand_core",
-]
-
-[[package]]
-name = "rand_chacha"
-version = "0.3.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
-dependencies = [
- "ppv-lite86",
- "rand_core",
-]
-
-[[package]]
-name = "rand_core"
-version = "0.6.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
-dependencies = [
- "getrandom",
-]
-
-[[package]]
-name = "rawpointer"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "60a357793950651c4ed0f3f52338f53b2f809f32d83a07f72909fa13e4c6c1e3"
-
-[[package]]
-name = "rayon"
-version = "1.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa"
-dependencies = [
- "either",
- "rayon-core",
-]
-
-[[package]]
-name = "rayon-core"
-version = "1.12.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2"
-dependencies = [
- "crossbeam-deque",
- "crossbeam-utils",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.2.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_syscall"
-version = "0.4.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
-dependencies = [
- "bitflags 1.3.2",
-]
-
-[[package]]
-name = "redox_users"
-version = "0.4.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4"
-dependencies = [
- "getrandom",
- "libredox",
- "thiserror",
-]
-
-[[package]]
-name = "regex"
-version = "1.10.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-automata",
- "regex-syntax 0.8.2",
-]
-
-[[package]]
-name = "regex-automata"
-version = "0.4.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea"
-dependencies = [
- "aho-corasick",
- "memchr",
- "regex-syntax 0.8.2",
-]
-
-[[package]]
-name = "regex-syntax"
-version = "0.7.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da"
-
-[[package]]
-name = "regex-syntax"
-version = "0.8.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
-
-[[package]]
-name = "relative-path"
-version = "1.9.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e898588f33fdd5b9420719948f9f2a32c922a246964576f71ba7f24f80610fbc"
-
-[[package]]
-name = "rfc6979"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f8dd2a808d456c4a54e300a23e9f5a67e122c3024119acbfd73e3bf664491cb2"
-dependencies = [
- "hmac",
- "subtle",
-]
-
-[[package]]
-name = "rstest"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de1bb486a691878cd320c2f0d319ba91eeaa2e894066d8b5f8f117c000e9d962"
-dependencies = [
- "futures",
- "futures-timer",
- "rstest_macros",
- "rustc_version",
-]
-
-[[package]]
-name = "rstest_macros"
-version = "0.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290ca1a1c8ca7edb7c3283bd44dc35dd54fdec6253a3912e201ba1072018fca8"
-dependencies = [
- "cfg-if",
- "proc-macro2",
- "quote",
- "rustc_version",
- "syn 1.0.109",
- "unicode-ident",
-]
-
-[[package]]
-name = "rust_decimal"
-version = "1.35.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1790d1c4c0ca81211399e0e0af16333276f375209e71a37b67698a373db5b47a"
-dependencies = [
- "arrayvec",
- "num-traits 0.2.19",
-]
-
-[[package]]
-name = "rustc-demangle"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
-
-[[package]]
-name = "rustc-hash"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
-
-[[package]]
-name = "rustc-hex"
-version = "2.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6"
-
-[[package]]
-name = "rustc_version"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
-dependencies = [
- "semver",
-]
-
-[[package]]
-name = "rustix"
-version = "0.38.34"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f"
-dependencies = [
- "bitflags 2.4.1",
- "errno",
- "libc",
- "linux-raw-sys",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "rustversion"
-version = "1.0.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
-
-[[package]]
-name = "ryu"
-version = "1.0.16"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
-
-[[package]]
-name = "salsa"
-version = "0.16.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4b84d9f96071f3f3be0dc818eae3327625d8ebc95b58da37d6850724f31d3403"
-dependencies = [
- "crossbeam-utils",
- "indexmap 1.9.3",
- "lock_api",
- "log",
- "oorandom",
- "parking_lot 0.11.2",
- "rustc-hash",
- "salsa-macros",
- "smallvec",
-]
-
-[[package]]
-name = "salsa-macros"
-version = "0.16.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cd3904a4ba0a9d0211816177fd34b04c7095443f8cdacd11175064fe541c8fe2"
-dependencies = [
- "heck 0.3.3",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "same-file"
-version = "1.0.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
-dependencies = [
- "winapi-util",
-]
-
-[[package]]
-name = "schemars"
-version = "0.8.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09c024468a378b7e36765cd36702b7a90cc3cba11654f6685c8f233408e89e92"
-dependencies = [
- "dyn-clone",
- "indexmap 1.9.3",
- "schemars_derive",
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "schemars_derive"
-version = "0.8.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b1eee588578aff73f856ab961cd2f79e36bc45d7ded33a7562adba4667aecc0e"
-dependencies = [
- "proc-macro2",
- "quote",
- "serde_derive_internals",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "scopeguard"
-version = "1.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
-
-[[package]]
-name = "semver"
-version = "1.0.21"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0"
-
-[[package]]
-name = "serde"
-version = "1.0.203"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7253ab4de971e72fb7be983802300c30b5a7f0c2e56fab8abfc6a214307c0094"
-dependencies = [
- "serde_derive",
-]
-
-[[package]]
-name = "serde_cbor"
-version = "0.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2bef2ebfde456fb76bbcf9f59315333decc4fda0b2b44b420243c11e0f5ec1f5"
-dependencies = [
- "half",
- "serde",
-]
-
-[[package]]
-name = "serde_derive"
-version = "1.0.203"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "500cbc0ebeb6f46627f50f3f5811ccf6bf00643be300b4c3eabc0ef55dc5b5ba"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "serde_derive_internals"
-version = "0.29.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "serde_json"
-version = "1.0.117"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3"
-dependencies = [
- "itoa",
- "ryu",
- "serde",
-]
-
-[[package]]
-name = "serde_spanned"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "79e674e01f999af37c49f70a6ede167a8a60b2503e56c5599532a65baa5969a0"
-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"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
-dependencies = [
- "cfg-if",
- "cpufeatures",
- "digest",
-]
-
-[[package]]
-name = "sha3"
-version = "0.10.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
-dependencies = [
- "digest",
- "keccak",
-]
-
-[[package]]
-name = "shlex"
-version = "1.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
-
-[[package]]
-name = "siphasher"
-version = "0.3.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d"
-
-[[package]]
-name = "slab"
-version = "0.4.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
-dependencies = [
- "autocfg",
-]
-
-[[package]]
-name = "smallvec"
-version = "1.11.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
-
-[[package]]
-name = "smol_str"
-version = "0.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74212e6bbe9a4352329b2f68ba3130c15a3f26fe88ff22dbdc6cdd58fa85e99c"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "spin"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
-
-[[package]]
-name = "sprs"
-version = "0.7.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ec63571489873d4506683915840eeb1bb16b3198ee4894cc6f2fe3013d505e56"
-dependencies = [
- "ndarray",
- "num-complex",
- "num-traits 0.1.43",
-]
-
-[[package]]
-name = "starknet-crypto"
-version = "0.5.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d3f2175b0b3fc24ff2ec6dc07f5a720498994effca7e78b11a6e1c1bd02cad52"
-dependencies = [
- "crypto-bigint",
- "hex",
- "hmac",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "rfc6979",
- "sha2",
- "starknet-crypto-codegen",
- "starknet-curve 0.3.0",
- "starknet-ff",
- "zeroize",
-]
-
-[[package]]
-name = "starknet-crypto"
-version = "0.6.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2e2c30c01e8eb0fc913c4ee3cf676389fffc1d1182bfe5bb9670e4e72e968064"
-dependencies = [
- "crypto-bigint",
- "hex",
- "hmac",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "rfc6979",
- "sha2",
- "starknet-crypto-codegen",
- "starknet-curve 0.4.2",
- "starknet-ff",
- "zeroize",
-]
-
-[[package]]
-name = "starknet-crypto-codegen"
-version = "0.3.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbc159a1934c7be9761c237333a57febe060ace2bc9e3b337a59a37af206d19f"
-dependencies = [
- "starknet-curve 0.4.2",
- "starknet-ff",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "starknet-curve"
-version = "0.3.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "252610baff59e4c4332ce3569f7469c5d3f9b415a2240d698fb238b2b4fc0942"
-dependencies = [
- "starknet-ff",
-]
-
-[[package]]
-name = "starknet-curve"
-version = "0.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d1c383518bb312751e4be80f53e8644034aa99a0afb29d7ac41b89a997db875b"
-dependencies = [
- "starknet-ff",
-]
-
-[[package]]
-name = "starknet-ff"
-version = "0.3.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7abf1b44ec5b18d87c1ae5f54590ca9d0699ef4dd5b2ffa66fc97f24613ec585"
-dependencies = [
- "ark-ff",
- "crypto-bigint",
- "getrandom",
- "hex",
-]
-
-[[package]]
-name = "starknet-types-core"
-version = "0.1.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce6bacf0ba19bc721e518bc4bf389ff13daa8a7c5db5fd320600473b8aa9fcbd"
-dependencies = [
- "lambdaworks-crypto",
- "lambdaworks-math",
- "lazy_static",
- "num-bigint",
- "num-integer",
- "num-traits 0.2.19",
- "serde",
-]
-
-[[package]]
-name = "starknet_api"
-version = "0.13.0-rc.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e0a80f50db7439ceb65de759fcbadb1695c82aec82126b2313413632e40d4eec"
-dependencies = [
- "bitvec",
- "cairo-lang-starknet-classes",
- "derive_more",
- "hex",
- "indexmap 2.2.6",
- "itertools 0.12.1",
- "once_cell",
- "primitive-types",
- "serde",
- "serde_json",
- "sha3",
- "starknet-crypto 0.5.2",
- "starknet-types-core",
- "strum",
- "strum_macros 0.24.3",
- "thiserror",
-]
-
-[[package]]
-name = "static_assertions"
-version = "1.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
-
-[[package]]
-name = "string_cache"
-version = "0.8.7"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b"
-dependencies = [
- "new_debug_unreachable",
- "once_cell",
- "parking_lot 0.12.1",
- "phf_shared 0.10.0",
- "precomputed-hash",
-]
-
-[[package]]
-name = "strsim"
-version = "0.10.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623"
-
-[[package]]
-name = "strsim"
-version = "0.11.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
-
-[[package]]
-name = "strum"
-version = "0.24.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
-
-[[package]]
-name = "strum_macros"
-version = "0.24.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59"
-dependencies = [
- "heck 0.4.1",
- "proc-macro2",
- "quote",
- "rustversion",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "strum_macros"
-version = "0.25.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "23dc1fa9ac9c169a78ba62f0b841814b7abae11bdd047b9c58f893439e309ea0"
-dependencies = [
- "heck 0.4.1",
- "proc-macro2",
- "quote",
- "rustversion",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "subtle"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc"
-
-[[package]]
-name = "syn"
-version = "1.0.109"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "syn"
-version = "2.0.66"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c42f3f41a2de00b01c0aaad383c5a45241efc8b2d1eda5661812fda5f3cdcff5"
-dependencies = [
- "proc-macro2",
- "quote",
- "unicode-ident",
-]
-
-[[package]]
-name = "tap"
-version = "1.0.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369"
-
-[[package]]
-name = "target-lexicon"
-version = "0.12.14"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f"
-
-[[package]]
-name = "tempfile"
-version = "3.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1"
-dependencies = [
- "cfg-if",
- "fastrand",
- "rustix",
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "term"
-version = "0.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f"
-dependencies = [
- "dirs-next",
- "rustversion",
- "winapi",
-]
-
-[[package]]
-name = "test-case"
-version = "2.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "21d6cf5a7dffb3f9dceec8e6b8ca528d9bd71d36c9f074defb548ce161f598c0"
-dependencies = [
- "test-case-macros",
-]
-
-[[package]]
-name = "test-case-macros"
-version = "2.2.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e45b7bf6e19353ddd832745c8fcf77a17a93171df7151187f26623f2b75b5b26"
-dependencies = [
- "cfg-if",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "textwrap"
-version = "0.11.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d326610f408c7a4eb6f51c37c330e496b08506c9457c9d34287ecc38809fb060"
-dependencies = [
- "unicode-width",
-]
-
-[[package]]
-name = "thiserror"
-version = "1.0.61"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
-dependencies = [
- "thiserror-impl",
-]
-
-[[package]]
-name = "thiserror-impl"
-version = "1.0.61"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "thiserror-impl-no-std"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "58e6318948b519ba6dc2b442a6d0b904ebfb8d411a3ad3e07843615a72249758"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 1.0.109",
-]
-
-[[package]]
-name = "thiserror-no-std"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a3ad459d94dd517257cc96add8a43190ee620011bb6e6cdc82dafd97dfafafea"
-dependencies = [
- "thiserror-impl-no-std",
-]
-
-[[package]]
-name = "tikv-jemalloc-sys"
-version = "0.5.4+5.3.0-patched"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9402443cb8fd499b6f327e40565234ff34dbda27460c5b47db0db77443dd85d1"
-dependencies = [
- "cc",
- "libc",
-]
-
-[[package]]
-name = "tikv-jemallocator"
-version = "0.5.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "965fe0c26be5c56c94e38ba547249074803efd52adfb66de62107d95aab3eaca"
-dependencies = [
- "libc",
- "tikv-jemalloc-sys",
-]
-
-[[package]]
-name = "time"
-version = "0.3.36"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885"
-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 = "tiny-keccak"
-version = "2.0.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237"
-dependencies = [
- "crunchy",
-]
-
-[[package]]
-name = "tinytemplate"
-version = "1.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "be4d6b5f19ff7664e8c98d03e2139cb510db9b0a60b55f8e8709b689d939b6bc"
-dependencies = [
- "serde",
- "serde_json",
-]
-
-[[package]]
-name = "tinyvec"
-version = "1.6.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
-dependencies = [
- "tinyvec_macros",
-]
-
-[[package]]
-name = "tinyvec_macros"
-version = "0.1.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
-
-[[package]]
-name = "tokio"
-version = "1.35.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
-dependencies = [
- "backtrace",
- "parking_lot 0.12.1",
- "pin-project-lite",
- "tokio-macros",
-]
-
-[[package]]
-name = "tokio-macros"
-version = "2.2.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "toml"
-version = "0.8.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a4e43f8cc456c9704c851ae29c67e17ef65d2c30017c17a9765b89c382dc8bba"
-dependencies = [
- "serde",
- "serde_spanned",
- "toml_datetime",
- "toml_edit 0.22.13",
-]
-
-[[package]]
-name = "toml_datetime"
-version = "0.6.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
-dependencies = [
- "serde",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.21.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d34d383cd00a163b4a5b85053df514d45bc330f6de7737edfe0a93311d1eaa03"
-dependencies = [
- "indexmap 2.2.6",
- "toml_datetime",
- "winnow 0.5.31",
-]
-
-[[package]]
-name = "toml_edit"
-version = "0.22.13"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c127785850e8c20836d49732ae6abfa47616e60bf9d9f57c43c250361a9db96c"
-dependencies = [
- "indexmap 2.2.6",
- "serde",
- "serde_spanned",
- "toml_datetime",
- "winnow 0.6.9",
-]
-
-[[package]]
-name = "tracing"
-version = "0.1.40"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
-dependencies = [
- "log",
- "pin-project-lite",
- "tracing-attributes",
- "tracing-core",
-]
-
-[[package]]
-name = "tracing-attributes"
-version = "0.1.27"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "tracing-core"
-version = "0.1.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
-dependencies = [
- "once_cell",
-]
-
-[[package]]
-name = "typenum"
-version = "1.17.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
-
-[[package]]
-name = "uint"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52"
-dependencies = [
- "byteorder",
- "crunchy",
- "hex",
- "static_assertions",
-]
-
-[[package]]
-name = "unescaper"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8f0f68e58d297ba8b22b8b5a96a87b863ba6bb46aaf51e19a4b02c5a6dd5b7f"
-dependencies = [
- "thiserror",
-]
-
-[[package]]
-name = "unicode-bidi"
-version = "0.3.15"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75"
-
-[[package]]
-name = "unicode-ident"
-version = "1.0.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
-
-[[package]]
-name = "unicode-normalization"
-version = "0.1.23"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5"
-dependencies = [
- "tinyvec",
-]
-
-[[package]]
-name = "unicode-segmentation"
-version = "1.10.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36"
-
-[[package]]
-name = "unicode-width"
-version = "0.1.12"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "68f5e5f3158ecfd4b8ff6fe086db7c8467a2dfdac97fe420f2b7c4aa97af66d6"
-
-[[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
-name = "unindent"
-version = "0.1.11"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1766d682d402817b5ac4490b3c3002d91dfa0d22812f341609f97b08757359c"
-
-[[package]]
-name = "url"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
-dependencies = [
- "form_urlencoded",
- "idna 0.5.0",
- "percent-encoding",
-]
-
-[[package]]
-name = "utf8parse"
-version = "0.2.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
-
-[[package]]
-name = "validator"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "841d6937c33ec6039d8071bcf72933146b5bbe378d645d8fa59bdadabfc2a249"
-dependencies = [
- "idna 0.2.3",
- "lazy_static",
- "regex",
- "serde",
- "serde_derive",
- "serde_json",
- "url",
- "validator_derive",
- "validator_types",
-]
-
-[[package]]
-name = "validator_derive"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4286b4497f270f59276a89ae0ad109d5f8f18c69b613e3fb22b61201aadb0c4d"
-dependencies = [
- "if_chain",
- "lazy_static",
- "proc-macro-error",
- "proc-macro2",
- "quote",
- "regex",
- "syn 1.0.109",
- "validator_types",
-]
-
-[[package]]
-name = "validator_types"
-version = "0.12.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ad9680608df133af2c1ddd5eaf1ddce91d60d61b6bc51494ef326458365a470a"
-
-[[package]]
-name = "version_check"
-version = "0.9.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
-
-[[package]]
-name = "walkdir"
-version = "2.5.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b"
-dependencies = [
- "same-file",
- "winapi-util",
-]
-
-[[package]]
-name = "wasi"
-version = "0.11.0+wasi-snapshot-preview1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
-
-[[package]]
-name = "wasm-bindgen"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8"
-dependencies = [
- "cfg-if",
- "wasm-bindgen-macro",
-]
-
-[[package]]
-name = "wasm-bindgen-backend"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da"
-dependencies = [
- "bumpalo",
- "log",
- "once_cell",
- "proc-macro2",
- "quote",
- "syn 2.0.66",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-macro"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726"
-dependencies = [
- "quote",
- "wasm-bindgen-macro-support",
-]
-
-[[package]]
-name = "wasm-bindgen-macro-support"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
- "wasm-bindgen-backend",
- "wasm-bindgen-shared",
-]
-
-[[package]]
-name = "wasm-bindgen-shared"
-version = "0.2.92"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96"
-
-[[package]]
-name = "web-sys"
-version = "0.3.69"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef"
-dependencies = [
- "js-sys",
- "wasm-bindgen",
-]
-
-[[package]]
-name = "winapi"
-version = "0.3.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
-dependencies = [
- "winapi-i686-pc-windows-gnu",
- "winapi-x86_64-pc-windows-gnu",
-]
-
-[[package]]
-name = "winapi-i686-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
-
-[[package]]
-name = "winapi-util"
-version = "0.1.8"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b"
-dependencies = [
- "windows-sys 0.52.0",
-]
-
-[[package]]
-name = "winapi-x86_64-pc-windows-gnu"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
-
-[[package]]
-name = "windows-sys"
-version = "0.48.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
-dependencies = [
- "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.0",
-]
-
-[[package]]
-name = "windows-targets"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
-dependencies = [
- "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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd"
-dependencies = [
- "windows_aarch64_gnullvm 0.52.0",
- "windows_aarch64_msvc 0.52.0",
- "windows_i686_gnu 0.52.0",
- "windows_i686_msvc 0.52.0",
- "windows_x86_64_gnu 0.52.0",
- "windows_x86_64_gnullvm 0.52.0",
- "windows_x86_64_msvc 0.52.0",
-]
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.48.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
-
-[[package]]
-name = "windows_aarch64_gnullvm"
-version = "0.52.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea"
-
-[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef"
-
-[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313"
-
-[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a"
-
-[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd"
-
-[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e"
-
-[[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.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04"
-
-[[package]]
-name = "winnow"
-version = "0.5.31"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "97a4882e6b134d6c28953a387571f1acdd3496830d5e36c5e3a1075580ea641c"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "winnow"
-version = "0.6.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "86c949fede1d13936a99f14fafd3e76fd642b556dd2ce96287fbe2e0151bfac6"
-dependencies = [
- "memchr",
-]
-
-[[package]]
-name = "wyz"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
-dependencies = [
- "tap",
-]
-
-[[package]]
-name = "xshell"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6db0ab86eae739efd1b054a8d3d16041914030ac4e01cd1dca0cf252fd8b6437"
-dependencies = [
- "xshell-macros",
-]
-
-[[package]]
-name = "xshell-macros"
-version = "0.2.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d422e8e38ec76e2f06ee439ccc765e9c6a9638b9e7c9f2e8255e4d41e8bd852"
-
-[[package]]
-name = "yansi"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
-
-[[package]]
-name = "zerocopy"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be"
-dependencies = [
- "zerocopy-derive",
-]
-
-[[package]]
-name = "zerocopy-derive"
-version = "0.7.32"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[package]]
-name = "zeroize"
-version = "1.7.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d"
-dependencies = [
- "zeroize_derive",
-]
-
-[[package]]
-name = "zeroize_derive"
-version = "1.4.2"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
-dependencies = [
- "proc-macro2",
- "quote",
- "syn 2.0.66",
-]
-
-[[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 0.11.2+zstd.1.5.2",
-]
-
-[[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 5.0.2+zstd.1.5.2",
-]
-
-[[package]]
-name = "zstd"
-version = "0.13.1"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d789b1514203a1120ad2429eae43a7bd32b90976a7bb8a05f7ec02fa88cc23a"
-dependencies = [
- "zstd-safe 7.1.0",
-]
-
-[[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-safe"
-version = "7.1.0"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd99b45c6bc03a018c8b8a86025678c87e55526064e38f9df301989dce7ec0a"
-dependencies = [
- "zstd-sys",
-]
-
-[[package]]
-name = "zstd-sys"
-version = "2.0.10+zstd.1.5.6"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c253a4914af5bafc8fa8c86ee400827e83cf6ec01195ec1f1ed8441bf00d65aa"
-dependencies = [
- "cc",
- "pkg-config",
-]
diff --git a/Cargo.toml b/Cargo.toml
deleted file mode 100644
index 1066dabdf1a..00000000000
--- a/Cargo.toml
+++ /dev/null
@@ -1,70 +0,0 @@
-[workspace]
-# Using version 2 to avoid unifying features. For more info, read:
-# https://doc.rust-lang.org/cargo/reference/resolver.html#feature-resolver-version-2
-resolver = "2"
-
-members = ["crates/blockifier", "crates/native_blockifier"]
-
-[workspace.package]
-version = "0.8.0-rc.1"
-edition = "2021"
-repository = "https://github.com/starkware-libs/blockifier/"
-license = "Apache-2.0"
-license-file = "LICENSE"
-
-[workspace.dependencies]
-anyhow = "1.0.0"
-ark-ec = "0.4.2"
-ark-ff = "0.4.0-alpha.7"
-ark-secp256k1 = "0.4.0"
-ark-secp256r1 = "0.4.0"
-assert_matches = "1.5.0"
-cached = "0.44.0"
-cairo-lang-casm = "2.7.0-rc.3"
-cairo-lang-runner = "2.7.0-rc.3"
-cairo-lang-starknet-classes = "2.7.0-rc.3"
-cairo-lang-utils = "2.7.0-rc.3"
-cairo-vm = "1.0.0-rc5"
-criterion = "0.3"
-derive_more = "0.99.17"
-glob = "0.3.1"
-indexmap = "2.1.0"
-itertools = "0.10.3"
-keccak = "0.1.3"
-log = "0.4"
-num-bigint = "0.4"
-num-integer = "0.1.45"
-num-rational = { version = "0.4", features = ["serde"] }
-num-traits = "0.2"
-once_cell = "1.19.0"
-papyrus_storage = "0.4.0-dev.4"
-paste = "1.0.15"
-phf = { version = "0.11", features = ["macros"] }
-pretty_assertions = "1.2.1"
-pyo3 = "0.19.1"
-pyo3-log = "0.8.1"
-rand = "0.8"
-regex = "1.10.4"
-rstest = "0.17.0"
-serde = "1.0.184"
-serde_json = "1.0.81"
-sha2 = "0.10.8"
-sha3 = "0.10.6"
-starknet-types-core = { version = "0.1.5", features = ["hash", "prime-bigint"] }
-starknet_api = "0.13.0-rc.0"
-strum = "0.24.1"
-strum_macros = "0.24.3"
-tempfile = "3.7.0"
-test-case = "2.2.2"
-thiserror = "1.0.37"
-tikv-jemallocator = "0.5.4"
-
-[workspace.lints.rust]
-future-incompatible = "deny"
-nonstandard-style = "deny"
-rust-2018-idioms = "deny"
-unused = "deny"
-warnings = "deny"
-
-[workspace.lints.clippy]
-as_conversions = "deny"
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index e6d9a8d4ee6..00000000000
--- a/Dockerfile
+++ /dev/null
@@ -1,14 +0,0 @@
-FROM ubuntu:20.04
-
-RUN apt update && apt -y install \
- build-essential \
- clang \
- curl \
- python3-dev
-
-ENV RUSTUP_HOME=/opt/rust
-ENV CARGO_HOME=/opt/rust
-ENV PATH=$PATH:/opt/rust/bin
-
-COPY scripts/install_build_tools.sh .
-RUN bash install_build_tools.sh
diff --git a/README.md b/README.md
deleted file mode 100644
index 110fa3be730..00000000000
--- a/README.md
+++ /dev/null
@@ -1,66 +0,0 @@
-
-
-
-
-
-[](https://github.com/starkware-libs/blockifier/actions/workflows/post-merge.yml)
-[](https://codecov.io/gh/starkware-libs/blockifier)
-
-
-
-
-Table of Contents
-
-- [About](#about)
-- [Roadmap](#roadmap)
-- [Support](#support)
-- [Security](#security)
-- [License](#license)
-
-
-
----
-
-## About
-
-Blockifier is a Rust implementation of the component in the Starknet sequencer that executes transactions, and is in charge of creating state diffs and blocks.
-
-## Roadmap
-
-The Blockifier is a step towards a decentralized sequencer client for Starknet, allowing anyone to run one.
-We'll add more milestones to this table once we finish the first one, where we blockify transactions sequentially, including all existing functionality.
-
-| name | status |
-| -------------------------------------------------------------------------------------------------------------------------------------- | :----: |
-| Add the ability to execute a block and output a state diff. | ✅ |
-| Integrate with the existing Starknet Sequencer by replacing its current transaction-blockifying component, which is written in Python. | ⏳ |
-| Implement optimistic concurrency of transaction execution. | |
-| Extend the Blockifier into a full Starknet sequencer, written in Rust, replacing the one currently in use. | |
-
-## Support
-
-Reach out to the maintainer at one of the following places:
-
-- [GitHub Discussions](https://github.com/starkware-libs/blockifier/discussions)
-- Contact options listed on [this GitHub profile](https://github.com/starkware-libs)
-
-## Security
-
-Blockifier follows good security practices, but 100% security cannot be assured.
-Blockifier is provided **"as is"** without any **warranty**. Use at your own risk.
-
-_For more information and to report security issues, please refer to our [security documentation](docs/SECURITY.md)._
-
-## License
-
-This project is licensed under the **Apache 2.0 license**.
-
-See [LICENSE](LICENSE) for more information.
diff --git a/WORKSPACE b/WORKSPACE
deleted file mode 100644
index e69de29bb2d..00000000000
diff --git a/build_native_blockifier.sh b/build_native_blockifier.sh
deleted file mode 100755
index 3c3879485e1..00000000000
--- a/build_native_blockifier.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/env bash
-set -e
-
-docker_image_name=blockifier-ci
-docker build . -t ${docker_image_name}
-
-docker run \
- --rm \
- --net host \
- -e CARGO_HOME=${HOME}/.cargo \
- -u $UID \
- -v /tmp:/tmp \
- -v "${HOME}:${HOME}" \
- --workdir ${PWD} \
- ${docker_image_name} \
- cargo build --release -p native_blockifier --features "testing"
diff --git a/commitlint.config.js b/commitlint.config.js
deleted file mode 100644
index 910cc673cd6..00000000000
--- a/commitlint.config.js
+++ /dev/null
@@ -1,58 +0,0 @@
-const Configuration = {
- /*
- * Resolve and load @commitlint/config-conventional from node_modules.
- * Referenced packages must be installed.
- * See [the README](https://github.com/conventional-changelog/commitlint/blob/master/%40commitlint/config-conventional/README.md)
- * for applied rules.
- */
- extends: ['@commitlint/config-conventional'],
- /*
- * Resolve and load conventional-changelog-atom from node_modules.
- * Referenced packages must be installed
- */
- // parserPreset: 'conventional-changelog-atom',
- /*
- * Resolve and load @commitlint/format from node_modules.
- * Referenced package must be installed
- */
- formatter: '@commitlint/format',
- /*
- * Any rules defined here will override rules from @commitlint/config-conventional
- */
- rules: {
- 'scope-enum': [2, 'always', [
- 'concurrency',
- 'execution',
- 'fee',
- 'native_blockifier',
- 'state',
- 'transaction',
- ]],
- },
- /*
- * Functions that return true if commitlint should ignore the given message.
- */
- ignores: [(commit) => commit === ''],
- /*
- * Whether commitlint uses the default ignore rules.
- */
- defaultIgnores: true,
- /*
- * Custom URL to show upon failure
- */
- helpUrl:
- 'https://github.com/conventional-changelog/commitlint/#what-is-commitlint',
- /*
- * Custom prompt configs, not used currently.
- */
- prompt: {
- messages: {},
- questions: {
- type: {
- description: 'please input type:',
- },
- },
- },
-};
-
-module.exports = Configuration;
diff --git a/crates/committer/Cargo.toml b/crates/committer/Cargo.toml
new file mode 100644
index 00000000000..aed76d8e4b2
--- /dev/null
+++ b/crates/committer/Cargo.toml
@@ -0,0 +1,38 @@
+[package]
+name = "committer"
+version.workspace = true
+edition.workspace = true
+repository.workspace = true
+license-file.workspace = true
+description = "Computes and manages Starknet state."
+
+[lints]
+workspace = true
+
+[features]
+testing = []
+
+[dev-dependencies]
+pretty_assertions.workspace = true
+rand.workspace = true
+rstest.workspace = true
+
+[dependencies]
+async-recursion.workspace = true
+derive_more.workspace = true
+ethnum.workspace = true
+hex.workspace = true
+log.workspace = true
+rand.workspace = true
+serde.workspace = true
+serde_json.workspace = true
+starknet-types-core.workspace = true
+strum.workspace = true
+strum_macros.workspace = true
+thiserror.workspace = true
+tokio.workspace = true
+
+# Optional dependencies required for tests and the testing feature.
+# See [here](https://github.com/bnjbvr/cargo-machete/issues/128).
+[package.metadata.cargo-machete]
+ignored = ["strum"]
diff --git a/crates/committer/src/block_committer.rs b/crates/committer/src/block_committer.rs
new file mode 100644
index 00000000000..3a8d642348d
--- /dev/null
+++ b/crates/committer/src/block_committer.rs
@@ -0,0 +1,3 @@
+pub mod commit;
+pub mod errors;
+pub mod input;
diff --git a/crates/committer/src/block_committer/commit.rs b/crates/committer/src/block_committer/commit.rs
new file mode 100644
index 00000000000..a3d2cec8aa3
--- /dev/null
+++ b/crates/committer/src/block_committer/commit.rs
@@ -0,0 +1,148 @@
+use log::warn;
+use std::collections::HashMap;
+
+use crate::block_committer::errors::BlockCommitmentError;
+use crate::block_committer::input::Config;
+use crate::block_committer::input::ConfigImpl;
+use crate::block_committer::input::ContractAddress;
+use crate::block_committer::input::Input;
+use crate::block_committer::input::StateDiff;
+use crate::patricia_merkle_tree::filled_tree::forest::FilledForest;
+use crate::patricia_merkle_tree::filled_tree::node::{ClassHash, Nonce};
+use crate::patricia_merkle_tree::node_data::leaf::ContractState;
+use crate::patricia_merkle_tree::original_skeleton_tree::skeleton_forest::ForestSortedIndices;
+use crate::patricia_merkle_tree::original_skeleton_tree::skeleton_forest::OriginalSkeletonForest;
+use crate::patricia_merkle_tree::types::NodeIndex;
+use crate::patricia_merkle_tree::types::SortedLeafIndices;
+use crate::patricia_merkle_tree::updated_skeleton_tree::hash_function::TreeHashFunctionImpl;
+use crate::patricia_merkle_tree::updated_skeleton_tree::skeleton_forest::UpdatedSkeletonForest;
+use crate::storage::map_storage::MapStorage;
+
+type BlockCommitmentResult = Result;
+
+pub async fn commit_block(input: Input) -> BlockCommitmentResult {
+ let (mut storage_tries_indices, mut contracts_trie_indices, mut classes_trie_indices) =
+ get_all_modified_indices(&input.state_diff);
+ let forest_sorted_indices = ForestSortedIndices {
+ storage_tries_sorted_indices: storage_tries_indices
+ .iter_mut()
+ .map(|(address, indices)| (*address, SortedLeafIndices::new(indices)))
+ .collect(),
+ contracts_trie_sorted_indices: SortedLeafIndices::new(&mut contracts_trie_indices),
+ classes_trie_sorted_indices: SortedLeafIndices::new(&mut classes_trie_indices),
+ };
+ let actual_storage_updates = input.state_diff.actual_storage_updates();
+ let actual_classes_updates = input.state_diff.actual_classes_updates();
+ let (mut original_forest, original_contracts_trie_leaves) = OriginalSkeletonForest::create(
+ MapStorage::from(input.storage),
+ input.contracts_trie_root_hash,
+ input.classes_trie_root_hash,
+ &actual_storage_updates,
+ &actual_classes_updates,
+ &forest_sorted_indices,
+ &input.config,
+ )?;
+
+ if input.config.warn_on_trivial_modifications() {
+ check_trivial_nonce_and_class_hash_updates(
+ &original_contracts_trie_leaves,
+ &input.state_diff.address_to_class_hash,
+ &input.state_diff.address_to_nonce,
+ );
+ }
+
+ let updated_forest = UpdatedSkeletonForest::create(
+ &mut original_forest,
+ &input.state_diff.skeleton_classes_updates(),
+ &input.state_diff.skeleton_storage_updates(),
+ &original_contracts_trie_leaves,
+ &input.state_diff.address_to_class_hash,
+ &input.state_diff.address_to_nonce,
+ )?;
+
+ Ok(FilledForest::create::(
+ updated_forest,
+ actual_storage_updates,
+ actual_classes_updates,
+ &original_contracts_trie_leaves,
+ &input.state_diff.address_to_class_hash,
+ &input.state_diff.address_to_nonce,
+ )
+ .await?)
+}
+
+/// Compares the previous state's nonce and class hash with the given in the state diff.
+/// In case of trivial update, logs out a warning for trivial state diff update.
+fn check_trivial_nonce_and_class_hash_updates(
+ original_contracts_trie_leaves: &HashMap,
+ address_to_class_hash: &HashMap,
+ address_to_nonce: &HashMap,
+) {
+ for (address, nonce) in address_to_nonce.iter() {
+ if original_contracts_trie_leaves
+ .get(&NodeIndex::from_contract_address(address))
+ .is_some_and(|previous_contract_state| previous_contract_state.nonce == *nonce)
+ {
+ warn!(
+ "Encountered a trivial nonce update of contract {:?}",
+ address
+ )
+ }
+ }
+
+ for (address, class_hash) in address_to_class_hash.iter() {
+ if original_contracts_trie_leaves
+ .get(&NodeIndex::from_contract_address(address))
+ .is_some_and(|previous_contract_state| {
+ previous_contract_state.class_hash == *class_hash
+ })
+ {
+ warn!(
+ "Encountered a trivial class hash update of contract {:?}",
+ address
+ )
+ }
+ }
+}
+
+type StorageTriesIndices = HashMap>;
+type ContractsTrieIndices = Vec;
+type ClassesTrieIndices = Vec;
+
+/// Returns all modified indices in the given state diff.
+pub(crate) fn get_all_modified_indices(
+ state_diff: &StateDiff,
+) -> (
+ StorageTriesIndices,
+ ContractsTrieIndices,
+ ClassesTrieIndices,
+) {
+ let accessed_addresses = state_diff.accessed_addresses();
+ let contracts_trie_indices: Vec = accessed_addresses
+ .iter()
+ .map(|address| NodeIndex::from_contract_address(address))
+ .collect();
+ let classes_trie_indices: Vec = state_diff
+ .class_hash_to_compiled_class_hash
+ .keys()
+ .map(NodeIndex::from_class_hash)
+ .collect();
+ let storage_tries_indices: HashMap> = accessed_addresses
+ .iter()
+ .map(|address| {
+ let indices: Vec = match state_diff.storage_updates.get(address) {
+ Some(updates) => updates
+ .keys()
+ .map(NodeIndex::from_starknet_storage_key)
+ .collect(),
+ None => Vec::new(),
+ };
+ (**address, indices)
+ })
+ .collect();
+ (
+ storage_tries_indices,
+ contracts_trie_indices,
+ classes_trie_indices,
+ )
+}
diff --git a/crates/committer/src/block_committer/errors.rs b/crates/committer/src/block_committer/errors.rs
new file mode 100644
index 00000000000..f2c7d4d2ae1
--- /dev/null
+++ b/crates/committer/src/block_committer/errors.rs
@@ -0,0 +1,9 @@
+use thiserror::Error;
+
+use crate::forest_errors::ForestError;
+
+#[derive(Debug, Error)]
+pub enum BlockCommitmentError {
+ #[error(transparent)]
+ ForestError(#[from] ForestError),
+}
diff --git a/crates/committer/src/block_committer/input.rs b/crates/committer/src/block_committer/input.rs
new file mode 100644
index 00000000000..10f6f630fc1
--- /dev/null
+++ b/crates/committer/src/block_committer/input.rs
@@ -0,0 +1,150 @@
+use log::LevelFilter;
+
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::filled_tree::node::{ClassHash, CompiledClassHash, Nonce};
+use crate::patricia_merkle_tree::node_data::leaf::{LeafModifications, SkeletonLeaf};
+use crate::patricia_merkle_tree::types::NodeIndex;
+use crate::storage::storage_trait::{StorageKey, StorageValue};
+use std::collections::{HashMap, HashSet};
+use std::fmt::Debug;
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+// TODO(Nimrod, 1/6/2025): Use the ContractAddress defined in starknet-types-core when available.
+pub struct ContractAddress(pub Felt);
+
+#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
+// TODO(Nimrod, 1/6/2025): Use the StarknetStorageValue defined in starknet-types-core when available.
+pub struct StarknetStorageKey(pub Felt);
+
+#[derive(Clone, Copy, Default, Debug, Eq, PartialEq)]
+pub struct StarknetStorageValue(pub Felt);
+
+#[derive(Debug, Default, Eq, PartialEq)]
+pub struct StateDiff {
+ pub address_to_class_hash: HashMap,
+ pub address_to_nonce: HashMap,
+ pub class_hash_to_compiled_class_hash: HashMap,
+ pub storage_updates:
+ HashMap>,
+}
+
+/// Trait contains all optional configurations of the committer.
+pub trait Config: Debug + Eq + PartialEq {
+ /// Indicates whether a warning should be given in case of a trivial state update.
+ /// If the configuration is set, it requires that the storage will contain the original data for
+ /// the modified leaves. Otherwise, it is not required.
+ fn warn_on_trivial_modifications(&self) -> bool;
+
+ /// Indicates from which log level output should be printed out to console.
+ fn logger_level(&self) -> LevelFilter;
+}
+
+#[derive(Debug, Eq, PartialEq)]
+pub struct ConfigImpl {
+ warn_on_trivial_modifications: bool,
+ log_level: LevelFilter,
+}
+
+impl Config for ConfigImpl {
+ fn warn_on_trivial_modifications(&self) -> bool {
+ self.warn_on_trivial_modifications
+ }
+
+ fn logger_level(&self) -> LevelFilter {
+ self.log_level
+ }
+}
+
+impl ConfigImpl {
+ pub fn new(warn_on_trivial_modifications: bool, log_level: LevelFilter) -> Self {
+ Self {
+ warn_on_trivial_modifications,
+ log_level,
+ }
+ }
+}
+
+#[derive(Debug, Eq, PartialEq)]
+pub struct Input {
+ pub storage: HashMap,
+ /// All relevant information for the state diff commitment.
+ pub state_diff: StateDiff,
+ pub contracts_trie_root_hash: HashOutput,
+ pub classes_trie_root_hash: HashOutput,
+ pub config: C,
+}
+
+impl StateDiff {
+ pub(crate) fn accessed_addresses(&self) -> HashSet<&ContractAddress> {
+ HashSet::from_iter(
+ self.address_to_class_hash
+ .keys()
+ .chain(self.address_to_nonce.keys())
+ .chain(self.storage_updates.keys()),
+ )
+ }
+
+ /// For each modified contract calculates it's actual storage updates.
+ pub(crate) fn skeleton_storage_updates(
+ &self,
+ ) -> HashMap> {
+ self.accessed_addresses()
+ .iter()
+ .map(|address| {
+ let updates = match self.storage_updates.get(address) {
+ Some(inner_updates) => inner_updates
+ .iter()
+ .map(|(key, value)| {
+ (
+ NodeIndex::from_starknet_storage_key(key),
+ SkeletonLeaf::from(value.0),
+ )
+ })
+ .collect(),
+ None => HashMap::new(),
+ };
+ (**address, updates)
+ })
+ .collect()
+ }
+
+ pub(crate) fn skeleton_classes_updates(&self) -> LeafModifications {
+ self.class_hash_to_compiled_class_hash
+ .iter()
+ .map(|(class_hash, compiled_class_hash)| {
+ (
+ NodeIndex::from_class_hash(class_hash),
+ SkeletonLeaf::from(compiled_class_hash.0),
+ )
+ })
+ .collect()
+ }
+
+ pub(crate) fn actual_storage_updates(
+ &self,
+ ) -> HashMap> {
+ self.accessed_addresses()
+ .iter()
+ .map(|address| {
+ let updates = match self.storage_updates.get(address) {
+ Some(inner_updates) => inner_updates
+ .iter()
+ .map(|(key, value)| (NodeIndex::from_starknet_storage_key(key), *value))
+ .collect(),
+ None => HashMap::new(),
+ };
+ (**address, updates)
+ })
+ .collect()
+ }
+
+ pub(crate) fn actual_classes_updates(&self) -> LeafModifications {
+ self.class_hash_to_compiled_class_hash
+ .iter()
+ .map(|(class_hash, compiled_class_hash)| {
+ (NodeIndex::from_class_hash(class_hash), *compiled_class_hash)
+ })
+ .collect()
+ }
+}
diff --git a/crates/committer/src/felt.rs b/crates/committer/src/felt.rs
new file mode 100644
index 00000000000..85b9b1e970e
--- /dev/null
+++ b/crates/committer/src/felt.rs
@@ -0,0 +1,130 @@
+use core::fmt;
+use ethnum::U256;
+use serde::{Deserialize, Serialize};
+use starknet_types_core::felt::{Felt as StarknetTypesFelt, FromStrError};
+
+#[derive(
+ Eq,
+ PartialEq,
+ Clone,
+ Copy,
+ Default,
+ Hash,
+ derive_more::Add,
+ derive_more::Sub,
+ PartialOrd,
+ Ord,
+ Serialize,
+ Deserialize,
+)]
+pub struct Felt(pub StarknetTypesFelt);
+
+#[macro_export]
+macro_rules! impl_from_hex_for_felt_wrapper {
+ ($wrapper:ty) => {
+ impl $wrapper {
+ pub(crate) fn from_hex(hex_string: &str) -> Result {
+ Ok(Self(Felt::from_hex(hex_string)?))
+ }
+ }
+ };
+}
+
+#[macro_export]
+macro_rules! impl_from {
+ ($to:ty, $from:ty, $($other_from: ty),+) => {
+ $crate::impl_from!($to, $from);
+ $crate::impl_from!($to $(, $other_from)*);
+ };
+ ($to:ty, $from:ty) => {
+ impl From<$from> for $to {
+ fn from(value: $from) -> Self {
+ Self(value.into())
+ }
+ }
+ };
+}
+impl_from!(Felt, StarknetTypesFelt, u128, u8);
+
+impl From for StarknetTypesFelt {
+ fn from(felt: Felt) -> Self {
+ felt.0
+ }
+}
+
+impl From<&Felt> for U256 {
+ fn from(felt: &Felt) -> Self {
+ U256::from_be_bytes(felt.to_bytes_be())
+ }
+}
+
+impl std::ops::Mul for Felt {
+ type Output = Self;
+
+ fn mul(self, rhs: Self) -> Self {
+ Self(self.0 * rhs.0)
+ }
+}
+
+impl fmt::Debug for Felt {
+ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+ write!(f, "{:?}", U256::from(self))
+ }
+}
+
+impl Felt {
+ pub const ZERO: Felt = Felt(StarknetTypesFelt::ZERO);
+ #[allow(dead_code)]
+ pub(crate) const ONE: Felt = Felt(StarknetTypesFelt::ONE);
+ #[allow(dead_code)]
+ pub(crate) const TWO: Felt = Felt(StarknetTypesFelt::TWO);
+ #[allow(dead_code)]
+ pub(crate) const THREE: Felt = Felt(StarknetTypesFelt::THREE);
+ pub const MAX: Felt = Felt(StarknetTypesFelt::MAX);
+
+ pub fn from_bytes_be_slice(bytes: &[u8]) -> Self {
+ Self(StarknetTypesFelt::from_bytes_be_slice(bytes))
+ }
+
+ /// Raises `self` to the power of `exponent`.
+ #[allow(dead_code)]
+ pub(crate) fn pow(&self, exponent: impl Into) -> Self {
+ Self(self.0.pow(exponent.into()))
+ }
+
+ #[allow(dead_code)]
+ pub(crate) fn bits(&self) -> u8 {
+ self.0
+ .bits()
+ .try_into()
+ // Should not fail as it takes less than 252 bits to represent a felt.
+ .expect("Unexpected error occurred when extracting bits of a Felt.")
+ }
+
+ pub fn from_bytes_be(bytes: &[u8; 32]) -> Self {
+ StarknetTypesFelt::from_bytes_be(bytes).into()
+ }
+
+ pub fn to_bytes_be(self) -> [u8; 32] {
+ self.0.to_bytes_be()
+ }
+
+ /// Parse a hex-encoded number into `Felt`.
+ pub fn from_hex(hex_string: &str) -> Result {
+ Ok(StarknetTypesFelt::from_hex(hex_string)?.into())
+ }
+
+ pub fn to_hex(&self) -> String {
+ self.0.to_hex_string()
+ }
+
+ // Convert to a 64-character hexadecimal string without the "0x" prefix.
+ pub fn to_fixed_hex_string(&self) -> String {
+ // Zero-pad the remaining string
+ self.0
+ .to_fixed_hex_string()
+ .strip_prefix("0x")
+ .unwrap_or("0")
+ .to_string()
+ }
+}
diff --git a/crates/committer/src/forest_errors.rs b/crates/committer/src/forest_errors.rs
new file mode 100644
index 00000000000..168ccad0edd
--- /dev/null
+++ b/crates/committer/src/forest_errors.rs
@@ -0,0 +1,35 @@
+use crate::block_committer::input::ContractAddress;
+use crate::patricia_merkle_tree::filled_tree::errors::{
+ ClassesTrieError, ContractsTrieError, StorageTrieError,
+};
+use crate::patricia_merkle_tree::original_skeleton_tree::errors::OriginalSkeletonTreeError;
+use crate::patricia_merkle_tree::updated_skeleton_tree::errors::UpdatedSkeletonTreeError;
+
+use thiserror::Error;
+use tokio::task::JoinError;
+
+pub(crate) type ForestResult = Result;
+
+#[derive(Debug, Error)]
+pub enum ForestError {
+ #[error(transparent)]
+ OriginalSkeleton(#[from] OriginalSkeletonTreeError),
+ #[error(transparent)]
+ UpdatedSkeleton(#[from] UpdatedSkeletonTreeError),
+ #[error(transparent)]
+ ClassesTrie(#[from] ClassesTrieError),
+ #[error(transparent)]
+ StorageTrie(#[from] StorageTrieError),
+ #[error(transparent)]
+ ContractsTrie(#[from] ContractsTrieError),
+ #[error("Missing input: Couldn't find the storage trie's current state of address {0:?}")]
+ MissingContractCurrentState(ContractAddress),
+ #[error("Can't build storage trie's updated skeleton, because there is no original skeleton at address {0:?}")]
+ MissingOriginalSkeleton(ContractAddress),
+ #[error("Can't fill storage trie, because there is no updated skeleton at address {0:?}")]
+ MissingUpdatedSkeleton(ContractAddress),
+ #[error("Can't build storage trie, because there are no sorted leaf indices of the contract at address {0:?}")]
+ MissingSortedLeafIndices(ContractAddress),
+ #[error(transparent)]
+ JoinError(#[from] JoinError),
+}
diff --git a/crates/committer/src/hash.rs b/crates/committer/src/hash.rs
new file mode 100644
index 00000000000..37201a3cbb8
--- /dev/null
+++ b/crates/committer/src/hash.rs
@@ -0,0 +1 @@
+pub mod hash_trait;
diff --git a/crates/committer/src/hash/hash_trait.rs b/crates/committer/src/hash/hash_trait.rs
new file mode 100644
index 00000000000..43dc4f2ed61
--- /dev/null
+++ b/crates/committer/src/hash/hash_trait.rs
@@ -0,0 +1,13 @@
+use starknet_types_core::felt::FromStrError;
+
+use crate::{felt::Felt, impl_from_hex_for_felt_wrapper};
+
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
+pub struct HashOutput(pub Felt);
+
+impl HashOutput {
+ pub(crate) const ZERO: HashOutput = HashOutput(Felt::ZERO);
+ pub(crate) const ROOT_OF_EMPTY_TREE: HashOutput = Self::ZERO;
+}
+
+impl_from_hex_for_felt_wrapper!(HashOutput);
diff --git a/crates/committer/src/lib.rs b/crates/committer/src/lib.rs
new file mode 100644
index 00000000000..d87fb198189
--- /dev/null
+++ b/crates/committer/src/lib.rs
@@ -0,0 +1,6 @@
+pub mod block_committer;
+pub mod felt;
+pub mod forest_errors;
+pub mod hash;
+pub mod patricia_merkle_tree;
+pub mod storage;
diff --git a/crates/committer/src/patricia_merkle_tree.rs b/crates/committer/src/patricia_merkle_tree.rs
new file mode 100644
index 00000000000..b3c5c9ad7ee
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree.rs
@@ -0,0 +1,12 @@
+pub mod errors;
+pub mod filled_tree;
+pub mod node_data;
+pub mod original_skeleton_tree;
+pub mod types;
+pub mod updated_skeleton_tree;
+
+#[cfg(test)]
+pub mod internal_test_utils;
+
+#[cfg(any(feature = "testing", test))]
+pub mod external_test_utils;
diff --git a/crates/committer/src/patricia_merkle_tree/errors.rs b/crates/committer/src/patricia_merkle_tree/errors.rs
new file mode 100644
index 00000000000..e157db8934b
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/errors.rs
@@ -0,0 +1,12 @@
+use std::fmt::Debug;
+use thiserror::Error;
+
+#[derive(Debug, Error)]
+pub enum TypesError {
+ #[error("Failed to convert type {from:?} to {to}. Reason: {reason}.")]
+ ConversionError {
+ from: T,
+ to: &'static str,
+ reason: &'static str,
+ },
+}
diff --git a/crates/committer/src/patricia_merkle_tree/external_test_utils.rs b/crates/committer/src/patricia_merkle_tree/external_test_utils.rs
new file mode 100644
index 00000000000..ca7472c324c
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/external_test_utils.rs
@@ -0,0 +1,128 @@
+use std::collections::HashMap;
+use std::sync::Arc;
+
+use ethnum::U256;
+use serde_json::json;
+
+use crate::block_committer::input::StarknetStorageValue;
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::errors::TypesError;
+use crate::storage::map_storage::MapStorage;
+use rand::Rng;
+
+use super::filled_tree::tree::{FilledTree, StorageTrie};
+use super::node_data::leaf::{Leaf, LeafModifications, SkeletonLeaf};
+use super::original_skeleton_tree::config::OriginalSkeletonStorageTrieConfig;
+use super::original_skeleton_tree::tree::{OriginalSkeletonTree, OriginalSkeletonTreeImpl};
+use super::types::{NodeIndex, SortedLeafIndices};
+use super::updated_skeleton_tree::hash_function::TreeHashFunctionImpl;
+use super::updated_skeleton_tree::tree::{UpdatedSkeletonTree, UpdatedSkeletonTreeImpl};
+
+impl TryFrom<&U256> for Felt {
+ type Error = TypesError;
+ fn try_from(value: &U256) -> Result {
+ if *value > U256::from(&Felt::MAX) {
+ return Err(TypesError::ConversionError {
+ from: *value,
+ to: "Felt",
+ reason: "value is bigger than felt::max",
+ });
+ }
+ Ok(Self::from_bytes_be(&value.to_be_bytes()))
+ }
+}
+
+/// Generates a random U256 number between low and high (exclusive).
+/// Panics if low > high
+pub fn get_random_u256(rng: &mut R, low: U256, high: U256) -> U256 {
+ assert!(low < high);
+ let high_of_low = low.high();
+ let high_of_high = high.high();
+
+ let delta = high - low;
+ if delta <= u128::MAX {
+ let delta = u128::try_from(delta).expect("Failed to convert delta to u128");
+ return low + rng.gen_range(0..delta);
+ }
+
+ // Randomize the high 128 bits in the extracted range, and the low 128 bits in their entire
+ // domain until the result is in range.
+ // As high-low>u128::MAX, the expected number of samples until the loops breaks is bound from
+ // above by 3 (as either:
+ // 1. high_of_high > high_of_low + 1, and there is a 1/3 chance to get a valid result for high
+ // bits in (high_of_low, high_of_high).
+ // 2. high_of_high == high_of_low + 1, and every possible low 128 bits value is valid either
+ // when the high bits equal high_of_high, or when they equal high_of_low).
+ let mut randomize = || {
+ U256::from_words(
+ rng.gen_range(*high_of_low..=*high_of_high),
+ rng.gen_range(0..=u128::MAX),
+ )
+ };
+ let mut result = randomize();
+ while result < low || result >= high {
+ result = randomize();
+ }
+ result
+}
+
+pub async fn tree_computation_flow(
+ leaf_modifications: Arc>,
+ storage: &MapStorage,
+ root_hash: HashOutput,
+) -> StorageTrie {
+ let config = OriginalSkeletonStorageTrieConfig::new(&leaf_modifications, false);
+ let mut sorted_leaf_indices: Vec = leaf_modifications.keys().copied().collect();
+ let sorted_leaf_indices = SortedLeafIndices::new(&mut sorted_leaf_indices);
+ let mut original_skeleton =
+ OriginalSkeletonTreeImpl::create(storage, root_hash, sorted_leaf_indices, &config)
+ .expect("Failed to create the original skeleton tree");
+
+ let updated_skeleton: UpdatedSkeletonTreeImpl = UpdatedSkeletonTree::create(
+ &mut original_skeleton,
+ &leaf_modifications
+ .iter()
+ .map(|(index, data)| {
+ (
+ *index,
+ match data.is_empty() {
+ true => SkeletonLeaf::Zero,
+ false => SkeletonLeaf::NonZero,
+ },
+ )
+ })
+ .collect(),
+ )
+ .expect("Failed to create the updated skeleton tree");
+
+ StorageTrie::create::(updated_skeleton.into(), leaf_modifications)
+ .await
+ .expect("Failed to create the filled tree")
+}
+
+pub async fn single_tree_flow_test(
+ leaf_modifications: LeafModifications,
+ storage: MapStorage,
+ root_hash: HashOutput,
+) -> String {
+ // Move from leaf number to actual index.
+ let leaf_modifications = leaf_modifications
+ .into_iter()
+ .map(|(k, v)| (NodeIndex::FIRST_LEAF + k, v))
+ .collect::>();
+
+ let filled_tree =
+ tree_computation_flow(Arc::new(leaf_modifications), &storage, root_hash).await;
+
+ let hash_result = filled_tree.get_root_hash();
+
+ let mut result_map = HashMap::new();
+ // Serialize the hash result.
+ let json_hash = &json!(hash_result.0.to_hex());
+ result_map.insert("root_hash", json_hash);
+ // Serlialize the storage modifications.
+ let json_storage = &json!(filled_tree.serialize());
+ result_map.insert("storage_changes", json_storage);
+ serde_json::to_string(&result_map).expect("serialization failed")
+}
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree.rs b/crates/committer/src/patricia_merkle_tree/filled_tree.rs
new file mode 100644
index 00000000000..4357d7f2fb4
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree.rs
@@ -0,0 +1,5 @@
+pub mod errors;
+pub mod forest;
+pub mod node;
+pub mod node_serde;
+pub mod tree;
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree/errors.rs b/crates/committer/src/patricia_merkle_tree/filled_tree/errors.rs
new file mode 100644
index 00000000000..073a2d37b2b
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree/errors.rs
@@ -0,0 +1,38 @@
+use tokio::task::JoinError;
+
+use crate::block_committer::input::StarknetStorageValue;
+use crate::patricia_merkle_tree::filled_tree::node::CompiledClassHash;
+use crate::patricia_merkle_tree::filled_tree::node::FilledNode;
+use crate::patricia_merkle_tree::node_data::errors::LeafError;
+use crate::patricia_merkle_tree::node_data::leaf::ContractState;
+use crate::patricia_merkle_tree::updated_skeleton_tree::errors::UpdatedSkeletonTreeError;
+use crate::patricia_merkle_tree::{node_data::leaf::Leaf, types::NodeIndex};
+
+#[derive(thiserror::Error, Debug)]
+pub enum FilledTreeError {
+ #[error("Deleted leaf at index {0:?} appears in the updated skeleton tree.")]
+ DeletedLeafInSkeleton(NodeIndex),
+ #[error("Double update at node {index:?}. Existing value: {existing_value:?}.")]
+ DoubleUpdate {
+ index: NodeIndex,
+ existing_value: Box>,
+ },
+ #[error(transparent)]
+ Leaf(#[from] LeafError),
+ #[error("Missing node at index {0:?}.")]
+ MissingNode(NodeIndex),
+ #[error("Missing root.")]
+ MissingRoot,
+ #[error("Poisoned lock: {0}.")]
+ PoisonedLock(String),
+ #[error(transparent)]
+ SerializeError(#[from] serde_json::Error),
+ #[error(transparent)]
+ UpdatedSkeletonError(#[from] UpdatedSkeletonTreeError),
+ #[error(transparent)]
+ JoinError(#[from] JoinError),
+}
+
+pub type StorageTrieError = FilledTreeError;
+pub type ClassesTrieError = FilledTreeError;
+pub type ContractsTrieError = FilledTreeError;
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree/forest.rs b/crates/committer/src/patricia_merkle_tree/filled_tree/forest.rs
new file mode 100644
index 00000000000..cadbe2a70d0
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree/forest.rs
@@ -0,0 +1,130 @@
+use crate::block_committer::input::{ContractAddress, StarknetStorageValue};
+use crate::forest_errors::{ForestError, ForestResult};
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::filled_tree::node::CompiledClassHash;
+use crate::patricia_merkle_tree::filled_tree::node::{ClassHash, Nonce};
+use crate::patricia_merkle_tree::filled_tree::tree::FilledTree;
+use crate::patricia_merkle_tree::filled_tree::tree::{
+ ClassesTrie, ContractsTrie, StorageTrie, StorageTrieMap,
+};
+use crate::patricia_merkle_tree::node_data::leaf::{ContractState, LeafModifications};
+use crate::patricia_merkle_tree::types::NodeIndex;
+use crate::patricia_merkle_tree::updated_skeleton_tree::hash_function::ForestHashFunction;
+use crate::patricia_merkle_tree::updated_skeleton_tree::skeleton_forest::UpdatedSkeletonForest;
+use crate::patricia_merkle_tree::updated_skeleton_tree::tree::UpdatedSkeletonTreeImpl;
+use crate::storage::storage_trait::Storage;
+
+use std::collections::HashMap;
+use std::sync::Arc;
+use tokio::task::JoinSet;
+
+pub struct FilledForest {
+ pub storage_tries: StorageTrieMap,
+ pub contracts_trie: ContractsTrie,
+ pub classes_trie: ClassesTrie,
+}
+
+impl FilledForest {
+ pub fn write_to_storage(&self, storage: &mut impl Storage) {
+ // Serialize all trees to one hash map.
+ let new_db_objects = self
+ .storage_tries
+ .values()
+ .flat_map(|tree| tree.serialize().into_iter())
+ .chain(self.contracts_trie.serialize())
+ .chain(self.classes_trie.serialize())
+ .collect();
+
+ // Store the new hash map
+ storage.mset(new_db_objects);
+ }
+
+ pub fn get_contract_root_hash(&self) -> HashOutput {
+ self.contracts_trie.get_root_hash()
+ }
+
+ pub fn get_compiled_class_root_hash(&self) -> HashOutput {
+ self.classes_trie.get_root_hash()
+ }
+
+ pub(crate) async fn create(
+ mut updated_forest: UpdatedSkeletonForest,
+ storage_updates: HashMap>,
+ classes_updates: LeafModifications,
+ original_contracts_trie_leaves: &HashMap,
+ address_to_class_hash: &HashMap,
+ address_to_nonce: &HashMap,
+ ) -> ForestResult {
+ let classes_trie_task = tokio::spawn(ClassesTrie::create::(
+ Arc::new(updated_forest.classes_trie),
+ Arc::new(classes_updates),
+ ));
+ let mut contracts_trie_modifications = HashMap::new();
+ let mut filled_storage_tries = HashMap::new();
+ let mut contracts_state_tasks = JoinSet::new();
+
+ for (address, inner_updates) in storage_updates {
+ let updated_storage_trie = updated_forest
+ .storage_tries
+ .remove(&address)
+ .ok_or(ForestError::MissingUpdatedSkeleton(address))?;
+
+ let original_contract_state = original_contracts_trie_leaves
+ .get(&NodeIndex::from_contract_address(&address))
+ .ok_or(ForestError::MissingContractCurrentState(address))?;
+ contracts_state_tasks.spawn(Self::new_contract_state:: | (
+ address,
+ *(address_to_nonce
+ .get(&address)
+ .unwrap_or(&original_contract_state.nonce)),
+ *(address_to_class_hash
+ .get(&address)
+ .unwrap_or(&original_contract_state.class_hash)),
+ updated_storage_trie,
+ inner_updates,
+ ));
+ }
+
+ while let Some(result) = contracts_state_tasks.join_next().await {
+ let (address, new_contract_state, filled_storage_trie) = result??;
+ contracts_trie_modifications.insert(
+ NodeIndex::from_contract_address(&address),
+ new_contract_state,
+ );
+ filled_storage_tries.insert(address, filled_storage_trie);
+ }
+
+ let contracts_trie_task = tokio::spawn(ContractsTrie::create:: | (
+ Arc::new(updated_forest.contracts_trie),
+ Arc::new(contracts_trie_modifications),
+ ));
+
+ Ok(Self {
+ storage_tries: filled_storage_tries,
+ contracts_trie: contracts_trie_task.await??,
+ classes_trie: classes_trie_task.await??,
+ })
+ }
+
+ async fn new_contract_state(
+ contract_address: ContractAddress,
+ new_nonce: Nonce,
+ new_class_hash: ClassHash,
+ updated_storage_trie: UpdatedSkeletonTreeImpl,
+ inner_updates: LeafModifications,
+ ) -> ForestResult<(ContractAddress, ContractState, StorageTrie)> {
+ let filled_storage_trie =
+ StorageTrie::create::(Arc::new(updated_storage_trie), Arc::new(inner_updates))
+ .await?;
+ let new_root_hash = filled_storage_trie.get_root_hash();
+ Ok((
+ contract_address,
+ ContractState {
+ nonce: new_nonce,
+ storage_root_hash: new_root_hash,
+ class_hash: new_class_hash,
+ },
+ filled_storage_trie,
+ ))
+ }
+}
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree/node.rs b/crates/committer/src/patricia_merkle_tree/filled_tree/node.rs
new file mode 100644
index 00000000000..116209c5580
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree/node.rs
@@ -0,0 +1,30 @@
+use starknet_types_core::felt::FromStrError;
+
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::impl_from_hex_for_felt_wrapper;
+use crate::patricia_merkle_tree::node_data::inner_node::NodeData;
+use crate::patricia_merkle_tree::node_data::leaf::Leaf;
+
+// TODO(Nimrod, 1/6/2024): Use the ClassHash defined in starknet-types-core when available.
+
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
+pub struct ClassHash(pub Felt);
+
+impl_from_hex_for_felt_wrapper!(ClassHash);
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
+pub struct Nonce(pub Felt);
+
+impl_from_hex_for_felt_wrapper!(Nonce);
+
+#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
+pub struct CompiledClassHash(pub Felt);
+
+impl_from_hex_for_felt_wrapper!(CompiledClassHash);
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+/// A node in a Patricia-Merkle tree which was modified during an update.
+pub struct FilledNode {
+ pub hash: HashOutput,
+ pub data: NodeData,
+}
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree/node_serde.rs b/crates/committer/src/patricia_merkle_tree/filled_tree/node_serde.rs
new file mode 100644
index 00000000000..9f631daaf71
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree/node_serde.rs
@@ -0,0 +1,143 @@
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::filled_tree::node::FilledNode;
+use crate::patricia_merkle_tree::node_data::inner_node::{
+ BinaryData, EdgeData, EdgePathLength, NodeData, PathToBottom,
+};
+use crate::patricia_merkle_tree::node_data::leaf::Leaf;
+use crate::storage::db_object::DBObject;
+use crate::storage::errors::DeserializationError;
+use crate::storage::storage_trait::{StarknetPrefix, StorageKey, StorageValue};
+use ethnum::U256;
+use serde::{Deserialize, Serialize};
+
+// Const describe the size of the serialized node.
+pub(crate) const SERIALIZE_HASH_BYTES: usize = 32;
+pub(crate) const BINARY_BYTES: usize = 2 * SERIALIZE_HASH_BYTES;
+pub(crate) const EDGE_LENGTH_BYTES: usize = 1;
+pub(crate) const EDGE_PATH_BYTES: usize = 32;
+pub(crate) const EDGE_BYTES: usize = SERIALIZE_HASH_BYTES + EDGE_PATH_BYTES + EDGE_LENGTH_BYTES;
+#[allow(dead_code)]
+pub(crate) const STORAGE_LEAF_SIZE: usize = SERIALIZE_HASH_BYTES;
+
+/// Temporary struct to serialize the leaf CompiledClass.
+/// Required to comply to existing storage layout.
+#[derive(Serialize, Deserialize)]
+pub(crate) struct LeafCompiledClassToSerialize {
+ pub(crate) compiled_class_hash: Felt,
+}
+
+impl FilledNode {
+ pub fn suffix(&self) -> [u8; SERIALIZE_HASH_BYTES] {
+ self.hash.0.to_bytes_be()
+ }
+
+ pub fn db_key(&self) -> StorageKey {
+ self.get_db_key(&self.suffix())
+ }
+}
+
+impl DBObject for FilledNode {
+ /// This method serializes the filled node into a byte vector, where:
+ /// - For binary nodes: Concatenates left and right hashes.
+ /// - For edge nodes: Concatenates bottom hash, path, and path length.
+ /// - For leaf nodes: use leaf.serialize() method.
+ fn serialize(&self) -> StorageValue {
+ match &self.data {
+ NodeData::Binary(BinaryData {
+ left_hash,
+ right_hash,
+ }) => {
+ // Serialize left and right hashes to byte arrays.
+ let left: [u8; SERIALIZE_HASH_BYTES] = left_hash.0.to_bytes_be();
+ let right: [u8; SERIALIZE_HASH_BYTES] = right_hash.0.to_bytes_be();
+
+ // Concatenate left and right hashes.
+ let serialized = [left, right].concat();
+ StorageValue(serialized)
+ }
+
+ NodeData::Edge(EdgeData {
+ bottom_hash,
+ path_to_bottom,
+ }) => {
+ // Serialize bottom hash, path, and path length to byte arrays.
+ let bottom: [u8; SERIALIZE_HASH_BYTES] = bottom_hash.0.to_bytes_be();
+ let path: [u8; SERIALIZE_HASH_BYTES] =
+ U256::from(&path_to_bottom.path).to_be_bytes();
+ let length: [u8; 1] = u8::from(path_to_bottom.length).to_be_bytes();
+
+ // Concatenate bottom hash, path, and path length.
+ let serialized = [bottom.to_vec(), path.to_vec(), length.to_vec()].concat();
+ StorageValue(serialized)
+ }
+
+ NodeData::Leaf(leaf_data) => leaf_data.serialize(),
+ }
+ }
+
+ fn get_prefix(&self) -> Vec {
+ match &self.data {
+ NodeData::Binary(_) | NodeData::Edge(_) => {
+ StarknetPrefix::InnerNode.to_storage_prefix()
+ }
+ NodeData::Leaf(leaf_data) => leaf_data.get_prefix(),
+ }
+ }
+}
+
+impl FilledNode {
+ /// Deserializes filled nodes.
+ pub(crate) fn deserialize(
+ node_hash: HashOutput,
+ value: &StorageValue,
+ is_leaf: bool,
+ ) -> Result {
+ if is_leaf {
+ return Ok(Self {
+ hash: node_hash,
+ data: NodeData::Leaf(L::deserialize(value)?),
+ });
+ }
+
+ if value.0.len() == BINARY_BYTES {
+ Ok(Self {
+ hash: node_hash,
+ data: NodeData::Binary(BinaryData {
+ left_hash: HashOutput(Felt::from_bytes_be_slice(
+ &value.0[..SERIALIZE_HASH_BYTES],
+ )),
+ right_hash: HashOutput(Felt::from_bytes_be_slice(
+ &value.0[SERIALIZE_HASH_BYTES..],
+ )),
+ }),
+ })
+ } else {
+ assert_eq!(
+ value.0.len(),
+ EDGE_BYTES,
+ "Unexpected inner node storage value length {}, expected to be {} or {}.",
+ value.0.len(),
+ EDGE_BYTES,
+ BINARY_BYTES
+ );
+ Ok(Self {
+ hash: node_hash,
+ data: NodeData::Edge(EdgeData {
+ bottom_hash: HashOutput(Felt::from_bytes_be_slice(
+ &value.0[..SERIALIZE_HASH_BYTES],
+ )),
+ path_to_bottom: PathToBottom::new(
+ U256::from_be_bytes(
+ value.0[SERIALIZE_HASH_BYTES..SERIALIZE_HASH_BYTES + EDGE_PATH_BYTES]
+ .try_into()
+ .expect("Slice with incorrect length."),
+ )
+ .into(),
+ EdgePathLength::new(value.0[EDGE_BYTES - 1])?,
+ )?,
+ }),
+ })
+ }
+ }
+}
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree/tree.rs b/crates/committer/src/patricia_merkle_tree/filled_tree/tree.rs
new file mode 100644
index 00000000000..6bc032f48c6
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree/tree.rs
@@ -0,0 +1,260 @@
+use std::collections::HashMap;
+use std::sync::Arc;
+use std::sync::Mutex;
+
+use async_recursion::async_recursion;
+
+use crate::block_committer::input::ContractAddress;
+use crate::block_committer::input::StarknetStorageValue;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::filled_tree::errors::FilledTreeError;
+use crate::patricia_merkle_tree::filled_tree::node::CompiledClassHash;
+use crate::patricia_merkle_tree::filled_tree::node::FilledNode;
+use crate::patricia_merkle_tree::node_data::inner_node::BinaryData;
+use crate::patricia_merkle_tree::node_data::inner_node::EdgeData;
+use crate::patricia_merkle_tree::node_data::inner_node::NodeData;
+use crate::patricia_merkle_tree::node_data::leaf::ContractState;
+use crate::patricia_merkle_tree::node_data::leaf::Leaf;
+use crate::patricia_merkle_tree::node_data::leaf::LeafModifications;
+use crate::patricia_merkle_tree::types::NodeIndex;
+use crate::patricia_merkle_tree::updated_skeleton_tree::hash_function::TreeHashFunction;
+use crate::patricia_merkle_tree::updated_skeleton_tree::node::UpdatedSkeletonNode;
+use crate::patricia_merkle_tree::updated_skeleton_tree::tree::UpdatedSkeletonTree;
+use crate::storage::db_object::DBObject;
+use crate::storage::storage_trait::StorageKey;
+use crate::storage::storage_trait::StorageValue;
+
+#[cfg(test)]
+#[path = "tree_test.rs"]
+pub mod tree_test;
+
+pub(crate) type FilledTreeResult = Result>;
+/// Consider a Patricia-Merkle Tree which has been updated with new leaves.
+/// FilledTree consists of all nodes which were modified in the update, including their updated
+/// data and hashes.
+pub(crate) trait FilledTree: Sized {
+ /// Computes and returns the filled tree.
+ async fn create<'a, TH: TreeHashFunction + 'static>(
+ updated_skeleton: Arc + 'static>,
+ leaf_modifications: Arc>,
+ ) -> FilledTreeResult;
+
+ /// Serializes the current state of the tree into a hashmap,
+ /// where each key-value pair corresponds
+ /// to a storage key and its serialized storage value.
+ fn serialize(&self) -> HashMap;
+
+ fn get_root_hash(&self) -> HashOutput;
+}
+
+#[derive(Debug, Eq, PartialEq)]
+pub struct FilledTreeImpl {
+ pub tree_map: HashMap>,
+ pub root_hash: HashOutput,
+}
+
+pub type StorageTrie = FilledTreeImpl;
+pub type ClassesTrie = FilledTreeImpl;
+pub type ContractsTrie = FilledTreeImpl;
+pub type StorageTrieMap = HashMap;
+
+impl FilledTreeImpl {
+ fn initialize_with_placeholders<'a>(
+ updated_skeleton: &Arc>,
+ ) -> HashMap>>> {
+ let mut filled_tree_map = HashMap::new();
+ for (index, node) in updated_skeleton.get_nodes() {
+ if !matches!(node, UpdatedSkeletonNode::UnmodifiedSubTree(_)) {
+ filled_tree_map.insert(index, Mutex::new(None));
+ }
+ }
+ filled_tree_map
+ }
+
+ pub(crate) fn get_all_nodes(&self) -> &HashMap> {
+ &self.tree_map
+ }
+
+ /// Writes the hash and data to the output map. The writing is done in a thread-safe manner with
+ /// interior mutability to avoid thread contention.
+ fn write_to_output_map(
+ output_map: Arc>>>>,
+ index: NodeIndex,
+ hash: HashOutput,
+ data: NodeData,
+ ) -> FilledTreeResult<(), L> {
+ match output_map.get(&index) {
+ Some(node) => {
+ let mut node = node
+ .lock()
+ .map_err(|_| FilledTreeError::PoisonedLock("Cannot lock node.".to_owned()))?;
+ match node.take() {
+ Some(existing_node) => Err(FilledTreeError::DoubleUpdate {
+ index,
+ existing_value: Box::new(existing_node),
+ }),
+ None => {
+ *node = Some(FilledNode { hash, data });
+ Ok(())
+ }
+ }
+ }
+ None => Err(FilledTreeError::::MissingNode(index)),
+ }
+ }
+
+ fn remove_arc_mutex_and_option(
+ hash_map_in: Arc>>>>,
+ ) -> FilledTreeResult>, L> {
+ let mut hash_map_out = HashMap::new();
+ for (key, value) in hash_map_in.iter() {
+ let mut value = value
+ .lock()
+ .map_err(|_| FilledTreeError::::PoisonedLock("Cannot lock node.".to_owned()))?;
+ match value.take() {
+ Some(value) => {
+ hash_map_out.insert(*key, value);
+ }
+ None => return Err(FilledTreeError::::MissingNode(*key)),
+ }
+ }
+ Ok(hash_map_out)
+ }
+
+ #[async_recursion]
+ async fn compute_filled_tree_rec<'a, TH>(
+ updated_skeleton: Arc + 'async_recursion + 'static>,
+ index: NodeIndex,
+ leaf_modifications: Arc>,
+ output_map: Arc>>>>,
+ ) -> FilledTreeResult
+ where
+ TH: TreeHashFunction + 'static,
+ {
+ let node = updated_skeleton.get_node(index)?;
+ match node {
+ UpdatedSkeletonNode::Binary => {
+ let left_index = index * 2.into();
+ let right_index = left_index + NodeIndex::ROOT;
+
+ let (left_hash, right_hash) = (
+ tokio::spawn(Self::compute_filled_tree_rec::(
+ Arc::clone(&updated_skeleton),
+ left_index,
+ Arc::clone(&leaf_modifications),
+ Arc::clone(&output_map),
+ )),
+ tokio::spawn(Self::compute_filled_tree_rec:: | (
+ Arc::clone(&updated_skeleton),
+ right_index,
+ Arc::clone(&leaf_modifications),
+ Arc::clone(&output_map),
+ )),
+ );
+
+ let data = NodeData::Binary(BinaryData {
+ left_hash: left_hash.await??,
+ right_hash: right_hash.await??,
+ });
+
+ let hash_value = TH::compute_node_hash(&data);
+ Self::write_to_output_map(output_map, index, hash_value, data)?;
+ Ok(hash_value)
+ }
+ UpdatedSkeletonNode::Edge(path_to_bottom) => {
+ let bottom_node_index = NodeIndex::compute_bottom_index(index, path_to_bottom);
+ let bottom_hash = Self::compute_filled_tree_rec:: | (
+ Arc::clone(&updated_skeleton),
+ bottom_node_index,
+ leaf_modifications,
+ Arc::clone(&output_map),
+ )
+ .await?;
+ let data = NodeData::Edge(EdgeData {
+ path_to_bottom: *path_to_bottom,
+ bottom_hash,
+ });
+ let hash_value = TH::compute_node_hash(&data);
+ Self::write_to_output_map(output_map, index, hash_value, data)?;
+ Ok(hash_value)
+ }
+ UpdatedSkeletonNode::UnmodifiedSubTree(hash_result) => Ok(*hash_result),
+ UpdatedSkeletonNode::Leaf => {
+ let leaf_data = L::create(&index, leaf_modifications).await?;
+ if leaf_data.is_empty() {
+ return Err(FilledTreeError::::DeletedLeafInSkeleton(index));
+ }
+ let node_data = NodeData::Leaf(leaf_data);
+ let hash_value = TH::compute_node_hash(&node_data);
+ Self::write_to_output_map(output_map, index, hash_value, node_data)?;
+ Ok(hash_value)
+ }
+ }
+ }
+
+ fn create_unmodified<'a>(
+ updated_skeleton: &Arc>,
+ ) -> Result> {
+ let root_node = updated_skeleton.get_node(NodeIndex::ROOT)?;
+ let UpdatedSkeletonNode::UnmodifiedSubTree(root_hash) = root_node else {
+ panic!("A root of tree without modifications is expected to be a unmodified subtree.")
+ };
+ Ok(Self {
+ tree_map: HashMap::new(),
+ root_hash: *root_hash,
+ })
+ }
+
+ fn create_empty() -> Self {
+ Self {
+ tree_map: HashMap::new(),
+ root_hash: HashOutput::ROOT_OF_EMPTY_TREE,
+ }
+ }
+}
+
+impl FilledTree for FilledTreeImpl {
+ async fn create<'a, TH: TreeHashFunction + 'static>(
+ updated_skeleton: Arc + 'static>,
+ leaf_modifications: Arc>,
+ ) -> Result> {
+ // Compute the filled tree in two steps:
+ // 1. Create a map containing the tree structure without hash values.
+ // 2. Fill in the hash values.
+ if leaf_modifications.is_empty() {
+ return Self::create_unmodified(&updated_skeleton);
+ }
+
+ if updated_skeleton.is_empty() {
+ return Ok(Self::create_empty());
+ }
+
+ let filled_tree_map = Arc::new(Self::initialize_with_placeholders(&updated_skeleton));
+ let root_hash = Self::compute_filled_tree_rec::(
+ updated_skeleton,
+ NodeIndex::ROOT,
+ leaf_modifications,
+ Arc::clone(&filled_tree_map),
+ )
+ .await?;
+
+ // Create and return a new FilledTreeImpl from the hashmap.
+ Ok(FilledTreeImpl {
+ tree_map: Self::remove_arc_mutex_and_option(filled_tree_map)?,
+ root_hash,
+ })
+ }
+
+ fn serialize(&self) -> HashMap {
+ // This function iterates over each node in the tree, using the node's `db_key` as the hashmap key
+ // and the result of the node's `serialize` method as the value.
+ self.get_all_nodes()
+ .iter()
+ .map(|(_, node)| (node.db_key(), node.serialize()))
+ .collect()
+ }
+
+ fn get_root_hash(&self) -> HashOutput {
+ self.root_hash
+ }
+}
diff --git a/crates/committer/src/patricia_merkle_tree/filled_tree/tree_test.rs b/crates/committer/src/patricia_merkle_tree/filled_tree/tree_test.rs
new file mode 100644
index 00000000000..26f61139ca0
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/filled_tree/tree_test.rs
@@ -0,0 +1,305 @@
+use std::collections::HashMap;
+use std::sync::Arc;
+
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::filled_tree::node::FilledNode;
+use crate::patricia_merkle_tree::filled_tree::tree::{FilledTree, FilledTreeImpl};
+use crate::patricia_merkle_tree::internal_test_utils::{MockLeaf, OriginalSkeletonMockTrieConfig};
+use crate::patricia_merkle_tree::node_data::inner_node::{
+ BinaryData, EdgeData, EdgePathLength, NodeData, PathToBottom,
+};
+use crate::patricia_merkle_tree::node_data::leaf::SkeletonLeaf;
+use crate::patricia_merkle_tree::original_skeleton_tree::tree::OriginalSkeletonTreeImpl;
+use crate::patricia_merkle_tree::types::{NodeIndex, SortedLeafIndices};
+use crate::patricia_merkle_tree::updated_skeleton_tree::hash_function::TreeHashFunctionImpl;
+use crate::patricia_merkle_tree::updated_skeleton_tree::node::UpdatedSkeletonNode;
+use crate::patricia_merkle_tree::updated_skeleton_tree::tree::{
+ UpdatedSkeletonNodeMap, UpdatedSkeletonTree, UpdatedSkeletonTreeImpl,
+};
+use crate::storage::map_storage::MapStorage;
+
+#[tokio::test(flavor = "multi_thread")]
+/// This test is a sanity test for computing the root hash of the patricia merkle tree with a single node that is a leaf with hash==1.
+async fn test_filled_tree_sanity() {
+ let mut skeleton_tree: UpdatedSkeletonNodeMap = HashMap::new();
+ let new_filled_leaf = MockLeaf(Felt::ONE);
+ let new_leaf_index = NodeIndex::ROOT;
+ skeleton_tree.insert(new_leaf_index, UpdatedSkeletonNode::Leaf);
+ let modifications = HashMap::from([(new_leaf_index, new_filled_leaf)]);
+ let updated_skeleton_tree = UpdatedSkeletonTreeImpl { skeleton_tree };
+ let root_hash = FilledTreeImpl::create::(
+ Arc::new(updated_skeleton_tree),
+ Arc::new(modifications),
+ )
+ .await
+ .unwrap()
+ .get_root_hash();
+ assert_eq!(root_hash, HashOutput(Felt::ONE), "Root hash mismatch");
+}
+
+// TODO(Aner, 11/4/25): Add test with large patricia merkle tree.
+// TOOD(Aner, 11/4/25): Add test with different leaf types.
+
+#[tokio::test(flavor = "multi_thread")]
+/// This test is a small test for testing the root hash computation of the patricia merkle tree.
+/// The tree structure & results were computed separately and tested for regression.
+/// i=1: binary
+/// / \
+/// i=2: edge i=3: edge
+/// l=1, p=0 l=4, p=15
+/// / \
+/// i=4: binary \
+/// / \ \
+/// i=8: edge i=9: edge \
+/// l=2, p=3 l=2, p=0 \
+/// \ / \
+/// \ / \
+/// i=35: leaf i=36: leaf i=63: leaf
+/// v=1 v=2 v=3
+async fn test_small_filled_tree() {
+ // Set up the updated skeleton tree.
+ let new_leaves = [(35, "0x1"), (36, "0x2"), (63, "0x3")];
+ let nodes_in_skeleton_tree: Vec<(NodeIndex, UpdatedSkeletonNode)> = [
+ create_binary_updated_skeleton_node_for_testing(1),
+ create_path_to_bottom_edge_updated_skeleton_node_for_testing(2, 0, 1),
+ create_path_to_bottom_edge_updated_skeleton_node_for_testing(3, 15, 4),
+ create_binary_updated_skeleton_node_for_testing(4),
+ create_path_to_bottom_edge_updated_skeleton_node_for_testing(8, 3, 2),
+ create_path_to_bottom_edge_updated_skeleton_node_for_testing(9, 0, 2),
+ ]
+ .into_iter()
+ .chain(
+ new_leaves
+ .iter()
+ .map(|(index, _)| create_leaf_updated_skeleton_node_for_testing(*index)),
+ )
+ .collect();
+ let skeleton_tree: UpdatedSkeletonNodeMap = nodes_in_skeleton_tree.into_iter().collect();
+
+ let updated_skeleton_tree = UpdatedSkeletonTreeImpl { skeleton_tree };
+ let modifications = new_leaves
+ .iter()
+ .map(|(index, value)| {
+ (
+ NodeIndex::from(*index),
+ MockLeaf(Felt::from_hex(value).unwrap()),
+ )
+ })
+ .collect();
+
+ // Compute the hash values.
+ let filled_tree = FilledTreeImpl::create::(
+ Arc::new(updated_skeleton_tree),
+ Arc::new(modifications),
+ )
+ .await
+ .unwrap();
+ let filled_tree_map = filled_tree.get_all_nodes();
+ let root_hash = filled_tree.get_root_hash();
+
+ // The expected hash values were computed separately.
+ let expected_root_hash = HashOutput(Felt::from_hex("0x21").unwrap());
+ let expected_filled_tree_map = HashMap::from([
+ create_mock_binary_entry_for_testing(1, "0x21", "0xb", "0x16"),
+ create_mock_edge_entry_for_testing(2, "0xb", 0, 1, "0xa"),
+ create_mock_edge_entry_for_testing(3, "0x16", 15, 4, "0x3"),
+ create_mock_binary_entry_for_testing(4, "0xa", "0x6", "0x4"),
+ create_mock_edge_entry_for_testing(8, "0x6", 3, 2, "0x1"),
+ create_mock_edge_entry_for_testing(9, "0x4", 0, 2, "0x2"),
+ create_mock_leaf_entry_for_testing(35, "0x1"),
+ create_mock_leaf_entry_for_testing(36, "0x2"),
+ create_mock_leaf_entry_for_testing(63, "0x3"),
+ ]);
+ assert_eq!(filled_tree_map, &expected_filled_tree_map);
+ assert_eq!(root_hash, expected_root_hash, "Root hash mismatch");
+}
+
+#[tokio::test(flavor = "multi_thread")]
+/// This test is a small test for testing the root hash computation of the patricia merkle tree
+/// with unmodified nodes. The tree structure & results are a partial of test_small_filled_tree.
+/// i=1: binary
+/// / \
+/// i=2: edge i=3: unmodified
+/// l=1, p=0 hash=0x3
+/// /
+/// i=4: binary
+/// / \
+/// i=8: edge i=9: unmodified
+/// l=2, p=3 hash=0x4
+/// \
+/// \
+/// i=35: leaf
+/// v=1
+async fn test_small_tree_with_unmodified_nodes() {
+ // Set up the updated skeleton tree.
+ let (new_leaf_index, new_leaf) = (35, "0x1");
+ let nodes_in_skeleton_tree = [
+ create_binary_updated_skeleton_node_for_testing(1),
+ create_path_to_bottom_edge_updated_skeleton_node_for_testing(2, 0, 1),
+ create_unmodified_updated_skeleton_node_for_testing(3, "0x3"),
+ create_binary_updated_skeleton_node_for_testing(4),
+ create_path_to_bottom_edge_updated_skeleton_node_for_testing(8, 3, 2),
+ create_unmodified_updated_skeleton_node_for_testing(9, "0x4"),
+ create_leaf_updated_skeleton_node_for_testing(new_leaf_index),
+ ];
+ let skeleton_tree: UpdatedSkeletonNodeMap = nodes_in_skeleton_tree.into_iter().collect();
+
+ let updated_skeleton_tree = UpdatedSkeletonTreeImpl { skeleton_tree };
+ let modifications = HashMap::from([(
+ NodeIndex::from(new_leaf_index),
+ MockLeaf(Felt::from_hex(new_leaf).unwrap()),
+ )]);
+
+ // Compute the hash values.
+ let filled_tree = FilledTreeImpl::create::(
+ Arc::new(updated_skeleton_tree),
+ Arc::new(modifications),
+ )
+ .await
+ .unwrap();
+ let filled_tree_map = filled_tree.get_all_nodes();
+ let root_hash = filled_tree.get_root_hash();
+
+ // The expected hash values were computed separately. Note that the unmodified nodes are not
+ // computed in the filled tree, but the hash values are directly used. The hashes of unmodified
+ // nodes should not appear in the filled tree.
+ let expected_root_hash = HashOutput(Felt::from_hex("0xe").unwrap());
+ let expected_filled_tree_map = HashMap::from([
+ create_mock_binary_entry_for_testing(1, "0xe", "0xb", "0x3"),
+ create_mock_edge_entry_for_testing(2, "0b", 0, 1, "0xa"),
+ create_mock_binary_entry_for_testing(4, "0xa", "0x6", "0x4"),
+ create_mock_edge_entry_for_testing(8, "0x6", 3, 2, "0x1"),
+ create_mock_leaf_entry_for_testing(35, "0x1"),
+ ]);
+ assert_eq!(filled_tree_map, &expected_filled_tree_map);
+ assert_eq!(root_hash, expected_root_hash, "Root hash mismatch");
+}
+
+#[tokio::test(flavor = "multi_thread")]
+/// Test that deleting a leaf that does not exist in the tree succeeds.
+async fn test_delete_leaf_from_empty_tree() {
+ let storage_modifications: HashMap =
+ HashMap::from([(NodeIndex::FIRST_LEAF, MockLeaf(Felt::ZERO))]);
+
+ let mut indices = [NodeIndex::FIRST_LEAF];
+ // Create an empty original skeleton tree with a single leaf modified.
+ let mut original_skeleton_tree = OriginalSkeletonTreeImpl::create_impl(
+ &MapStorage {
+ storage: HashMap::new(),
+ },
+ HashOutput::ROOT_OF_EMPTY_TREE,
+ SortedLeafIndices::new(&mut indices),
+ &OriginalSkeletonMockTrieConfig::new(&storage_modifications, false),
+ )
+ .unwrap();
+
+ // Create an updated skeleton tree with a single leaf that is deleted.
+ let skeleton_modifications = HashMap::from([(NodeIndex::FIRST_LEAF, SkeletonLeaf::Zero)]);
+
+ let updated_skeleton_tree =
+ UpdatedSkeletonTreeImpl::create(&mut original_skeleton_tree, &skeleton_modifications)
+ .unwrap();
+
+ let leaf_modifications = HashMap::from([(NodeIndex::FIRST_LEAF, MockLeaf(Felt::ZERO))]);
+ // Compute the filled tree.
+ let filled_tree = FilledTreeImpl::create::(
+ updated_skeleton_tree.into(),
+ leaf_modifications.into(),
+ )
+ .await
+ .unwrap();
+
+ // The filled tree should be empty.
+ let filled_tree_map = filled_tree.get_all_nodes();
+ assert!(filled_tree_map.is_empty());
+ let root_hash = filled_tree.get_root_hash();
+ assert!(root_hash == HashOutput::ROOT_OF_EMPTY_TREE);
+}
+
+fn create_binary_updated_skeleton_node_for_testing(
+ index: u128,
+) -> (NodeIndex, UpdatedSkeletonNode) {
+ (NodeIndex::from(index), UpdatedSkeletonNode::Binary)
+}
+
+fn create_path_to_bottom_edge_updated_skeleton_node_for_testing(
+ index: u128,
+ path: u128,
+ length: u8,
+) -> (NodeIndex, UpdatedSkeletonNode) {
+ (
+ NodeIndex::from(index),
+ UpdatedSkeletonNode::Edge(
+ PathToBottom::new(path.into(), EdgePathLength::new(length).unwrap()).unwrap(),
+ ),
+ )
+}
+
+fn create_unmodified_updated_skeleton_node_for_testing(
+ index: u128,
+ hash: &str,
+) -> (NodeIndex, UpdatedSkeletonNode) {
+ (
+ NodeIndex::from(index),
+ UpdatedSkeletonNode::UnmodifiedSubTree(HashOutput(Felt::from_hex(hash).unwrap())),
+ )
+}
+
+fn create_leaf_updated_skeleton_node_for_testing(index: u128) -> (NodeIndex, UpdatedSkeletonNode) {
+ (NodeIndex::from(index), UpdatedSkeletonNode::Leaf)
+}
+
+fn create_mock_binary_entry_for_testing(
+ index: u128,
+ hash: &str,
+ left_hash: &str,
+ right_hash: &str,
+) -> (NodeIndex, FilledNode) {
+ (
+ NodeIndex::from(index),
+ FilledNode {
+ hash: HashOutput(Felt::from_hex(hash).unwrap()),
+ data: NodeData::Binary(BinaryData {
+ left_hash: HashOutput(Felt::from_hex(left_hash).unwrap()),
+ right_hash: HashOutput(Felt::from_hex(right_hash).unwrap()),
+ }),
+ },
+ )
+}
+
+fn create_mock_edge_entry_for_testing(
+ index: u128,
+ hash: &str,
+ path: u128,
+ length: u8,
+ bottom_hash: &str,
+) -> (NodeIndex, FilledNode) {
+ (
+ NodeIndex::from(index),
+ FilledNode {
+ hash: HashOutput(Felt::from_hex(hash).unwrap()),
+ data: NodeData::Edge(EdgeData {
+ bottom_hash: HashOutput(Felt::from_hex(bottom_hash).unwrap()),
+ path_to_bottom: PathToBottom::new(
+ path.into(),
+ EdgePathLength::new(length).unwrap(),
+ )
+ .unwrap(),
+ }),
+ },
+ )
+}
+
+fn create_mock_leaf_entry_for_testing(
+ index: u128,
+ hash: &str,
+) -> (NodeIndex, FilledNode) {
+ (
+ NodeIndex::from(index),
+ FilledNode {
+ hash: HashOutput(Felt::from_hex(hash).unwrap()),
+ data: NodeData::Leaf(MockLeaf(Felt::from_hex(hash).unwrap())),
+ },
+ )
+}
diff --git a/crates/committer/src/patricia_merkle_tree/internal_test_utils.rs b/crates/committer/src/patricia_merkle_tree/internal_test_utils.rs
new file mode 100644
index 00000000000..2cf06aaa030
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/internal_test_utils.rs
@@ -0,0 +1,176 @@
+use std::sync::Arc;
+
+use crate::felt::Felt;
+use crate::generate_trie_config;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::external_test_utils::get_random_u256;
+use crate::patricia_merkle_tree::filled_tree::tree::FilledTreeImpl;
+use crate::patricia_merkle_tree::node_data::errors::LeafResult;
+use crate::patricia_merkle_tree::node_data::inner_node::NodeData;
+use crate::patricia_merkle_tree::node_data::inner_node::{EdgePathLength, PathToBottom};
+use crate::patricia_merkle_tree::node_data::leaf::SkeletonLeaf;
+use crate::patricia_merkle_tree::node_data::leaf::{Leaf, LeafModifications};
+use crate::patricia_merkle_tree::original_skeleton_tree::config::OriginalSkeletonTreeConfig;
+use crate::patricia_merkle_tree::original_skeleton_tree::errors::OriginalSkeletonTreeError;
+use crate::patricia_merkle_tree::original_skeleton_tree::node::OriginalSkeletonNode;
+use crate::patricia_merkle_tree::original_skeleton_tree::tree::OriginalSkeletonTreeResult;
+use crate::patricia_merkle_tree::types::{NodeIndex, SubTreeHeight};
+use crate::patricia_merkle_tree::updated_skeleton_tree::hash_function::{
+ HashFunction, TreeHashFunction, TreeHashFunctionImpl,
+};
+use crate::patricia_merkle_tree::updated_skeleton_tree::node::UpdatedSkeletonNode;
+use crate::patricia_merkle_tree::updated_skeleton_tree::tree::UpdatedSkeletonTreeImpl;
+use crate::storage::db_object::{DBObject, Deserializable};
+use crate::storage::storage_trait::StorageValue;
+use ethnum::U256;
+use rand::rngs::ThreadRng;
+use rstest::{fixture, rstest};
+
+#[derive(Debug, PartialEq, Clone, Copy, Default, Eq)]
+pub(crate) struct MockLeaf(pub(crate) Felt);
+
+impl DBObject for MockLeaf {
+ fn serialize(&self) -> StorageValue {
+ StorageValue(self.0.to_bytes_be().to_vec())
+ }
+
+ fn get_prefix(&self) -> Vec {
+ vec![0]
+ }
+}
+
+impl Deserializable for MockLeaf {
+ fn deserialize(
+ value: &StorageValue,
+ ) -> Result {
+ Ok(Self(Felt::from_bytes_be_slice(&value.0)))
+ }
+
+ fn prefix() -> Vec {
+ vec![0]
+ }
+}
+
+impl Leaf for MockLeaf {
+ fn is_empty(&self) -> bool {
+ self.0 == Felt::ZERO
+ }
+
+ async fn create(
+ index: &NodeIndex,
+ leaf_modifications: Arc>,
+ ) -> LeafResult {
+ Self::from_modifications(index, leaf_modifications)
+ }
+}
+
+impl TreeHashFunction for TreeHashFunctionImpl {
+ fn compute_leaf_hash(leaf_data: &MockLeaf) -> HashOutput {
+ HashOutput(leaf_data.0)
+ }
+
+ fn compute_node_hash(node_data: &NodeData) -> HashOutput {
+ Self::compute_node_hash_with_inner_hash_function::(node_data)
+ }
+}
+
+generate_trie_config!(OriginalSkeletonMockTrieConfig, MockLeaf);
+
+pub(crate) type MockTrie = FilledTreeImpl;
+
+struct MockHashFunction;
+
+impl HashFunction for MockHashFunction {
+ fn hash(left: &Felt, right: &Felt) -> HashOutput {
+ HashOutput(*left + *right)
+ }
+}
+
+impl From for SkeletonLeaf {
+ fn from(value: u8) -> Self {
+ Self::from(Felt::from(value))
+ }
+}
+
+impl From<&str> for PathToBottom {
+ fn from(value: &str) -> Self {
+ Self::new(
+ U256::from_str_radix(value, 2)
+ .expect("Invalid binary string")
+ .into(),
+ EdgePathLength::new(
+ (value.len() - if value.starts_with('+') { 1 } else { 0 })
+ .try_into()
+ .expect("String is too large"),
+ )
+ .expect("Invalid length"),
+ )
+ .expect("Illegal PathToBottom")
+ }
+}
+
+#[fixture]
+pub(crate) fn random() -> ThreadRng {
+ rand::thread_rng()
+}
+
+impl NodeIndex {
+ /// Assumes self represents an index in a smaller tree height. Returns a node index represents
+ /// the same index in the starknet state tree as if the smaller tree was 'planted' at the lowest
+ /// leftmost node from the root.
+ pub(crate) fn from_subtree_index(subtree_index: Self, subtree_height: SubTreeHeight) -> Self {
+ let height_diff = SubTreeHeight::ACTUAL_HEIGHT.0 - subtree_height.0;
+ let offset = (NodeIndex::ROOT << height_diff) - 1.into();
+ subtree_index + (offset << (subtree_index.bit_length() - 1))
+ }
+}
+
+pub(crate) fn small_tree_index_to_full(index: U256, height: SubTreeHeight) -> NodeIndex {
+ NodeIndex::from_subtree_index(NodeIndex::new(index), height)
+}
+
+#[rstest]
+#[should_panic]
+#[case(U256::ZERO, U256::ZERO)]
+#[case(U256::ZERO, U256::ONE)]
+#[case(U256::ONE, U256::ONE << 128)]
+#[case((U256::ONE<<128)-U256::ONE, U256::ONE << 128)]
+#[case(U256::ONE<<128, (U256::ONE << 128)+U256::ONE)]
+fn test_get_random_u256(mut random: ThreadRng, #[case] low: U256, #[case] high: U256) {
+ let r = get_random_u256(&mut random, low, high);
+ assert!(low <= r && r < high);
+}
+
+/// Returns an UpdatedSkeleton instance initialized with the UpdatedSkeletonNodes immediately
+/// derived from the leaf_modifications (as done in UpdatedSkeletonTreeImpl::finalize_bottom_layer).
+pub(crate) fn get_initial_updated_skeleton(
+ original_skeleton: &[(NodeIndex, OriginalSkeletonNode)],
+ leaf_modifications: &[(NodeIndex, u8)],
+) -> UpdatedSkeletonTreeImpl {
+ UpdatedSkeletonTreeImpl {
+ skeleton_tree: leaf_modifications
+ .iter()
+ .filter(|(_, leaf_val)| *leaf_val != 0)
+ .map(|(index, _)| (*index, UpdatedSkeletonNode::Leaf))
+ .chain(
+ original_skeleton
+ .iter()
+ .filter_map(|(index, node)| match node {
+ OriginalSkeletonNode::UnmodifiedSubTree(hash) => {
+ Some((*index, UpdatedSkeletonNode::UnmodifiedSubTree(*hash)))
+ }
+ OriginalSkeletonNode::Binary | OriginalSkeletonNode::Edge(_) => None,
+ }),
+ )
+ .collect(),
+ }
+}
+
+pub(crate) fn as_fully_indexed(
+ subtree_height: u8,
+ indices: impl Iterator- ,
+) -> Vec {
+ indices
+ .map(|index| small_tree_index_to_full(index, SubTreeHeight::new(subtree_height)))
+ .collect()
+}
diff --git a/crates/committer/src/patricia_merkle_tree/node_data.rs b/crates/committer/src/patricia_merkle_tree/node_data.rs
new file mode 100644
index 00000000000..4e528cf888e
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/node_data.rs
@@ -0,0 +1,4 @@
+pub mod errors;
+pub mod inner_node;
+pub mod leaf;
+pub mod leaf_serde;
diff --git a/crates/committer/src/patricia_merkle_tree/node_data/errors.rs b/crates/committer/src/patricia_merkle_tree/node_data/errors.rs
new file mode 100644
index 00000000000..4d1a729b38a
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/node_data/errors.rs
@@ -0,0 +1,33 @@
+use std::fmt::Debug;
+use thiserror::Error;
+
+use crate::patricia_merkle_tree::node_data::inner_node::{EdgePath, EdgePathLength};
+use crate::patricia_merkle_tree::types::NodeIndex;
+
+#[derive(Debug, Error)]
+pub enum PathToBottomError {
+ #[error("Tried to remove {n_edges:?} edges from a {length:?} length path.")]
+ RemoveEdgesError {
+ length: EdgePathLength,
+ n_edges: EdgePathLength,
+ },
+ #[error("EdgePath {path:?} is too long for EdgePathLength {length:?}.")]
+ MismatchedLengthError {
+ path: EdgePath,
+ length: EdgePathLength,
+ },
+}
+
+#[derive(Debug, Error)]
+pub enum EdgePathError {
+ #[error("Length {length:?} is not in range [0, EdgePathLength::MAX]")]
+ IllegalLength { length: u8 },
+}
+
+#[derive(Debug, Error)]
+pub enum LeafError {
+ #[error("Missing modification data at index {0:?}.")]
+ MissingLeafModificationData(NodeIndex),
+}
+
+pub type LeafResult = Result;
diff --git a/crates/committer/src/patricia_merkle_tree/node_data/inner_node.rs b/crates/committer/src/patricia_merkle_tree/node_data/inner_node.rs
new file mode 100644
index 00000000000..20f3357a3a9
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/node_data/inner_node.rs
@@ -0,0 +1,177 @@
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::node_data::errors::{EdgePathError, PathToBottomError};
+use crate::patricia_merkle_tree::node_data::leaf::Leaf;
+use crate::patricia_merkle_tree::types::{NodeIndex, SubTreeHeight};
+
+use ethnum::U256;
+use strum_macros::{EnumDiscriminants, EnumIter};
+
+#[cfg(test)]
+#[path = "inner_node_tests.rs"]
+pub mod inner_node_test;
+
+#[derive(Clone, Debug, PartialEq, Eq)]
+#[cfg_attr(any(test, feature = "testing"), derive(EnumDiscriminants))]
+#[cfg_attr(any(test, feature = "testing"), strum_discriminants(derive(EnumIter)))]
+// A Patricia-Merkle tree node's data, i.e., the pre-image of its hash.
+pub enum NodeData {
+ Binary(BinaryData),
+ Edge(EdgeData),
+ Leaf(L),
+}
+
+#[derive(Clone, Debug, Default, PartialEq, Eq)]
+pub struct BinaryData {
+ pub left_hash: HashOutput,
+ pub right_hash: HashOutput,
+}
+
+// Wraps a U256. Maximal possible value is the longest path in a tree of height 251 (2 ^ 251 - 1).
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
+pub struct EdgePath(pub U256);
+
+impl EdgePath {
+ pub const BITS: u8 = SubTreeHeight::ACTUAL_HEIGHT.0;
+
+ /// [EdgePath] constant that represents the longest path (from some node) in a tree.
+ #[allow(clippy::as_conversions)]
+ pub const MAX: Self = Self(U256::from_words(
+ u128::MAX >> (U256::BITS - Self::BITS as u32),
+ u128::MAX,
+ ));
+}
+
+impl From for EdgePath {
+ fn from(value: U256) -> Self {
+ assert!(value <= EdgePath::MAX.0, "Path {value:?} is too long.");
+ Self(value)
+ }
+}
+
+impl From for EdgePath {
+ fn from(value: u128) -> Self {
+ Self(value.into())
+ }
+}
+
+impl From<&EdgePath> for Felt {
+ fn from(path: &EdgePath) -> Self {
+ Self::from_bytes_be(&path.0.to_be_bytes())
+ }
+}
+
+impl From<&EdgePath> for U256 {
+ fn from(path: &EdgePath) -> Self {
+ path.0
+ }
+}
+#[derive(
+ Clone, Copy, Debug, Default, PartialOrd, derive_more::Add, derive_more::Sub, PartialEq, Eq, Hash,
+)]
+pub struct EdgePathLength(u8);
+
+impl EdgePathLength {
+ /// [EdgePathLength] constant that represents the longest path (from some node) in a tree.
+ pub const ONE: Self = Self(1);
+ pub const MAX: Self = Self(SubTreeHeight::ACTUAL_HEIGHT.0);
+
+ pub fn new(length: u8) -> Result {
+ if length > Self::MAX.0 {
+ return Err(EdgePathError::IllegalLength { length });
+ }
+ Ok(Self(length))
+ }
+}
+
+impl From for u8 {
+ fn from(value: EdgePathLength) -> Self {
+ value.0
+ }
+}
+
+impl From for Felt {
+ fn from(value: EdgePathLength) -> Self {
+ value.0.into()
+ }
+}
+
+#[allow(clippy::manual_non_exhaustive)]
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
+pub struct PathToBottom {
+ pub path: EdgePath,
+ pub length: EdgePathLength,
+ // Used to prevent direct instantiation, while allowing destructure of other fields.
+ _fake_field: (),
+}
+
+type PathToBottomResult = Result;
+
+impl PathToBottom {
+ /// Creates a new [PathToBottom] instance.
+ // Asserts the path is not longer than the length.
+ pub fn new(path: EdgePath, length: EdgePathLength) -> PathToBottomResult {
+ let bit_length = U256::BITS - path.0.leading_zeros();
+ if bit_length > u8::from(length).into() {
+ return Err(PathToBottomError::MismatchedLengthError { path, length });
+ }
+ Ok(Self {
+ path,
+ length,
+ _fake_field: (),
+ })
+ }
+}
+
+#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
+pub struct EdgeData {
+ pub bottom_hash: HashOutput,
+ pub path_to_bottom: PathToBottom,
+}
+
+impl PathToBottom {
+ pub(crate) const LEFT_CHILD: Self = Self {
+ path: EdgePath(U256::ZERO),
+ length: EdgePathLength(1),
+ _fake_field: (),
+ };
+
+ pub(crate) const RIGHT_CHILD: Self = Self {
+ path: EdgePath(U256::ONE),
+ length: EdgePathLength(1),
+ _fake_field: (),
+ };
+
+ pub(crate) fn bottom_index(&self, root_index: NodeIndex) -> NodeIndex {
+ NodeIndex::compute_bottom_index(root_index, self)
+ }
+
+ /// Returns true iff the first step on the path is to the left.
+ pub(crate) fn is_left_descendant(&self) -> bool {
+ self.path.0 >> (self.length.0 - 1) == 0
+ }
+
+ pub(crate) fn concat_paths(&self, other: Self) -> PathToBottom {
+ Self::new(
+ EdgePath::from((self.path.0 << other.length.0) + other.path.0),
+ self.length + other.length,
+ )
+ .unwrap_or_else(|_| {
+ panic!("Concatenating paths {self:?} and {other:?} unexpectedly failed.")
+ })
+ }
+
+ /// Returns the path after removing the first steps (the edges from the path's origin node).
+ pub(crate) fn remove_first_edges(&self, n_edges: EdgePathLength) -> PathToBottomResult {
+ if self.length < n_edges {
+ return Err(PathToBottomError::RemoveEdgesError {
+ length: self.length,
+ n_edges,
+ });
+ }
+ Self::new(
+ EdgePath(self.path.0 & ((U256::ONE << (self.length.0 - n_edges.0)) - 1)),
+ self.length - n_edges,
+ )
+ }
+}
diff --git a/crates/committer/src/patricia_merkle_tree/node_data/inner_node_tests.rs b/crates/committer/src/patricia_merkle_tree/node_data/inner_node_tests.rs
new file mode 100644
index 00000000000..2bbbd204758
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/node_data/inner_node_tests.rs
@@ -0,0 +1,24 @@
+use ethnum::U256;
+use rstest::rstest;
+
+use crate::patricia_merkle_tree::node_data::inner_node::{EdgePathLength, PathToBottom};
+
+#[rstest]
+#[case(PathToBottom::from("1011"), 1, PathToBottom::from("011"))]
+#[case(PathToBottom::from("1011"), 2, PathToBottom::from("11"))]
+#[case(PathToBottom::from("1011"), 3, PathToBottom::from("1"))]
+#[case(PathToBottom::from("1011"), 4, PathToBottom::new(U256::ZERO.into(), EdgePathLength::new(0).unwrap()).unwrap())]
+#[should_panic]
+#[case(PathToBottom::from("1011"), 5, PathToBottom::from("0"))]
+fn test_remove_first_edges(
+ #[case] path_to_bottom: PathToBottom,
+ #[case] n_edges: u8,
+ #[case] expected: PathToBottom,
+) {
+ assert_eq!(
+ path_to_bottom
+ .remove_first_edges(EdgePathLength::new(n_edges).unwrap())
+ .unwrap(),
+ expected
+ );
+}
diff --git a/crates/committer/src/patricia_merkle_tree/node_data/leaf.rs b/crates/committer/src/patricia_merkle_tree/node_data/leaf.rs
new file mode 100644
index 00000000000..7cdde637e17
--- /dev/null
+++ b/crates/committer/src/patricia_merkle_tree/node_data/leaf.rs
@@ -0,0 +1,113 @@
+use std::collections::HashMap;
+use std::fmt::Debug;
+use std::future::Future;
+use std::sync::Arc;
+
+use crate::block_committer::input::StarknetStorageValue;
+use crate::felt::Felt;
+use crate::hash::hash_trait::HashOutput;
+use crate::patricia_merkle_tree::filled_tree::node::{ClassHash, CompiledClassHash, Nonce};
+use crate::patricia_merkle_tree::node_data::errors::{LeafError, LeafResult};
+use crate::patricia_merkle_tree::types::NodeIndex;
+use crate::storage::db_object::{DBObject, Deserializable};
+
+pub trait Leaf: Clone + Sync + Send + DBObject + Deserializable + Default + Debug + Eq {
+ /// Returns true if leaf is empty.
+ fn is_empty(&self) -> bool;
+
+ /// Creates a leaf.
+ /// This function is async to allow computation of a leaf on the fly; in simple cases, it can
+ /// be enough to return the leaf data directly using [Self::from_modifications].
+ // Use explicit desugaring of `async fn` to allow adding trait bounds to the return type, see
+ // https://blog.rust-lang.org/2023/12/21/async-fn-rpit-in-traits.html#async-fn-in-public-traits
+ // for details.
+ fn create(
+ index: &NodeIndex,
+ leaf_modifications: Arc>,
+ ) -> impl Future
| | | |