diff --git a/.DS_Store b/.DS_Store
index fc56969bb..3c164b1a9 100644
Binary files a/.DS_Store and b/.DS_Store differ
diff --git a/.cargo/audit.toml b/.cargo/audit.toml
new file mode 100644
index 000000000..f562d12e0
--- /dev/null
+++ b/.cargo/audit.toml
@@ -0,0 +1,30 @@
+[advisories]
+ignore = [
+ # DO NOT ADD ANYTHING TO THIS LIST WITHOUT CAREFUL CONSIDERATION!
+
+ # dotenv being unmaintained is ignored because it is an indirect dependency of cloud-storage, which would be hard to replace.
+ # In addition, it is most likely not ever going to be on a security-critical path, considering it only parses trusted .env files.
+ # However, we should probably replace cloud-storage with tame-gcs as soon as possible to remove this ignore.
+ "RUSTSEC-2021-0141",
+
+ # mach is unmaintained, but seems to be required by wasmtime at its latest version, which we currently cannot do without.
+ # We should replace it with mach2 in our personal code, but will need to keep it there until wasmtime switches to it.
+ # Anyway, it cannot be a security liability in production, considering it is bindings to the OS X kernel.
+ "RUSTSEC-2020-0168",
+
+ # memmap is unmaintained, but is used by wasmer0, which we need to keep alive for replayability reasons.
+ # We should remove wasmer0 and this ignore as soon as we get limited replayability.
+ "RUSTSEC-2020-0077",
+
+ # parity-wasm is deprecated, but is used by our runtimes before unc-vm, which we need to keep alive for replayability reasons.
+ # We should remove them all, as well as this ignore, as soon as we get limited replayability.
+ "RUSTSEC-2022-0061",
+
+ # borsh is vulnerable, but is used by wasmer0, which we need to keep alive for replayability reasons.
+ # We should remove it, as well as this ignore, as soon as we get limited replayability.
+ "RUSTSEC-2023-0033",
+
+ # older versions of parking-lot are vulnerable, but used by wasmer0, which we need to keep alive for replayability reasons.
+ # We should remove it, as well as this ignore, as soon as we get limited replayability.
+ "RUSTSEC-2020-0070",
+]
diff --git a/.cargo/config.toml b/.cargo/config.toml
new file mode 100644
index 000000000..5a4d9f339
--- /dev/null
+++ b/.cargo/config.toml
@@ -0,0 +1,7 @@
+[build]
+# We compile with `panic=abort`, so we need `-Cforce-unwind-tables=y`
+# to get a useful backtrace on panic.
+rustflags = ["-Cforce-unwind-tables=y"]
+
+[target.'cfg(target_arch = "x86_64")']
+rustflags = ["-Ctarget-feature=+sse4.1,+sse4.2", "-Cforce-unwind-tables=y"]
diff --git a/.config/nextest.toml b/.config/nextest.toml
new file mode 100644
index 000000000..e449bf728
--- /dev/null
+++ b/.config/nextest.toml
@@ -0,0 +1,36 @@
+[profile.default]
+slow-timeout = { period = "60s", terminate-after = 2, grace-period = "0s" }
+
+[[profile.default.overrides]]
+filter = 'test(test_full_estimator)'
+slow-timeout = { period = "10m", terminate-after = 3 }
+retries = 0
+threads-required = 2
+
+[[profile.default.overrides]]
+filter = 'package(style-tests)'
+slow-timeout = { period = "120s", terminate-after = 5 }
+retries = 0
+threads-required = 4
+
+# Unfortunately no support for inheriting profiles yet:
+# https://github.com/nextest-rs/nextest/issues/387
+[profile.ci]
+slow-timeout = { period = "120s", terminate-after = 5 }
+# Try a few times before failing the whole test suite on a potentially spurious tests.
+# The hope is that people will fix the spurious tests as they encounter them locally...
+retries = { backoff = "fixed", count = 3, delay = "1s" }
+failure-output = "final"
+fail-fast = false
+
+[[profile.ci.overrides]]
+filter = 'test(test_full_estimator)'
+slow-timeout = { period = "10m", terminate-after = 3 }
+retries = 0
+threads-required = 2
+
+[[profile.ci.overrides]]
+filter = 'package(style-tests)'
+slow-timeout = { period = "120s", terminate-after = 5 }
+retries = 0
+threads-required = 4
diff --git a/.dockerignore b/.dockerignore
new file mode 100644
index 000000000..48701d105
--- /dev/null
+++ b/.dockerignore
@@ -0,0 +1,25 @@
+.idea/
+.vscode/
+
+docker/
+!docker/scripts/
+ops/
+!ops/run.sh
+!ops/tendermint-config.toml
+
+**/target
+storage/
+keystore/
+tmp/
+sandbox/
+
+# Ignore Vim swapfiles
+*.swp
+
+# Docker files shouldn't invalidate the cache because Docker itself will use these appropriately
+.dockerignore
+Dockerfile
+Dockerfile.nightly
+
+# Ignore git internal structure
+.git/
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 000000000..214b64ac9
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,6 @@
+**/package-lock.json linguist-generated=true -diff
+# Disable linguist for WebAssembly files.
+# Those are used to test the runtime and should not be indexed.
+*.wasm linguist-detectable=false
+*.wast linguist-detectable=false
+*.wat linguist-detectable=false
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 000000000..4ca72b851
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,36 @@
+---
+name: Bug report
+about: Create a report to help us improve
+title: ''
+labels: ''
+assignees: ''
+
+---
+
+
+
+**Describe the bug**
+Please provide a short description of the bug.
+
+**To Reproduce**
+Steps to reproduce the behavior.
+
+**Expected behavior**
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+If applicable, add screenshots to help explain your problem.
+
+**Version (please complete the following information):**
+- utility commit/branch
+- rust version (if local)
+- docker (if using docker)
+- mainnet/testnet/local
+
+**Additional context**
+Add any other context about the problem here.
diff --git a/.github/PULL_REQUEST_TEMPLATE/copilot_generated.md b/.github/PULL_REQUEST_TEMPLATE/copilot_generated.md
new file mode 100644
index 000000000..3cae3853f
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/copilot_generated.md
@@ -0,0 +1,10 @@
+### WHAT
+copilot:summary
+
+copilot:poem
+
+### WHY
+
+
+### HOW
+copilot:walkthrough
diff --git a/.github/PULL_REQUEST_TEMPLATE/feature_stabilization.md b/.github/PULL_REQUEST_TEMPLATE/feature_stabilization.md
new file mode 100644
index 000000000..c79ce0a24
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE/feature_stabilization.md
@@ -0,0 +1,15 @@
+# Feature to stabilize
+Describe the protocol feature you want to stabilize in this PR, what it is about, and why do we need it without assuming prior knowledge of the feature.
+Feel free to link other pull requests or issues here.
+
+# Context
+
+- NEP (if exists): https://github.com/near/NEPs/blob/master/neps/nep-XXXX.md
+- Implementation: https://github.com/utnet-org/utility/pull/XXXX
+
+# Testing and QA
+Describe the testing plan for this protocol and why you are confident that it is ready to be stabilized.
+
+# Checklist
+- [ ] Link to nightly nayduck run (`./scripts/nayduck.py`, [docs](https://github.com/utnet-org/utility/blob/master/nightly/README.md#scheduling-a-run)): https://nayduck.near.org/
+- [ ] Update CHANGELOG.md to include this protocol feature in the `Unreleased` section.
diff --git a/.github/weekly-digest.yml b/.github/weekly-digest.yml
new file mode 100644
index 000000000..af602faff
--- /dev/null
+++ b/.github/weekly-digest.yml
@@ -0,0 +1,8 @@
+# Configuration for weekly-digest - https://github.com/apps/weekly-digest
+publishDay: 5
+canPublishIssues: true
+canPublishPullRequests: true
+canPublishContributors: true
+canPublishStargazers: true
+canPublishCommits: false
+
diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml
new file mode 100644
index 000000000..f83a02a03
--- /dev/null
+++ b/.github/workflows/book.yml
@@ -0,0 +1,45 @@
+name: Book
+
+on:
+ push:
+ branches:
+ - master
+ pull_request:
+ paths:
+ - 'docs/**'
+ - '.github/workflows/book.yml'
+
+jobs:
+ book:
+ name: Book
+ runs-on: ubuntu-latest
+ env:
+ MDBOOK_VERSION: '0.4.21'
+ steps:
+ - uses: actions/checkout@v2
+ - name: Install mdbook
+ run: |
+ curl -L https://github.com/rust-lang/mdBook/releases/download/v$MDBOOK_VERSION/mdbook-v$MDBOOK_VERSION-x86_64-unknown-linux-gnu.tar.gz | tar xz -C ~/.cargo/bin
+ - name: Build
+ run: mdbook build
+ working-directory: docs
+ - uses: actions/upload-artifact@v2
+ with:
+ name: book
+ path: target/book
+
+ deploy:
+ name: Deploy
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write
+ needs: book
+ if: github.event_name == 'push' && github.ref == 'refs/heads/master'
+ steps:
+ - uses: actions/download-artifact@v2
+ with:
+ name: book
+ - uses: peaceiris/actions-gh-pages@v3
+ with:
+ github_token: ${{ secrets.GITHUB_TOKEN }}
+ publish_dir: .
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 000000000..e36254559
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,380 @@
+name: CI
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ merge_group:
+
+env:
+ CI_HACKS: 1
+
+# BE CAREFUL IF EDITING THIS FILE:
+# If you add/remove python tests from here, you should also update `check_pytests.py`’s list of GHA_TESTS
+# so that it stays in-sync, to make sure no tests are lost.
+
+jobs:
+ cargo_nextest:
+ name: "Cargo Nextest (${{matrix.name}})"
+ runs-on: ${{ matrix.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - name: Linux
+ id: linux
+ cache_id: linux
+ os: ubuntu-22.04-16core
+ type: stable
+ runs_integ_tests: true
+ - name: Linux Nightly
+ id: linux-nightly
+ cache_id: linux
+ os: ubuntu-22.04-16core
+ type: nightly
+ runs_integ_tests: true
+ - name: MacOS
+ id: macos
+ cache_id: macos
+ os: macos-latest-xlarge
+ type: stable
+ runs_integ_tests: false
+ timeout-minutes: 90
+ steps:
+ - uses: actions/checkout@v4
+
+ # Install all the required tools
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: just
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-nextest
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-deny
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-llvm-cov
+
+ # Setup the dependency rust cache and llvm-cov
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-${{ matrix.cache_id }}"
+
+ # Run the tests
+ - run: just codecov "nextest-unit ${{ matrix.type }}"
+ - run: mv codecov.json unit-${{ matrix.id }}.json
+ - run: just codecov "nextest-integration ${{ matrix.type }}"
+ if: matrix.runs_integ_tests
+ - run: mv codecov.json integration-${{ matrix.id }}.json
+ if: matrix.runs_integ_tests
+
+ # Upload the coverage
+ - uses: actions/upload-artifact@v3
+ with:
+ name: coverage
+ path: |
+ unit-${{ matrix.id }}.json
+ integration-${{ matrix.id }}.json
+
+ protobuf_backward_compat:
+ name: "Protobuf Backward Compatibility"
+ runs-on: ubuntu-22.04-8core
+ steps:
+ - uses: actions/checkout@v4
+ - uses: bufbuild/buf-setup-action@1158f4fa81bc02e1ff62abcca6d516c9e24c77da
+ - uses: bufbuild/buf-breaking-action@a074e988ee34efcd4927079e79c611f428354c01
+ with:
+ against: "https://github.com/utnet-org/utility.git#${{github.event.pull_request.base.sha && format('ref={0}', github.event.pull_request.base.sha) || 'branch=master' }}"
+
+ py_backward_compat:
+ name: "Backward Compatibility"
+ runs-on: ubuntu-22.04
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.11
+ cache: pip
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-llvm-cov
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-linux"
+ save-if: "false" # use the cache from nextest, but don’t double-save
+ - run: pip3 install --user -r pytest/requirements.txt
+ - run: cargo llvm-cov show-env | grep -v RUSTFLAGS | tr -d "'" >> "$GITHUB_ENV"
+ - run: echo "RUSTC_WORKSPACE_WRAPPER=$PWD/scripts/rustc-coverage-wrapper.sh" >> "$GITHUB_ENV"
+ - run: cargo build --locked --profile dev-release -p uncd --bin uncd
+ - run: echo "CURRENT_NEARD=$PWD/target/dev-release/uncd" >> "$GITHUB_ENV"
+ - run: cd pytest && python3 tests/sanity/backward_compatible.py
+ - run: cargo llvm-cov report --profile dev-release --codecov --output-path py-backward-compat.json
+ - uses: actions/upload-artifact@v3
+ with:
+ name: coverage
+ path: py-backward-compat.json
+
+ py_db_migration:
+ name: "Database Migration"
+ runs-on: ubuntu-22.04-8core
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.11
+ cache: pip
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-llvm-cov
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-linux"
+ save-if: "false" # use the cache from nextest, but don’t double-save
+ - run: pip3 install --user -r pytest/requirements.txt
+ - run: cargo llvm-cov show-env | grep -v RUSTFLAGS | tr -d "'" >> "$GITHUB_ENV"
+ - run: echo "RUSTC_WORKSPACE_WRAPPER=$PWD/scripts/rustc-coverage-wrapper.sh" >> "$GITHUB_ENV"
+ - run: cargo build --locked --profile dev-release -p uncd --bin uncd
+ - run: echo "CURRENT_NEARD=$PWD/target/dev-release/uncd" >> "$GITHUB_ENV"
+ - run: echo "unc_ROOT=$PWD" >> "$GITHUB_ENV"
+ - run: cd pytest && python3 tests/sanity/db_migration.py
+ - run: cargo llvm-cov report --profile dev-release --codecov --output-path py-db-migration.json
+ - uses: actions/upload-artifact@v3
+ with:
+ name: coverage
+ path: py-db-migration.json
+
+ py_sanity_checks:
+ name: "Sanity Checks"
+ runs-on: ubuntu-22.04-16core
+ strategy:
+ fail-fast: false
+ timeout-minutes: 90
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.11
+ cache: pip
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-llvm-cov
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-linux"
+ save-if: "false" # use the cache from nextest, but don’t double-save
+ - run: pip3 install --user -r pytest/requirements.txt
+ # This is the only job that uses `--features nightly` so we build this in-line instead of a
+ # separate job like done with the regular uncd.
+ - run: cargo llvm-cov show-env | grep -v RUSTFLAGS | tr -d "'" >> "$GITHUB_ENV"
+ - run: echo "RUSTC_WORKSPACE_WRAPPER=$PWD/scripts/rustc-coverage-wrapper.sh" >> "$GITHUB_ENV"
+ - run: cargo build --profile dev-release -p uncd --bin uncd --features nightly
+ # Note: We're not running spin_up_cluster.py for non-nightly
+ # because spinning up non-nightly clusters is already covered
+ # by other steps in the CI, e.g. upgradable.
+ - run: python3 pytest/tests/sanity/spin_up_cluster.py
+ env:
+ unc_ROOT: "target/dev-release"
+ - run: cargo llvm-cov report --profile dev-release --codecov --output-path py-sanity-checks.json
+ - uses: actions/upload-artifact@v3
+ with:
+ name: coverage
+ path: py-sanity-checks.json
+
+ py_genesis_check:
+ name: "Genesis Changes"
+ runs-on: ubuntu-22.04-8core
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.11
+ cache: pip
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-llvm-cov
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-linux"
+ save-if: "false" # use the cache from nextest, but don’t double-save
+ - run: pip3 install --user -r pytest/requirements.txt
+ - run: cargo llvm-cov show-env | grep -v RUSTFLAGS | tr -d "'" >> "$GITHUB_ENV"
+ - run: echo "RUSTC_WORKSPACE_WRAPPER=$PWD/scripts/rustc-coverage-wrapper.sh" >> "$GITHUB_ENV"
+ - run: cargo build --locked --profile dev-release -p uncd --bin uncd
+ - run: echo "CURRENT_NEARD=$PWD/target/dev-release/uncd" >> "$GITHUB_ENV"
+ - run: python3 scripts/state/update_res.py check
+ - run: cargo llvm-cov report --profile dev-release --codecov --output-path py-genesis-check.json
+ - uses: actions/upload-artifact@v3
+ with:
+ name: coverage
+ path: py-genesis-check.json
+
+ py_style_check:
+ name: "Style"
+ runs-on: ubuntu-22.04
+ steps:
+ - uses: actions/checkout@v4
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: just
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.11
+ cache: pip
+ - run: pip3 install --user -r pytest/requirements.txt
+ - run: just python-style-checks
+
+ py_upgradability:
+ name: "Upgradability"
+ runs-on: ubuntu-22.04-8core
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-python@v4
+ with:
+ python-version: 3.11
+ cache: pip
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-llvm-cov
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-linux"
+ save-if: "false" # use the cache from nextest, but don’t double-save
+ - run: pip3 install --user -r pytest/requirements.txt
+ - run: cargo llvm-cov show-env | grep -v RUSTFLAGS | tr -d "'" >> "$GITHUB_ENV"
+ - run: echo "RUSTC_WORKSPACE_WRAPPER=$PWD/scripts/rustc-coverage-wrapper.sh" >> "$GITHUB_ENV"
+ - run: cargo build --locked --profile dev-release -p uncd --bin uncd
+ - run: echo "CURRENT_NEARD=$PWD/target/dev-release/uncd" >> "$GITHUB_ENV"
+ - run: cd pytest && python3 tests/sanity/upgradable.py
+ - run: cargo llvm-cov report --profile dev-release --codecov --output-path py-upgradability.json
+ - uses: actions/upload-artifact@v3
+ with:
+ name: coverage
+ path: py-upgradability.json
+
+ rpc_error_schema:
+ name: "RPC Schema"
+ runs-on: ubuntu-22.04-8core
+ steps:
+ - uses: actions/checkout@v4
+ - uses: Swatinem/rust-cache@a95ba195448af2da9b00fb742d14ffaaf3c21f43
+ with:
+ prefix-key: "0" # change this to invalidate CI cache
+ shared-key: "cargo_nextest-linux"
+ save-if: "false" # use the cache from nextest, but don’t double-save
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: just
+ - run: just check-rpc-errors-schema
+
+ lychee_checks:
+ name: "Lychee Lints"
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: lycheeverse/lychee-action@2ac9f030ccdea0033e2510a23a67da2a2da98492
+ with:
+ fail: true
+
+ cargo_audit:
+ name: "Cargo Audit"
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-audit
+ - run: cargo audit -D warnings
+
+ upload_coverage:
+ name: "Upload Coverage"
+ runs-on: ubuntu-latest
+ needs:
+ - cargo_nextest
+ - py_backward_compat
+ - py_db_migration
+ - py_sanity_checks
+ - py_genesis_check
+ - py_upgradability
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/download-artifact@v3
+ with:
+ name: coverage
+ # Keep the number of uploads here in sync with codecov.yml’s after_n_build value
+ # codecov will send a comment only after having receidev this number of uploads.
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: unit-linux.json
+ fail_ci_if_error: true
+ flags: unittests,linux
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: unit-linux-nightly.json
+ fail_ci_if_error: true
+ flags: unittests,linux-nightly
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: unit-macos.json
+ fail_ci_if_error: true
+ flags: unittests,macos
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: integration-linux.json
+ fail_ci_if_error: true
+ flags: integration-tests,linux
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: integration-linux-nightly.json
+ fail_ci_if_error: true
+ flags: integration-tests,linux-nightly
+ # - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ # with:
+ # token: ${{ secrets.CODECOV_TOKEN }}
+ # files: integration-macos.json
+ # fail_ci_if_error: true
+ # flags: integration-tests,macos
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: py-backward-compat.json
+ fail_ci_if_error: true
+ flags: pytests,backward-compatibility,linux
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: py-db-migration.json
+ fail_ci_if_error: true
+ flags: pytests,db-migration,linux
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: py-sanity-checks.json
+ fail_ci_if_error: true
+ flags: pytests,sanity-checks,linux
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: py-genesis-check.json
+ fail_ci_if_error: true
+ flags: pytests,genesis-check,linux
+ - uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: py-upgradability.json
+ fail_ci_if_error: true
+ flags: pytests,upgradability,linux
diff --git a/.github/workflows/issue-metrics.yml b/.github/workflows/issue-metrics.yml
new file mode 100644
index 000000000..81be7bbe9
--- /dev/null
+++ b/.github/workflows/issue-metrics.yml
@@ -0,0 +1,42 @@
+name: Monthly issue metrics
+
+on:
+ workflow_dispatch:
+ schedule:
+ - cron: '3 2 1 * *'
+
+permissions:
+ issues: write
+ pull-requests: read
+
+jobs:
+ monthly-issue-metrics:
+ name: past month issue metrics
+ runs-on: ubuntu-latest
+ steps:
+ - name: Get dates for last month
+ shell: bash
+ id: last-month
+ run: |
+ # Calculate the first day of the previous month
+ first_day=$(date -d "last month" +%Y-%m-01)
+
+ # Calculate the last day of the previous month
+ last_day=$(date -d "$first_day +1 month -1 day" +%Y-%m-%d)
+
+ #Set an environment variable with the date range
+ echo "$first_day..$last_day"
+ echo "LAST_MONTH=$first_day..$last_day" >> $GITHUB_OUTPUT
+
+ - name: Run issue-metrics tool
+ uses: github/issue-metrics@v2
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ SEARCH_QUERY: 'repo:utnet-org/utility is:issue created:${{ steps.last-month.outputs.LAST_MONTH }}'
+
+ - name: Create issue
+ uses: peter-evans/create-issue-from-file@v4
+ with:
+ title: Monthly issue metrics report
+ token: ${{ secrets.GITHUB_TOKEN }}
+ content-filepath: ./issue_metrics.md
diff --git a/.github/workflows/mac_binary.yml b/.github/workflows/mac_binary.yml
new file mode 100644
index 000000000..c2df74dc0
--- /dev/null
+++ b/.github/workflows/mac_binary.yml
@@ -0,0 +1,26 @@
+name: MacOS binary release
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+ tags:
+ - '[0-9]+.[0-9]+.[0-9]+*'
+jobs:
+ build_binary:
+ runs-on: macOS-latest
+
+ steps:
+ - uses: hecrj/setup-rust-action@v1
+ with:
+ rust-version: nightly-2020-03-19
+ - uses: actions/checkout@master
+ - uses: isbang/setup-awscli@v0.1.0
+ - run: scripts/mac-release.sh
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ - run: scripts/mac-release.sh nightly-release
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
diff --git a/.github/workflows/mac_m1_binary.yml b/.github/workflows/mac_m1_binary.yml
new file mode 100644
index 000000000..2778f3d1b
--- /dev/null
+++ b/.github/workflows/mac_m1_binary.yml
@@ -0,0 +1,23 @@
+name: MacOS-m1 binary release
+on:
+ workflow_dispatch:
+ push:
+ branches:
+ - master
+ tags:
+ - '[0-9]+.[0-9]+.[0-9]+*'
+jobs:
+ build_binary:
+ runs-on: macos-latest-xlarge
+
+ steps:
+ - uses: actions/checkout@master
+ - uses: isbang/setup-awscli@v0.1.0
+ - run: scripts/mac-release.sh
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
+ - run: scripts/mac-release.sh nightly-release
+ env:
+ AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
+ AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
diff --git a/.github/workflows/master_fuzzer_binaries.yml b/.github/workflows/master_fuzzer_binaries.yml
new file mode 100644
index 000000000..4ed29701b
--- /dev/null
+++ b/.github/workflows/master_fuzzer_binaries.yml
@@ -0,0 +1,54 @@
+name: Build fuzz targets from master
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build_fuzzers:
+ name: Build Fuzzers
+ runs-on: "ubuntu-20.04-32core"
+
+ permissions:
+ contents: "read"
+ id-token: "write"
+
+ steps:
+ - run: sudo fallocate -l 128G /swap-file
+ - run: sudo chmod 600 /swap-file
+ - run: sudo mkswap /swap-file
+ - run: sudo swapon /swap-file
+
+ - id: "auth"
+ uses: "google-github-actions/auth@v1"
+ with:
+ workload_identity_provider: "projects/968400232856/locations/global/workloadIdentityPools/project-identity-pool/providers/github-provider"
+ service_account: "unc-fuzzer-service-account@unc-fuzzer.iam.gserviceaccount.com"
+
+ - name: Installing nightly rust
+ run: |
+ rustup install nightly
+ rustup default nightly
+
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-bolero
+ # TODO: remove the below once https://github.com/camshaft/bolero/pull/195 is released on crates.io
+ # and https://github.com/camshaft/bolero/pull/196 has a proper fix
+ git: https://github.com/Ekleog-NEAR/bolero
+ rev: 56da8e6d1d018519a30b36d85d3a53fe35a42eaf
+
+ - run: rustup target add --toolchain nightly wasm32-unknown-unknown
+
+ - name: "Set up GCP SDK"
+ uses: "google-github-actions/setup-gcloud@v1"
+ with:
+ version: ">= 416.0.0"
+
+ - uses: actions/checkout@master
+
+ - name: "Compile fuzzers and upload to GCS"
+ run: |
+ NAME="framework-${{ github.ref_name }}-$(env TZ=Etc/UTC date +"%Y%m%d%H%M%S")"
+ RUSTFLAGS="-A warnings --cfg fuzz" cargo +nightly bolero build-clusterfuzz --all-features --profile fuzz
+ gsutil cp -Z target/fuzz/clusterfuzz.tar "gs://fuzzer_targets/${{ github.ref_name }}/$NAME.tar.gz"
diff --git a/.github/workflows/nightly_nayduck.yml b/.github/workflows/nightly_nayduck.yml
new file mode 100644
index 000000000..f692428f1
--- /dev/null
+++ b/.github/workflows/nightly_nayduck.yml
@@ -0,0 +1,21 @@
+name: Nightly Nayduck tests check
+on:
+ merge_group:
+
+jobs:
+ nightly_nayduck_tests:
+ runs-on: "ubuntu-latest"
+ timeout-minutes: 10
+
+ steps:
+ - name: Install JQ json processor
+ run: sudo apt install jq
+
+ # In this step we get the latest nightly results from the nayduck server
+ # and check if there are any non-passing tests
+ - name: Check if there are any non-passing tests
+ run: |
+ NIGHTLY_RESULTS=$(curl -s https://nayduck.near.org/api/nightly-events)
+ UNSUCCESSFUL_TESTS=$(jq -e '.tests | .[][] | select(.[2] != "PASSED" ) ' <<< ${NIGHTLY_RESULTS} )
+ if [ -z "$UNSUCCESSFUL_TESTS" ] ; then echo "Nightly Nayduck tests OK"; \
+ else echo "Nightly Nayduck tests are failing" && exit 1; fi
diff --git a/.github/workflows/ondemand_fuzzer_binaries.yml b/.github/workflows/ondemand_fuzzer_binaries.yml
new file mode 100644
index 000000000..557eaf6e7
--- /dev/null
+++ b/.github/workflows/ondemand_fuzzer_binaries.yml
@@ -0,0 +1,90 @@
+name: Build on demand fuzz targets
+on:
+ # Run when a new release or rc is created
+ release:
+ types: [released, prereleased]
+
+ # Run on-demand
+ workflow_dispatch:
+ inputs:
+ branch_type:
+ type: choice
+ required: true
+ options:
+ - master
+ - release
+ - rc
+ description: Type of branch to build fuzz targets
+ branch_ref:
+ type: string
+ required: true
+ description: Branch name or tag to build from
+
+jobs:
+ build_fuzzers:
+ name: Build Fuzzers
+ runs-on: "ubuntu-20.04-32core"
+
+ permissions:
+ contents: "read"
+ id-token: "write"
+
+ steps:
+ - run: sudo fallocate -l 128G /swap-file
+ - run: sudo chmod 600 /swap-file
+ - run: sudo mkswap /swap-file
+ - run: sudo swapon /swap-file
+
+ - id: "auth"
+ uses: "google-github-actions/auth@v1"
+ with:
+ workload_identity_provider: "projects/968400232856/locations/global/workloadIdentityPools/project-identity-pool/providers/github-provider"
+ service_account: "unc-fuzzer-service-account@unc-fuzzer.iam.gserviceaccount.com"
+
+ - name: Installing nightly rust
+ run: |
+ rustup install nightly
+ rustup default nightly
+
+ - uses: baptiste0928/cargo-install@21a18ba3bf4a184d1804e8b759930d3471b1c941
+ with:
+ crate: cargo-bolero
+ # TODO: remove the below once https://github.com/camshaft/bolero/pull/195 is released on crates.io
+ # and https://github.com/camshaft/bolero/pull/196 has a proper fix
+ git: https://github.com/Ekleog-NEAR/bolero
+ rev: 56da8e6d1d018519a30b36d85d3a53fe35a42eaf
+
+ - run: rustup target add --toolchain nightly wasm32-unknown-unknown
+
+ - name: "Set up GCP SDK"
+ uses: "google-github-actions/setup-gcloud@v1"
+ with:
+ version: ">= 416.0.0"
+
+ - name: Checkout Release/RC branch
+ if: contains(fromJSON('["released", "prereleased"]'), github.event.action)
+ uses: actions/checkout@master
+
+ - name: Checkout ${{ github.event.inputs.branch_ref }} branch
+ if: ${{ github.event_name == 'workflow_dispatch'}}
+ uses: actions/checkout@master
+ with:
+ ref: ${{ github.event.inputs.branch_ref }}
+
+ - name: Build Release branch fuzz targets
+ if: ${{ github.event.action == 'released'}}
+ run: echo "branch_type=release" >> "$GITHUB_ENV"
+
+ - name: Build RC branch fuzz targets
+ if: ${{ github.event.action == 'prereleased'}}
+ run: echo "branch_type=rc" >> "$GITHUB_ENV"
+
+ - name: Build fuzz targets from ${{ github.event.inputs.branch_ref }}" branch
+ if: ${{ github.event_name == 'workflow_dispatch'}}
+ run: echo "branch_type=${{ github.event.inputs.branch_type }}" >> "$GITHUB_ENV"
+
+ - name: "Compile fuzzers and upload to GCS"
+ run: |
+ NAME="framework-$branch_type-$(env TZ=Etc/UTC date +"%Y%m%d%H%M%S")"
+ RUSTFLAGS="-A warnings --cfg fuzz" cargo +nightly bolero build-clusterfuzz --all-features --profile fuzz
+ gsutil cp -Z target/fuzz/clusterfuzz.tar "gs://fuzzer_targets/$branch_type/$NAME.tar.gz"
diff --git a/.github/workflows/unc_crates_publish.yml b/.github/workflows/unc_crates_publish.yml
new file mode 100644
index 000000000..b85548113
--- /dev/null
+++ b/.github/workflows/unc_crates_publish.yml
@@ -0,0 +1,41 @@
+name: Unc Crates Publish
+
+on:
+ schedule:
+ - cron: '*/30 * * * *'
+ workflow_dispatch:
+
+jobs:
+ publish-cargo-crates:
+ name: "Publish unc-workspaces on crates.io https://crates.io/crates/unc-workspaces"
+ runs-on: "ubuntu-22.04-2core"
+ #environment: deploy
+ permissions:
+ contents: write # required for crates push
+ timeout-minutes: 30
+
+ steps:
+ - name: Checkout utnet-org/utility's develop branch
+ uses: actions/checkout@v4
+ with:
+ fetch-depth: 0
+ ref: develop
+ - name: Set up git user
+ uses: fregante/setup-git-user@v2
+ - name: Publish unc-workspaces on crates.io
+ env:
+ CARGO_REGISTRY_TOKEN: ${{ secrets.CARGO_REGISTRY_TOKEN }}
+ run: |
+ set -x
+ cargo install --git https://github.com/miraclx/cargo-workspaces --tag v0.3.0 cargo-workspaces
+ cargo ws publish --yes --allow-dirty --force '*' \
+ --no-git-commit --no-git-push --no-individual-tags --tag-prefix 'crates-' \
+ --tag-msg $$'crates.io snapshot\n---%{\n- %n - https://crates.io/crates/%n/%v}'
+
+ - name: Create tag on https://github.com/utnet-org/utility
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ run: |
+ git push --no-follow-tags https://github.com/utnet-org/utility.git tag 'crates-*'
+
+
diff --git a/.github/workflows/uncd_assertion_binary.yml b/.github/workflows/uncd_assertion_binary.yml
new file mode 100644
index 000000000..4bbb293a6
--- /dev/null
+++ b/.github/workflows/uncd_assertion_binary.yml
@@ -0,0 +1,47 @@
+name: Uncd Assertion binary release
+
+on:
+ schedule:
+ - cron: '23 */8 * * *'
+
+ workflow_dispatch:
+ inputs:
+ branch:
+ default: 'master'
+ description: "Nearcore branch to build and publish"
+ type: string
+ required: true
+
+jobs:
+ binary-release:
+ name: "Build and publish uncd binary"
+ runs-on: "ubuntu-20.04-16core"
+ #environment: deploy
+ permissions:
+ id-token: write # required to use OIDC authentication
+
+ steps:
+ - name: Configure AWS Credentials
+ uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: arn:aws:iam::754641474505:role/GitHubActionsRunner
+ aws-region: us-west-1
+
+ - name: Checkout ${{ github.event.inputs.branch }} branch
+ if: ${{ github.event_name == 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.inputs.branch }}
+
+ - name: Checkout framework repository
+ if: ${{ github.event_name != 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+
+ - name: Uncd binary build and upload to S3
+ run: ./scripts/binary_release.sh assertions-release
+
+ - name: Update latest version metadata in S3
+ run: |
+ echo $(git rev-parse HEAD) > latest
+ BRANCH=$(git branch --show-current)
+ aws s3 cp --acl public-read latest s3://build.nearprotocol.com/framework/$(uname)/${BRANCH}/latest-assertions
diff --git a/.github/workflows/uncd_nightly_binary.yml b/.github/workflows/uncd_nightly_binary.yml
new file mode 100644
index 000000000..0ddb33769
--- /dev/null
+++ b/.github/workflows/uncd_nightly_binary.yml
@@ -0,0 +1,40 @@
+name: Uncd Nightly binary release
+
+on:
+ workflow_dispatch:
+ inputs:
+ branch:
+ default: 'master'
+ description: "Nearcore branch to build and publish"
+ type: string
+ required: true
+
+jobs:
+ binary-release:
+ name: "Build and publish uncd binary"
+ runs-on: "ubuntu-20.04-16core"
+ #environment: deploy
+ permissions:
+ id-token: write # required to use OIDC authentication
+
+ steps:
+ - name: Configure AWS Credentials
+ uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: arn:aws:iam::754641474505:role/GitHubActionsRunner
+ aws-region: us-west-1
+
+ - name: Checkout ${{ github.event.inputs.branch }} branch
+ if: ${{ github.event_name == 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.inputs.branch }}
+
+ - name: Uncd binary build and upload to S3
+ run: ./scripts/binary_release.sh nightly-release
+
+ - name: Update latest version metadata in S3
+ run: |
+ echo $(git rev-parse HEAD) > latest
+ BRANCH=$(git branch --show-current)
+ aws s3 cp --acl public-read latest s3://build.nearprotocol.com/framework/$(uname)/${BRANCH}/latest-nightly
diff --git a/.github/workflows/uncd_release.yml b/.github/workflows/uncd_release.yml
new file mode 100644
index 000000000..0d66e1fbf
--- /dev/null
+++ b/.github/workflows/uncd_release.yml
@@ -0,0 +1,88 @@
+name: Uncd binary and Docker image release
+
+on:
+ # Run when a new release or rc is created
+ release:
+ types: [released, prereleased]
+ push:
+ branches: master
+
+ workflow_dispatch:
+ inputs:
+ branch:
+ default: 'master'
+ description: "Nearcore branch to build and publish"
+ type: string
+ required: true
+
+jobs:
+ binary-release:
+ name: "Build and publish uncd binary"
+ runs-on: "ubuntu-20.04-16core"
+ #environment: deploy
+ permissions:
+ id-token: write # required to use OIDC authentication
+
+ steps:
+ - name: Configure AWS Credentials
+ uses: aws-actions/configure-aws-credentials@v4
+ with:
+ role-to-assume: arn:aws:iam::754641474505:role/GitHubActionsRunner
+ aws-region: us-west-1
+
+ - name: Checkout ${{ github.event.inputs.branch }} branch
+ if: ${{ github.event_name == 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.inputs.branch }}
+
+ - name: Checkout unc repository
+ if: ${{ github.event_name != 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+
+ - name: Uncd binary build and upload to S3
+ run: ./scripts/binary_release.sh
+
+ - name: Update latest version metadata in S3
+ run: |
+ echo $(git rev-parse HEAD) > latest
+ BRANCH=$(git branch --show-current)
+ aws s3 cp --acl public-read latest s3://build.nearprotocol.com/unc/$(uname)/${BRANCH}/latest
+
+ docker-release:
+ name: "Build and publish unc Docker image"
+ runs-on: "ubuntu-20.04-16core"
+ #environment: deploy
+ steps:
+ - name: Checkout ${{ github.event.inputs.branch }} branch
+ if: ${{ github.event_name == 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+ with:
+ ref: ${{ github.event.inputs.branch }}
+
+ - name: Checkout unc repository
+ if: ${{ github.event_name != 'workflow_dispatch'}}
+ uses: actions/checkout@v4
+
+ - name: Login to Docker Hub
+ uses: docker/login-action@v3
+ with:
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
+ password: ${{ secrets.DOCKER_PAT_TOKEN }}
+
+ - name: Build and push Docker image to Dockerhub
+ run: |
+ COMMIT=$(git rev-parse HEAD)
+ BRANCH=${{ github.ref_name }}
+ make docker-unc
+ docker tag unc utnet-org/utility:${BRANCH}-${COMMIT}
+ docker tag unc utnet-org/utility:${BRANCH}
+
+ docker push utnet-org/utility:${BRANCH}-${COMMIT}
+ docker push utnet-org/utility:${BRANCH}
+
+ if [[ ${BRANCH} == "master" ]];
+ then
+ docker tag unc utnet-org/utility:latest
+ docker push utnet-org/utility:latest
+ fi
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 000000000..a931f3010
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,65 @@
+# Generated by Cargo
+# will have compiled files and executables
+target
+/target_expensive/
+/sandbox
+docker-build
+/conf/grafana-dashboard-main-testnet.json
+/storage/
+/test-utils/node/storage
+/test-utils/ganache/storage
+/node/service/storage
+/keystore/
+/chain/client/tmp_bench
+testdir/
+my_script.sh
+# These are backup files generated by rustfmt
+**/*.rs.bk
+
+**/.ipynb_checkpoints/*
+
+# Editor config files
+.vscode
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+.idea
+
+# Python env
+.env
+*.pyc
+venv
+
+# Node
+**/node_modules/
+
+# Integration tests
+create-unc-app/
+unc-api-js/
+nearlib_release_test/
+test-keys/
+tmp/
+
+# OS X
+.DS_Store
+
+# Logs
+*.log
+
+# Vim tmp files
+*.swp
+rusty-tags.vi
+
+# testnet genesis
+/framework/res/testnet.json
+/framework/res/testnet_genesis_records*.json
+
+# logs from mocknet nodes
+/pytest/logs/
+
+# Estimator generated files
+costs-*.txt
+names-to-stats.txt
+data_dump_*.bin!
+*_key.json
+
+
diff --git a/.gitpod.Dockerfile b/.gitpod.Dockerfile
new file mode 100644
index 000000000..f924eb1eb
--- /dev/null
+++ b/.gitpod.Dockerfile
@@ -0,0 +1,4 @@
+FROM gitpod/workspace-full
+
+RUN git clone https://github.com/unet-org/utility.git --depth 1 /home/gitpod/utility
+RUN bash -cl "cd /home/gitpod/utility && cargo build && cargo test"
diff --git a/.gitpod.yml b/.gitpod.yml
new file mode 100644
index 000000000..ea1eca7fe
--- /dev/null
+++ b/.gitpod.yml
@@ -0,0 +1,8 @@
+tasks:
+ - init: cp -R /home/gitpod/utility/target ./target && cargo build && cargo test
+image:
+ file: .gitpod.Dockerfile
+github:
+ prebuilds:
+ addCheck: true
+ addComment: true
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
new file mode 100644
index 000000000..caacff25e
--- /dev/null
+++ b/.pre-commit-config.yaml
@@ -0,0 +1,4 @@
+- repo: https://github.com/doublify/pre-commit-rust
+ rev: master
+ hooks:
+ - id: fmt
\ No newline at end of file
diff --git a/.style.yapf b/.style.yapf
new file mode 100644
index 000000000..f34c28059
--- /dev/null
+++ b/.style.yapf
@@ -0,0 +1,4 @@
+[style]
+based_on_style = google
+indent_width = 4
+column_limit = 80
diff --git a/ATTRIBUTIONS.md b/ATTRIBUTIONS.md
new file mode 100644
index 000000000..eef269417
--- /dev/null
+++ b/ATTRIBUTIONS.md
@@ -0,0 +1,1073 @@
+# UNC Client Attributions
+
+We have taken inspiration and few pieces of code from:
+ * [OpenEthereum](https://github.com/openethereum/openethereum)
+ * [Parity Substrate](https://github.com/paritytech/substrate)
+ * [Parity Trie](https://github.com/paritytech/trie)
+ * [Grin](https://github.com/mimblewimble/grin/)
+ * [Near](https://github.com/near/nearcore)
+
+## Licenses
+
+### OpenEthereum, Parity Substrate
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ {one line to give the program's name and a brief idea of what it does.}
+ Copyright (C) {year} {name of author}
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ {project} Copyright (C) {year} {fullname}
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
+
+### Parity Trie
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+
+### Grin
+
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+### Near
+
+ END OF TERMS AND CONDITIONS
diff --git a/CODEOWNERS b/CODEOWNERS
new file mode 100644
index 000000000..4a025b352
--- /dev/null
+++ b/CODEOWNERS
@@ -0,0 +1,3 @@
+# CODEOWNERS: https://help.github.com/articles/about-codeowners/
+
+* @utnet-org/utility-codeowners
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 000000000..1bdba600b
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,76 @@
+# Contributor Covenant Code of Conduct
+
+## Our Pledge
+
+In the interest of fostering an open and welcoming environment, we as
+contributors and maintainers pledge to making participation in our project and
+our community a harassment-free experience for everyone, regardless of age, body
+size, disability, ethnicity, sex characteristics, gender identity and expression,
+level of experience, education, socio-economic status, nationality, personal
+appearance, race, religion, or sexual identity and orientation.
+
+## Our Standards
+
+Examples of behavior that contributes to creating a positive environment
+include:
+
+* Using welcoming and inclusive language
+* Being respectful of differing viewpoints and experiences
+* Gracefully accepting constructive criticism
+* Focusing on what is best for the community
+* Showing empathy towards other community members
+
+Examples of unacceptable behavior by participants include:
+
+* The use of sexualized language or imagery and unwelcome sexual attention or
+ advances
+* Trolling, insulting/derogatory comments, and personal or political attacks
+* Public or private harassment
+* Publishing others' private information, such as a physical or electronic
+ address, without explicit permission
+* Other conduct which could reasonably be considered inappropriate in a
+ professional setting
+
+## Our Responsibilities
+
+Project maintainers are responsible for clarifying the standards of acceptable
+behavior and are expected to take appropriate and fair corrective action in
+response to any instances of unacceptable behavior.
+
+Project maintainers have the right and responsibility to remove, edit, or
+reject comments, commits, code, wiki edits, issues, and other contributions
+that are not aligned to this Code of Conduct, or to ban temporarily or
+permanently any contributor for other behaviors that they deem inappropriate,
+threatening, offensive, or harmful.
+
+## Scope
+
+This Code of Conduct applies both within project spaces and in public spaces
+when an individual is representing the project or its community. Examples of
+representing a project or community include using an official project e-mail
+address, posting via an official social media account, or acting as an appointed
+representative at an online or offline event. Representation of a project may be
+further defined and clarified by project maintainers.
+
+## Enforcement
+
+Instances of abusive, harassing, or otherwise unacceptable behavior may be
+reported by contacting the project team at social@unc.com. All
+complaints will be reviewed and investigated and will result in a response that
+is deemed necessary and appropriate to the circumstances. The project team is
+obligated to maintain confidentiality with regard to the reporter of an incident.
+Further details of specific enforcement policies may be posted separately.
+
+Project maintainers who do not follow or enforce the Code of Conduct in good
+faith may face temporary or permanent repercussions as determined by other
+members of the project's leadership.
+
+## Attribution
+
+This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
+available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
+
+[homepage]: https://www.contributor-covenant.org
+
+For answers to common questions about this code of conduct, see
+https://www.contributor-covenant.org/faq
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 000000000..d84d7c589
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,163 @@
+Thank you for your interest in contributing to the NEAR reference client! We
+welcome contributions from everyone. Below are various bits of information to
+help you get started. If you require additional help, please reach out to us on
+our [zulip channel](https://unc.zulipchat.com/).
+
+## Quick Start
+
+framework is a fairly standard Rust project, so building is as easy as
+
+```console
+$ cargo build
+```
+
+Building framework requires a fairly recent Rust compiler (get it
+[here](https://rustup.rs)), as well as `clang` and `cmake` to build RocksDB
+(`sudo apt install cmake clang`).
+
+Sadly at the moment framework is only compatible with Linux and MacOS, Windows is
+not supported yet.
+
+To run a local NEAR network with one node, use
+
+```console
+$ cargo run -p uncd -- init # generates various configs in ~/.unc
+$ cargo run -p uncd -- run
+```
+
+You can now use your own node's HTTP RPC API (e.g.
+[httpie](https://httpie.io/docs/cli/installation))
+
+```console
+$ http get http://localhost:3030/status
+$ http post http://localhost:3030/ method=query jsonrpc=2.0 id=1 \
+ params:='{"request_type": "view_account", "finality": "final", "account_id": "test.unc"}'
+```
+
+The RPC is documented [here](https://docs.unc.org/api/rpc/introduction), and
+can be conveniently accessed from the command line [NEAR
+CLI](https://docs.unc.org/tools/unc-cli) utility.
+
+## Next Steps
+
+To learn more about how framework works, skim through our guide to framework
+development:
+
+https://unc.github.io/framework/
+
+If you are looking for relatively simple tasks to familiarise yourself with
+`framework`, please check out issues labeled with the `C-good-first-issue` label
+[here](https://github.com/utnet-org/utility/labels/C-good-first-issue). If you see
+one that looks interesting and is unassigned or has not been actively worked on
+in some time, please ask to have the issue assigned to you and someone from
+the team should help you get started. We do not always keep the issue tracker
+up-to-date, so if you do not find an interesting task to work on, please ask for
+help on our zulip channel.
+
+If you have an idea for an enhancement to the protocol itself, please make a
+proposal by following the [NEAR Enhancement
+Proposal](https://github.com/unc/NEPs/blob/master/neps/nep-0001.md) process.
+
+## Pull Requests
+
+All the contributions to `framework` happen via Pull Requests. Please follow the
+following steps when creating a PR:
+
+1. Fork the `framework` repository and create a new branch there to do your work.
+2. The branch can contain any number of commits. When merged, all commits will
+ be squashed into a single commit.
+3. The changes should be thoroughly tested. Please refer to [this
+ document](https://github.com/utnet-org/utility/blob/master/docs/practices/testing/README.md)
+ for our testing guidelines and an overview of the testing infrastructure.
+4. When ready, send a pull request against the `master` branch of the `framework`
+ repository.
+5. Feel free to submit draft PRs to get early feedback and to make sure you are
+ on the right track.
+6. The PR name should follow the template: `: `. Where `type` is:
+ - `fix` for bug fixes;
+ - `feat` for new features;
+ - `refactor` for changes that reorganize code without adding new content;
+ - `doc` for changes that change documentation or comments;
+ - `test` for changes that introduce new tests;
+ - `chore` for grunt tasks like updating dependencies.
+7. The PR should also contain a description when appropriate to provide
+ additional information to help the reviewer inspect the proposed change.
+8. If your PR introduces a user-observable change (e.g. a new protocol feature,
+ new configuration option, new Prometheus metric etc.) please document it in
+ [CHANGELOG.md](CHANGELOG.md) in the `[unreleased]` section.
+9. It is important to select the ` Allow edits and access to secrets by
+ maintainers` checkbox on the PR. Without this option, the merge bot will not
+ have sufficient rights to be able to merge the PR when it is approved. It
+ also allows the maintainers to make trivial changes to the PR as necessary.
+ Please see
+ [these](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request-from-a-fork)
+ [links](https://stackoverflow.com/questions/63341296/github-pull-request-allow-edits-by-maintainers)
+ for the implications of selecting the checkbox.
+
+## After the PR is submitted
+
+1. We have a CI process configured to run various tests on each PR. All tests
+need to pass before a PR can be merged.
+2. When all the comments from the reviewer(s) have been addressed, they should
+approve the PR allowing a PR to be merged.
+3. Before merging a PR, the code should be reviewed properly. In particular, the
+person who clicks "Merge when ready" has specific duties, exposed in the last
+paragraph of the "Code review process" section below.
+4. An approved PR can be merged by clicking the "Merge when ready" button. The
+button can be clicked by the author if they have the appropriate access, or by a
+reviewer otherwise. PR authors can also click the button immediately after filing
+a PR; removing an additional round-trip after the PR gets approved. The PR author
+will be notified by email by github if the PR fails to land, once it has entered
+the merge queue (ie. after it has passed PR CI and gotten an approving review).
+
+## Code review process
+
+We have two groups of code reviewers: Super owners and normal owners. When a
+PR is created:
+
+- a super owner will be automatically assigned to review.
+- they may choose to review the PR themselves or they may delegate to someone else
+who belongs either to the super owners or the normal owners group.
+- the delegate will perform the review and as needed engage other reviewers as
+well. They will review your tests, and make sure that they can convince
+themselves the test coverage is adequate before they even look into the
+change, so make sure you tested all the corner cases.
+- it is normal to sometimes require multiple rounds of reviews to get a PR
+ merged. If your PR received some feedback from a reviewer, use the [github
+ UI](https://stackoverflow.com/questions/40893008/how-to-resume-review-process-after-updating-pull-request-at-github)
+ to re-request a review.
+
+The author is also free to directly request reviews from specific persons
+[through the github
+ui](https://docs.github.com/en/github/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/requesting-a-pull-request-review).
+In this case, the automatically selected super owner will ensure that the
+selected reviewer is sufficient or additional reviewers are needed.
+
+The process for becoming a code reviewer is relatively straightforward.
+The candidate should have a good understanding of the codebase and then
+the existing super owners will discuss and approve the addition. These
+discussions take place on zulip so if you are interested in becoming a
+code reviewer, please reach out to us there.
+
+The person who clicks the "Merge when ready" button is the one who
+guarantees that no unreviewed code was added between the approving review
+and the commit that is being landed. They must be especially careful of
+commits that might have happened before the review, but not have been
+reviewed (eg. because the review was already in progress), as they will
+show above the review line on the GitHub UI. In addition, not refreshing
+the page might lead to these commits just not displaying, so the reviewer
+should refresh the page both before and after clicking "Merge when ready,"
+and confirm that the commits are as expected.
+
+## Release Schedule
+
+Once your change ends up in master, it will be released with the rest of the
+changes by other contributors on the regular release schedules.
+
+On [betanet](https://docs.unc.org/docs/concepts/networks#testnet) we run
+nightly build from master with all the nightly protocol features enabled. Every
+five weeks, we stabilize some protocol features and make a release candidate for
+testnet. The process for feature stabilization can be found in [this
+document](docs/practices/protocol_upgrade.md). After the release candidate has been
+running on testnet for four weeks and no issues are observed, we stabilize and
+publish the release for mainnet.
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 000000000..3b50c8a89
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,8775 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "actix"
+version = "0.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb72882332b6d6282f428b77ba0358cb2687e61a6f6df6a6d3871e8a177c2d4f"
+dependencies = [
+ "actix-macros",
+ "actix-rt",
+ "actix_derive",
+ "bitflags 2.4.2",
+ "bytes",
+ "crossbeam-channel",
+ "futures-core",
+ "futures-sink",
+ "futures-task",
+ "futures-util",
+ "log",
+ "once_cell",
+ "parking_lot 0.12.1",
+ "pin-project-lite",
+ "smallvec",
+ "tokio",
+ "tokio-util 0.7.10",
+]
+
+[[package]]
+name = "actix-codec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a"
+dependencies = [
+ "bitflags 2.4.2",
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "memchr",
+ "pin-project-lite",
+ "tokio",
+ "tokio-util 0.7.10",
+ "tracing",
+]
+
+[[package]]
+name = "actix-cors"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0346d8c1f762b41b458ed3145eea914966bb9ad20b9be0d6d463b20d45586370"
+dependencies = [
+ "actix-utils",
+ "actix-web",
+ "derive_more",
+ "futures-util",
+ "log",
+ "once_cell",
+ "smallvec",
+]
+
+[[package]]
+name = "actix-http"
+version = "3.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d223b13fd481fc0d1f83bb12659ae774d9e3601814c68a0bc539731698cca743"
+dependencies = [
+ "actix-codec",
+ "actix-rt",
+ "actix-service",
+ "actix-utils",
+ "ahash 0.8.11",
+ "base64 0.21.7",
+ "bitflags 2.4.2",
+ "brotli",
+ "bytes",
+ "bytestring",
+ "derive_more",
+ "encoding_rs",
+ "flate2",
+ "futures-core",
+ "h2",
+ "http 0.2.12",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "language-tags",
+ "local-channel",
+ "mime",
+ "percent-encoding",
+ "pin-project-lite",
+ "rand 0.8.5",
+ "sha1",
+ "smallvec",
+ "tokio",
+ "tokio-util 0.7.10",
+ "tracing",
+ "zstd",
+]
+
+[[package]]
+name = "actix-macros"
+version = "0.2.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
+dependencies = [
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "actix-router"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d22475596539443685426b6bdadb926ad0ecaefdfc5fb05e5e3441f15463c511"
+dependencies = [
+ "bytestring",
+ "http 0.2.12",
+ "regex",
+ "serde",
+ "tracing",
+]
+
+[[package]]
+name = "actix-rt"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d"
+dependencies = [
+ "actix-macros",
+ "futures-core",
+ "tokio",
+]
+
+[[package]]
+name = "actix-server"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4"
+dependencies = [
+ "actix-rt",
+ "actix-service",
+ "actix-utils",
+ "futures-core",
+ "futures-util",
+ "mio",
+ "socket2 0.5.6",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "actix-service"
+version = "2.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a"
+dependencies = [
+ "futures-core",
+ "paste",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "actix-tls"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4cce60a2f2b477bc72e5cde0af1812a6e82d8fd85b5570a5dcf2a5bf2c5be5f"
+dependencies = [
+ "actix-rt",
+ "actix-service",
+ "actix-utils",
+ "futures-core",
+ "http 0.2.12",
+ "http 1.1.0",
+ "impl-more",
+ "openssl",
+ "pin-project-lite",
+ "tokio",
+ "tokio-openssl",
+ "tokio-util 0.7.10",
+ "tracing",
+]
+
+[[package]]
+name = "actix-utils"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8"
+dependencies = [
+ "local-waker",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "actix-web"
+version = "4.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a6556ddebb638c2358714d853257ed226ece6023ef9364f23f0c70737ea984"
+dependencies = [
+ "actix-codec",
+ "actix-http",
+ "actix-macros",
+ "actix-router",
+ "actix-rt",
+ "actix-server",
+ "actix-service",
+ "actix-utils",
+ "actix-web-codegen",
+ "ahash 0.8.11",
+ "bytes",
+ "bytestring",
+ "cfg-if 1.0.0",
+ "cookie",
+ "derive_more",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "itoa",
+ "language-tags",
+ "log",
+ "mime",
+ "once_cell",
+ "pin-project-lite",
+ "regex",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "smallvec",
+ "socket2 0.5.6",
+ "time",
+ "url",
+]
+
+[[package]]
+name = "actix-web-codegen"
+version = "4.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5"
+dependencies = [
+ "actix-router",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "actix_derive"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[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 = "ahash"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "891477e0c6a8957309ee5c45a6368af3ae14bb510732d2684ffa19af310920f9"
+dependencies = [
+ "getrandom 0.2.12",
+ "once_cell",
+ "version_check",
+]
+
+[[package]]
+name = "ahash"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011"
+dependencies = [
+ "cfg-if 1.0.0",
+ "getrandom 0.2.12",
+ "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 = "alloc-no-stdlib"
+version = "2.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3"
+
+[[package]]
+name = "alloc-stdlib"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece"
+dependencies = [
+ "alloc-no-stdlib",
+]
+
+[[package]]
+name = "allocator-api2"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5"
+
+[[package]]
+name = "android-tzdata"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0"
+
+[[package]]
+name = "android_system_properties"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "anes"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b46cbb362ab8752921c97e041f5e366ee6297bd428a31275b9fcf1e380f7299"
+
+[[package]]
+name = "anstream"
+version = "0.6.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
+dependencies = [
+ "anstyle",
+ "anstyle-parse",
+ "anstyle-query",
+ "anstyle-wincon",
+ "colorchoice",
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+
+[[package]]
+name = "anstyle-parse"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+dependencies = [
+ "utf8parse",
+]
+
+[[package]]
+name = "anstyle-query"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "anstyle-wincon"
+version = "3.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+dependencies = [
+ "anstyle",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "anyhow"
+version = "1.0.80"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1"
+
+[[package]]
+name = "arbitrary"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110"
+dependencies = [
+ "derive_arbitrary",
+]
+
+[[package]]
+name = "arc-swap"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b3d0060af21e8d11a926981cc00c6c1541aa91dd64b9f881985c3da1094425f"
+
+[[package]]
+name = "arrayref"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545"
+
+[[package]]
+name = "arrayvec"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b"
+
+[[package]]
+name = "assert_matches"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b34d609dfbaf33d6889b2b7106d3ca345eacad44200913df5ba02bfd31d2ba9"
+
+[[package]]
+name = "async-recursion"
+version = "1.0.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "async-stream"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cd56dd203fef61ac097dd65721a419ddccb106b2d2b70ba60a6b529f03961a51"
+dependencies = [
+ "async-stream-impl",
+ "futures-core",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "async-stream-impl"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[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.52",
+]
+
+[[package]]
+name = "attohttpc"
+version = "0.19.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "262c3f7f5d61249d8c00e5546e2685cd15ebeeb1bc0f3cc5449350a1cb07319e"
+dependencies = [
+ "http 0.2.12",
+ "log",
+ "native-tls",
+ "openssl",
+ "serde",
+ "serde_json",
+ "url",
+ "wildmatch",
+]
+
+[[package]]
+name = "autocfg"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "awc"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "68c09cc97310b926f01621faee652f3d1b0962545a3cec6c9ac07def9ea36c2c"
+dependencies = [
+ "actix-codec",
+ "actix-http",
+ "actix-rt",
+ "actix-service",
+ "actix-tls",
+ "actix-utils",
+ "base64 0.21.7",
+ "bytes",
+ "cfg-if 1.0.0",
+ "cookie",
+ "derive_more",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http 0.2.12",
+ "itoa",
+ "log",
+ "mime",
+ "openssl",
+ "percent-encoding",
+ "pin-project-lite",
+ "rand 0.8.5",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "tokio",
+]
+
+[[package]]
+name = "aws-creds"
+version = "0.30.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aeeee1a5defa63cba39097a510dfe63ef53658fc8995202a610f6a8a4d03639"
+dependencies = [
+ "attohttpc",
+ "dirs",
+ "rust-ini",
+ "serde",
+ "serde-xml-rs",
+ "thiserror",
+ "time",
+ "url",
+]
+
+[[package]]
+name = "aws-region"
+version = "0.25.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42fed2b9fca70f2908268d057a607f2a906f47edbf856ea8587de9038d264e22"
+dependencies = [
+ "thiserror",
+]
+
+[[package]]
+name = "backtrace"
+version = "0.3.69"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+dependencies = [
+ "addr2line",
+ "cc",
+ "cfg-if 1.0.0",
+ "libc",
+ "miniz_oxide",
+ "object",
+ "rustc-demangle",
+]
+
+[[package]]
+name = "base64"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3441f0f7b02788e948e47f457ca01f1d7e6d92c693bc132c22b087d3141c03ff"
+
+[[package]]
+name = "base64"
+version = "0.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
+
+[[package]]
+name = "base64"
+version = "0.21.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567"
+
+[[package]]
+name = "base64ct"
+version = "1.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b"
+
+[[package]]
+name = "basic-toml"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2db21524cad41c5591204d22d75e1970a2d1f71060214ca931dc7d5afe2c14e5"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bencher"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dfdb4953a096c551ce9ace855a604d702e6e62d77fac690575ae347571717f5"
+
+[[package]]
+name = "bincode"
+version = "1.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bindgen"
+version = "0.65.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfdf7b466f9a4903edc73f95d6d2bcd5baf8ae620638762244d3f60143643cc5"
+dependencies = [
+ "bitflags 1.3.2",
+ "cexpr",
+ "clang-sys",
+ "lazy_static",
+ "lazycell",
+ "peeking_take_while",
+ "prettyplease",
+ "proc-macro2",
+ "quote",
+ "regex",
+ "rustc-hash",
+ "shlex",
+ "syn 2.0.52",
+]
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf"
+
+[[package]]
+name = "bitmaps"
+version = "2.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "031043d04099746d8db04daf1fa424b2bc8bd69d92b25962dcde24da39ab64a2"
+dependencies = [
+ "typenum",
+]
+
+[[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 = "blake2"
+version = "0.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174"
+dependencies = [
+ "crypto-mac",
+ "digest 0.9.0",
+ "opaque-debug",
+]
+
+[[package]]
+name = "blake3"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b64485778c4f16a6a5a9d335e80d449ac6c70cdd6a06d2af18a6f6f775a125b3"
+dependencies = [
+ "arrayref",
+ "arrayvec",
+ "cc",
+ "cfg-if 0.1.10",
+ "constant_time_eq",
+ "crypto-mac",
+ "digest 0.9.0",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4"
+dependencies = [
+ "generic-array 0.14.7",
+]
+
+[[package]]
+name = "block-buffer"
+version = "0.10.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
+dependencies = [
+ "generic-array 0.14.7",
+]
+
+[[package]]
+name = "block_on_proc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b872f3528eeeb4370ee73b51194dc1cd93680c2d0eb6c7a223889038d2c1a167"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "bolero"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "bolero-afl",
+ "bolero-engine",
+ "bolero-generator",
+ "bolero-honggfuzz",
+ "bolero-kani",
+ "bolero-libfuzzer",
+ "cfg-if 1.0.0",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "bolero-afl"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "bolero-engine",
+ "cc",
+]
+
+[[package]]
+name = "bolero-engine"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "anyhow",
+ "backtrace",
+ "bolero-generator",
+ "lazy_static",
+ "pretty-hex",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "bolero-generator"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "arbitrary",
+ "bolero-generator-derive",
+ "either",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "bolero-generator-derive"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "proc-macro-crate 1.3.1",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "bolero-honggfuzz"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "bolero-engine",
+]
+
+[[package]]
+name = "bolero-kani"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "bolero-engine",
+]
+
+[[package]]
+name = "bolero-libfuzzer"
+version = "0.10.0"
+source = "git+https://github.com/Ekleog-NEAR/bolero?rev=56da8e6d1d018519a30b36d85d3a53fe35a42eaf#56da8e6d1d018519a30b36d85d3a53fe35a42eaf"
+dependencies = [
+ "bolero-engine",
+ "cc",
+]
+
+[[package]]
+name = "borsh"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15bf3650200d8bffa99015595e10f1fbd17de07abbc25bb067da79e769939bfa"
+dependencies = [
+ "borsh-derive 0.9.3",
+ "hashbrown 0.11.2",
+]
+
+[[package]]
+name = "borsh"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667"
+dependencies = [
+ "borsh-derive 1.3.1",
+ "cfg_aliases",
+]
+
+[[package]]
+name = "borsh-derive"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6441c552f230375d18e3cc377677914d2ca2b0d36e52129fe15450a2dce46775"
+dependencies = [
+ "borsh-derive-internal",
+ "borsh-schema-derive-internal",
+ "proc-macro-crate 0.1.5",
+ "proc-macro2",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "borsh-derive"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd"
+dependencies = [
+ "once_cell",
+ "proc-macro-crate 3.1.0",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+ "syn_derive",
+]
+
+[[package]]
+name = "borsh-derive-internal"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5449c28a7b352f2d1e592a8a28bf139bc71afb0764a14f3c02500935d8c44065"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "borsh-schema-derive-internal"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdbd5696d8bfa21d53d9fe39a714a18538bad11492a42d066dbbc395fb1951c0"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "brotli"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+ "brotli-decompressor",
+]
+
+[[package]]
+name = "brotli-decompressor"
+version = "2.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f"
+dependencies = [
+ "alloc-no-stdlib",
+ "alloc-stdlib",
+]
+
+[[package]]
+name = "bs58"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "771fe0050b883fcc3ea2359b1a96bcfbc090b7116eae7c3c512c7a083fdf23d3"
+
+[[package]]
+name = "bumpalo"
+version = "3.15.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b"
+
+[[package]]
+name = "bytecheck"
+version = "0.6.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2"
+dependencies = [
+ "bytecheck_derive",
+ "ptr_meta",
+ "simdutf8",
+]
+
+[[package]]
+name = "bytecheck_derive"
+version = "0.6.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "byteorder"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
+
+[[package]]
+name = "bytes"
+version = "1.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+[[package]]
+name = "bytesize"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "bytestring"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "74d80203ea6b29df88012294f62733de21cfeab47f17b41af3a38bc30a03ee72"
+dependencies = [
+ "bytes",
+]
+
+[[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 = "c2-chacha"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d27dae93fe7b1e0424dc57179ac396908c26b035a87234809f5c4dfd1b47dc80"
+dependencies = [
+ "cipher",
+ "ppv-lite86",
+]
+
+[[package]]
+name = "camino"
+version = "1.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c59e92b5a388f549b863a7bea62612c09f24c8393560709a54558a9abdfb3b9c"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo-platform"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "694c8807f2ae16faecc43dc17d74b3eb042482789fd0eb64b39a2e04e087053f"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "cargo_metadata"
+version = "0.14.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4acbb09d9ee8e23699b9634375c72795d095bf268439da88562cf9b501f181fa"
+dependencies = [
+ "camino",
+ "cargo-platform",
+ "semver 1.0.22",
+ "serde",
+ "serde_json",
+]
+
+[[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.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a0ba8f7aaa012f30d5b2861462f6708eccd49c3c39863fe083a308035f63d723"
+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 = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cfg_aliases"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e"
+
+[[package]]
+name = "chainsync-loadtest"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "async-trait",
+ "clap",
+ "dirs",
+ "framework",
+ "futures",
+ "log",
+ "openssl-probe",
+ "parking_lot 0.12.1",
+ "rand 0.8.5",
+ "tokio",
+ "unc-async",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-network",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "chrono"
+version = "0.4.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5bc015644b92d5890fab7489e49d21f879d5c990186827d42ec511919404f38b"
+dependencies = [
+ "android-tzdata",
+ "iana-time-zone",
+ "js-sys",
+ "num-traits",
+ "serde",
+ "wasm-bindgen",
+ "windows-targets 0.52.4",
+]
+
+[[package]]
+name = "ciborium"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42e69ffd6f0917f5c029256a24d0161db17cea3997d185db0d35926308770f0e"
+dependencies = [
+ "ciborium-io",
+ "ciborium-ll",
+ "serde",
+]
+
+[[package]]
+name = "ciborium-io"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05afea1e0a06c9be33d539b876f1ce3692f4afea2cb41f740e7743225ed1c757"
+
+[[package]]
+name = "ciborium-ll"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57663b653d948a338bfb3eeba9bb2fd5fcfaecb9e199e87e1eda4d9e8b240fd9"
+dependencies = [
+ "ciborium-io",
+ "half",
+]
+
+[[package]]
+name = "cipher"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801"
+dependencies = [
+ "generic-array 0.14.7",
+]
+
+[[package]]
+name = "clang-sys"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1"
+dependencies = [
+ "glob",
+ "libc",
+ "libloading",
+]
+
+[[package]]
+name = "clap"
+version = "4.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c918d541ef2913577a0f9566e9ce27cb35b6df072075769e0b26cb5a554520da"
+dependencies = [
+ "clap_builder",
+ "clap_derive",
+]
+
+[[package]]
+name = "clap_builder"
+version = "4.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f3e7391dad68afb0c2ede1bf619f579a3dc9c2ec67f089baa397123a2f3d1eb"
+dependencies = [
+ "anstream",
+ "anstyle",
+ "clap_lex",
+ "strsim 0.11.0",
+]
+
+[[package]]
+name = "clap_derive"
+version = "4.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47"
+dependencies = [
+ "heck 0.4.1",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "clap_lex"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
+
+[[package]]
+name = "cloud-storage"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7602ac4363f68ac757d6b87dd5d850549a14d37489902ae639c06ecec06ad275"
+dependencies = [
+ "async-trait",
+ "base64 0.13.1",
+ "bytes",
+ "chrono",
+ "dotenv",
+ "futures-util",
+ "hex",
+ "jsonwebtoken",
+ "lazy_static",
+ "openssl",
+ "percent-encoding",
+ "reqwest",
+ "serde",
+ "serde_json",
+ "tokio",
+]
+
+[[package]]
+name = "cloudabi"
+version = "0.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f"
+dependencies = [
+ "bitflags 1.3.2",
+]
+
+[[package]]
+name = "cold-store-tool"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "borsh 1.3.1",
+ "clap",
+ "framework",
+ "rand 0.8.5",
+ "strum",
+ "tracing",
+ "unc-chain-configs",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "colorchoice"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+
+[[package]]
+name = "combine"
+version = "4.6.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4"
+dependencies = [
+ "bytes",
+ "memchr",
+]
+
+[[package]]
+name = "console"
+version = "0.15.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb"
+dependencies = [
+ "encode_unicode",
+ "lazy_static",
+ "libc",
+ "unicode-width",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "const-oid"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c2459377285ad874054d797f3ccebf984978aa39129f6eafde5cdc8315b612f8"
+
+[[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 = "cookie"
+version = "0.16.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e859cd57d0710d9e06c381b550c06e76992472a8c6d527aecd2fc673dcc231fb"
+dependencies = [
+ "percent-encoding",
+ "time",
+ "version_check",
+]
+
+[[package]]
+name = "core-foundation"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f"
+
+[[package]]
+name = "cpp_demangle"
+version = "0.3.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eeaa953eaad386a53111e47172c2fedba671e5684c8dd601a5f474f4f118710f"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "cpu-time"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e9e393a7668fe1fad3075085b86c781883000b4ede868f43627b34a87c8b7ded"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "cranelift-bforest"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b5bb9245ec7dcc04d03110e538d31f0969d301c9d673145f4b4d5c3478539a3"
+dependencies = [
+ "cranelift-entity",
+]
+
+[[package]]
+name = "cranelift-codegen"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ebb18d10e5ddac43ba4ca8fd4e310938569c3e484cc01b6372b27dc5bb4dfd28"
+dependencies = [
+ "bumpalo",
+ "cranelift-bforest",
+ "cranelift-codegen-meta",
+ "cranelift-codegen-shared",
+ "cranelift-control",
+ "cranelift-entity",
+ "cranelift-isle",
+ "gimli",
+ "hashbrown 0.14.3",
+ "log",
+ "regalloc2",
+ "smallvec",
+ "target-lexicon 0.12.14",
+]
+
+[[package]]
+name = "cranelift-codegen-meta"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a3ce6d22982c1b9b6b012654258bab1a13947bb12703518bef06b1a4867c3d6"
+dependencies = [
+ "cranelift-codegen-shared",
+]
+
+[[package]]
+name = "cranelift-codegen-shared"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "47220fd4f9a0ce23541652b6f16f83868d282602c600d14934b2a4c166b4bd80"
+
+[[package]]
+name = "cranelift-control"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed5a4c42672aea9b6e820046b52e47a1c05d3394a6cdf4cb3c3c4b702f954bd2"
+dependencies = [
+ "arbitrary",
+]
+
+[[package]]
+name = "cranelift-entity"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b4e9a3296fc827f9d35135dc2c0c8dd8d8359eb1ef904bae2d55d5bcb0c9f94"
+dependencies = [
+ "serde",
+ "serde_derive",
+]
+
+[[package]]
+name = "cranelift-frontend"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ec537d0f0b8e084517f3e7bfa1d89af343d7c7df455573fca9f272d4e01267"
+dependencies = [
+ "cranelift-codegen",
+ "log",
+ "smallvec",
+ "target-lexicon 0.12.14",
+]
+
+[[package]]
+name = "cranelift-isle"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45bab6d69919d210a50331d35cc6ce111567bc040aebac63a8ae130d0400a075"
+
+[[package]]
+name = "cranelift-native"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f32e81605f352cf37af5463f11cd7deec7b6572741931a8d372f7fdd4a744f5d"
+dependencies = [
+ "cranelift-codegen",
+ "libc",
+ "target-lexicon 0.12.14",
+]
+
+[[package]]
+name = "cranelift-wasm"
+version = "0.101.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0edaa4cbec1bc787395c074233df2652dd62f3e29d3ee60329514a0a51e6b045"
+dependencies = [
+ "cranelift-codegen",
+ "cranelift-entity",
+ "cranelift-frontend",
+ "itertools",
+ "log",
+ "smallvec",
+ "wasmparser 0.115.0",
+ "wasmtime-types",
+]
+
+[[package]]
+name = "crc"
+version = "3.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe"
+dependencies = [
+ "crc-catalog",
+]
+
+[[package]]
+name = "crc-catalog"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19d374276b40fb8bbdee95aef7c7fa6b5316ec764510eb64b8dd0e2ed0d7e7f5"
+
+[[package]]
+name = "crc32fast"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "criterion"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f"
+dependencies = [
+ "anes",
+ "cast",
+ "ciborium",
+ "clap",
+ "criterion-plot",
+ "is-terminal",
+ "itertools",
+ "num-traits",
+ "once_cell",
+ "oorandom",
+ "regex",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "tinytemplate",
+ "walkdir",
+]
+
+[[package]]
+name = "criterion-plot"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
+dependencies = [
+ "cast",
+ "itertools",
+]
+
+[[package]]
+name = "crossbeam"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-epoch",
+ "crossbeam-queue",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[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-queue"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35"
+dependencies = [
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345"
+
+[[package]]
+name = "crossterm"
+version = "0.25.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67"
+dependencies = [
+ "bitflags 1.3.2",
+ "crossterm_winapi",
+ "libc",
+ "mio",
+ "parking_lot 0.12.1",
+ "signal-hook",
+ "signal-hook-mio",
+ "winapi",
+]
+
+[[package]]
+name = "crossterm_winapi"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "crunchy"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
+
+[[package]]
+name = "crypto-common"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
+dependencies = [
+ "generic-array 0.14.7",
+ "typenum",
+]
+
+[[package]]
+name = "crypto-mac"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab"
+dependencies = [
+ "generic-array 0.14.7",
+ "subtle",
+]
+
+[[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 = "curve25519-dalek"
+version = "4.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a677b8922c94e01bdbb12126b0bc852f00447528dee1782229af9c720c3f348"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "curve25519-dalek-derive",
+ "digest 0.10.7",
+ "fiat-crypto",
+ "platforms",
+ "rand_core 0.6.4",
+ "rustc_version 0.4.0",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "curve25519-dalek-derive"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "darling"
+version = "0.20.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391"
+dependencies = [
+ "darling_core",
+ "darling_macro",
+]
+
+[[package]]
+name = "darling_core"
+version = "0.20.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "strsim 0.10.0",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.20.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f"
+dependencies = [
+ "darling_core",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "debugid"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef552e6f588e446098f6ba40d89ac146c8c7b64aade83c051ee00bb5d2bc18d"
+dependencies = [
+ "uuid",
+]
+
+[[package]]
+name = "der"
+version = "0.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c"
+dependencies = [
+ "const-oid",
+ "pem-rfc7468",
+ "zeroize",
+]
+
+[[package]]
+name = "deranged"
+version = "0.3.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4"
+dependencies = [
+ "powerfmt",
+ "serde",
+]
+
+[[package]]
+name = "derive-enum-from-into"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "adc2a1b7c0031fb651e9bc1fa4255da82747c187b9ac1dc36b3783d71fadd9d5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "derive_arbitrary"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "67e77553c4162a157adbf834ebae5b415acbecbeafc7a74b0e886657506a7611"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "derive_more"
+version = "0.99.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
+dependencies = [
+ "convert_case",
+ "proc-macro2",
+ "quote",
+ "rustc_version 0.4.0",
+ "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 = "digest"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5"
+dependencies = [
+ "generic-array 0.12.4",
+]
+
+[[package]]
+name = "digest"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066"
+dependencies = [
+ "generic-array 0.14.7",
+]
+
+[[package]]
+name = "digest"
+version = "0.10.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
+dependencies = [
+ "block-buffer 0.10.4",
+ "const-oid",
+ "crypto-common",
+ "subtle",
+]
+
+[[package]]
+name = "dirs"
+version = "4.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059"
+dependencies = [
+ "dirs-sys",
+]
+
+[[package]]
+name = "dirs-sys"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6"
+dependencies = [
+ "libc",
+ "redox_users",
+ "winapi",
+]
+
+[[package]]
+name = "dissimilar"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "86e3bdc80eee6e16b2b6b0f87fbc98c04bee3455e35174c0de1a125d0688c632"
+
+[[package]]
+name = "dlv-list"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0688c2a7f92e427f44895cd63841bff7b29f8d7a1648b9e7e07a4a365b2e1257"
+
+[[package]]
+name = "dotenv"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f"
+
+[[package]]
+name = "dynasm"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "add9a102807b524ec050363f09e06f1504214b0e1c7797f64261c891022dce8b"
+dependencies = [
+ "bitflags 1.3.2",
+ "byteorder",
+ "lazy_static",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "dynasm"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33dc03612f42465a8ed7f5e354bc2b79ba54cedefa81d5bd3a064f1835adaba8"
+dependencies = [
+ "bitflags 1.3.2",
+ "byteorder",
+ "lazy_static",
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "dynasmrt"
+version = "1.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "64fba5a42bd76a17cad4bfa00de168ee1cbfa06a5e8ce992ae880218c05641a9"
+dependencies = [
+ "byteorder",
+ "dynasm 1.2.3",
+ "memmap2",
+]
+
+[[package]]
+name = "dynasmrt"
+version = "2.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f7dccc31a678058996aef614f6bd418ced384da70f284e83e2b7bf29b27b6a28"
+dependencies = [
+ "byteorder",
+ "dynasm 2.0.0",
+ "fnv",
+ "memmap2",
+]
+
+[[package]]
+name = "easy-ext"
+version = "0.2.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "53aff6fdc1b181225acdcb5b14c47106726fd8e486707315b1b138baed68ee31"
+
+[[package]]
+name = "ed25519"
+version = "2.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "115531babc129696a58c64a4fef0a8bf9e9698629fb97e9e40767d235cfbcd53"
+dependencies = [
+ "signature",
+]
+
+[[package]]
+name = "ed25519-dalek"
+version = "2.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4a3daa8e81a3963a60642bcc1f90a670680bd4a77535faa384e9d1c79d620871"
+dependencies = [
+ "curve25519-dalek",
+ "ed25519",
+ "rand_core 0.6.4",
+ "sha2 0.10.8",
+ "subtle",
+]
+
+[[package]]
+name = "either"
+version = "1.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a"
+
+[[package]]
+name = "elastic-array"
+version = "0.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0d63720ea2bc2e1b79f7aa044d9dc0b825f9ccb6930b32120f8fb9e873aa84bc"
+dependencies = [
+ "heapsize",
+]
+
+[[package]]
+name = "encode_unicode"
+version = "0.3.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f"
+
+[[package]]
+name = "encoding_rs"
+version = "0.8.33"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "enum-map"
+version = "2.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9"
+dependencies = [
+ "enum-map-derive",
+]
+
+[[package]]
+name = "enum-map-derive"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "enumset"
+version = "1.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "226c0da7462c13fb57e5cc9e0dc8f0635e7d27f276a3a7fd30054647f669007d"
+dependencies = [
+ "enumset_derive",
+]
+
+[[package]]
+name = "enumset_derive"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e08b6c6ab82d70f08844964ba10c7babb716de2ecaeab9be5717918a5177d3af"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "equivalent"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
+
+[[package]]
+name = "errno"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
+dependencies = [
+ "errno-dragonfly",
+ "libc",
+ "winapi",
+]
+
+[[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 = "errno-dragonfly"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "estimator-warehouse"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "chrono",
+ "clap",
+ "insta",
+ "nix 0.24.3",
+ "reqwest",
+ "rusqlite",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "xshell",
+]
+
+[[package]]
+name = "expect-test"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30d9eafeadd538e68fb28016364c9732d78e420b9ff8853fa5e4058861e9f8d3"
+dependencies = [
+ "dissimilar",
+ "once_cell",
+]
+
+[[package]]
+name = "fallible-iterator"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4443176a9f2c162692bd3d352d745ef9413eec5782a80d8fd6f8a1ac692a07f7"
+
+[[package]]
+name = "fallible-iterator"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2acce4a10f12dc2fb14a218589d4f1f62ef011b2d0cc4b3cb1bba8e94da14649"
+
+[[package]]
+name = "fallible-streaming-iterator"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7360491ce676a36bf9bb3c56c1aa791658183a54d2744120f27285738d90465a"
+
+[[package]]
+name = "fastrand"
+version = "2.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5"
+
+[[package]]
+name = "fiat-crypto"
+version = "0.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1676f435fc1dadde4d03e43f5d62b259e1ce5f40bd4ffb21db2b42ebe59c1382"
+
+[[package]]
+name = "finite-wasm"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d81b511929c2669eaf64e36471cf27c2508133e62ade9d49e608e8d675e7854"
+dependencies = [
+ "bitvec",
+ "dissimilar",
+ "num-traits",
+ "prefix-sum-vec",
+ "thiserror",
+ "wasm-encoder 0.27.0",
+ "wasmparser 0.105.0",
+ "wasmprinter",
+]
+
+[[package]]
+name = "fixed-hash"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c"
+dependencies = [
+ "static_assertions",
+]
+
+[[package]]
+name = "fixedbitset"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
+
+[[package]]
+name = "flagset"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cdeb3aa5e95cf9aabc17f060cfa0ced7b83f042390760ca53bf09df9968acaa1"
+
+[[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 = "foreign-types"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1"
+dependencies = [
+ "foreign-types-shared",
+]
+
+[[package]]
+name = "foreign-types-shared"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
+
+[[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 = "framework"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-rt",
+ "actix-web",
+ "anyhow",
+ "awc",
+ "bencher",
+ "borsh 1.3.1",
+ "chrono",
+ "cloud-storage",
+ "dirs",
+ "easy-ext",
+ "futures",
+ "hex",
+ "hyper",
+ "hyper-tls",
+ "indicatif",
+ "node-runtime",
+ "num-rational",
+ "once_cell",
+ "primitive-types",
+ "rand 0.8.5",
+ "rayon",
+ "regex",
+ "reqwest",
+ "rlimit",
+ "rust-s3",
+ "serde",
+ "serde_ignored",
+ "serde_json",
+ "smart-default",
+ "strum",
+ "tempfile",
+ "testlib",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "unc-actix-test-utils",
+ "unc-async",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chunks",
+ "unc-client",
+ "unc-client-primitives",
+ "unc-config-utils",
+ "unc-crypto",
+ "unc-dyn-configs",
+ "unc-epoch-manager",
+ "unc-jsonrpc",
+ "unc-jsonrpc-primitives",
+ "unc-mainnet-res",
+ "unc-network",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-performance-metrics",
+ "unc-pool",
+ "unc-primitives",
+ "unc-store",
+ "unc-telemetry",
+ "unc-vm-runner",
+ "xz2",
+]
+
+[[package]]
+name = "fs2"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[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.52",
+]
+
+[[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-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 = "fxhash"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c"
+dependencies = [
+ "byteorder",
+]
+
+[[package]]
+name = "fxprof-processed-profile"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "27d12c0aed7f1e24276a241aadc4cb8ea9f83000f34bc062b7cc2d51e3b0fabd"
+dependencies = [
+ "bitflags 2.4.2",
+ "debugid",
+ "fxhash",
+ "serde",
+ "serde_json",
+]
+
+[[package]]
+name = "generic-array"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"
+dependencies = [
+ "typenum",
+]
+
+[[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 = "genesis-csv-to-json"
+version = "0.1.0"
+dependencies = [
+ "chrono",
+ "clap",
+ "csv",
+ "framework",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-network",
+ "unc-primitives",
+]
+
+[[package]]
+name = "genesis-populate"
+version = "0.1.0"
+dependencies = [
+ "borsh 1.3.1",
+ "clap",
+ "framework",
+ "indicatif",
+ "tempfile",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+ "unc-test-contracts",
+ "unc-vm-runner",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.1.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.9.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "getrandom"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+]
+
+[[package]]
+name = "gimli"
+version = "0.28.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+dependencies = [
+ "fallible-iterator 0.3.0",
+ "indexmap 2.2.5",
+ "stable_deref_trait",
+]
+
+[[package]]
+name = "glob"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b"
+
+[[package]]
+name = "h2"
+version = "0.3.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9"
+dependencies = [
+ "bytes",
+ "fnv",
+ "futures-core",
+ "futures-sink",
+ "futures-util",
+ "http 0.2.12",
+ "indexmap 2.2.5",
+ "slab",
+ "tokio",
+ "tokio-util 0.7.10",
+ "tracing",
+]
+
+[[package]]
+name = "half"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e"
+dependencies = [
+ "cfg-if 1.0.0",
+ "crunchy",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
+dependencies = [
+ "ahash 0.7.8",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+dependencies = [
+ "ahash 0.7.8",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.13.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e"
+dependencies = [
+ "ahash 0.8.11",
+]
+
+[[package]]
+name = "hashbrown"
+version = "0.14.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+dependencies = [
+ "ahash 0.8.11",
+ "allocator-api2",
+]
+
+[[package]]
+name = "hashlink"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7"
+dependencies = [
+ "hashbrown 0.14.3",
+]
+
+[[package]]
+name = "heapsize"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1679e6ea370dee694f91f1dc469bf94cf8f52051d147aec3e1f9497c6fc22461"
+dependencies = [
+ "winapi",
+]
+
+[[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.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "hex-literal"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d70693199b3cf4552f3fa720b54163927a3ebed2aef240efaf556033ab336a11"
+dependencies = [
+ "hex-literal-impl",
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "hex-literal-impl"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59448fc2f82a5fb6907f78c3d69d843e82ff5b051923313cc4438cb0c7b745a8"
+dependencies = [
+ "proc-macro-hack",
+]
+
+[[package]]
+name = "hkdf"
+version = "0.12.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7"
+dependencies = [
+ "hmac",
+]
+
+[[package]]
+name = "hmac"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
+dependencies = [
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "home"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "http"
+version = "0.2.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258"
+dependencies = [
+ "bytes",
+ "fnv",
+ "itoa",
+]
+
+[[package]]
+name = "http-body"
+version = "0.4.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2"
+dependencies = [
+ "bytes",
+ "http 0.2.12",
+ "pin-project-lite",
+]
+
+[[package]]
+name = "httparse"
+version = "1.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
+
+[[package]]
+name = "httpdate"
+version = "1.0.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9"
+
+[[package]]
+name = "hyper"
+version = "0.14.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80"
+dependencies = [
+ "bytes",
+ "futures-channel",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http 0.2.12",
+ "http-body",
+ "httparse",
+ "httpdate",
+ "itoa",
+ "pin-project-lite",
+ "socket2 0.5.6",
+ "tokio",
+ "tower-service",
+ "tracing",
+ "want",
+]
+
+[[package]]
+name = "hyper-timeout"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1"
+dependencies = [
+ "hyper",
+ "pin-project-lite",
+ "tokio",
+ "tokio-io-timeout",
+]
+
+[[package]]
+name = "hyper-tls"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905"
+dependencies = [
+ "bytes",
+ "hyper",
+ "native-tls",
+ "tokio",
+ "tokio-native-tls",
+]
+
+[[package]]
+name = "iana-time-zone"
+version = "0.1.60"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141"
+dependencies = [
+ "android_system_properties",
+ "core-foundation-sys",
+ "iana-time-zone-haiku",
+ "js-sys",
+ "wasm-bindgen",
+ "windows-core",
+]
+
+[[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f"
+dependencies = [
+ "cc",
+]
+
+[[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.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
+dependencies = [
+ "unicode-bidi",
+ "unicode-normalization",
+]
+
+[[package]]
+name = "im"
+version = "15.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d0acd33ff0285af998aaf9b57342af478078f53492322fafc47450e09397e0e9"
+dependencies = [
+ "bitmaps",
+ "rand_core 0.6.4",
+ "rand_xoshiro",
+ "sized-chunks",
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "impl-more"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d"
+
+[[package]]
+name = "indexer-example"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "clap",
+ "openssl-probe",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "unc-indexer",
+ "unc-o11y",
+]
+
+[[package]]
+name = "indexmap"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
+dependencies = [
+ "autocfg 1.1.0",
+ "hashbrown 0.12.3",
+ "serde",
+]
+
+[[package]]
+name = "indexmap"
+version = "2.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
+dependencies = [
+ "equivalent",
+ "hashbrown 0.14.3",
+ "serde",
+]
+
+[[package]]
+name = "indicatif"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7baab56125e25686df467fe470785512329883aab42696d661247aca2a2896e4"
+dependencies = [
+ "console",
+ "lazy_static",
+ "number_prefix",
+ "rayon",
+ "regex",
+]
+
+[[package]]
+name = "insta"
+version = "1.36.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0a7c22c4d34ef4788c351e971c52bfdfe7ea2766f8c5466bc175dd46e52ac22e"
+dependencies = [
+ "console",
+ "lazy_static",
+ "linked-hash-map",
+ "pest",
+ "pest_derive",
+ "serde",
+ "similar",
+ "yaml-rust",
+]
+
+[[package]]
+name = "instant"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "integration-tests"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-rt",
+ "anyhow",
+ "assert_matches",
+ "borsh 1.3.1",
+ "chrono",
+ "clap",
+ "framework",
+ "futures",
+ "hex",
+ "insta",
+ "itertools",
+ "node-runtime",
+ "once_cell",
+ "parking_lot 0.12.1",
+ "primitive-types",
+ "rand 0.8.5",
+ "rlp",
+ "serde",
+ "serde_json",
+ "smart-default",
+ "strum",
+ "tempfile",
+ "testlib",
+ "tokio",
+ "tracing",
+ "unc-actix-test-utils",
+ "unc-async",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chunks",
+ "unc-client",
+ "unc-client-primitives",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-fmt",
+ "unc-jsonrpc",
+ "unc-jsonrpc-client",
+ "unc-jsonrpc-primitives",
+ "unc-network",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-performance-metrics",
+ "unc-primitives",
+ "unc-primitives-core",
+ "unc-stdx",
+ "unc-store",
+ "unc-telemetry",
+ "unc-test-contracts",
+ "unc-undo-block",
+ "unc-vm-runner",
+ "unc-wallet-contract",
+ "wat",
+]
+
+[[package]]
+name = "io-lifetimes"
+version = "1.0.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "ipnet"
+version = "2.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3"
+
+[[package]]
+name = "is-terminal"
+version = "0.4.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b"
+dependencies = [
+ "hermit-abi",
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "itertools"
+version = "0.10.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
+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.28"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6"
+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 = "json_comments"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9dbbfed4e59ba9750e15ba154fdfd9329cee16ff3df539c2666b70f58cc32105"
+
+[[package]]
+name = "jsonwebtoken"
+version = "7.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afabcc15e437a6484fc4f12d0fd63068fe457bf93f1c148d3d9649c60b103f32"
+dependencies = [
+ "base64 0.12.3",
+ "pem",
+ "ring",
+ "serde",
+ "serde_json",
+ "simple_asn1 0.4.1",
+]
+
+[[package]]
+name = "keccak"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ecc2af9a1119c51f12a14607e783cb977bde58bc069ff0c3da1095e635d70654"
+dependencies = [
+ "cpufeatures",
+]
+
+[[package]]
+name = "keypair-generator"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "framework",
+ "unc-crypto",
+]
+
+[[package]]
+name = "language-tags"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4345964bb142484797b161f473a503a434de77149dd8c7427788c6e13379388"
+
+[[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 = "leb128"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "884e2677b40cc8c339eaefcb701c32ef1fd2493d71118dc0ca4b6a736c93bd67"
+
+[[package]]
+name = "libc"
+version = "0.2.153"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+
+[[package]]
+name = "libfuzzer-sys"
+version = "0.4.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7"
+dependencies = [
+ "arbitrary",
+ "cc",
+ "once_cell",
+]
+
+[[package]]
+name = "libloading"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2caa5afb8bf9f3a2652760ce7d4f62d21c4d5a423e68466fca30df82f2330164"
+dependencies = [
+ "cfg-if 1.0.0",
+ "windows-targets 0.52.4",
+]
+
+[[package]]
+name = "libm"
+version = "0.2.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058"
+
+[[package]]
+name = "libredox"
+version = "0.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8"
+dependencies = [
+ "bitflags 2.4.2",
+ "libc",
+ "redox_syscall 0.4.1",
+]
+
+[[package]]
+name = "librocksdb-sys"
+version = "0.11.0+8.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3386f101bcb4bd252d8e9d2fb41ec3b0862a15a62b478c355b2982efa469e3e"
+dependencies = [
+ "bindgen",
+ "bzip2-sys",
+ "cc",
+ "glob",
+ "libc",
+ "libz-sys",
+ "lz4-sys",
+ "tikv-jemalloc-sys",
+ "zstd-sys",
+]
+
+[[package]]
+name = "libsqlite3-sys"
+version = "0.26.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "afc22eff61b133b115c6e8c74e818c628d6d5e7a502afea6f64dee076dd94326"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "libz-sys"
+version = "1.1.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "037731f5d3aaa87a5675e895b63ddff1a87624bc29f77004ea829809654e48f6"
+dependencies = [
+ "cc",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "linked-hash-map"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.3.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
+
+[[package]]
+name = "linux-raw-sys"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
+
+[[package]]
+name = "local-channel"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6cbc85e69b8df4b8bb8b89ec634e7189099cea8927a276b7384ce5488e53ec8"
+dependencies = [
+ "futures-core",
+ "futures-sink",
+ "local-waker",
+]
+
+[[package]]
+name = "local-waker"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487"
+
+[[package]]
+name = "lock_api"
+version = "0.3.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c4da24a77a3d8a6d4862d95f72e6fdb9c09a643ecdb402d754004a557f2bec75"
+dependencies = [
+ "scopeguard",
+]
+
+[[package]]
+name = "lock_api"
+version = "0.4.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+dependencies = [
+ "autocfg 1.1.0",
+ "scopeguard",
+]
+
+[[package]]
+name = "log"
+version = "0.4.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c"
+
+[[package]]
+name = "loupe"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b6a72dfa44fe15b5e76b94307eeb2ff995a8c5b283b55008940c02e0c5b634d"
+dependencies = [
+ "loupe-derive",
+ "rustversion",
+]
+
+[[package]]
+name = "loupe-derive"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0fbfc88337168279f2e9ae06e157cfed4efd3316e14dc96ed074d4f2e6c5952"
+dependencies = [
+ "quote",
+ "syn 1.0.109",
+]
+
+[[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 = "lz4-sys"
+version = "1.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57d27b317e207b10f69f5e75494119e391a96f48861ae870d1da6edac98ca900"
+dependencies = [
+ "cc",
+ "libc",
+]
+
+[[package]]
+name = "lzma-sys"
+version = "0.1.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5fda04ab3764e6cde78b9974eec4f779acaba7c4e84b36eca3cf77c581b85d27"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "mach"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b823e83b2affd8f40a9ee8c29dbc56404c1e34cd2710921f2801e2cf29527afa"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "matchers"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558"
+dependencies = [
+ "regex-automata 0.1.10",
+]
+
+[[package]]
+name = "maybe-async"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cf92c10c7e361d6b99666ec1c6f9805b0bea2c3bd8c78dc6fe98ac5bd78db11"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "md-5"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf"
+dependencies = [
+ "cfg-if 1.0.0",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "md5"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "490cc448043f947bae3cbee9c203358d62dbee0db12107a74be5c30ccfd09771"
+
+[[package]]
+name = "memchr"
+version = "2.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+
+[[package]]
+name = "memfd"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2cffa4ad52c6f791f4f8b15f0c05f9824b2ced1160e88cc393d64fff9a8ac64"
+dependencies = [
+ "rustix 0.38.31",
+]
+
+[[package]]
+name = "memmap"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "memmap2"
+version = "0.5.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.8.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "memoffset"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "mime"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
+
+[[package]]
+name = "minidom"
+version = "0.15.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f45614075738ce1b77a1768912a60c0227525971b03e09122a05b8a34a2a6278"
+dependencies = [
+ "rxml",
+]
+
+[[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.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+dependencies = [
+ "adler",
+]
+
+[[package]]
+name = "mio"
+version = "0.8.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c"
+dependencies = [
+ "libc",
+ "log",
+ "wasi 0.11.0+wasi-snapshot-preview1",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "mock-node"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-rt",
+ "anyhow",
+ "clap",
+ "framework",
+ "futures",
+ "pin-project",
+ "rand 0.8.5",
+ "rayon",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "tokio",
+ "tracing",
+ "unc-actix-test-utils",
+ "unc-async",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chunks",
+ "unc-client",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-jsonrpc",
+ "unc-jsonrpc-client",
+ "unc-network",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-primitives",
+ "unc-store",
+ "unc-telemetry",
+]
+
+[[package]]
+name = "more-asserts"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7843ec2de400bcbc6a6328c958dc38e5359da6e93e72e37bc5246bf1ae776389"
+
+[[package]]
+name = "multimap"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a"
+
+[[package]]
+name = "native-tls"
+version = "0.2.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
+dependencies = [
+ "lazy_static",
+ "libc",
+ "log",
+ "openssl",
+ "openssl-probe",
+ "openssl-sys",
+ "schannel",
+ "security-framework",
+ "security-framework-sys",
+ "tempfile",
+]
+
+[[package]]
+name = "nix"
+version = "0.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b2e0b4f3320ed72aaedb9a5ac838690a8047c7b275da22711fddff4f8a14229"
+dependencies = [
+ "bitflags 1.3.2",
+ "cc",
+ "cfg-if 0.1.10",
+ "libc",
+ "void",
+]
+
+[[package]]
+name = "nix"
+version = "0.24.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fa52e972a9a719cecb6864fb88568781eb706bac2cd1d4f04a648542dbf78069"
+dependencies = [
+ "bitflags 1.3.2",
+ "cfg-if 1.0.0",
+ "libc",
+ "memoffset 0.6.5",
+]
+
+[[package]]
+name = "node-runtime"
+version = "0.1.0"
+dependencies = [
+ "assert_matches",
+ "borsh 1.3.1",
+ "enum-map",
+ "hex",
+ "indicatif",
+ "num-bigint 0.3.3",
+ "num-rational",
+ "num-traits",
+ "once_cell",
+ "rand 0.8.5",
+ "rayon",
+ "serde",
+ "serde_json",
+ "sha2 0.10.8",
+ "tempfile",
+ "testlib",
+ "thiserror",
+ "tracing",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-primitives-core",
+ "unc-store",
+ "unc-test-contracts",
+ "unc-vm-runner",
+ "unc-wallet-contract",
+]
+
+[[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 = "ntapi"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
+dependencies = [
+ "winapi",
+]
+
+[[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.2.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-bigint-dig"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d51546d704f52ef14b3c962b5776e53d5b862e5790e40a350d366c209bd7f7a"
+dependencies = [
+ "autocfg 0.1.8",
+ "byteorder",
+ "lazy_static",
+ "libm",
+ "num-integer",
+ "num-iter",
+ "num-traits",
+ "rand 0.7.3",
+ "serde",
+ "smallvec",
+ "zeroize",
+]
+
+[[package]]
+name = "num-bigint-dig"
+version = "0.8.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151"
+dependencies = [
+ "byteorder",
+ "lazy_static",
+ "libm",
+ "num-integer",
+ "num-iter",
+ "num-traits",
+ "rand 0.8.5",
+ "smallvec",
+ "zeroize",
+]
+
+[[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",
+]
+
+[[package]]
+name = "num-iter"
+version = "0.1.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d869c01cc0c455284163fd0092f1f93835385ccab5a98a0dcc497b2f8bf055a9"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-integer",
+ "num-traits",
+]
+
+[[package]]
+name = "num-rational"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07"
+dependencies = [
+ "autocfg 1.1.0",
+ "num-bigint 0.3.3",
+ "num-integer",
+ "num-traits",
+ "serde",
+]
+
+[[package]]
+name = "num-traits"
+version = "0.2.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a"
+dependencies = [
+ "autocfg 1.1.0",
+ "libm",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.16.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "number_prefix"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a"
+
+[[package]]
+name = "object"
+version = "0.32.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+dependencies = [
+ "crc32fast",
+ "hashbrown 0.14.3",
+ "indexmap 2.2.5",
+ "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 = "opaque-debug"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381"
+
+[[package]]
+name = "openssl"
+version = "0.10.64"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "95a0481286a310808298130d22dd1fef0fa571e05a8f44ec801801e84b216b1f"
+dependencies = [
+ "bitflags 2.4.2",
+ "cfg-if 1.0.0",
+ "foreign-types",
+ "libc",
+ "once_cell",
+ "openssl-macros",
+ "openssl-sys",
+]
+
+[[package]]
+name = "openssl-macros"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "openssl-probe"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf"
+
+[[package]]
+name = "openssl-src"
+version = "300.2.3+3.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cff92b6f71555b61bb9315f7c64da3ca43d87531622120fea0195fc761b4843"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "openssl-sys"
+version = "0.9.101"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dda2b0f344e78efc2facf7d195d098df0dd72151b26ab98da807afc26c198dff"
+dependencies = [
+ "cc",
+ "libc",
+ "openssl-src",
+ "pkg-config",
+ "vcpkg",
+]
+
+[[package]]
+name = "opentelemetry"
+version = "0.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6105e89802af13fdf48c49d7646d3b533a70e536d818aae7e78ba0433d01acb8"
+dependencies = [
+ "async-trait",
+ "crossbeam-channel",
+ "futures-channel",
+ "futures-executor",
+ "futures-util",
+ "js-sys",
+ "lazy_static",
+ "percent-encoding",
+ "pin-project",
+ "rand 0.8.5",
+ "thiserror",
+ "tokio",
+ "tokio-stream",
+]
+
+[[package]]
+name = "opentelemetry-otlp"
+version = "0.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9d1a6ca9de4c8b00aa7f1a153bd76cb263287155cec642680d79d98706f3d28a"
+dependencies = [
+ "async-trait",
+ "futures",
+ "futures-util",
+ "http 0.2.12",
+ "opentelemetry",
+ "prost",
+ "thiserror",
+ "tokio",
+ "tonic",
+ "tonic-build",
+]
+
+[[package]]
+name = "opentelemetry-semantic-conventions"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "985cc35d832d412224b2cffe2f9194b1b89b6aa5d0bef76d080dce09d90e62bd"
+dependencies = [
+ "opentelemetry",
+]
+
+[[package]]
+name = "ordered-multimap"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ccd746e37177e1711c20dd619a1620f34f5c8b569c53590a72dedd5344d8924a"
+dependencies = [
+ "dlv-list",
+ "hashbrown 0.12.3",
+]
+
+[[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.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "eebde548fbbf1ea81a99b128872779c437752fb99f217c45245e1a61dcd9edcd"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "parity-wasm"
+version = "0.41.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ddfc878dac00da22f8f61e7af3157988424567ab01d9920b962ef7dcbd7cd865"
+
+[[package]]
+name = "parity-wasm"
+version = "0.42.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "be5e13c266502aadf83426d87d81a0f5d1ef45b8027f5a471c360abfe4bfae92"
+
+[[package]]
+name = "parking_lot"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3a704eb390aafdc107b0e392f56a82b668e3a71366993b5340f5833fd62505e"
+dependencies = [
+ "lock_api 0.3.4",
+ "parking_lot_core 0.7.3",
+]
+
+[[package]]
+name = "parking_lot"
+version = "0.11.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7d17b78036a60663b797adeaee46f5c9dfebb86948d1255007a1d6be0271ff99"
+dependencies = [
+ "instant",
+ "lock_api 0.4.11",
+ "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 0.4.11",
+ "parking_lot_core 0.9.9",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b93f386bb233083c799e6e642a9d73db98c24a5deeb95ffc85bf281255dffc98"
+dependencies = [
+ "cfg-if 0.1.10",
+ "cloudabi",
+ "libc",
+ "redox_syscall 0.1.57",
+ "smallvec",
+ "winapi",
+]
+
+[[package]]
+name = "parking_lot_core"
+version = "0.8.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "60a2cfe6f0ad2bfc16aefa463b497d5c7a5ecd44a23efa72aa342d90177356dc"
+dependencies = [
+ "cfg-if 1.0.0",
+ "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 1.0.0",
+ "libc",
+ "redox_syscall 0.4.1",
+ "smallvec",
+ "windows-targets 0.48.5",
+]
+
+[[package]]
+name = "paste"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+
+[[package]]
+name = "peeking_take_while"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099"
+
+[[package]]
+name = "pem"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd56cbd21fea48d0c440b41cd69c589faacade08c992d9a54e471b79d0fd13eb"
+dependencies = [
+ "base64 0.13.1",
+ "once_cell",
+ "regex",
+]
+
+[[package]]
+name = "pem-rfc7468"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412"
+dependencies = [
+ "base64ct",
+]
+
+[[package]]
+name = "percent-encoding"
+version = "2.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
+
+[[package]]
+name = "pest"
+version = "2.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56f8023d0fb78c8e03784ea1c7f3fa36e68a723138990b8d5a47d916b651e7a8"
+dependencies = [
+ "memchr",
+ "thiserror",
+ "ucd-trie",
+]
+
+[[package]]
+name = "pest_derive"
+version = "2.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b0d24f72393fd16ab6ac5738bc33cdb6a9aa73f8b902e8fe29cf4e67d7dd1026"
+dependencies = [
+ "pest",
+ "pest_generator",
+]
+
+[[package]]
+name = "pest_generator"
+version = "2.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fdc17e2a6c7d0a492f0158d7a4bd66cc17280308bbaff78d5bef566dca35ab80"
+dependencies = [
+ "pest",
+ "pest_meta",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "pest_meta"
+version = "2.7.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "934cd7631c050f4674352a6e835d5f6711ffbfb9345c2fc0107155ac495ae293"
+dependencies = [
+ "once_cell",
+ "pest",
+ "sha2 0.10.8",
+]
+
+[[package]]
+name = "petgraph"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9"
+dependencies = [
+ "fixedbitset",
+ "indexmap 2.2.5",
+]
+
+[[package]]
+name = "pin-project"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0"
+dependencies = [
+ "pin-project-internal",
+]
+
+[[package]]
+name = "pin-project-internal"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[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 = "pkcs1"
+version = "0.7.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f"
+dependencies = [
+ "der",
+ "pkcs8",
+ "spki",
+]
+
+[[package]]
+name = "pkcs8"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7"
+dependencies = [
+ "der",
+ "spki",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.30"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec"
+
+[[package]]
+name = "platforms"
+version = "3.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "626dec3cac7cc0e1577a2ec3fc496277ec2baa084bebad95bb6fdbfae235f84c"
+
+[[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 = "prefix-sum-vec"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aa06bd51638b6e76ac9ba9b6afb4164fa647bd2916d722f2623fbb6d1ed8bdba"
+
+[[package]]
+name = "pretty-hex"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6fa0831dd7cc608c38a5e323422a0077678fa5744aa2be4ad91c4ece8eec8d5"
+
+[[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 = "prettyplease"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a41cf62165e97c7f814d2221421dbb9afcbcdb0a88068e5ea206e19951c2cbb5"
+dependencies = [
+ "proc-macro2",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "primitive-types"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05e4722c697a58a99d5d06a08c30821d7c082a4632198de1eaa5a6c22ef42373"
+dependencies = [
+ "fixed-hash",
+ "uint",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785"
+dependencies = [
+ "toml",
+]
+
+[[package]]
+name = "proc-macro-crate"
+version = "1.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919"
+dependencies = [
+ "once_cell",
+ "toml_edit 0.19.15",
+]
+
+[[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.1",
+]
+
+[[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-macro-hack"
+version = "0.5.20+deprecated"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068"
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "prometheus"
+version = "0.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "449811d15fbdf5ceb5c1144416066429cf82316e2ec8ce0c1f6f8a02e7bbcf8c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "fnv",
+ "lazy_static",
+ "memchr",
+ "parking_lot 0.12.1",
+ "protobuf 2.28.0",
+ "thiserror",
+]
+
+[[package]]
+name = "prost"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "444879275cb4fd84958b1a1d5420d15e6fcf7c235fe47f053c9c2a80aceb6001"
+dependencies = [
+ "bytes",
+ "prost-derive",
+]
+
+[[package]]
+name = "prost-build"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62941722fb675d463659e49c4f3fe1fe792ff24fe5bbaa9c08cd3b98a1c354f5"
+dependencies = [
+ "bytes",
+ "heck 0.3.3",
+ "itertools",
+ "lazy_static",
+ "log",
+ "multimap",
+ "petgraph",
+ "prost",
+ "prost-types",
+ "regex",
+ "tempfile",
+ "which",
+]
+
+[[package]]
+name = "prost-derive"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f9cc1a3263e07e0bf68e96268f37665207b49560d98739662cdfaae215c720fe"
+dependencies = [
+ "anyhow",
+ "itertools",
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "prost-types"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "534b7a0e836e3c482d2693070f982e39e7611da9695d4d1f5a4b186b51faef0a"
+dependencies = [
+ "bytes",
+ "prost",
+]
+
+[[package]]
+name = "protobuf"
+version = "2.28.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
+
+[[package]]
+name = "protobuf"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "58678a64de2fced2bdec6bca052a6716a0efe692d6e3f53d1bda6a1def64cfc0"
+dependencies = [
+ "once_cell",
+ "protobuf-support",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf-codegen"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32777b0b3f6538d9d2e012b3fad85c7e4b9244b5958d04a6415f4333782b7a77"
+dependencies = [
+ "anyhow",
+ "once_cell",
+ "protobuf 3.4.0",
+ "protobuf-parse",
+ "regex",
+ "tempfile",
+ "thiserror",
+]
+
+[[package]]
+name = "protobuf-parse"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "96cb37955261126624a25b5e6bda40ae34cf3989d52a783087ca6091b29b5642"
+dependencies = [
+ "anyhow",
+ "indexmap 1.9.3",
+ "log",
+ "protobuf 3.4.0",
+ "protobuf-support",
+ "tempfile",
+ "thiserror",
+ "which",
+]
+
+[[package]]
+name = "protobuf-support"
+version = "3.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e1ed294a835b0f30810e13616b1cd34943c6d1e84a8f3b0dcfe466d256c3e7e7"
+dependencies = [
+ "thiserror",
+]
+
+[[package]]
+name = "psm"
+version = "0.1.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5787f7cda34e3033a72192c018bc5883100330f362ef279a8cbccfce8bb4e874"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "ptr_meta"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1"
+dependencies = [
+ "ptr_meta_derive",
+]
+
+[[package]]
+name = "ptr_meta_derive"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "pwasm-utils"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f7a12f176deee919f4ba55326ee17491c8b707d0987aed822682c821b660192"
+dependencies = [
+ "byteorder",
+ "log",
+ "parity-wasm 0.41.0",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.35"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+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.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03"
+dependencies = [
+ "getrandom 0.1.16",
+ "libc",
+ "rand_chacha 0.2.2",
+ "rand_core 0.5.1",
+ "rand_hc 0.2.0",
+]
+
+[[package]]
+name = "rand"
+version = "0.8.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404"
+dependencies = [
+ "libc",
+ "rand_chacha 0.3.1",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_chacha"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402"
+dependencies = [
+ "ppv-lite86",
+ "rand_core 0.5.1",
+]
+
+[[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 0.6.4",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19"
+dependencies = [
+ "getrandom 0.1.16",
+]
+
+[[package]]
+name = "rand_core"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
+dependencies = [
+ "getrandom 0.2.12",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c"
+dependencies = [
+ "rand_core 0.5.1",
+]
+
+[[package]]
+name = "rand_hc"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b363d4f6370f88d62bf586c80405657bde0f0e1b8945d47d2ad59b906cb4f54"
+dependencies = [
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_xorshift"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f"
+dependencies = [
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rand_xoshiro"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa"
+dependencies = [
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "rayon"
+version = "1.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd"
+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 = "redis"
+version = "0.23.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4f49cdc0bb3f412bf8e7d1bd90fe1d9eb10bc5c399ba90973c14662a27b3f8ba"
+dependencies = [
+ "combine",
+ "itoa",
+ "percent-encoding",
+ "ryu",
+ "sha1_smol",
+ "socket2 0.4.10",
+ "url",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.1.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce"
+
+[[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 0.2.12",
+ "libredox",
+ "thiserror",
+]
+
+[[package]]
+name = "reed-solomon-erasure"
+version = "4.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a415a013dd7c5d4221382329a5a3482566da675737494935cbbbcdec04662f9d"
+dependencies = [
+ "smallvec",
+]
+
+[[package]]
+name = "regalloc2"
+version = "0.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad156d539c879b7a24a363a2016d77961786e71f48f2e2fc8302a92abd2429a6"
+dependencies = [
+ "hashbrown 0.13.2",
+ "log",
+ "rustc-hash",
+ "slice-group-by",
+ "smallvec",
+]
+
+[[package]]
+name = "regex"
+version = "1.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-automata 0.4.6",
+ "regex-syntax 0.8.2",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+dependencies = [
+ "regex-syntax 0.6.29",
+]
+
+[[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.6.29"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
+
+[[package]]
+name = "regex-syntax"
+version = "0.8.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
+
+[[package]]
+name = "region"
+version = "3.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76e189c2369884dce920945e2ddf79b3dff49e071a167dd1817fa9c4c00d512e"
+dependencies = [
+ "bitflags 1.3.2",
+ "libc",
+ "mach",
+ "winapi",
+]
+
+[[package]]
+name = "rend"
+version = "0.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c"
+dependencies = [
+ "bytecheck",
+]
+
+[[package]]
+name = "reqwest"
+version = "0.11.24"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
+dependencies = [
+ "base64 0.21.7",
+ "bytes",
+ "encoding_rs",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http 0.2.12",
+ "http-body",
+ "hyper",
+ "hyper-tls",
+ "ipnet",
+ "js-sys",
+ "log",
+ "mime",
+ "native-tls",
+ "once_cell",
+ "percent-encoding",
+ "pin-project-lite",
+ "rustls-pemfile",
+ "serde",
+ "serde_json",
+ "serde_urlencoded",
+ "sync_wrapper",
+ "system-configuration",
+ "tokio",
+ "tokio-native-tls",
+ "tokio-util 0.7.10",
+ "tower-service",
+ "url",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "wasm-streams",
+ "web-sys",
+ "winreg",
+]
+
+[[package]]
+name = "restaked"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "framework",
+ "integration-tests",
+ "tokio",
+ "unc-crypto",
+ "unc-jsonrpc-client",
+ "unc-o11y",
+ "unc-primitives",
+]
+
+[[package]]
+name = "ring"
+version = "0.16.20"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc"
+dependencies = [
+ "cc",
+ "libc",
+ "once_cell",
+ "spin",
+ "untrusted",
+ "web-sys",
+ "winapi",
+]
+
+[[package]]
+name = "ripemd"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f"
+dependencies = [
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "rkyv"
+version = "0.7.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0"
+dependencies = [
+ "bitvec",
+ "bytecheck",
+ "bytes",
+ "hashbrown 0.12.3",
+ "ptr_meta",
+ "rend",
+ "rkyv_derive",
+ "seahash",
+ "tinyvec",
+ "uuid",
+]
+
+[[package]]
+name = "rkyv_derive"
+version = "0.7.44"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "rlimit"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "347703a5ae47adf1e693144157be231dde38c72bd485925cae7407ad3e52480b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "rlp"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec"
+dependencies = [
+ "bytes",
+ "rustc-hex",
+]
+
+[[package]]
+name = "rocksdb"
+version = "0.21.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb6f170a4041d50a0ce04b0d2e14916d6ca863ea2e422689a5b694395d299ffe"
+dependencies = [
+ "libc",
+ "librocksdb-sys",
+]
+
+[[package]]
+name = "rsa"
+version = "0.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3648b669b10afeab18972c105e284a7b953a669b0be3514c27f9b17acab2f9cd"
+dependencies = [
+ "byteorder",
+ "digest 0.9.0",
+ "lazy_static",
+ "num-bigint-dig 0.6.1",
+ "num-integer",
+ "num-iter",
+ "num-traits",
+ "pem",
+ "rand 0.7.3",
+ "sha2 0.9.9",
+ "simple_asn1 0.4.1",
+ "subtle",
+ "thiserror",
+ "zeroize",
+]
+
+[[package]]
+name = "rsa"
+version = "0.9.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5d0e5124fcb30e76a7e79bfee683a2746db83784b86289f6251b54b7950a0dfc"
+dependencies = [
+ "const-oid",
+ "digest 0.10.7",
+ "num-bigint-dig 0.8.4",
+ "num-integer",
+ "num-traits",
+ "pkcs1",
+ "pkcs8",
+ "rand_core 0.6.4",
+ "sha2 0.10.8",
+ "signature",
+ "spki",
+ "subtle",
+ "zeroize",
+]
+
+[[package]]
+name = "rsa-export"
+version = "0.3.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fce6de48e7cae950d65a62e67da01c1bb44576f0c3ea3e5749088cf0205a7263"
+dependencies = [
+ "num-bigint-dig 0.6.1",
+ "pem",
+ "rsa 0.3.0",
+ "simple_asn1 0.5.4",
+]
+
+[[package]]
+name = "runtime-params-estimator"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "borsh 1.3.1",
+ "bs58",
+ "bytesize",
+ "cfg-if 1.0.0",
+ "chrono",
+ "clap",
+ "enum-map",
+ "framework",
+ "genesis-populate",
+ "hex",
+ "indicatif",
+ "insta",
+ "libc",
+ "node-runtime",
+ "num-rational",
+ "num-traits",
+ "rand 0.8.5",
+ "rand_xorshift",
+ "rocksdb",
+ "serde_json",
+ "tempfile",
+ "tracing",
+ "tracing-span-tree",
+ "tracing-subscriber",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-fmt",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-store",
+ "unc-test-contracts",
+ "unc-vm-runner",
+ "wat",
+]
+
+[[package]]
+name = "runtime-tester"
+version = "0.1.0"
+dependencies = [
+ "bolero",
+ "cpu-time",
+ "framework",
+ "libfuzzer-sys",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "testlib",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-client-primitives",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-store",
+ "unc-test-contracts",
+]
+
+[[package]]
+name = "runtime-tester-fuzz"
+version = "0.1.0"
+dependencies = [
+ "libfuzzer-sys",
+ "runtime-tester",
+ "serde_json",
+]
+
+[[package]]
+name = "rusqlite"
+version = "0.29.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "549b9d036d571d42e6e85d1c1425e2ac83491075078ca9a15be021c56b1641f2"
+dependencies = [
+ "bitflags 2.4.2",
+ "chrono",
+ "fallible-iterator 0.2.0",
+ "fallible-streaming-iterator",
+ "hashlink",
+ "libsqlite3-sys",
+ "smallvec",
+]
+
+[[package]]
+name = "rust-ini"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f6d5f2436026b4f6e79dc829837d467cc7e9a55ee40e750d716713540715a2df"
+dependencies = [
+ "cfg-if 1.0.0",
+ "ordered-multimap",
+]
+
+[[package]]
+name = "rust-s3"
+version = "0.32.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6009d9d4cf910505534d62d380a0aa305805a2af0b5c3ad59a3024a0715b847"
+dependencies = [
+ "async-trait",
+ "aws-creds",
+ "aws-region",
+ "base64 0.13.1",
+ "block_on_proc",
+ "cfg-if 1.0.0",
+ "hex",
+ "hmac",
+ "http 0.2.12",
+ "log",
+ "maybe-async",
+ "md5",
+ "minidom",
+ "percent-encoding",
+ "reqwest",
+ "serde",
+ "serde-xml-rs",
+ "serde_derive",
+ "sha2 0.10.8",
+ "thiserror",
+ "time",
+ "tokio",
+ "tokio-stream",
+ "url",
+]
+
+[[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.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a"
+dependencies = [
+ "semver 0.9.0",
+]
+
+[[package]]
+name = "rustc_version"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366"
+dependencies = [
+ "semver 1.0.22",
+]
+
+[[package]]
+name = "rustix"
+version = "0.37.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
+dependencies = [
+ "bitflags 1.3.2",
+ "errno 0.3.8",
+ "io-lifetimes",
+ "libc",
+ "linux-raw-sys 0.3.8",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "rustix"
+version = "0.38.31"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949"
+dependencies = [
+ "bitflags 2.4.2",
+ "errno 0.3.8",
+ "libc",
+ "linux-raw-sys 0.4.13",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "rustls-pemfile"
+version = "1.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c"
+dependencies = [
+ "base64 0.21.7",
+]
+
+[[package]]
+name = "rustversion"
+version = "1.0.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4"
+
+[[package]]
+name = "rxml"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a98f186c7a2f3abbffb802984b7f1dfd65dac8be1aafdaabbca4137f53f0dff7"
+dependencies = [
+ "bytes",
+ "rxml_validation",
+ "smartstring",
+]
+
+[[package]]
+name = "rxml_validation"
+version = "0.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "22a197350ece202f19a166d1ad6d9d6de145e1d2a8ef47db299abe164dbd7530"
+
+[[package]]
+name = "ryu"
+version = "1.0.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1"
+
+[[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 = "schannel"
+version = "0.1.23"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534"
+dependencies = [
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+[[package]]
+name = "seahash"
+version = "4.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b"
+
+[[package]]
+name = "secp256k1"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f"
+dependencies = [
+ "rand 0.8.5",
+ "secp256k1-sys",
+]
+
+[[package]]
+name = "secp256k1-sys"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "security-framework"
+version = "2.9.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "core-foundation-sys",
+ "libc",
+ "security-framework-sys",
+]
+
+[[package]]
+name = "security-framework-sys"
+version = "2.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[package]]
+name = "semver"
+version = "0.9.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403"
+dependencies = [
+ "semver-parser",
+]
+
+[[package]]
+name = "semver"
+version = "1.0.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "semver-parser"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
+
+[[package]]
+name = "serde"
+version = "1.0.197"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde-bench"
+version = "0.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d733da87e79faaac25616e33d26299a41143fd4cd42746cbb0e91d8feea243fd"
+dependencies = [
+ "byteorder",
+ "serde",
+]
+
+[[package]]
+name = "serde-xml-rs"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "65162e9059be2f6a3421ebbb4fef3e74b7d9e7c60c50a0e292c6239f19f1edfa"
+dependencies = [
+ "log",
+ "serde",
+ "thiserror",
+ "xml-rs",
+]
+
+[[package]]
+name = "serde_bytes"
+version = "0.11.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b8497c313fd43ab992087548117643f6fcd935cbf36f176ffda0aacf9591734"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.197"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "serde_ignored"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8e319a36d1b52126a0d608f24e93b2d81297091818cd70625fcf50a15d84ddf"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.114"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f09b1bd632ef549eaa9f60a1f8de742bdbc698e6cee2095fc84dde5f549ae0"
+dependencies = [
+ "indexmap 2.2.5",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_repr"
+version = "0.1.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "serde_urlencoded"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
+dependencies = [
+ "form_urlencoded",
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "serde_with"
+version = "3.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270"
+dependencies = [
+ "base64 0.21.7",
+ "chrono",
+ "hex",
+ "indexmap 1.9.3",
+ "indexmap 2.2.5",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "serde_with_macros",
+ "time",
+]
+
+[[package]]
+name = "serde_with_macros"
+version = "3.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d"
+dependencies = [
+ "darling",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "serde_yaml"
+version = "0.9.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fd075d994154d4a774f95b51fb96bdc2832b0ea48425c92546073816cda1f2f"
+dependencies = [
+ "indexmap 2.2.5",
+ "itoa",
+ "ryu",
+ "serde",
+ "unsafe-libyaml",
+]
+
+[[package]]
+name = "serial_test"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e0bccbcf40c8938196944a3da0e133e031a33f4d6b72db3bda3cc556e361905d"
+dependencies = [
+ "lazy_static",
+ "parking_lot 0.11.2",
+ "serial_test_derive",
+]
+
+[[package]]
+name = "serial_test_derive"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b2acd6defeddb41eb60bb468f8825d0cfd0c2a76bc03bfd235b6a1dc4f6a1ad5"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "sha1"
+version = "0.10.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "sha1_smol"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ae1a47186c03a32177042e55dbc5fd5aee900b8e0069a8d70fba96a9375cd012"
+
+[[package]]
+name = "sha2"
+version = "0.9.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800"
+dependencies = [
+ "block-buffer 0.9.0",
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest 0.9.0",
+ "opaque-debug",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
+dependencies = [
+ "cfg-if 1.0.0",
+ "cpufeatures",
+ "digest 0.10.7",
+]
+
+[[package]]
+name = "sha3"
+version = "0.10.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "75872d278a8f37ef87fa0ddbda7802605cb18344497949862c0d4dcb291eba60"
+dependencies = [
+ "digest 0.10.7",
+ "keccak",
+]
+
+[[package]]
+name = "sharded-slab"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+dependencies = [
+ "lazy_static",
+]
+
+[[package]]
+name = "shell-escape"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "45bb67a18fa91266cc7807181f62f9178a6873bfad7dc788c42e6430db40184f"
+
+[[package]]
+name = "shlex"
+version = "1.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
+
+[[package]]
+name = "signal-hook"
+version = "0.3.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801"
+dependencies = [
+ "libc",
+ "signal-hook-registry",
+]
+
+[[package]]
+name = "signal-hook-mio"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af"
+dependencies = [
+ "libc",
+ "mio",
+ "signal-hook",
+]
+
+[[package]]
+name = "signal-hook-registry"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "signature"
+version = "2.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de"
+dependencies = [
+ "digest 0.10.7",
+ "rand_core 0.6.4",
+]
+
+[[package]]
+name = "simdutf8"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a"
+
+[[package]]
+name = "similar"
+version = "2.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32fea41aca09ee824cc9724996433064c89f7777e60762749a4170a14abbfa21"
+
+[[package]]
+name = "simple_asn1"
+version = "0.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "692ca13de57ce0613a363c8c2f1de925adebc81b04c923ac60c5488bb44abe4b"
+dependencies = [
+ "chrono",
+ "num-bigint 0.2.6",
+ "num-traits",
+]
+
+[[package]]
+name = "simple_asn1"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8eb4ea60fb301dc81dfc113df680571045d375ab7345d171c5dc7d7e13107a80"
+dependencies = [
+ "chrono",
+ "num-bigint 0.4.4",
+ "num-traits",
+ "thiserror",
+]
+
+[[package]]
+name = "sized-chunks"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "16d69225bde7a69b235da73377861095455d298f2b970996eec25ddbb42b3d1e"
+dependencies = [
+ "bitmaps",
+ "typenum",
+]
+
+[[package]]
+name = "slab"
+version = "0.4.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67"
+dependencies = [
+ "autocfg 1.1.0",
+]
+
+[[package]]
+name = "slice-group-by"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "826167069c09b99d56f31e9ae5c99049e932a98c9dc2dac47645b08dbbf76ba7"
+
+[[package]]
+name = "smallvec"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+
+[[package]]
+name = "smart-default"
+version = "0.6.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "133659a15339456eeeb07572eb02a91c91e9815e9cbc89566944d2c8d3efdbf6"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "smartstring"
+version = "1.0.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3fb72c633efbaa2dd666986505016c32c3044395ceaf881518399d2f4127ee29"
+dependencies = [
+ "autocfg 1.1.0",
+ "static_assertions",
+ "version_check",
+]
+
+[[package]]
+name = "socket2"
+version = "0.4.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d"
+dependencies = [
+ "libc",
+ "winapi",
+]
+
+[[package]]
+name = "socket2"
+version = "0.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
+dependencies = [
+ "libc",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "speedy_sync"
+version = "0.1.0"
+dependencies = [
+ "borsh 1.3.1",
+ "clap",
+ "framework",
+ "serde",
+ "serde_json",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chain-primitives",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "spin"
+version = "0.5.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
+
+[[package]]
+name = "spki"
+version = "0.7.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d91ed6c858b01f942cd56b37a94b3e0a1798290327d1236e4d9cf4eaca44d29d"
+dependencies = [
+ "base64ct",
+ "der",
+]
+
+[[package]]
+name = "sptr"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a"
+
+[[package]]
+name = "stable_deref_trait"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
+
+[[package]]
+name = "state-viewer"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "borsh 1.3.1",
+ "bytesize",
+ "chrono",
+ "clap",
+ "cloud-storage",
+ "framework",
+ "insta",
+ "itertools",
+ "node-runtime",
+ "once_cell",
+ "rand 0.8.5",
+ "rayon",
+ "redis",
+ "regex",
+ "reqwest",
+ "rust-s3",
+ "serde",
+ "serde_json",
+ "strum",
+ "tempfile",
+ "testlib",
+ "thiserror",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-network",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-primitives-core",
+ "unc-store",
+ "unc-test-contracts",
+ "yansi",
+]
+
+[[package]]
+name = "static_assertions"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
+
+[[package]]
+name = "storage-usage-delta-calculator"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "node-runtime",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "unc-chain-configs",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "store-validator"
+version = "0.1.0"
+dependencies = [
+ "clap",
+ "framework",
+ "serde_json",
+ "testlib",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-epoch-manager",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-store",
+ "yansi",
+]
+
+[[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.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
+
+[[package]]
+name = "strum"
+version = "0.24.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f"
+dependencies = [
+ "strum_macros",
+]
+
+[[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 = "stun"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a7e94b1ec00bad60e6410e058b52f1c66de3dc5fe4d62d09b3e52bb7d3b73e25"
+dependencies = [
+ "base64 0.13.1",
+ "crc",
+ "lazy_static",
+ "md-5",
+ "rand 0.8.5",
+ "ring",
+ "subtle",
+ "thiserror",
+ "tokio",
+ "url",
+ "webrtc-util",
+]
+
+[[package]]
+name = "style-tests"
+version = "0.0.0"
+
+[[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.52"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "syn_derive"
+version = "0.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b"
+dependencies = [
+ "proc-macro-error",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "sync_wrapper"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
+
+[[package]]
+name = "sysinfo"
+version = "0.24.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54cb4ebf3d49308b99e6e9dc95e989e2fdbdc210e4f67c39db0bb89ba927001c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "rayon",
+ "winapi",
+]
+
+[[package]]
+name = "system-configuration"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7"
+dependencies = [
+ "bitflags 1.3.2",
+ "core-foundation",
+ "system-configuration-sys",
+]
+
+[[package]]
+name = "system-configuration-sys"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9"
+dependencies = [
+ "core-foundation-sys",
+ "libc",
+]
+
+[[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.10.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab0e7238dcc7b40a7be719a25365910f6807bd864f4cce6b2e6b873658e2b19d"
+
+[[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 1.0.0",
+ "fastrand",
+ "rustix 0.38.31",
+ "windows-sys 0.52.0",
+]
+
+[[package]]
+name = "termcolor"
+version = "1.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "test-log"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7b319995299c65d522680decf80f2c108d85b861d81dfe340a10d16cee29d9e6"
+dependencies = [
+ "test-log-macros",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "test-log-macros"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8f546451eaa38373f549093fe9fd05e7d2bade739e2ddf834b9968621d60107"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "testlib"
+version = "0.1.0"
+dependencies = [
+ "node-runtime",
+ "once_cell",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-test-contracts",
+]
+
+[[package]]
+name = "themis"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "cargo_metadata",
+ "semver 1.0.22",
+ "serde",
+ "toml",
+]
+
+[[package]]
+name = "thiserror"
+version = "1.0.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e45bcbe8ed29775f228095caf2cd67af7a4ccf756ebff23a306bf3e8b47b24b"
+dependencies = [
+ "thiserror-impl",
+]
+
+[[package]]
+name = "thiserror-impl"
+version = "1.0.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a953cb265bef375dae3de6663da4d3804eee9682ea80d8e2542529b73c531c81"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c"
+dependencies = [
+ "cfg-if 1.0.0",
+ "once_cell",
+]
+
+[[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.34"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749"
+dependencies = [
+ "deranged",
+ "itoa",
+ "num-conv",
+ "powerfmt",
+ "serde",
+ "time-core",
+ "time-macros",
+]
+
+[[package]]
+name = "time-core"
+version = "0.1.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3"
+
+[[package]]
+name = "time-macros"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774"
+dependencies = [
+ "num-conv",
+ "time-core",
+]
+
+[[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.36.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931"
+dependencies = [
+ "backtrace",
+ "bytes",
+ "libc",
+ "mio",
+ "num_cpus",
+ "parking_lot 0.12.1",
+ "pin-project-lite",
+ "signal-hook-registry",
+ "socket2 0.5.6",
+ "tokio-macros",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "tokio-io-timeout"
+version = "1.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf"
+dependencies = [
+ "pin-project-lite",
+ "tokio",
+]
+
+[[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.52",
+]
+
+[[package]]
+name = "tokio-native-tls"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2"
+dependencies = [
+ "native-tls",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-openssl"
+version = "0.6.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6ffab79df67727f6acf57f1ff743091873c24c579b1e2ce4d8f53e47ded4d63d"
+dependencies = [
+ "futures-util",
+ "openssl",
+ "openssl-sys",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-stream"
+version = "0.1.14"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
+dependencies = [
+ "futures-core",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.6.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "log",
+ "pin-project-lite",
+ "tokio",
+]
+
+[[package]]
+name = "tokio-util"
+version = "0.7.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+dependencies = [
+ "bytes",
+ "futures-core",
+ "futures-sink",
+ "pin-project-lite",
+ "tokio",
+ "tracing",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "toml_datetime"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+
+[[package]]
+name = "toml_edit"
+version = "0.19.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
+dependencies = [
+ "indexmap 2.2.5",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "toml_edit"
+version = "0.21.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1"
+dependencies = [
+ "indexmap 2.2.5",
+ "toml_datetime",
+ "winnow",
+]
+
+[[package]]
+name = "tonic"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ff08f4649d10a70ffa3522ca559031285d8e421d727ac85c60825761818f5d0a"
+dependencies = [
+ "async-stream",
+ "async-trait",
+ "base64 0.13.1",
+ "bytes",
+ "futures-core",
+ "futures-util",
+ "h2",
+ "http 0.2.12",
+ "http-body",
+ "hyper",
+ "hyper-timeout",
+ "percent-encoding",
+ "pin-project",
+ "prost",
+ "prost-derive",
+ "tokio",
+ "tokio-stream",
+ "tokio-util 0.6.10",
+ "tower",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+ "tracing-futures",
+]
+
+[[package]]
+name = "tonic-build"
+version = "0.6.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9403f1bafde247186684b230dc6f38b5cd514584e8bec1dd32514be4745fa757"
+dependencies = [
+ "proc-macro2",
+ "prost-build",
+ "quote",
+ "syn 1.0.109",
+]
+
+[[package]]
+name = "tower"
+version = "0.4.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c"
+dependencies = [
+ "futures-core",
+ "futures-util",
+ "indexmap 1.9.3",
+ "pin-project",
+ "pin-project-lite",
+ "rand 0.8.5",
+ "slab",
+ "tokio",
+ "tokio-util 0.7.10",
+ "tower-layer",
+ "tower-service",
+ "tracing",
+]
+
+[[package]]
+name = "tower-layer"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0"
+
+[[package]]
+name = "tower-service"
+version = "0.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
+
+[[package]]
+name = "tqdm"
+version = "0.4.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6f056dcbe6bffd4595b23fba18affc5bd8c36ebd3199a112b1046f14f57b7323"
+dependencies = [
+ "crossterm",
+]
+
+[[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-appender"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3566e8ce28cc0a3fe42519fc80e6b4c943cc4c8cef275620eb8dac2d3d4e06cf"
+dependencies = [
+ "crossbeam-channel",
+ "thiserror",
+ "time",
+ "tracing-subscriber",
+]
+
+[[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.52",
+]
+
+[[package]]
+name = "tracing-core"
+version = "0.1.32"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+dependencies = [
+ "once_cell",
+ "valuable",
+]
+
+[[package]]
+name = "tracing-futures"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
+dependencies = [
+ "pin-project",
+ "tracing",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-log"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3"
+dependencies = [
+ "log",
+ "once_cell",
+ "tracing-core",
+]
+
+[[package]]
+name = "tracing-opentelemetry"
+version = "0.17.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbbe89715c1dbbb790059e2565353978564924ee85017b5fff365c872ff6721f"
+dependencies = [
+ "once_cell",
+ "opentelemetry",
+ "tracing",
+ "tracing-core",
+ "tracing-log 0.1.4",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-span-tree"
+version = "0.1.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c3809cda0328d505548af1ca24fac329f41c0c213d0a1e78908922d0b43e5c43"
+dependencies = [
+ "tracing",
+ "tracing-subscriber",
+]
+
+[[package]]
+name = "tracing-subscriber"
+version = "0.3.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+dependencies = [
+ "matchers",
+ "nu-ansi-term",
+ "once_cell",
+ "regex",
+ "sharded-slab",
+ "smallvec",
+ "thread_local",
+ "tracing",
+ "tracing-core",
+ "tracing-log 0.2.0",
+]
+
+[[package]]
+name = "try-lock"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
+
+[[package]]
+name = "trybuild"
+version = "1.0.89"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a9d3ba662913483d6722303f619e75ea10b7855b0f8e0d72799cf8621bb488f"
+dependencies = [
+ "basic-toml",
+ "glob",
+ "once_cell",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "termcolor",
+]
+
+[[package]]
+name = "turn"
+version = "0.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4712ee30d123ec7ae26d1e1b218395a16c87cdbaf4b3925d170d684af62ea5e8"
+dependencies = [
+ "async-trait",
+ "base64 0.13.1",
+ "futures",
+ "log",
+ "md-5",
+ "rand 0.8.5",
+ "ring",
+ "stun",
+ "thiserror",
+ "tokio",
+ "webrtc-util",
+]
+
+[[package]]
+name = "typenum"
+version = "1.17.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
+
+[[package]]
+name = "ucd-trie"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ed646292ffc8188ef8ea4d1e0e0150fb15a5c2e12ad9b8fc191ae7a8a7f3c4b9"
+
+[[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 = "unc-account-id"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6568505d6185d67606e842f07ff475f0f4a45d862bce80f5d5bd31a7d7058881"
+dependencies = [
+ "borsh 1.3.1",
+ "serde",
+]
+
+[[package]]
+name = "unc-actix-test-utils"
+version = "0.1.0"
+dependencies = [
+ "actix-rt",
+ "futures",
+ "once_cell",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-amend-genesis"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "borsh 1.3.1",
+ "clap",
+ "framework",
+ "node-runtime",
+ "num-rational",
+ "serde",
+ "serde_json",
+ "tempfile",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-network",
+ "unc-primitives",
+ "unc-primitives-core",
+ "unc-store",
+ "unc-test-contracts",
+]
+
+[[package]]
+name = "unc-async"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "derive-enum-from-into",
+ "derive_more",
+ "futures",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "time",
+ "tokio",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-cache"
+version = "0.1.0"
+dependencies = [
+ "bencher",
+ "lru",
+ "rand 0.8.5",
+]
+
+[[package]]
+name = "unc-chain"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "assert_matches",
+ "borsh 1.3.1",
+ "bytesize",
+ "chrono",
+ "crossbeam-channel",
+ "enum-map",
+ "insta",
+ "itertools",
+ "itoa",
+ "lru",
+ "num-rational",
+ "once_cell",
+ "rand 0.8.5",
+ "rand_chacha 0.3.1",
+ "rayon",
+ "strum",
+ "thiserror",
+ "tracing",
+ "unc-async",
+ "unc-cache",
+ "unc-chain-configs",
+ "unc-chain-primitives",
+ "unc-client-primitives",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-network",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-performance-metrics-macros",
+ "unc-pool",
+ "unc-primitives",
+ "unc-store",
+ "yansi",
+]
+
+[[package]]
+name = "unc-chain-configs"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "bytesize",
+ "chrono",
+ "derive_more",
+ "num-rational",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "sha2 0.10.8",
+ "smart-default",
+ "tracing",
+ "unc-config-utils",
+ "unc-crypto",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-chain-primitives"
+version = "0.1.0"
+dependencies = [
+ "chrono",
+ "thiserror",
+ "tracing",
+ "unc-crypto",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-chunks"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "assert_matches",
+ "borsh 1.3.1",
+ "chrono",
+ "derive-enum-from-into",
+ "derive_more",
+ "futures",
+ "itertools",
+ "lru",
+ "once_cell",
+ "rand 0.8.5",
+ "reed-solomon-erasure",
+ "strum",
+ "time",
+ "tracing",
+ "unc-async",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chunks-primitives",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-network",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-performance-metrics-macros",
+ "unc-pool",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-chunks-primitives"
+version = "0.1.0"
+dependencies = [
+ "unc-chain-primitives",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-client"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-rt",
+ "anyhow",
+ "assert_matches",
+ "async-trait",
+ "borsh 1.3.1",
+ "chrono",
+ "cloud-storage",
+ "derive_more",
+ "futures",
+ "itertools",
+ "lru",
+ "num-rational",
+ "once_cell",
+ "percent-encoding",
+ "rand 0.8.5",
+ "rayon",
+ "reed-solomon-erasure",
+ "regex",
+ "reqwest",
+ "rust-s3",
+ "serde",
+ "serde_json",
+ "strum",
+ "sysinfo",
+ "tempfile",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "unc-actix-test-utils",
+ "unc-async",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chain-primitives",
+ "unc-chunks",
+ "unc-client-primitives",
+ "unc-crypto",
+ "unc-dyn-configs",
+ "unc-epoch-manager",
+ "unc-network",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-performance-metrics",
+ "unc-performance-metrics-macros",
+ "unc-pool",
+ "unc-primitives",
+ "unc-store",
+ "unc-telemetry",
+ "yansi",
+]
+
+[[package]]
+name = "unc-client-primitives"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "chrono",
+ "serde",
+ "serde_json",
+ "strum",
+ "thiserror",
+ "tracing",
+ "unc-chain-configs",
+ "unc-chain-primitives",
+ "unc-chunks-primitives",
+ "unc-crypto",
+ "unc-primitives",
+ "yansi",
+]
+
+[[package]]
+name = "unc-config-utils"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "json_comments",
+ "thiserror",
+ "tracing",
+]
+
+[[package]]
+name = "unc-crypto"
+version = "0.1.0"
+dependencies = [
+ "blake2",
+ "bolero",
+ "borsh 1.3.1",
+ "bs58",
+ "c2-chacha",
+ "curve25519-dalek",
+ "derive_more",
+ "ed25519-dalek",
+ "hex",
+ "hex-literal",
+ "once_cell",
+ "primitive-types",
+ "rand 0.7.3",
+ "rsa 0.9.6",
+ "rsa-export",
+ "secp256k1",
+ "serde",
+ "serde_json",
+ "sha2 0.10.8",
+ "subtle",
+ "tempfile",
+ "thiserror",
+ "unc-account-id",
+ "unc-config-utils",
+ "unc-stdx",
+]
+
+[[package]]
+name = "unc-database-tool"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "borsh 1.3.1",
+ "clap",
+ "framework",
+ "indicatif",
+ "rand 0.8.5",
+ "rayon",
+ "rocksdb",
+ "strum",
+ "tempfile",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-dyn-configs"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "once_cell",
+ "prometheus",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "unc-chain-configs",
+ "unc-o11y",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-epoch-manager"
+version = "0.1.0"
+dependencies = [
+ "borsh 1.3.1",
+ "chrono",
+ "itertools",
+ "num-bigint 0.3.3",
+ "num-rational",
+ "num-traits",
+ "primitive-types",
+ "protobuf 3.4.0",
+ "rand 0.8.5",
+ "rand_hc 0.3.2",
+ "serde_json",
+ "smart-default",
+ "tracing",
+ "unc-cache",
+ "unc-chain-configs",
+ "unc-chain-primitives",
+ "unc-crypto",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-epoch-sync-tool"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "clap",
+ "framework",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-flat-storage"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "borsh 1.3.1",
+ "clap",
+ "framework",
+ "rayon",
+ "tqdm",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-fmt"
+version = "0.1.0"
+dependencies = [
+ "unc-primitives-core",
+]
+
+[[package]]
+name = "unc-fork-network"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "chrono",
+ "clap",
+ "framework",
+ "hex",
+ "rayon",
+ "serde",
+ "serde_json",
+ "strum",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-mirror",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-indexer"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "async-recursion",
+ "framework",
+ "futures",
+ "node-runtime",
+ "once_cell",
+ "rocksdb",
+ "serde",
+ "serde_json",
+ "tokio",
+ "tracing",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-crypto",
+ "unc-dyn-configs",
+ "unc-indexer-primitives",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-indexer-primitives"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "serde_json",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-jsonrpc"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-cors",
+ "actix-web",
+ "bs58",
+ "easy-ext",
+ "futures",
+ "hex",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "serde_with",
+ "tokio",
+ "tracing",
+ "tracing-subscriber",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-client-primitives",
+ "unc-jsonrpc-adversarial-primitives",
+ "unc-jsonrpc-client",
+ "unc-jsonrpc-primitives",
+ "unc-network",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-rpc-error-macro",
+]
+
+[[package]]
+name = "unc-jsonrpc-adversarial-primitives"
+version = "0.1.0"
+dependencies = [
+ "serde",
+ "unc-network",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-jsonrpc-client"
+version = "0.1.0"
+dependencies = [
+ "actix-http",
+ "awc",
+ "futures",
+ "serde",
+ "serde_json",
+ "unc-jsonrpc-primitives",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-jsonrpc-fuzz"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "arbitrary",
+ "awc",
+ "libfuzzer-sys",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "tokio",
+ "unc-jsonrpc",
+ "unc-jsonrpc-primitives",
+ "unc-jsonrpc-tests",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-jsonrpc-primitives"
+version = "0.1.0"
+dependencies = [
+ "arbitrary",
+ "serde",
+ "serde_json",
+ "thiserror",
+ "unc-chain-configs",
+ "unc-client-primitives",
+ "unc-crypto",
+ "unc-primitives",
+ "unc-rpc-error-macro",
+]
+
+[[package]]
+name = "unc-jsonrpc-tests"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "awc",
+ "borsh 1.3.1",
+ "futures",
+ "once_cell",
+ "serde",
+ "serde_json",
+ "unc-actix-test-utils",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-crypto",
+ "unc-jsonrpc",
+ "unc-jsonrpc-primitives",
+ "unc-network",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-mainnet-res"
+version = "0.1.0"
+dependencies = [
+ "serde_json",
+ "unc-account-id",
+ "unc-chain-configs",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-mirror"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "async-trait",
+ "borsh 1.3.1",
+ "bs58",
+ "clap",
+ "ed25519-dalek",
+ "framework",
+ "hex",
+ "hkdf",
+ "once_cell",
+ "openssl-probe",
+ "rand_core 0.5.1",
+ "rocksdb",
+ "secp256k1",
+ "serde",
+ "serde_json",
+ "sha2 0.10.8",
+ "strum",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chain-primitives",
+ "unc-client",
+ "unc-client-primitives",
+ "unc-crypto",
+ "unc-epoch-manager",
+ "unc-indexer",
+ "unc-indexer-primitives",
+ "unc-network",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-primitives-core",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-network"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "arc-swap",
+ "assert_matches",
+ "async-trait",
+ "borsh 1.3.1",
+ "bytes",
+ "bytesize",
+ "chrono",
+ "criterion",
+ "crossbeam-channel",
+ "derive_more",
+ "futures",
+ "futures-util",
+ "im",
+ "itertools",
+ "lru",
+ "once_cell",
+ "opentelemetry",
+ "parking_lot 0.12.1",
+ "pin-project",
+ "pretty_assertions",
+ "protobuf 3.4.0",
+ "protobuf-codegen",
+ "rand 0.8.5",
+ "rand_xorshift",
+ "rayon",
+ "rlimit",
+ "serde",
+ "smart-default",
+ "strum",
+ "stun",
+ "tempfile",
+ "thiserror",
+ "time",
+ "tokio",
+ "tokio-stream",
+ "tokio-util 0.7.10",
+ "tracing",
+ "turn",
+ "unc-async",
+ "unc-crypto",
+ "unc-fmt",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-performance-metrics-macros",
+ "unc-primitives",
+ "unc-stable-hasher",
+ "unc-store",
+ "webrtc-util",
+]
+
+[[package]]
+name = "unc-o11y"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "base64 0.21.7",
+ "bencher",
+ "clap",
+ "itoa",
+ "once_cell",
+ "opentelemetry",
+ "opentelemetry-otlp",
+ "opentelemetry-semantic-conventions",
+ "prometheus",
+ "serde",
+ "serde_json",
+ "smartstring",
+ "strum",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "tracing-appender",
+ "tracing-opentelemetry",
+ "tracing-subscriber",
+ "unc-crypto",
+ "unc-fmt",
+ "unc-primitives-core",
+]
+
+[[package]]
+name = "unc-parameters"
+version = "0.1.0"
+dependencies = [
+ "assert_matches",
+ "borsh 1.3.1",
+ "clap",
+ "enum-map",
+ "insta",
+ "num-rational",
+ "serde",
+ "serde_repr",
+ "serde_yaml",
+ "strum",
+ "thiserror",
+ "unc-account-id",
+ "unc-primitives-core",
+]
+
+[[package]]
+name = "unc-performance-metrics"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "bitflags 1.3.2",
+ "bytes",
+ "bytesize",
+ "futures",
+ "libc",
+ "once_cell",
+ "strum",
+ "tokio",
+ "tokio-util 0.7.10",
+ "tracing",
+]
+
+[[package]]
+name = "unc-performance-metrics-macros"
+version = "0.1.0"
+dependencies = [
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "unc-ping"
+version = "0.1.0"
+dependencies = [
+ "actix-web",
+ "anyhow",
+ "chrono",
+ "clap",
+ "once_cell",
+ "prometheus",
+ "tokio",
+ "tracing",
+ "unc-async",
+ "unc-jsonrpc",
+ "unc-network",
+ "unc-o11y",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-pool"
+version = "0.1.0"
+dependencies = [
+ "borsh 1.3.1",
+ "once_cell",
+ "rand 0.8.5",
+ "unc-crypto",
+ "unc-o11y",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-primitives"
+version = "0.1.0"
+dependencies = [
+ "arbitrary",
+ "assert_matches",
+ "base64 0.21.7",
+ "bencher",
+ "borsh 1.3.1",
+ "bytesize",
+ "cfg-if 1.0.0",
+ "chrono",
+ "derive_more",
+ "easy-ext",
+ "enum-map",
+ "hex",
+ "insta",
+ "num-rational",
+ "once_cell",
+ "primitive-types",
+ "rand 0.8.5",
+ "rand_chacha 0.3.1",
+ "reed-solomon-erasure",
+ "serde",
+ "serde_json",
+ "serde_with",
+ "serde_yaml",
+ "sha3",
+ "smart-default",
+ "strum",
+ "thiserror",
+ "time",
+ "tracing",
+ "unc-crypto",
+ "unc-fmt",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives-core",
+ "unc-rpc-error-macro",
+ "unc-stdx",
+ "unc-vm-runner",
+]
+
+[[package]]
+name = "unc-primitives-core"
+version = "0.1.0"
+dependencies = [
+ "arbitrary",
+ "base64 0.21.7",
+ "borsh 1.3.1",
+ "bs58",
+ "derive_more",
+ "enum-map",
+ "insta",
+ "num-rational",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "serde_with",
+ "sha2 0.10.8",
+ "strum",
+ "thiserror",
+ "unc-account-id",
+]
+
+[[package]]
+name = "unc-rpc-error-core"
+version = "0.1.0"
+dependencies = [
+ "quote",
+ "serde",
+ "serde_json",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "unc-rpc-error-macro"
+version = "0.1.0"
+dependencies = [
+ "fs2",
+ "serde",
+ "serde_json",
+ "syn 2.0.52",
+ "unc-rpc-error-core",
+]
+
+[[package]]
+name = "unc-stable-hasher"
+version = "0.1.0"
+
+[[package]]
+name = "unc-state-parts"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "chrono",
+ "clap",
+ "once_cell",
+ "sha2 0.10.8",
+ "tokio",
+ "tracing",
+ "unc-async",
+ "unc-jsonrpc",
+ "unc-network",
+ "unc-o11y",
+ "unc-ping",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-state-parts-dump-check"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-web",
+ "anyhow",
+ "borsh 1.3.1",
+ "clap",
+ "cloud-storage",
+ "framework",
+ "once_cell",
+ "reqwest",
+ "tokio",
+ "tracing",
+ "unc-client",
+ "unc-jsonrpc",
+ "unc-o11y",
+ "unc-primitives",
+ "unc-primitives-core",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-stdx"
+version = "0.1.0"
+
+[[package]]
+name = "unc-store"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "actix-rt",
+ "anyhow",
+ "assert_matches",
+ "bencher",
+ "borsh 1.3.1",
+ "bytesize",
+ "crossbeam",
+ "derive_more",
+ "elastic-array",
+ "enum-map",
+ "fs2",
+ "hex",
+ "insta",
+ "itertools",
+ "itoa",
+ "lru",
+ "num_cpus",
+ "once_cell",
+ "rand 0.8.5",
+ "rayon",
+ "rlimit",
+ "rocksdb",
+ "serde",
+ "serde_json",
+ "strum",
+ "tempfile",
+ "thiserror",
+ "tokio",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-chunks",
+ "unc-crypto",
+ "unc-fmt",
+ "unc-o11y",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-stdx",
+ "unc-vm-runner",
+]
+
+[[package]]
+name = "unc-telemetry"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "awc",
+ "futures",
+ "once_cell",
+ "openssl",
+ "serde",
+ "serde_json",
+ "tracing",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-performance-metrics-macros",
+ "unc-primitives",
+]
+
+[[package]]
+name = "unc-test-contracts"
+version = "0.1.0"
+dependencies = [
+ "arbitrary",
+ "once_cell",
+ "rand 0.8.5",
+ "wasm-encoder 0.27.0",
+ "wasm-smith",
+ "wat",
+]
+
+[[package]]
+name = "unc-undo-block"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "chrono",
+ "clap",
+ "framework",
+ "tracing",
+ "unc-chain",
+ "unc-chain-configs",
+ "unc-epoch-manager",
+ "unc-primitives",
+ "unc-store",
+]
+
+[[package]]
+name = "unc-vm-compiler"
+version = "0.1.0"
+dependencies = [
+ "enumset",
+ "finite-wasm",
+ "hashbrown 0.14.3",
+ "rkyv",
+ "smallvec",
+ "target-lexicon 0.12.14",
+ "thiserror",
+ "tracing",
+ "unc-vm-types",
+ "unc-vm-vm",
+ "wasmparser 0.99.0",
+]
+
+[[package]]
+name = "unc-vm-compiler-singlepass"
+version = "0.1.0"
+dependencies = [
+ "dynasm 2.0.0",
+ "dynasmrt 2.0.0",
+ "enumset",
+ "finite-wasm",
+ "hashbrown 0.14.3",
+ "lazy_static",
+ "memoffset 0.8.0",
+ "more-asserts",
+ "rayon",
+ "smallvec",
+ "strum",
+ "target-lexicon 0.12.14",
+ "tracing",
+ "unc-vm-compiler",
+ "unc-vm-types",
+ "unc-vm-vm",
+]
+
+[[package]]
+name = "unc-vm-compiler-test-derive"
+version = "0.1.0"
+dependencies = [
+ "pretty_assertions",
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+ "trybuild",
+]
+
+[[package]]
+name = "unc-vm-engine"
+version = "0.1.0"
+dependencies = [
+ "backtrace",
+ "cfg-if 1.0.0",
+ "crossbeam-queue",
+ "enumset",
+ "finite-wasm",
+ "lazy_static",
+ "memmap2",
+ "more-asserts",
+ "region",
+ "rkyv",
+ "rustc-demangle",
+ "rustix 0.37.27",
+ "target-lexicon 0.12.14",
+ "thiserror",
+ "tracing",
+ "unc-vm-compiler",
+ "unc-vm-types",
+ "unc-vm-vm",
+]
+
+[[package]]
+name = "unc-vm-runner"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "arbitrary",
+ "assert_matches",
+ "base64 0.21.7",
+ "bolero",
+ "borsh 1.3.1",
+ "ed25519-dalek",
+ "enum-map",
+ "expect-test",
+ "finite-wasm",
+ "hex",
+ "loupe",
+ "memoffset 0.8.0",
+ "num-rational",
+ "once_cell",
+ "parity-wasm 0.41.0",
+ "parity-wasm 0.42.2",
+ "prefix-sum-vec",
+ "pwasm-utils",
+ "rand 0.8.5",
+ "ripemd",
+ "serde",
+ "serde_json",
+ "serde_repr",
+ "serde_with",
+ "sha2 0.10.8",
+ "sha3",
+ "strum",
+ "thiserror",
+ "tracing",
+ "unc-crypto",
+ "unc-parameters",
+ "unc-primitives-core",
+ "unc-stdx",
+ "unc-test-contracts",
+ "unc-vm-compiler",
+ "unc-vm-compiler-singlepass",
+ "unc-vm-engine",
+ "unc-vm-types",
+ "unc-vm-vm",
+ "wasm-encoder 0.27.0",
+ "wasm-smith",
+ "wasmer-compiler-near",
+ "wasmer-compiler-singlepass-near",
+ "wasmer-engine-near",
+ "wasmer-engine-universal-near",
+ "wasmer-runtime-core-near",
+ "wasmer-runtime-near",
+ "wasmer-types-near",
+ "wasmer-vm-near",
+ "wasmparser 0.78.2",
+ "wasmprinter",
+ "wasmtime",
+ "wat",
+ "zeropool-bn",
+]
+
+[[package]]
+name = "unc-vm-runner-fuzz"
+version = "0.1.0"
+dependencies = [
+ "arbitrary",
+ "libfuzzer-sys",
+ "unc-parameters",
+ "unc-primitives",
+ "unc-test-contracts",
+ "unc-vm-runner",
+ "wasm-smith",
+ "wasmprinter",
+]
+
+[[package]]
+name = "unc-vm-test-api"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "cfg-if 1.0.0",
+ "finite-wasm",
+ "indexmap 1.9.3",
+ "more-asserts",
+ "prefix-sum-vec",
+ "serial_test",
+ "target-lexicon 0.12.14",
+ "tempfile",
+ "test-log",
+ "thiserror",
+ "tracing",
+ "tracing-subscriber",
+ "unc-vm-compiler",
+ "unc-vm-compiler-singlepass",
+ "unc-vm-compiler-test-derive",
+ "unc-vm-engine",
+ "unc-vm-test-generator",
+ "unc-vm-types",
+ "unc-vm-vm",
+ "unc-vm-wast",
+ "wat",
+ "winapi",
+]
+
+[[package]]
+name = "unc-vm-test-generator"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "target-lexicon 0.12.14",
+]
+
+[[package]]
+name = "unc-vm-types"
+version = "0.1.0"
+dependencies = [
+ "bolero",
+ "indexmap 1.9.3",
+ "num-traits",
+ "rkyv",
+ "thiserror",
+]
+
+[[package]]
+name = "unc-vm-vm"
+version = "0.1.0"
+dependencies = [
+ "backtrace",
+ "cc",
+ "cfg-if 1.0.0",
+ "finite-wasm",
+ "indexmap 1.9.3",
+ "libc",
+ "memoffset 0.8.0",
+ "more-asserts",
+ "region",
+ "rkyv",
+ "thiserror",
+ "tracing",
+ "unc-vm-types",
+ "wasmparser 0.99.0",
+ "winapi",
+]
+
+[[package]]
+name = "unc-vm-wast"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "tempfile",
+ "thiserror",
+ "unc-vm-test-api",
+ "wast 40.0.0",
+]
+
+[[package]]
+name = "unc-wallet-contract"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "unc-primitives-core",
+ "unc-vm-runner",
+]
+
+[[package]]
+name = "uncd"
+version = "0.1.0"
+dependencies = [
+ "actix",
+ "anyhow",
+ "clap",
+ "cold-store-tool",
+ "framework",
+ "futures",
+ "once_cell",
+ "openssl-probe",
+ "opentelemetry",
+ "rayon",
+ "rlimit",
+ "rustc_version 0.4.0",
+ "serde",
+ "serde_json",
+ "shell-escape",
+ "state-viewer",
+ "thiserror",
+ "tikv-jemallocator",
+ "tokio",
+ "tracing",
+ "unc-amend-genesis",
+ "unc-chain-configs",
+ "unc-client",
+ "unc-config-utils",
+ "unc-crypto",
+ "unc-database-tool",
+ "unc-dyn-configs",
+ "unc-epoch-sync-tool",
+ "unc-flat-storage",
+ "unc-fork-network",
+ "unc-jsonrpc-primitives",
+ "unc-mirror",
+ "unc-network",
+ "unc-o11y",
+ "unc-performance-metrics",
+ "unc-ping",
+ "unc-primitives",
+ "unc-state-parts",
+ "unc-state-parts-dump-check",
+ "unc-store",
+ "unc-undo-block",
+ "yansi",
+]
+
+[[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.11.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85"
+
+[[package]]
+name = "unsafe-libyaml"
+version = "0.2.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ab4c90930b95a82d00dc9e9ac071b4991924390d46cbd0dfe566148667605e4b"
+
+[[package]]
+name = "untrusted"
+version = "0.7.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
+
+[[package]]
+name = "url"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633"
+dependencies = [
+ "form_urlencoded",
+ "idna",
+ "percent-encoding",
+]
+
+[[package]]
+name = "utf8parse"
+version = "0.2.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a"
+
+[[package]]
+name = "uuid"
+version = "1.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a"
+
+[[package]]
+name = "valuable"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+[[package]]
+name = "vcpkg"
+version = "0.2.15"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "void"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
+
+[[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 = "want"
+version = "0.3.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e"
+dependencies = [
+ "try-lock",
+]
+
+[[package]]
+name = "wasi"
+version = "0.9.0+wasi-snapshot-preview1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"
+
+[[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 1.0.0",
+ "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.52",
+ "wasm-bindgen-shared",
+]
+
+[[package]]
+name = "wasm-bindgen-futures"
+version = "0.4.42"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0"
+dependencies = [
+ "cfg-if 1.0.0",
+ "js-sys",
+ "wasm-bindgen",
+ "web-sys",
+]
+
+[[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.52",
+ "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 = "wasm-encoder"
+version = "0.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b47b995b096a689358ca9de6c727b94351b95b390dbbf6b7021c22797d36caa"
+dependencies = [
+ "leb128",
+]
+
+[[package]]
+name = "wasm-encoder"
+version = "0.27.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e77053dc709db790691d3732cfc458adc5acc881dec524965c608effdcd9c581"
+dependencies = [
+ "leb128",
+]
+
+[[package]]
+name = "wasm-encoder"
+version = "0.35.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ca90ba1b5b0a70d3d49473c5579951f3bddc78d47b59256d2f9d4922b150aca"
+dependencies = [
+ "leb128",
+]
+
+[[package]]
+name = "wasm-encoder"
+version = "0.201.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b9c7d2731df60006819b013f64ccc2019691deccf6e11a1804bc850cd6748f1a"
+dependencies = [
+ "leb128",
+]
+
+[[package]]
+name = "wasm-smith"
+version = "0.10.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bb87569c81c298836d88405a28a68e8dfcd43b75220a4b4522831a63921b7dbc"
+dependencies = [
+ "arbitrary",
+ "flagset",
+ "indexmap 1.9.3",
+ "leb128",
+ "wasm-encoder 0.12.0",
+ "wasmparser 0.85.0",
+]
+
+[[package]]
+name = "wasm-streams"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
+dependencies = [
+ "futures-util",
+ "js-sys",
+ "wasm-bindgen",
+ "wasm-bindgen-futures",
+ "web-sys",
+]
+
+[[package]]
+name = "wasmer-compiler-near"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "46fdae7245128f284476e6db9653ef0a15b011975091bcd7f9d7303132409662"
+dependencies = [
+ "enumset",
+ "rkyv",
+ "smallvec",
+ "target-lexicon 0.12.14",
+ "thiserror",
+ "wasmer-types-near",
+ "wasmer-vm-near",
+ "wasmparser 0.78.2",
+]
+
+[[package]]
+name = "wasmer-compiler-singlepass-near"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac4af0e438015585eb27b2c6f6869c58c540bfe27408b686b1778470bf301050"
+dependencies = [
+ "byteorder",
+ "dynasm 1.2.3",
+ "dynasmrt 1.2.3",
+ "lazy_static",
+ "memoffset 0.6.5",
+ "more-asserts",
+ "rayon",
+ "smallvec",
+ "wasmer-compiler-near",
+ "wasmer-types-near",
+ "wasmer-vm-near",
+]
+
+[[package]]
+name = "wasmer-engine-near"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4048411cabb2c94c7d8d11d9d0282cc6b15308b61ebc1e122c40e89865ebb5c5"
+dependencies = [
+ "backtrace",
+ "enumset",
+ "lazy_static",
+ "memmap2",
+ "more-asserts",
+ "rustc-demangle",
+ "target-lexicon 0.12.14",
+ "thiserror",
+ "wasmer-compiler-near",
+ "wasmer-types-near",
+ "wasmer-vm-near",
+]
+
+[[package]]
+name = "wasmer-engine-universal-near"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c5f31c3d2850ac7957406d3c9581d9435ea8126a26478709fa7e931b6f562b4d"
+dependencies = [
+ "cfg-if 1.0.0",
+ "enumset",
+ "leb128",
+ "region",
+ "rkyv",
+ "thiserror",
+ "wasmer-compiler-near",
+ "wasmer-engine-near",
+ "wasmer-types-near",
+ "wasmer-vm-near",
+ "winapi",
+]
+
+[[package]]
+name = "wasmer-runtime-core-near"
+version = "0.18.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5a3fac37da3c625e98708c5dd92d3f642aaf700fd077168d3d0fff277ec6a165"
+dependencies = [
+ "bincode",
+ "blake3",
+ "borsh 0.9.3",
+ "cc",
+ "digest 0.8.1",
+ "errno 0.2.8",
+ "hex",
+ "indexmap 1.9.3",
+ "lazy_static",
+ "libc",
+ "nix 0.15.0",
+ "page_size",
+ "parking_lot 0.10.2",
+ "rustc_version 0.2.3",
+ "serde",
+ "serde-bench",
+ "serde_bytes",
+ "serde_derive",
+ "smallvec",
+ "target-lexicon 0.10.0",
+ "wasmparser 0.51.4",
+ "winapi",
+]
+
+[[package]]
+name = "wasmer-runtime-near"
+version = "0.18.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "158e6fff11e5e1ef805af50637374d5bd43d92017beafa18992cdf7f3f7ae3e4"
+dependencies = [
+ "lazy_static",
+ "memmap",
+ "serde",
+ "serde_derive",
+ "wasmer-runtime-core-near",
+ "wasmer-singlepass-backend-near",
+]
+
+[[package]]
+name = "wasmer-singlepass-backend-near"
+version = "0.18.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5f6edd0ba6c0bcf9b279186d4dbe81649dda3e5ef38f586865943de4dcd653f8"
+dependencies = [
+ "bincode",
+ "borsh 0.9.3",
+ "byteorder",
+ "dynasm 1.2.3",
+ "dynasmrt 1.2.3",
+ "lazy_static",
+ "libc",
+ "nix 0.15.0",
+ "serde",
+ "serde_derive",
+ "smallvec",
+ "wasmer-runtime-core-near",
+]
+
+[[package]]
+name = "wasmer-types-near"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ba154adffb0fbd33f5dabd3788a1744d846b43e6e090d44269c7ee8fa5743e4"
+dependencies = [
+ "indexmap 1.9.3",
+ "rkyv",
+ "thiserror",
+]
+
+[[package]]
+name = "wasmer-vm-near"
+version = "2.4.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70a5585596f6e9915d606de944aece51626736fb1191aefb5b2ef108c6f7604a"
+dependencies = [
+ "backtrace",
+ "cc",
+ "cfg-if 1.0.0",
+ "indexmap 1.9.3",
+ "libc",
+ "memoffset 0.6.5",
+ "more-asserts",
+ "region",
+ "rkyv",
+ "thiserror",
+ "wasmer-types-near",
+ "winapi",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.51.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "aeb1956b19469d1c5e63e459d29e7b5aa0f558d9f16fcef09736f8a265e6c10a"
+
+[[package]]
+name = "wasmparser"
+version = "0.78.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65"
+
+[[package]]
+name = "wasmparser"
+version = "0.85.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "570460c58b21e9150d2df0eaaedbb7816c34bcec009ae0dcc976e40ba81463e7"
+dependencies = [
+ "indexmap 1.9.3",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.99.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9ef3b717afc67f848f412d4f02c127dd3e35a0eecd58c684580414df4fde01d3"
+dependencies = [
+ "indexmap 1.9.3",
+ "url",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.105.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "83be9e0b3f9570dc1979a33ae7b89d032c73211564232b99976553e5c155ec32"
+dependencies = [
+ "indexmap 1.9.3",
+ "url",
+]
+
+[[package]]
+name = "wasmparser"
+version = "0.115.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e06c0641a4add879ba71ccb3a1e4278fd546f76f1eafb21d8f7b07733b547cd5"
+dependencies = [
+ "indexmap 2.2.5",
+ "semver 1.0.22",
+]
+
+[[package]]
+name = "wasmprinter"
+version = "0.2.57"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "50b0e5ed7a74a065637f0d7798ce5f29cadb064980d24b0c82af5200122fa0d8"
+dependencies = [
+ "anyhow",
+ "wasmparser 0.105.0",
+]
+
+[[package]]
+name = "wasmtime"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ca54f6090ce46973f33a79f265924b204f248f91aec09229bce53d19d567c1a6"
+dependencies = [
+ "anyhow",
+ "bincode",
+ "bumpalo",
+ "cfg-if 1.0.0",
+ "fxprof-processed-profile",
+ "indexmap 2.2.5",
+ "libc",
+ "log",
+ "object",
+ "once_cell",
+ "paste",
+ "psm",
+ "serde",
+ "serde_derive",
+ "serde_json",
+ "target-lexicon 0.12.14",
+ "wasm-encoder 0.35.0",
+ "wasmparser 0.115.0",
+ "wasmtime-cranelift",
+ "wasmtime-environ",
+ "wasmtime-jit",
+ "wasmtime-runtime",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "wasmtime-asm-macros"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "54984bc0b5689da87a43d7c181d23092b4d5cfcbb7ae3eb6b917dd55865d95e6"
+dependencies = [
+ "cfg-if 1.0.0",
+]
+
+[[package]]
+name = "wasmtime-cranelift"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cf3cee8be02f5006d21b773ffd6802f96a0b7d661ff2ad8a01fb93df458b1aa"
+dependencies = [
+ "anyhow",
+ "cfg-if 1.0.0",
+ "cranelift-codegen",
+ "cranelift-control",
+ "cranelift-entity",
+ "cranelift-frontend",
+ "cranelift-native",
+ "cranelift-wasm",
+ "gimli",
+ "log",
+ "object",
+ "target-lexicon 0.12.14",
+ "thiserror",
+ "wasmparser 0.115.0",
+ "wasmtime-cranelift-shared",
+ "wasmtime-environ",
+ "wasmtime-versioned-export-macros",
+]
+
+[[package]]
+name = "wasmtime-cranelift-shared"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "420fd2a69bc162957f4c94f21c7fa08ecf60d916f4e87b56332507c555da381d"
+dependencies = [
+ "anyhow",
+ "cranelift-codegen",
+ "cranelift-control",
+ "cranelift-native",
+ "gimli",
+ "object",
+ "target-lexicon 0.12.14",
+ "wasmtime-environ",
+]
+
+[[package]]
+name = "wasmtime-environ"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fb6a445ce2b2810127caee6c1b79b8da4ae57712b05556a674592c18b7500a14"
+dependencies = [
+ "anyhow",
+ "cranelift-entity",
+ "gimli",
+ "indexmap 2.2.5",
+ "log",
+ "object",
+ "serde",
+ "serde_derive",
+ "target-lexicon 0.12.14",
+ "thiserror",
+ "wasmparser 0.115.0",
+ "wasmtime-types",
+]
+
+[[package]]
+name = "wasmtime-jit"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f0f6586c61125fbfc13c3108c3dd565d21f314dd5bac823b9a5b7ab576d21f1"
+dependencies = [
+ "addr2line",
+ "anyhow",
+ "bincode",
+ "cfg-if 1.0.0",
+ "cpp_demangle",
+ "gimli",
+ "log",
+ "object",
+ "rustc-demangle",
+ "rustix 0.38.31",
+ "serde",
+ "serde_derive",
+ "target-lexicon 0.12.14",
+ "wasmtime-environ",
+ "wasmtime-jit-icache-coherence",
+ "wasmtime-runtime",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "wasmtime-jit-debug"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "109a9e46afe33580b952b14a4207354355f19bcdf0b47485b397b68409eaf553"
+dependencies = [
+ "once_cell",
+ "wasmtime-versioned-export-macros",
+]
+
+[[package]]
+name = "wasmtime-jit-icache-coherence"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f67e6be36375c39cff57ed3b137ab691afbf2d9ba8ee1c01f77888413f218749"
+dependencies = [
+ "cfg-if 1.0.0",
+ "libc",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "wasmtime-runtime"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1d07986b2327b5e7f535ed638fbde25990fc8f85400194fda0d26db71c7b685e"
+dependencies = [
+ "anyhow",
+ "cc",
+ "cfg-if 1.0.0",
+ "indexmap 2.2.5",
+ "libc",
+ "log",
+ "mach",
+ "memfd",
+ "memoffset 0.9.0",
+ "paste",
+ "rand 0.8.5",
+ "rustix 0.38.31",
+ "sptr",
+ "wasm-encoder 0.35.0",
+ "wasmtime-asm-macros",
+ "wasmtime-environ",
+ "wasmtime-jit-debug",
+ "wasmtime-versioned-export-macros",
+ "wasmtime-wmemcheck",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "wasmtime-types"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e810a0d2e869abd1cb42bd232990f6bd211672b3d202d2ae7e70ffb97ed70ea3"
+dependencies = [
+ "cranelift-entity",
+ "serde",
+ "serde_derive",
+ "thiserror",
+ "wasmparser 0.115.0",
+]
+
+[[package]]
+name = "wasmtime-versioned-export-macros"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "09b5575a75e711ca6c36bb9ad647c93541cdc8e34218031acba5da3f35919dd3"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn 2.0.52",
+]
+
+[[package]]
+name = "wasmtime-wmemcheck"
+version = "14.0.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9dafab2db172a53e23940e0fa3078c202f567ee5f13f4b42f66b694fab43c658"
+
+[[package]]
+name = "wast"
+version = "40.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9bb4f48a8b083dbc50e291e430afb8f524092bb00428957bcc63f49f856c64ac"
+dependencies = [
+ "leb128",
+ "memchr",
+ "unicode-width",
+]
+
+[[package]]
+name = "wast"
+version = "201.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1ef6e1ef34d7da3e2b374fd2b1a9c0227aff6cad596e1b24df9b58d0f6222faa"
+dependencies = [
+ "bumpalo",
+ "leb128",
+ "memchr",
+ "unicode-width",
+ "wasm-encoder 0.201.0",
+]
+
+[[package]]
+name = "wat"
+version = "1.201.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "453d5b37a45b98dee4f4cb68015fc73634d7883bbef1c65e6e9c78d454cf3f32"
+dependencies = [
+ "wast 201.0.0",
+]
+
+[[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 = "webrtc-util"
+version = "0.7.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93f1db1727772c05cf7a2cfece52c3aca8045ca1e176cd517d323489aa3c6d87"
+dependencies = [
+ "async-trait",
+ "bitflags 1.3.2",
+ "bytes",
+ "cc",
+ "ipnet",
+ "lazy_static",
+ "libc",
+ "log",
+ "nix 0.24.3",
+ "rand 0.8.5",
+ "thiserror",
+ "tokio",
+ "winapi",
+]
+
+[[package]]
+name = "which"
+version = "4.4.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
+dependencies = [
+ "either",
+ "home",
+ "once_cell",
+ "rustix 0.38.31",
+]
+
+[[package]]
+name = "wildmatch"
+version = "2.3.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "495ec47bf3c1345005f40724f0269362c8556cbc43aed0526ed44cae1d35fceb"
+
+[[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.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596"
+dependencies = [
+ "winapi",
+]
+
+[[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-core"
+version = "0.52.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9"
+dependencies = [
+ "windows-targets 0.52.4",
+]
+
+[[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.4",
+]
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
+dependencies = [
+ "windows_aarch64_gnullvm 0.52.4",
+ "windows_aarch64_msvc 0.52.4",
+ "windows_i686_gnu 0.52.4",
+ "windows_i686_msvc 0.52.4",
+ "windows_x86_64_gnu 0.52.4",
+ "windows_x86_64_gnullvm 0.52.4",
+ "windows_x86_64_msvc 0.52.4",
+]
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
+
+[[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.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
+
+[[package]]
+name = "winnow"
+version = "0.5.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "winreg"
+version = "0.50.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
+dependencies = [
+ "cfg-if 1.0.0",
+ "windows-sys 0.48.0",
+]
+
+[[package]]
+name = "wyz"
+version = "0.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed"
+dependencies = [
+ "tap",
+]
+
+[[package]]
+name = "xml-rs"
+version = "0.8.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a"
+
+[[package]]
+name = "xshell"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ce2107fe03e558353b4c71ad7626d58ed82efaf56c54134228608893c77023ad"
+dependencies = [
+ "xshell-macros",
+]
+
+[[package]]
+name = "xshell-macros"
+version = "0.2.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7e2c411759b501fb9501aac2b1b2d287a6e93e5bdcf13c25306b23e1b716dd0e"
+
+[[package]]
+name = "xz2"
+version = "0.1.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "388c44dc09d76f1536602ead6d325eb532f5c122f17782bd57fb47baeeb767e2"
+dependencies = [
+ "lzma-sys",
+]
+
+[[package]]
+name = "yaml-rust"
+version = "0.4.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85"
+dependencies = [
+ "linked-hash-map",
+]
+
+[[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.52",
+]
+
+[[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.52",
+]
+
+[[package]]
+name = "zeropool-bn"
+version = "0.5.11"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "71e61de68ede9ffdd69c01664f65a178c5188b73f78faa21f0936016a888ff7c"
+dependencies = [
+ "byteorder",
+ "crunchy",
+ "lazy_static",
+ "rand 0.8.5",
+ "rustc-hex",
+]
+
+[[package]]
+name = "zstd"
+version = "0.13.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bffb3309596d527cfcba7dfc6ed6052f1d39dfbd7c867aa2e865e4a449c10110"
+dependencies = [
+ "zstd-safe",
+]
+
+[[package]]
+name = "zstd-safe"
+version = "7.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "43747c7422e2924c11144d5229878b98180ef8b06cca4ab5af37afc8a8d8ea3e"
+dependencies = [
+ "zstd-sys",
+]
+
+[[package]]
+name = "zstd-sys"
+version = "2.0.9+zstd.1.5.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656"
+dependencies = [
+ "cc",
+ "pkg-config",
+]
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 000000000..132f558de
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,423 @@
+[workspace.package]
+version = "0.1.0" # managed by cargo-workspaces, see below
+authors = ["Hello Inc "]
+edition = "2021"
+rust-version = "1.75.0"
+repository = "https://github.com/utnet-org/utility"
+license = "MIT OR Apache-2.0"
+
+[workspace.metadata.workspaces]
+# Shared version of all public crates in the workspace.
+# This is only used for crates that are not stable.
+# Most crates are not stable on purpose, as maintaining API compatibility is a
+# significant developer time expense. Please think thoroughly before adding
+# anything to the list of stable crates.
+version = "0.1.0"
+exclude = ["uncd"]
+
+[workspace]
+resolver = "2"
+members = [
+ "chain/chain",
+ "chain/chunks",
+ "chain/client",
+ "chain/client-primitives",
+ "chain/epoch-manager",
+ "chain/indexer",
+ "chain/indexer-primitives",
+ "chain/jsonrpc",
+ "chain/jsonrpc-adversarial-primitives",
+ "chain/jsonrpc-primitives",
+ "chain/jsonrpc/client",
+ "chain/jsonrpc/fuzz",
+ "chain/jsonrpc/jsonrpc-tests",
+ "chain/network",
+ "chain/pool",
+ "chain/telemetry",
+ "core/async",
+ "core/chain-configs",
+ "core/crypto",
+ "core/dyn-configs",
+ "core/o11y",
+ "core/parameters",
+ "core/primitives",
+ "core/primitives-core",
+ "core/store",
+ "framework",
+ "genesis-tools/genesis-csv-to-json",
+ "genesis-tools/genesis-populate",
+ "genesis-tools/keypair-generator",
+ "integration-tests",
+ "runtime/unc-vm/test-api",
+ "runtime/unc-vm/compiler",
+ "runtime/unc-vm/compiler-singlepass",
+ "runtime/unc-vm/engine",
+ "runtime/unc-vm/vm",
+ "runtime/unc-vm/types",
+ "runtime/unc-vm/wast",
+ "runtime/unc-vm/compiler-test-derive",
+ "runtime/unc-vm-runner",
+ "runtime/unc-vm-runner/fuzz",
+ "runtime/unc-wallet-contract",
+ "runtime/runtime",
+ "runtime/runtime-params-estimator",
+ "runtime/runtime-params-estimator/estimator-warehouse",
+ "test-utils/actix-test-utils",
+ "test-utils/runtime-tester",
+ "test-utils/runtime-tester/fuzz",
+ "test-utils/store-validator",
+ "test-utils/testlib",
+ "test-utils/style",
+ "tools/database",
+ "tools/chainsync-loadtest",
+ "tools/fork-network",
+ "tools/indexer/example",
+ "tools/mirror",
+ "tools/mock-node",
+ "tools/ping",
+ "tools/restaked",
+ "tools/rpctypegen/core",
+ "tools/rpctypegen/macro",
+ "tools/speedy_sync",
+ "tools/state-parts",
+ "tools/state-parts-dump-check",
+ "tools/state-viewer",
+ "tools/storage-usage-delta-calculator",
+ "tools/themis",
+ "tools/undo-block",
+ "utils/config",
+ "utils/fmt",
+ "utils/mainnet-res",
+ "utils/unc-cache",
+ "utils/stdx",
+ "uncd",
+]
+
+[workspace.lints.rust]
+warnings = "deny"
+
+[workspace.lints.clippy]
+all = { level = "allow", priority = -100 }
+correctness = { level = "deny", priority = -50 }
+suspicious = { level = "deny", priority = -50 }
+perf = { level = "deny", priority = -50 }
+# overrides clippy::perf = "deny": https://github.com/rust-lang/rust-clippy/issues/8111
+single_char_pattern = "allow"
+clone_on_copy = "deny"
+derivable_impls = "deny"
+redundant_clone = "deny"
+len_zero = "deny"
+
+
+[workspace.dependencies]
+actix = "0.13.0"
+actix-cors = "0.6.1"
+actix-http = "3.3"
+actix-rt = "2"
+actix-web = "4.1"
+anyhow = "1.0.62"
+arbitrary = { version = "1.2.3", features = ["derive"] }
+arc-swap = "1.5"
+assert_matches = "1.5.0"
+async-recursion = "1.0.4"
+async-trait = "0.1.58"
+awc = { version = "3", features = ["openssl"] }
+backtrace = "0.3"
+base64 = "0.21"
+bencher = "0.1.5"
+bitflags = "1.2"
+blake2 = "0.9.1"
+bn = { package = "zeropool-bn", version = "0.5.11", default-features = false }
+bolero = { version = "0.10.0", git = "https://github.com/Ekleog-NEAR/bolero", rev = "56da8e6d1d018519a30b36d85d3a53fe35a42eaf", features = ["arbitrary"] }
+borsh = { version = "1.0.0", features = ["derive", "rc"] }
+bs58 = "0.4"
+bytes = "1"
+bytesize = { version = "1.1", features = ["serde"] }
+c2-chacha = "0.3"
+cargo_metadata = "0.14.1"
+cc = "1.0"
+cfg-if = "1.0"
+chrono = { version = "0.4.19", features = ["serde"] }
+clap = { version = "4.2.0", features = ["derive", "env", "string"] }
+cloud-storage = "0.11.1"
+conqueue = "0.4.0"
+cpu-time = "1.0"
+criterion = { version = "0.5.1", default_features = false, features = ["html_reports", "cargo_bench_support"] }
+crossbeam = "0.8"
+crossbeam-channel = "0.5.8"
+crossbeam-queue = "0.3.8"
+csv = "1.2.1"
+curve25519-dalek = { version = "4.1.1", default-features = false, features = ["alloc", "precomputed-tables", "rand_core"] }
+derive-enum-from-into = "0.1.1"
+derive_more = "0.99.9"
+dirs = "4"
+dynasm = "2.0"
+dynasmrt = "2.0"
+easy-ext = "0.2"
+ed25519-dalek = { version = "2.1.0", default-features = false, features = ["hazmat", "rand_core"] }
+elastic-array = "0.11"
+enum-map = "2.1.0"
+enumset = "1.0"
+expect-test = "1.3.0"
+finite-wasm = "0.5.0"
+flate2 = "1.0.22"
+fs2 = "0.4"
+futures = "0.3.5"
+futures-util = "0.3"
+genesis-populate = { path = "genesis-tools/genesis-populate" }
+hashbrown = "0.14.2"
+hex = { version = "0.4.2", features = ["serde"] }
+hex-literal = "0.2"
+hkdf = "0.12.3"
+hyper = { version = "0.14", features = ["full"] }
+hyper-tls = "0.5.0"
+im = "15"
+indexmap = "1.6"
+indicatif = { version = "0.15.0", features = ["with_rayon"] }
+insta = { version = "1.34.0", features = ["json", "yaml", "redactions"] }
+integration-tests = { path = "integration-tests" }
+itertools = "0.10.0"
+itoa = "1.0"
+json_comments = "0.2.1"
+lazy_static = "1.4"
+leb128 = "0.2"
+libc = "0.2.81"
+libfuzzer-sys = { version = "0.4", features = ["arbitrary-derive"] }
+log = "0.4"
+loupe = "0.1"
+lru = "0.7.2"
+memmap2 = "0.5"
+memoffset = "0.8"
+more-asserts = "0.2"
+unc-account-id = { version = "0.1.0", features = ["internal_unstable", "serde", "borsh"] }
+unc-actix-test-utils = { path = "test-utils/actix-test-utils" }
+unc-amend-genesis = { path = "tools/amend-genesis" }
+unc-database-tool= { path = "tools/database" }
+unc-async = { path = "core/async" }
+unc-cache = { path = "utils/unc-cache", version = "0.1.0" }
+unc-chain = { path = "chain/chain" }
+unc-chain-configs = { path = "core/chain-configs", version = "0.1.0" }
+unc-chain-primitives = { path = "chain/chain-primitives", version = "0.1.0" }
+unc-chunks = { path = "chain/chunks" }
+unc-chunks-primitives = { path = "chain/chunks-primitives", version = "0.1.0" }
+unc-client = { path = "chain/client" }
+unc-client-primitives = { path = "chain/client-primitives", version = "0.1.0" }
+unc-cold-store-tool = { path = "tools/cold-store", package = "cold-store-tool" }
+unc-config-utils = { path = "utils/config", version = "0.1.0" }
+framework = { path = "framework" }
+unc-crypto = { path = "core/crypto", version = "0.1.0" }
+unc-dyn-configs = { path = "core/dyn-configs", version = "0.1.0" }
+unc-epoch-manager = { path = "chain/epoch-manager" }
+unc-epoch-sync-tool = { path = "tools/epoch-sync"}
+unc-flat-storage = { path = "tools/flat-storage" }
+unc-fork-network = { path = "tools/fork-network" }
+unc-fmt = { path = "utils/fmt", version = "0.1.0" }
+unc-indexer = { path = "chain/indexer" }
+unc-indexer-primitives = { path = "chain/indexer-primitives", version = "0.1.0" }
+unc-jsonrpc = { path = "chain/jsonrpc" }
+unc-jsonrpc-adversarial-primitives = { path = "chain/jsonrpc-adversarial-primitives" }
+unc-jsonrpc-client = { path = "chain/jsonrpc/client" }
+unc-jsonrpc-primitives = { path = "chain/jsonrpc-primitives", features = ["full"], version = "0.1.0" }
+unc-jsonrpc-tests = { path = "chain/jsonrpc/jsonrpc-tests" }
+unc-mainnet-res = { path = "utils/mainnet-res" }
+unc-mirror = { path = "tools/mirror" }
+unc-network = { path = "chain/network" }
+unc-o11y = { path = "core/o11y", version = "0.1.0" }
+unc-parameters = { path = "core/parameters", version = "0.1.0" }
+unc-performance-metrics = { path = "utils/unc-performance-metrics" }
+unc-performance-metrics-macros = { path = "utils/unc-performance-metrics-macros" }
+unc-ping = { path = "tools/ping" }
+unc-pool = { path = "chain/pool" }
+unc-primitives = { path = "core/primitives", version = "0.1.0" }
+unc-primitives-core = { path = "core/primitives-core", version = "0.1.0" }
+unc-rpc-error-core = { path = "tools/rpctypegen/core", version = "0.1.0" }
+unc-rpc-error-macro = { path = "tools/rpctypegen/macro", version = "0.1.0" }
+unc-stable-hasher = { path = "utils/unc-stable-hasher", version = "0.1.0" }
+unc-state-parts = { path = "tools/state-parts" }
+unc-state-parts-dump-check = { path = "tools/state-parts-dump-check" }
+unc-state-viewer = { path = "tools/state-viewer", package = "state-viewer" }
+unc-store = { path = "core/store" }
+unc-telemetry = { path = "chain/telemetry" }
+unc-test-contracts = { path = "runtime/unc-test-contracts" }
+unc-undo-block = { path = "tools/undo-block" }
+unc-vm-test-api = { path = "runtime/unc-vm/test-api" }
+unc-vm-compiler = { path = "runtime/unc-vm/compiler", version = "0.1.0" }
+unc-vm-compiler-singlepass = { path = "runtime/unc-vm/compiler-singlepass", version = "0.1.0" }
+unc-vm-compiler-test-derive = { path = "runtime/unc-vm/compiler-test-derive" }
+unc-vm-engine = { path = "runtime/unc-vm/engine", version = "0.1.0" }
+unc-vm-engine-universal = { path = "runtime/unc-vm/engine-universal" }
+unc-vm-runner = { path = "runtime/unc-vm-runner", version = "0.1.0" }
+unc-vm-test-generator = { path = "runtime/unc-vm/test-generator" }
+unc-vm-types = { path = "runtime/unc-vm/types", version = "0.1.0" }
+unc-vm-vm = { path = "runtime/unc-vm/vm", version = "0.1.0" }
+unc-vm-wast = { path = "runtime/unc-vm/wast" }
+unc-wallet-contract = { path = "runtime/unc-wallet-contract" }
+nix = "0.24"
+node-runtime = { path = "runtime/runtime" }
+num-bigint = "0.3"
+num_cpus = "1.11"
+num-rational = { version = "0.3.1", features = ["serde"] }
+num-traits = "0.2.15"
+once_cell = "1.13.1"
+openssl = { version = "0.10.60", features = ["vendored"] }
+openssl-probe = "0.1.4"
+opentelemetry = { version = "0.17.0", features = ["rt-tokio", "trace"] }
+opentelemetry-otlp = "0.10.0"
+opentelemetry-semantic-conventions = "0.9.0"
+paperclip = { version = "0.8.0", features = ["actix4"] }
+parity-wasm = { version = "0.42", default-features = false }
+parity-wasm_41 = { package = "parity-wasm", version = "0.41" }
+parking_lot = "0.12.1"
+percent-encoding = "2.2.0"
+pin-project = "1.0"
+prefix-sum-vec = "0.1.2"
+pretty_assertions = "1.2"
+primitive-types = { version = "0.10", default-features = false }
+proc-macro2 = "1.0.64"
+prometheus = "0.13.1"
+protobuf = "3.0.1"
+protobuf-codegen = "3.0.1"
+pwasm-utils_12 = { package = "pwasm-utils", version = "0.12" }
+quote = "1.0"
+rand = "0.8.5"
+rand_chacha = "0.3.1"
+rand_core = "0.5"
+rand_hc = "0.3.1"
+rand_xorshift = "0.3"
+rayon = "1.5"
+redis = "0.23.0"
+reed-solomon-erasure = "4"
+regex = "1.7.1"
+region = "3.0"
+reqwest = { version = "0.11.14", features = ["blocking"] }
+ripemd = "0.1.1"
+rkyv = "0.7.31"
+rlimit = "0.7"
+rlp = "0.5.2"
+rocksdb = { version = "0.21.0", default-features = false, features = ["snappy", "lz4", "zstd", "zlib", "jemalloc"] }
+runtime-tester = { path = "test-utils/runtime-tester" }
+rusqlite = { version = "0.29.0", features = ["bundled", "chrono", "functions"] }
+rustc-demangle = "0.1"
+rust-s3 = { version = "0.32.3", features = ["blocking"] }
+rustix = "0.37"
+rsa = { version = "0.9.6", features = ["sha2", "getrandom"] }
+rsa-export = '0.3.3'
+secp256k1 = { version = "0.27.0", features = ["recovery", "rand-std"] }
+semver = "1.0.4"
+serde = { version = "1.0.136", features = ["alloc", "derive", "rc"] }
+serde_ignored = "0.1"
+serde_json = "1.0.68"
+serde_repr = "0.1.8"
+serde_with = { version = "3.0", features = ["base64"] }
+serde_yaml = "0.9"
+serial_test = "0.5"
+sha2 = "0.10"
+sha3 = "0.10"
+shell-escape = "0.1.5"
+smallvec = "1.6"
+smart-default = "0.6"
+smartstring = "1.0.1"
+strum = { version = "0.24", features = ["derive"] }
+stun = "0.4"
+subtle = "2.2"
+syn = { version = "2.0.4", features = ["extra-traits", "full"] }
+sysinfo = "0.24.5"
+tar = "0.4.38"
+target-lexicon = { version = "0.12.2", default-features = false }
+tempfile = "3.3"
+testlib = { path = "test-utils/testlib" }
+test-log = { version = "0.2", default-features = false, features = ["trace"] }
+thiserror = "1.0.30"
+tikv-jemallocator = "0.5.0"
+time = { version = "0.3.9", features = ["parsing", "serde"] }
+tokio = { version = "1.28", features = [
+ "fs",
+ "macros",
+ "net",
+ "rt-multi-thread",
+ "sync",
+ "time",
+] }
+tokio-stream = { version = "0.1.2", features = ["net"] }
+tokio-util = { version = "0.7.1", features = ["codec", "io"] }
+toml = "0.5.8"
+tqdm = "0.4.4"
+tracing = { version = "0.1.36", features = ["std"] }
+tracing-appender = "0.2.2"
+tracing-opentelemetry = "0.17.0"
+tracing-span-tree = "0.1"
+tracing-subscriber = { version = "0.3.15", features = ["env-filter", "fmt", "registry", "std"] }
+trybuild = "1.0.11"
+turn = "0.6"
+validator = "0.12"
+wasm-encoder = "0.27.0"
+wasmer-compiler = { package = "wasmer-compiler-near", version = "=2.4.1" }
+wasmer-compiler-singlepass = { package = "wasmer-compiler-singlepass-near", version = "=2.4.1" }
+wasmer-engine = { package = "wasmer-engine-near", version = "=2.4.1" }
+wasmer-engine-universal = { package = "wasmer-engine-universal-near", version = "=2.4.1", features = ["compiler"] }
+wasmer-runtime = { version = "0.18.0", package = "wasmer-runtime-near", features = ["default-backend-singlepass"], default-features = false }
+wasmer-runtime-core = { version = "0.18.2", package = "wasmer-runtime-core-near" }
+wasmer-types = { package = "wasmer-types-near", version = "=2.4.1" }
+wasmer-vm = { package = "wasmer-vm-near", version = "=2.4.1" }
+wasmparser = "0.78" # TODO: unify at least the versions of wasmparser we have in our codebase
+wasmprinter = "0.2"
+wasm-smith = "0.10"
+wasmtime = { version = "14.0.4", default-features = false, features = ["cranelift"] }
+wast = "40.0"
+wat = "1.0.40"
+webrtc-util = "0.7"
+winapi = { version = "0.3", features = ["winbase", "memoryapi", "errhandlingapi", "winnt", "impl-default"] }
+xshell = "0.2.1"
+xz2 = "0.1.6"
+yansi = "0.5.1"
+
+stdx = { package = "unc-stdx", path = "utils/stdx", version = "0.1.0" }
+
+[patch.crates-io]
+
+# Note that "bench" profile inherits from "release" profile and
+# "test" profile inherits from "dev" profile.
+# https://doc.rust-lang.org/cargo/reference/profiles.html#test
+
+[profile.dev]
+panic = 'abort'
+
+[profile.release]
+overflow-checks = true
+panic = 'abort'
+lto = "fat"
+codegen-units = 1
+
+# A much faster to compile version of `release`, for development use.
+[profile.dev-release]
+inherits = "release"
+lto = false
+codegen-units = 16
+debug-assertions = true
+
+# Used for fuzzing, LTO is ill-supported as of 2023-09 and so should not be enabled.
+[profile.fuzz]
+inherits = "dev"
+opt-level = 3
+incremental = false
+codegen-units = 1
+
+# Compile some dependencies with optimizations to speed up tests.
+[profile.dev.package.hex]
+opt-level = 3
+[profile.dev.package.rand]
+opt-level = 3
+[profile.dev.package.bs58]
+opt-level = 3
+[profile.dev.package.sha2]
+opt-level = 3
+[profile.dev.package.curve25519-dalek]
+opt-level = 3
+[profile.dev.package.unsafe-libyaml]
+opt-level = 3
+[profile.dev.package.hashbrown]
+opt-level = 3
+[profile.dev.package.dynasmrt]
+opt-level = 3
+[profile.dev.package."*"]
+opt-level = 1
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 000000000..49c0db065
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,46 @@
+# syntax=docker/dockerfile-upstream:experimental
+
+FROM ubuntu:22.04 as build
+
+RUN apt-get update -qq && apt-get install -y \
+ git \
+ cmake \
+ g++ \
+ pkg-config \
+ libssl-dev \
+ curl \
+ llvm \
+ clang \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY ./rust-toolchain.toml /tmp/rust-toolchain.toml
+
+ENV RUSTUP_HOME=/usr/local/rustup \
+ CARGO_HOME=/usr/local/cargo \
+ PATH=/usr/local/cargo/bin:$PATH
+
+RUN curl https://sh.rustup.rs -sSf | \
+ sh -s -- -y --no-modify-path --default-toolchain none
+
+VOLUME [ /near ]
+WORKDIR /near
+COPY . .
+
+ENV PORTABLE=ON
+ARG make_target=
+RUN make CARGO_TARGET_DIR=/tmp/target \
+ "${make_target:?make_target not set}"
+
+# Docker image
+FROM ubuntu:22.04
+
+EXPOSE 3030 24567
+
+RUN apt-get update -qq && apt-get install -y \
+ libssl-dev ca-certificates \
+ && rm -rf /var/lib/apt/lists/*
+
+COPY scripts/run_docker.sh /usr/local/bin/run.sh
+COPY --from=build /tmp/target/release/uncd /usr/local/bin/
+
+CMD ["/usr/local/bin/run.sh"]
diff --git a/Justfile b/Justfile
new file mode 100644
index 000000000..e4d9b53f9
--- /dev/null
+++ b/Justfile
@@ -0,0 +1,98 @@
+# FIXME: some of these tests don't work very well on MacOS at the moment. Should fix
+# them at earliest convenience :)
+# Also in addition to this, the `nextest-integration` test is currently disabled on macos
+with_macos_excludes := if os() == "macos" {
+ "--exclude node-runtime --exclude runtime-params-estimator --exclude unc-network --exclude estimator-warehouse"
+} else {
+ ""
+}
+nightly_flags := "--features nightly,test_features"
+
+export RUST_BACKTRACE := env("RUST_BACKTRACE", "short")
+ci_hack_nextest_profile := if env("CI_HACKS", "0") == "1" { "--profile ci" } else { "" }
+
+# all the tests, as close to CI as possible
+test: test-ci test-extra
+
+# only the tests that are exactly the same as the ones in CI
+test-ci: (nextest "stable") (nextest "nightly") python-style-checks
+
+# tests that are as close to CI as possible, but not exactly the same code
+test-extra: check-lychee
+
+# all cargo tests, TYPE is "stable" or "nightly"
+nextest TYPE *FLAGS: (nextest-unit TYPE FLAGS) (nextest-integration TYPE FLAGS)
+
+# cargo unit tests, TYPE is "stable" or "nightly"
+nextest-unit TYPE *FLAGS:
+ cargo nextest run \
+ --locked \
+ --workspace \
+ --exclude integration-tests \
+ --cargo-profile dev-release \
+ {{ ci_hack_nextest_profile }} \
+ {{ with_macos_excludes }} \
+ {{ if TYPE == "nightly" { nightly_flags } \
+ else if TYPE == "stable" { "" } \
+ else { error("TYPE is neighter 'nightly' nor 'stable'") } }} \
+ {{ FLAGS }}
+
+# cargo integration tests, TYPE is "stable" or "nightly"
+[linux]
+nextest-integration TYPE *FLAGS:
+ cargo nextest run \
+ --locked \
+ --package integration-tests \
+ --cargo-profile dev-release \
+ {{ ci_hack_nextest_profile }} \
+ {{ if TYPE == "nightly" { nightly_flags } \
+ else if TYPE == "stable" { "" } \
+ else { error("TYPE is neither 'nightly' nor 'stable'") } }} \
+ {{ FLAGS }}
+# Note: when re-enabling this on macos, ci.yml will need to be adjusted to report code coverage again
+[macos]
+nextest-integration TYPE *FLAGS:
+ @echo "Nextest integration tests are currently disabled on macos!"
+
+# generate a codecov report for RULE
+codecov RULE:
+ #!/usr/bin/env bash
+ set -euxo pipefail
+ # Note: macos seems to not support `source <()` as a way to set environment variables, but
+ # this variant seems to work on both linux and macos.
+ # TODO: remove the RUSTFLAGS hack, see also https://github.com/rust-lang/cargo/issues/13040
+ cargo llvm-cov show-env --export-prefix | grep -v RUSTFLAGS > env
+ source ./env
+ export RUSTC_WORKSPACE_WRAPPER="{{ absolute_path("scripts/rustc-coverage-wrapper.sh") }}"
+ {{ just_executable() }} {{ RULE }}
+ cargo llvm-cov report --profile dev-release --codecov --output-path codecov.json
+ # See https://github.com/taiki-e/cargo-llvm-cov/issues/292
+ find target -name '*.profraw' -delete
+
+# style checks from python scripts
+python-style-checks:
+ python3 scripts/check_nightly.py
+ python3 scripts/check_pytests.py
+ python3 scripts/fix_nightly_feature_flags.py
+ ./scripts/formatting --check
+
+# lychee-based url validity checks
+check-lychee:
+ # This is not actually run in CI. GITHUB_TOKEN can still be set locally by people who want
+ # to reproduce CI behavior in a better way.
+ git ls-files | grep 'md$\|mkd$\|html\?$' | xargs lychee {{ if env("GITHUB_TOKEN", "") != "" { "" } else { "-a 429" } }}
+ @echo {{ if env("GITHUB_TOKEN", "") != "" { "" } \
+ else { "Note: 'Too Many Requests' errors are allowed here but not in CI, set GITHUB_TOKEN to check them" } }}
+
+# build target/rpc_errors_schema.json
+build-rpc-errors-schema:
+ rm -f target/rpc_errors_schema.json
+ cargo check -p unc-jsonrpc --features dump_errors_schema
+
+# update chain/jsonrpc/res/rpc_errors_schema.json
+update-rpc-errors-schema: build-rpc-errors-schema
+ cp target/rpc_errors_schema.json chain/jsonrpc/res/rpc_errors_schema.json
+
+# check chain/jsonrpc/res/rpc_errors_schema.json
+check-rpc-errors-schema: build-rpc-errors-schema
+ diff target/rpc_errors_schema.json chain/jsonrpc/res/rpc_errors_schema.json
diff --git a/LICENSE-APACHE b/LICENSE-APACHE
new file mode 100644
index 000000000..f49a4e16e
--- /dev/null
+++ b/LICENSE-APACHE
@@ -0,0 +1,201 @@
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
\ No newline at end of file
diff --git a/LICENSE-MIT b/LICENSE-MIT
new file mode 100644
index 000000000..749aa1ecd
--- /dev/null
+++ b/LICENSE-MIT
@@ -0,0 +1,19 @@
+The MIT License (MIT)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
\ No newline at end of file
diff --git a/Makefile b/Makefile
new file mode 100644
index 000000000..73fb2885d
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,96 @@
+export DOCKER_BUILDKIT = 1
+export CARGO_BUILD_RUSTFLAGS = -D warnings
+export UNC_RELEASE_BUILD = no
+export CARGO_TARGET_DIR = target
+
+
+# By default, build a regular release
+all: release
+
+
+docker-framework: DOCKER_TAG ?= framework
+docker-framework:
+ docker build -t $(DOCKER_TAG) -f Dockerfile --build-arg=make_target=uncd-release --progress=plain .
+
+docker-framework-sandbox: DOCKER_TAG ?= framework-sandbox
+docker-framework-sandbox:
+ docker build -t $(DOCKER_TAG) -f Dockerfile --build-arg=make_target=uncd-sandbox-release --progress=plain .
+
+docker-framework-nightly: DOCKER_TAG ?= framework-nightly
+docker-framework-nightly:
+ docker build -t $(DOCKER_TAG) -f Dockerfile --build-arg=make_target=uncd-nightly-release --progress=plain .
+
+
+release: uncd-release
+ cargo build -p store-validator --release
+ cargo build -p genesis-populate --release
+ $(MAKE) sandbox-release
+
+uncd: uncd-release
+ @echo 'uncd binary ready in ./target/release/uncd'
+
+uncd-release: UNC_RELEASE_BUILD=release
+uncd-release:
+ cargo build -p uncd --release
+
+uncd-debug:
+ cargo build -p uncd
+
+debug: uncd-debug
+ cargo build -p store-validator
+ cargo build -p genesis-populate
+ $(MAKE) sandbox
+
+
+perf-release: UNC_RELEASE_BUILD=release
+perf-release:
+ CARGO_PROFILE_RELEASE_DEBUG=true cargo build -p uncd --release --features performance_stats
+ cargo build -p store-validator --release --features framework/performance_stats
+
+
+perf-debug:
+ cargo build -p uncd --features performance_stats
+ cargo build -p store-validator --features framework/performance_stats
+
+
+nightly-release: uncd-nightly-release
+ cargo build -p store-validator --release --features framework/nightly,framework/performance_stats
+ cargo build -p genesis-populate --release --features framework/nightly,framework/performance_stats
+
+uncd-nightly-release:
+ cargo build -p uncd --release --features nightly,performance_stats
+
+
+nightly-debug:
+ cargo build -p uncd --features nightly,performance_stats
+ cargo build -p store-validator --features framework/nightly,framework/performance_stats
+ cargo build -p genesis-populate --features framework/nightly,framework/performance_stats
+
+
+assertions-release: UNC_RELEASE_BUILD=release
+assertions-release:
+ CARGO_PROFILE_RELEASE_DEBUG=true CARGO_PROFILE_RELEASE_DEBUG_ASSERTIONS=true cargo build -p uncd --release --features performance_stats
+
+sandbox: CARGO_TARGET_DIR=sandbox
+sandbox: uncd-sandbox
+ mkdir -p target/debug
+ ln -f sandbox/debug/uncd target/debug/uncd-sandbox
+ @ln -f sandbox/debug/uncd target/debug/unc-sandbox
+
+uncd-sandbox:
+ cargo build -p uncd --features sandbox
+
+
+sandbox-release: CARGO_TARGET_DIR=sandbox
+sandbox-release: uncd-sandbox-release
+ mkdir -p target/release
+ ln -f sandbox/release/uncd target/release/uncd-sandbox
+ @ln -f sandbox/release/uncd target/release/unc-sandbox
+
+uncd-sandbox-release:
+ cargo build -p uncd --features sandbox --release
+
+
+.PHONY: docker-framework docker-framework-nightly release uncd debug
+.PHONY: perf-release perf-debug nightly-release nightly-debug assertions-release sandbox
+.PHONY: sandbox-release
diff --git a/README.md b/README.md
new file mode 100644
index 000000000..04721b7c8
--- /dev/null
+++ b/README.md
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+## Reference implementation of UNC Protocol
+
+![Buildkite](https://img.shields.io/buildkite/0eae07525f8e44a19b48fa937813e2c21ee04aa351361cd851)
+![Stable Status][stable-release]
+![Prerelease Status][prerelease]
+[![codecov][codecov-badge]][codecov-url]
+[![Discord chat][discord-badge]][discord-url]
+[![Telegram Group][telegram-badge]][telegram-url]
+
+[stable-release]: https://img.shields.io/github/v/release/utnet-org/utility?label=stable
+[prerelease]: https://img.shields.io/github/v/release/utnet-org/utility?include_prereleases&label=prerelease
+[ci-badge-master]: https://badge.buildkite.com/a81147cb62c585cc434459eedd1d25e521453120ead9ee6c64.svg?branch=master
+[ci-url]: https://buildkite.com/utnet-org/utility
+[codecov-badge]: https://codecov.io/gh/utnet-org/utility/branch/master/graph/badge.svg
+[codecov-url]: https://codecov.io/gh/utnet-org/utility
+[discord-badge]: https://img.shields.io/discord/490367152054992913.svg
+[discord-url]: https://unc.chat
+[telegram-badge]: https://cdn.jsdelivr.net/gh/Patrolavia/telegram-badge@8fe3382b3fd3a1c533ba270e608035a27e430c2e/chat.svg
+[telegram-url]: https://t.me/cryptounc
+
+## About UNC
+
+UNC's purpose is to enable community-driven innovation to benefit people around the world.
+
+To achieve this purpose, *UNC* provides a developer platform where developers and entrepreneurs can create apps that put users back in control of their data and assets, which is the foundation of ["Open Web" movement][open-web-url].
+
+One of the components of *UNC* is the UNC Protocol, an infrastructure for server-less applications and smart contracts powered by a blockchain.
+UNC Protocol is built to deliver usability and scalability of modern PaaS like Firebase at fraction of the prices that blockchains like Ethereum charge.
+
+Overall, *UNC* provides a wide range of tools for developers to easily build applications:
+ - [JS Client library][js-api] to connect to UNC Protocol from your applications.
+ - [Rust][rust-sdk] and [JavaScript/TypeScript][js-sdk] SDKs to write smart contracts and stateful server-less functions.
+ - [Numerous examples][examples-url] with links to hack on them right inside your browser.
+ - [Lots of documentation][docs-url], with [Tutorials][tutorials-url] and [API docs][api-docs-url].
+
+[open-web-url]: https://techcrunch.com/2016/04/10/1301496/
+[js-api]: https://github.com/utnet-org/utility/unc-api-js
+[rust-sdk]: https://github.com/utnet-org/utility/unc-sdk-rs
+[js-sdk]: https://github.com/utnet-org/utility/unc-sdk-js
+[examples-url]: https://utnet-org/utility.dev
+[docs-url]: https://docs.utnet-org/utility.org
+[tutorials-url]: https://docs.utnet-org/utility.org/tutorials/welcome
+[api-docs-url]: https://docs.utnet-org/utility.org/api/rpc/introduction
+
+## Join the Network
+
+The easiest way to join the network, is by using the `make release` command, which you can install as follows:
+
+```bash
+cd utility
+make release
+```
+
+You can join all the active networks:
+```
+# mainnet or testnet node init
+./target/release/uncd --home ~/.unc init --chain-id [testnet, mainnet] --download-genesis --download-config
+
+# localnet node init
+./target/release/uncd localnet
+
+# node run
+./target/release/uncd --home ~/.unc run
+```
+
+
+To learn how to become validator, checkout [documentation](https://docs.utnet-org/utility.org/docs/develop/node/validator/staking-and-delegation).
+
+## Contributing
+
+The workflow and details of setup to contribute are described in [CONTRIBUTING.md](CONTRIBUTING.md), and security policy is described in [SECURITY.md](SECURITY.md).
+To propose new protocol changes or standards use [Specification & Standards repository](https://github.com/nearprotocol/NEPs).
+
+## Getting in Touch
+
+We use Zulip for semi-synchronous technical discussion, feel free to chime in:
+
+https://utnet-org/utility.zulipchat.com/
+
+For non-technical discussion and overall direction of the project, see our Discourse forum:
+
+https://gov.utnet-org/utility.org
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 000000000..d8f1ed0eb
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,46 @@
+# Security Policy
+
+Reference client for NEAR is held to the highest security standard.
+This document defines the policy on how to report vulnerabilities and receive updates when security patches are released.
+
+If you have any suggestions or comments about the security policy, please email the [NEAR Security Team](mailto:security@near.org) at security@near.org
+
+## Reporting a vulnerability
+
+All security issues should be submitted on [hackenproof](https://hackenproof.com/unc). The team will review the submissions and decide whether they are eligible for bounty payouts. For more details, please check out the program description on the hackenproof website.
+
+## Handling & disclosure process
+
+1. Security report is received and assigned to an owner. This person will coordinate the process of evaluating, fixing, releasing and disclosing the issue.
+2. After initial report is received, the evaluation process is performed. It's identified if the issue exists, its severity and which version / components of the code is affected. Additional review to identify similar issues also happens.
+3. Fixes are implemented for all supported releases. These fixes are not publicly communicated but held in a private repo of the Security Team or locally.
+4. A suggested announcement date for this vulnerability is chosen. The notification is drafted and includes patches to all supported versions and affected components.
+5. On the announcement date, the [NEAR Security Update newsletter](https://groups.google.com/a/near.org/g/security-updates) is sent an announcement. The changes are fast tracked and merged into the public repository. At least 6 hours after the mailing list is notified, a copy of the advisory will be published across social channels.
+
+This process may take time, especially when coordinating with network participants and maintainers of other components in the ecosystem.
+The goal will be to address issues in as short of a period as possible, but it's important that the process described above to ensure that disclosures are handled in a consistent manner.
+
+*Note:* If the Security Team identifies that an issue is mission-critical and requires a subset of network participants to update prior to newsletter announcement - this will be done in a manual way by communicating via direct channels.
+
+## Reward
+
+The discovery of the security vulnerabilities that include but are not limited to the following categories will be rewarded proportionally to their severity:
+* Algorithmic, implementation, and economic issues that violate safety of the blockchain;
+* Algorithmic, implementation, and economic issues that stall the blockchain or significantly throttle liveness;
+* Algorithmic, implementation, and economic issues in the standard contracts developed by NEAR;
+* Issues that expose the private data of the users, the developers, or the validators;
+
+The following are the necessary conditions for the reward:
+* The vulnerability is disclosed to NEAR before it is disclosed publicly and NEAR is given sufficient time to fix it;
+* The vulnerability is not disclosed to anyone else except the finder and NEAR before it is fixed;
+* The vulnerability is not exploited until it is fixed.
+
+### Rewards platform
+
+We are using https://gitcoin.co/ to reward tokens. Meaning that every security vulnerability that you submit to us will be processed like a general work-item by an external contributor. To receive the reward, you would need to register on https://gitcoin.co/ and be able to receive the reward through it. Example of a reward for a security vulnerability finding: https://gitcoin.co/issue/near/community/5/4359
+
+
+## Receive Security Updates
+
+If you want to be informed about security vulnerabilities, please subscribe to the [NEAR Security Update newsletter](https://groups.google.com/a/near.org/g/security-updates).
+The newsletter is very low traffic and only sent out where public disclosure of a vulnerability happens.
diff --git a/buf.yaml b/buf.yaml
new file mode 100644
index 000000000..93e819b2f
--- /dev/null
+++ b/buf.yaml
@@ -0,0 +1,4 @@
+version: v1
+breaking:
+ use:
+ - WIRE
diff --git a/chain/chain-primitives/Cargo.toml b/chain/chain-primitives/Cargo.toml
new file mode 100644
index 000000000..3f7ea0fc2
--- /dev/null
+++ b/chain/chain-primitives/Cargo.toml
@@ -0,0 +1,23 @@
+[package]
+name = "unc-chain-primitives"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+description = "This crate hosts NEAR chain-related error types"
+repository.workspace = true
+license.workspace = true
+publish = true
+
+[lints]
+workspace = true
+
+[dependencies]
+chrono.workspace = true
+thiserror.workspace = true
+tracing.workspace = true
+
+unc-primitives.workspace = true
+unc-crypto.workspace = true
+
+[features]
+new_epoch_sync = []
diff --git a/chain/chain-primitives/README.md b/chain/chain-primitives/README.md
new file mode 100644
index 000000000..fd899e852
--- /dev/null
+++ b/chain/chain-primitives/README.md
@@ -0,0 +1,3 @@
+# unc-chain-primitives
+
+This crate hosts NEAR chain-related error types.
\ No newline at end of file
diff --git a/chain/chain-primitives/src/error.rs b/chain/chain-primitives/src/error.rs
new file mode 100644
index 000000000..bb2ae0c21
--- /dev/null
+++ b/chain/chain-primitives/src/error.rs
@@ -0,0 +1,469 @@
+use std::io;
+
+use chrono::DateTime;
+use chrono::Utc;
+
+use unc_primitives::block::BlockValidityError;
+use unc_primitives::challenge::{ChunkProofs, ChunkState};
+use unc_primitives::errors::{BlockError, EpochError, StorageError};
+use unc_primitives::hash::CryptoHash;
+use unc_primitives::shard_layout::ShardLayoutError;
+use unc_primitives::sharding::{ChunkHash, ShardChunkHeader};
+use unc_primitives::types::{BlockHeight, EpochId, ShardId};
+
+#[derive(thiserror::Error, Debug)]
+pub enum QueryError {
+ #[error("Account ID {requested_account_id} is invalid")]
+ InvalidAccount {
+ requested_account_id: unc_primitives::types::AccountId,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+ #[error("Account {requested_account_id} does not exist while viewing")]
+ UnknownAccount {
+ requested_account_id: unc_primitives::types::AccountId,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+ #[error(
+ "Contract code for contract ID {contract_account_id} has never been observed on the node"
+ )]
+ NoContractCode {
+ contract_account_id: unc_primitives::types::AccountId,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+ #[error("Access key for public key {public_key} does not exist while viewing")]
+ UnknownAccessKey {
+ public_key: unc_crypto::PublicKey,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+ #[error("Internal error occurred: {error_message}")]
+ InternalError {
+ error_message: String,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+ #[error("Function call returned an error: {error_message}")]
+ ContractExecutionError {
+ error_message: String,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+ #[error("The state of account {requested_account_id} is too large")]
+ TooLargeContractState {
+ requested_account_id: unc_primitives::types::AccountId,
+ block_height: unc_primitives::types::BlockHeight,
+ block_hash: unc_primitives::hash::CryptoHash,
+ },
+}
+
+#[derive(Debug, thiserror::Error)]
+pub enum Error {
+ /// The block is already known
+ #[error("Block is known: {0}")]
+ BlockKnown(#[from] BlockKnownError),
+ #[error("Too many blocks being processed")]
+ TooManyProcessingBlocks,
+ /// Orphan block.
+ #[error("Orphan")]
+ Orphan,
+ /// Chunk is missing.
+ #[error("Chunk Missing (unavailable on the node): {0:?}")]
+ ChunkMissing(ChunkHash),
+ /// Chunks missing with header info.
+ #[error("Chunks Missing: {0:?}")]
+ ChunksMissing(Vec),
+ /// Block time is before parent block time.
+ #[error("Invalid Block Time: block time {1} before previous {0}")]
+ InvalidBlockPastTime(DateTime, DateTime),
+ /// Block time is from too much in the future.
+ #[error("Invalid Block Time: Too far in the future: {0}")]
+ InvalidBlockFutureTime(DateTime),
+ /// Block height is invalid (not previous + 1).
+ #[error("Invalid Block Height {0}")]
+ InvalidBlockHeight(BlockHeight),
+ /// Invalid block proposed signature.
+ #[error("Invalid Block Proposer Signature")]
+ InvalidBlockProposer,
+ /// Invalid state root hash.
+ #[error("Invalid State Root Hash")]
+ InvalidStateRoot,
+ /// Invalid block tx root hash.
+ #[error("Invalid Block Tx Root Hash")]
+ InvalidTxRoot,
+ /// Invalid chunk receipts root hash.
+ #[error("Invalid Chunk Receipts Root Hash")]
+ InvalidChunkReceiptsRoot,
+ /// Invalid chunk headers root hash.
+ #[error("Invalid Chunk Headers Root Hash")]
+ InvalidChunkHeadersRoot,
+ /// Invalid chunk tx root hash.
+ #[error("Invalid Chunk Tx Root Hash")]
+ InvalidChunkTxRoot,
+ /// Invalid receipts proof.
+ #[error("Invalid Receipts Proof")]
+ InvalidReceiptsProof,
+ /// Invalid outcomes proof.
+ #[error("Invalid Outcomes Proof")]
+ InvalidOutcomesProof,
+ /// Invalid state payload on state sync.
+ #[error("Invalid State Payload")]
+ InvalidStatePayload,
+ /// Invalid transactions in the block.
+ #[error("Invalid Transactions")]
+ InvalidTransactions,
+ /// Invalid Challenge Root (doesn't match actual challenge)
+ #[error("Invalid Challenge Root")]
+ InvalidChallengeRoot,
+ /// Invalid challenge (wrong signature or format).
+ #[error("Invalid Challenge")]
+ InvalidChallenge,
+ /// Incorrect (malicious) challenge (slash the sender).
+ #[error("Malicious Challenge")]
+ MaliciousChallenge,
+ /// Incorrect number of chunk headers
+ #[error("Incorrect Number of Chunk Headers")]
+ IncorrectNumberOfChunkHeaders,
+ /// Invalid chunk.
+ #[error("Invalid Chunk")]
+ InvalidChunk,
+ /// One of the chunks has invalid proofs
+ #[error("Invalid Chunk Proofs")]
+ InvalidChunkProofs(Box),
+ /// Invalid chunk state.
+ #[error("Invalid Chunk State")]
+ InvalidChunkState(Box),
+ #[error("Invalid Chunk State Witness")]
+ InvalidChunkStateWitness(String),
+ /// Invalid chunk mask
+ #[error("Invalid Chunk Mask")]
+ InvalidChunkMask,
+ /// The chunk height is outside of the horizon
+ #[error("Invalid Chunk Height")]
+ InvalidChunkHeight,
+ /// Invalid epoch hash
+ #[error("Invalid Epoch Hash")]
+ InvalidEpochHash,
+ /// `next_bps_hash` doens't correspond to the actual next block producers set
+ #[error("Invalid Next BP Hash")]
+ InvalidNextBPHash,
+ /// The block has a protocol version that's outdated
+ #[error("Invalid protocol version")]
+ InvalidProtocolVersion,
+ /// The block doesn't have approvals from 50% of the block producers
+ #[error("Not enough approvals")]
+ NotEnoughApprovals,
+ /// The information about the last final block is incorrect
+ #[error("Invalid finality info")]
+ InvalidFinalityInfo,
+ /// Invalid validator proposals in the block.
+ #[error("Invalid Validator Proposals")]
+ InvalidValidatorProposals,
+ /// Invalid Signature
+ #[error("Invalid Signature")]
+ InvalidSignature,
+ /// Invalid Approvals
+ #[error("Invalid Approvals")]
+ InvalidApprovals,
+ /// Invalid Gas Limit
+ #[error("Invalid Gas Limit")]
+ InvalidGasLimit,
+ /// Invalid Gas Price
+ #[error("Invalid Gas Price")]
+ InvalidGasPrice,
+ /// Invalid Gas Used
+ #[error("Invalid Gas Used")]
+ InvalidGasUsed,
+ /// Invalid Balance Burnt
+ #[error("Invalid Balance Burnt")]
+ InvalidBalanceBurnt,
+ /// Invalid shard id
+ #[error("Shard id {0} does not exist")]
+ InvalidShardId(ShardId),
+ /// Invalid shard id
+ #[error("Invalid state request: {0}")]
+ InvalidStateRequest(String),
+ /// Invalid VRF proof, or incorrect random_output in the header
+ #[error("Invalid Randomness Beacon Output")]
+ InvalidRandomnessBeaconOutput,
+ /// Invalid block merkle root.
+ #[error("Invalid Block Merkle Root")]
+ InvalidBlockMerkleRoot,
+ /// Invalid split shard ids.
+ #[error("Invalid Split Shard Ids when resharding. shard_id: {0}, parent_shard_id: {1}")]
+ InvalidSplitShardsIds(u64, u64),
+ /// Someone is not a validator. Usually happens in signature verification
+ #[error("Not A Validator")]
+ NotAValidator,
+ /// Someone is not a chunk validator. Happens if we're asked to validate a chunk we're not
+ /// supposed to validate, or to verify a chunk approval signed by a validator that isn't
+ /// supposed to validate the chunk.
+ #[error("Not A Chunk Validator")]
+ NotAChunkValidator,
+ /// Validator error.
+ #[error("Validator Error: {0}")]
+ ValidatorError(String),
+ /// Block out of bounds. Usually if received block is too far in the future or alternative fork.
+ #[error("Epoch Out Of Bounds: {:?}", _0)]
+ BlockOutOfBounds(CryptoHash),
+ /// Epoch out of bounds. Usually if received block is too far in the future or alternative fork.
+ #[error("Epoch Out Of Bounds: {:?}", _0)]
+ EpochOutOfBounds(EpochId),
+ /// A challenged block is on the chain that was attempted to become the head
+ #[error("Challenged block on chain")]
+ ChallengedBlockOnChain,
+ /// Block cannot be finalized.
+ #[error("Block cannot be finalized")]
+ CannotBeFinalized,
+ /// IO Error.
+ #[error("IO Error: {0}")]
+ IOErr(#[from] io::Error),
+ /// Not found record in the DB.
+ #[error("DB Not Found Error: {0}")]
+ DBNotFoundErr(String),
+ /// Storage error. Used for internal passing the error.
+ #[error("Storage Error: {0}")]
+ StorageError(#[from] StorageError),
+ /// GC error.
+ #[error("GC Error: {0}")]
+ GCError(String),
+ /// Anything else
+ #[error("Other Error: {0}")]
+ Other(String),
+}
+
+/// For now StorageError can happen at any time from ViewClient because of
+/// the used isolation level + running ViewClient in a separate thread.
+pub trait LogTransientStorageError {
+ fn log_storage_error(self, message: &str) -> Self;
+}
+
+impl LogTransientStorageError for Result {
+ fn log_storage_error(self, message: &str) -> Self {
+ if let Err(err) = &self {
+ tracing::error!(target: "client", "Transient storage error: {message}, {err}");
+ }
+ self
+ }
+}
+
+impl Error {
+ pub fn is_bad_data(&self) -> bool {
+ match self {
+ Error::BlockKnown(_)
+ | Error::TooManyProcessingBlocks
+ | Error::Orphan
+ | Error::ChunkMissing(_)
+ | Error::ChunksMissing(_)
+ | Error::InvalidChunkHeight
+ | Error::IOErr(_)
+ | Error::Other(_)
+ | Error::ValidatorError(_)
+ | Error::EpochOutOfBounds(_)
+ | Error::ChallengedBlockOnChain
+ | Error::CannotBeFinalized
+ | Error::StorageError(_)
+ | Error::GCError(_)
+ | Error::DBNotFoundErr(_) => false,
+ Error::InvalidBlockPastTime(_, _)
+ | Error::InvalidBlockFutureTime(_)
+ | Error::InvalidBlockHeight(_)
+ | Error::InvalidBlockProposer
+ | Error::InvalidChunk
+ | Error::InvalidChunkProofs(_)
+ | Error::InvalidChunkState(_)
+ | Error::InvalidChunkStateWitness(_)
+ | Error::InvalidChunkMask
+ | Error::InvalidStateRoot
+ | Error::InvalidTxRoot
+ | Error::InvalidChunkReceiptsRoot
+ | Error::InvalidOutcomesProof
+ | Error::InvalidChunkHeadersRoot
+ | Error::InvalidChunkTxRoot
+ | Error::InvalidReceiptsProof
+ | Error::InvalidStatePayload
+ | Error::InvalidTransactions
+ | Error::InvalidChallenge
+ | Error::InvalidSplitShardsIds(_, _)
+ | Error::MaliciousChallenge
+ | Error::IncorrectNumberOfChunkHeaders
+ | Error::InvalidEpochHash
+ | Error::InvalidNextBPHash
+ | Error::NotEnoughApprovals
+ | Error::InvalidFinalityInfo
+ | Error::InvalidValidatorProposals
+ | Error::InvalidSignature
+ | Error::InvalidApprovals
+ | Error::InvalidGasLimit
+ | Error::InvalidGasPrice
+ | Error::InvalidGasUsed
+ | Error::InvalidBalanceBurnt
+ | Error::InvalidShardId(_)
+ | Error::InvalidStateRequest(_)
+ | Error::InvalidRandomnessBeaconOutput
+ | Error::InvalidBlockMerkleRoot
+ | Error::InvalidProtocolVersion
+ | Error::NotAValidator
+ | Error::NotAChunkValidator
+ | Error::BlockOutOfBounds(_)
+ | Error::InvalidChallengeRoot => true,
+ }
+ }
+
+ pub fn is_error(&self) -> bool {
+ match self {
+ Error::IOErr(_) | Error::Other(_) | Error::DBNotFoundErr(_) => true,
+ _ => false,
+ }
+ }
+
+ /// Some blockchain errors are reported in the prometheus metrics. In such cases a report might
+ /// contain a label that specifies the type of error that has occured. For example when the node
+ /// receives a block with an invalid signature this would be reported as:
+ /// `unc_num_invalid_blocks{error="invalid_signature"}`.
+ /// This function returns the value of the error label for a specific instance of Error.
+ pub fn prometheus_label_value(&self) -> &'static str {
+ match self {
+ Error::BlockKnown(_) => "block_known",
+ Error::TooManyProcessingBlocks => "too_many_processing_blocks",
+ Error::Orphan => "orphan",
+ Error::ChunkMissing(_) => "chunk_missing",
+ Error::ChunksMissing(_) => "chunks_missing",
+ Error::InvalidChunkHeight => "invalid_chunk_height",
+ Error::IOErr(_) => "io_err",
+ Error::Other(_) => "other",
+ Error::ValidatorError(_) => "validator_error",
+ Error::EpochOutOfBounds(_) => "epoch_out_of_bounds",
+ Error::ChallengedBlockOnChain => "challenged_block_on_chain",
+ Error::CannotBeFinalized => "cannot_be_finalized",
+ Error::StorageError(_) => "storage_error",
+ Error::GCError(_) => "gc_error",
+ Error::DBNotFoundErr(_) => "db_not_found_err",
+ Error::InvalidBlockPastTime(_, _) => "invalid_block_past_time",
+ Error::InvalidBlockFutureTime(_) => "invalid_block_future_time",
+ Error::InvalidBlockHeight(_) => "invalid_block_height",
+ Error::InvalidBlockProposer => "invalid_block_proposer",
+ Error::InvalidChunk => "invalid_chunk",
+ Error::InvalidChunkProofs(_) => "invalid_chunk_proofs",
+ Error::InvalidChunkState(_) => "invalid_chunk_state",
+ Error::InvalidChunkStateWitness(_) => "invalid_chunk_state_witness",
+ Error::InvalidChunkMask => "invalid_chunk_mask",
+ Error::InvalidStateRoot => "invalid_state_root",
+ Error::InvalidTxRoot => "invalid_tx_root",
+ Error::InvalidChunkReceiptsRoot => "invalid_chunk_receipts_root",
+ Error::InvalidOutcomesProof => "invalid_outcomes_proof",
+ Error::InvalidChunkHeadersRoot => "invalid_chunk_headers_root",
+ Error::InvalidChunkTxRoot => "invalid_chunk_tx_root",
+ Error::InvalidReceiptsProof => "invalid_receipts_proof",
+ Error::InvalidStatePayload => "invalid_state_payload",
+ Error::InvalidTransactions => "invalid_transactions",
+ Error::InvalidChallenge => "invalid_challenge",
+ Error::InvalidSplitShardsIds(_, _) => "invalid_split_shard_ids",
+ Error::MaliciousChallenge => "malicious_challenge",
+ Error::IncorrectNumberOfChunkHeaders => "incorrect_number_of_chunk_headers",
+ Error::InvalidEpochHash => "invalid_epoch_hash",
+ Error::InvalidNextBPHash => "invalid_next_bp_hash",
+ Error::NotEnoughApprovals => "not_enough_approvals",
+ Error::InvalidFinalityInfo => "invalid_finality_info",
+ Error::InvalidValidatorProposals => "invalid_validator_proposals",
+ Error::InvalidSignature => "invalid_signature",
+ Error::InvalidApprovals => "invalid_approvals",
+ Error::InvalidGasLimit => "invalid_gas_limit",
+ Error::InvalidGasPrice => "invalid_gas_price",
+ Error::InvalidGasUsed => "invalid_gas_used",
+ Error::InvalidBalanceBurnt => "invalid_balance_burnt",
+ Error::InvalidShardId(_) => "invalid_shard_id",
+ Error::InvalidStateRequest(_) => "invalid_state_request",
+ Error::InvalidRandomnessBeaconOutput => "invalid_randomness_beacon_output",
+ Error::InvalidBlockMerkleRoot => "invalid_block_merkele_root",
+ Error::InvalidProtocolVersion => "invalid_protocol_version",
+ Error::NotAValidator => "not_a_validator",
+ Error::NotAChunkValidator => "not_a_chunk_validator",
+ Error::InvalidChallengeRoot => "invalid_challenge_root",
+ Error::BlockOutOfBounds(_)=> "block_out_of_bounds"
+ }
+ }
+}
+
+impl From for Error {
+ fn from(error: EpochError) -> Self {
+ match error {
+ EpochError::EpochOutOfBounds(epoch_id) => Error::EpochOutOfBounds(epoch_id),
+ EpochError::MissingBlock(h) => Error::DBNotFoundErr(format!("epoch block: {h}")),
+ EpochError::NotAValidator(_account_id, _epoch_id) => Error::NotAValidator,
+ err => Error::Other(err.to_string()),
+ }
+ }
+}
+
+impl From for Error {
+ fn from(error: BlockError) -> Self {
+ match error {
+ err => Error::ValidatorError(err.to_string()),
+ }
+ }
+}
+
+pub trait EpochErrorResultToChainError {
+ fn into_chain_error(self) -> Result;
+}
+
+impl EpochErrorResultToChainError for Result {
+ fn into_chain_error(self: Result) -> Result {
+ self.map_err(|err| err.into())
+ }
+}
+
+impl From for Error {
+ fn from(error: ShardLayoutError) -> Self {
+ match error {
+ ShardLayoutError::InvalidShardIdError { shard_id } => Error::InvalidShardId(shard_id),
+ }
+ }
+}
+
+impl From for Error {
+ fn from(error: BlockValidityError) -> Self {
+ match error {
+ BlockValidityError::InvalidStateRoot => Error::InvalidStateRoot,
+ BlockValidityError::InvalidReceiptRoot => Error::InvalidChunkReceiptsRoot,
+ BlockValidityError::InvalidTransactionRoot => Error::InvalidTxRoot,
+ BlockValidityError::InvalidChunkHeaderRoot => Error::InvalidChunkHeadersRoot,
+ BlockValidityError::InvalidChunkMask => Error::InvalidChunkMask,
+ BlockValidityError::InvalidChallengeRoot => Error::InvalidChallengeRoot,
+ }
+ }
+}
+
+#[derive(Clone, Eq, PartialEq, Debug, thiserror::Error)]
+pub enum BlockKnownError {
+ #[error("already known in header")]
+ KnownInHeader,
+ #[error("already known in head")]
+ KnownInHead,
+ #[error("already known in orphan")]
+ KnownInOrphan,
+ #[error("already known in missing chunks")]
+ KnownInMissingChunks,
+ #[error("already known in store")]
+ KnownInStore,
+ #[error("already known in blocks in processing")]
+ KnownInProcessing,
+ #[error("already known in invalid blocks")]
+ KnownAsInvalid,
+}
+
+#[cfg(feature = "new_epoch_sync")]
+pub mod epoch_sync {
+ #[derive(thiserror::Error, std::fmt::Debug)]
+ pub enum EpochSyncInfoError {
+ #[error(transparent)]
+ EpochSyncInfoErr(#[from] unc_primitives::errors::epoch_sync::EpochSyncInfoError),
+ #[error(transparent)]
+ IOErr(#[from] std::io::Error),
+ #[error(transparent)]
+ ChainErr(#[from] crate::Error),
+ }
+}
diff --git a/chain/chain-primitives/src/lib.rs b/chain/chain-primitives/src/lib.rs
new file mode 100644
index 000000000..dd4aeed7c
--- /dev/null
+++ b/chain/chain-primitives/src/lib.rs
@@ -0,0 +1,3 @@
+pub mod error;
+
+pub use error::Error;
diff --git a/chain/chain/Cargo.toml b/chain/chain/Cargo.toml
new file mode 100644
index 000000000..40058480b
--- /dev/null
+++ b/chain/chain/Cargo.toml
@@ -0,0 +1,87 @@
+[package]
+name = "unc-chain"
+version.workspace = true
+authors.workspace = true
+edition.workspace = true
+publish = false
+
+[lints]
+workspace = true
+
+[dependencies]
+actix.workspace = true
+assert_matches.workspace = true
+borsh.workspace = true
+bytesize.workspace = true
+chrono.workspace = true
+crossbeam-channel.workspace = true
+enum-map.workspace = true
+itertools.workspace = true
+itoa.workspace = true
+lru.workspace = true
+num-rational.workspace = true
+once_cell.workspace = true
+rand.workspace = true
+rand_chacha.workspace = true
+rayon.workspace = true
+strum.workspace = true
+thiserror.workspace = true
+tracing.workspace = true
+yansi.workspace = true
+
+unc-async.workspace = true
+unc-cache.workspace = true
+unc-chain-configs.workspace = true
+unc-chain-primitives.workspace = true
+unc-client-primitives.workspace = true
+unc-crypto.workspace = true
+unc-epoch-manager.workspace = true
+unc-network.workspace = true
+unc-o11y.workspace = true
+unc-performance-metrics.workspace = true
+unc-performance-metrics-macros.workspace = true
+unc-pool.workspace = true
+unc-primitives.workspace = true
+unc-store.workspace = true
+
+[dev-dependencies]
+insta.workspace = true
+assert_matches.workspace = true
+
+[features]
+# if enabled, we assert in most situations that are impossible unless some byzantine behavior is observed.
+byzantine_asserts = []
+expensive_tests = []
+test_features = []
+no_cache = ["unc-store/no_cache"]
+new_epoch_sync = ["unc-store/new_epoch_sync", "unc-primitives/new_epoch_sync", "unc-epoch-manager/new_epoch_sync", "unc-chain-primitives/new_epoch_sync"]
+
+protocol_feature_reject_blocks_with_outdated_protocol_version = [
+ "unc-primitives/protocol_feature_reject_blocks_with_outdated_protocol_version",
+]
+
+nightly = [
+ "nightly_protocol",
+ "protocol_feature_reject_blocks_with_outdated_protocol_version",
+ "unc-async/nightly",
+ "unc-chain-configs/nightly",
+ "unc-client-primitives/nightly",
+ "unc-epoch-manager/nightly",
+ "unc-network/nightly",
+ "unc-o11y/nightly",
+ "unc-pool/nightly",
+ "unc-primitives/nightly",
+ "unc-store/nightly",
+]
+nightly_protocol = [
+ "unc-async/nightly_protocol",
+ "unc-chain-configs/nightly_protocol",
+ "unc-client-primitives/nightly_protocol",
+ "unc-epoch-manager/nightly_protocol",
+ "unc-network/nightly_protocol",
+ "unc-o11y/nightly_protocol",
+ "unc-pool/nightly_protocol",
+ "unc-primitives/nightly_protocol",
+ "unc-store/nightly_protocol",
+]
+sandbox = ["unc-primitives/sandbox"]
diff --git a/chain/chain/src/block_processing_utils.rs b/chain/chain/src/block_processing_utils.rs
new file mode 100644
index 000000000..efd150ff7
--- /dev/null
+++ b/chain/chain/src/block_processing_utils.rs
@@ -0,0 +1,158 @@
+use crate::chain::BlockMissingChunks;
+use crate::unc_chain_primitives::error::BlockKnownError::KnownInProcessing;
+use crate::orphan::OrphanMissingChunks;
+use crate::Provenance;
+use unc_primitives::block::Block;
+use unc_primitives::challenge::{ChallengeBody, ChallengesResult};
+use unc_primitives::hash::CryptoHash;
+use unc_primitives::sharding::{ReceiptProof, ShardChunkHeader, StateSyncInfo};
+use unc_primitives::types::ShardId;
+use once_cell::sync::OnceCell;
+use std::collections::HashMap;
+use std::sync::Arc;
+use std::time::Instant;
+
+/// Max number of blocks that can be in the pool at once.
+/// This number will likely never be hit unless there are many forks in the chain.
+pub(crate) const MAX_PROCESSING_BLOCKS: usize = 5;
+
+/// Contains information from preprocessing a block
+pub(crate) struct BlockPreprocessInfo {
+ pub(crate) is_caught_up: bool,
+ pub(crate) state_sync_info: Option,
+ pub(crate) incoming_receipts: HashMap>,
+ pub(crate) challenges_result: ChallengesResult,
+ pub(crate) challenged_blocks: Vec,
+ pub(crate) provenance: Provenance,
+ /// This field will be set when the apply_chunks has finished.
+ /// This is used to provide a way for caller to wait for the finishing of applying chunks of
+ /// a block
+ pub(crate) apply_chunks_done: Arc>,
+ /// This is used to calculate block processing time metric
+ pub(crate) block_start_processing_time: Instant,
+}
+
+/// Blocks which finished pre-processing and are now being applied asynchronously
+pub(crate) struct BlocksInProcessing {
+ // A map that stores all blocks in processing
+ preprocessed_blocks: HashMap,
+}
+
+#[derive(Debug)]
+pub(crate) enum AddError {
+ ExceedingPoolSize,
+ BlockAlreadyInPool,
+}
+
+impl From for unc_chain_primitives::Error {
+ fn from(err: AddError) -> Self {
+ match err {
+ AddError::ExceedingPoolSize => unc_chain_primitives::Error::TooManyProcessingBlocks,
+ AddError::BlockAlreadyInPool => {
+ unc_chain_primitives::Error::BlockKnown(KnownInProcessing)
+ }
+ }
+ }
+}
+
+/// Results from processing a block that are useful for client and client actor to use
+/// for steps after a block is processed that can't be finished inside Chain after a block is processed
+/// (for example, sending requests for missing chunks or challenges).
+/// This struct is passed to Chain::process_block as an argument instead of returned as Result,
+/// because the information stored here need to returned whether process_block succeeds or returns an error.
+#[derive(Default)]
+pub struct BlockProcessingArtifact {
+ pub orphans_missing_chunks: Vec,
+ pub blocks_missing_chunks: Vec,
+ pub challenges: Vec,
+ pub invalid_chunks: Vec,
+}
+
+/// This struct defines the callback function that will be called after apply chunks are finished
+/// for each block. Multiple functions that might trigger the start processing of new blocks has
+/// this as an argument. Caller of these functions must note that this callback can be called multiple
+/// times, for different blocks, because these functions may trigger the processing of more than
+/// one block.
+pub type DoneApplyChunkCallback = Arc () + Send + Sync + 'static>;
+
+#[derive(Debug)]
+pub struct BlockNotInPoolError;
+
+impl BlocksInProcessing {
+ pub(crate) fn new() -> Self {
+ BlocksInProcessing { preprocessed_blocks: HashMap::new() }
+ }
+
+ pub(crate) fn len(&self) -> usize {
+ self.preprocessed_blocks.len()
+ }
+
+ /// Add a preprocessed block to the pool. Return Error::ExceedingPoolSize if the pool already
+ /// reaches its max size.
+ pub(crate) fn add(
+ &mut self,
+ block: Block,
+ preprocess_info: BlockPreprocessInfo,
+ ) -> Result<(), AddError> {
+ self.add_dry_run(block.hash())?;
+
+ self.preprocessed_blocks.insert(*block.hash(), (block, preprocess_info));
+ Ok(())
+ }
+
+ pub(crate) fn contains(&self, block_hash: &CryptoHash) -> bool {
+ self.preprocessed_blocks.contains_key(block_hash)
+ }
+
+ pub(crate) fn remove(
+ &mut self,
+ block_hash: &CryptoHash,
+ ) -> Option<(Block, BlockPreprocessInfo)> {
+ self.preprocessed_blocks.remove(block_hash)
+ }
+
+ /// This function does NOT add the block, it simply checks if the block can be added
+ pub(crate) fn add_dry_run(&self, block_hash: &CryptoHash) -> Result<(), AddError> {
+ // We set a limit to the max number of blocks that we will be processing at the same time.
+ // Since processing a block requires that the its previous block is processed, this limit
+ // is likely never hit, unless there are many forks in the chain.
+ // In this case, we will simply drop the block.
+ if self.preprocessed_blocks.len() >= MAX_PROCESSING_BLOCKS {
+ Err(AddError::ExceedingPoolSize)
+ } else if self.preprocessed_blocks.contains_key(block_hash) {
+ Err(AddError::BlockAlreadyInPool)
+ } else {
+ Ok(())
+ }
+ }
+
+ pub(crate) fn has_blocks_to_catch_up(&self, prev_hash: &CryptoHash) -> bool {
+ self.preprocessed_blocks
+ .iter()
+ .any(|(_, (block, _))| block.header().prev_hash() == prev_hash)
+ }
+
+ /// This function waits until apply_chunks_done is marked as true for all blocks in the pool
+ /// Returns true if new blocks are done applying chunks
+ pub(crate) fn wait_for_all_blocks(&self) -> bool {
+ for (_, (_, block_preprocess_info)) in self.preprocessed_blocks.iter() {
+ let _ = block_preprocess_info.apply_chunks_done.wait();
+ }
+ !self.preprocessed_blocks.is_empty()
+ }
+
+ /// This function waits until apply_chunks_done is marked as true for block `block_hash`
+ pub(crate) fn wait_for_block(
+ &self,
+ block_hash: &CryptoHash,
+ ) -> Result<(), BlockNotInPoolError> {
+ let _ = self
+ .preprocessed_blocks
+ .get(block_hash)
+ .ok_or(BlockNotInPoolError)?
+ .1
+ .apply_chunks_done
+ .wait();
+ Ok(())
+ }
+}
diff --git a/chain/chain/src/blocks_delay_tracker.rs b/chain/chain/src/blocks_delay_tracker.rs
new file mode 100644
index 000000000..0c9478bd8
--- /dev/null
+++ b/chain/chain/src/blocks_delay_tracker.rs
@@ -0,0 +1,484 @@
+use chrono::DateTime;
+use unc_epoch_manager::EpochManagerAdapter;
+use unc_primitives::block::{Block, Tip};
+use unc_primitives::hash::CryptoHash;
+use unc_primitives::sharding::{ChunkHash, ShardChunkHeader};
+use unc_primitives::static_clock::StaticClock;
+use unc_primitives::types::{BlockHeight, ShardId};
+use unc_primitives::views::{
+ BlockProcessingInfo, BlockProcessingStatus, ChainProcessingInfo, ChunkProcessingInfo,
+ ChunkProcessingStatus, DroppedReason,
+};
+use std::collections::{hash_map::Entry, BTreeMap, HashMap};
+use std::mem;
+use std::time::Instant;
+use tracing::error;
+
+use crate::{metrics, Chain, ChainStoreAccess};
+
+const BLOCK_DELAY_TRACKING_COUNT: u64 = 50;
+
+/// A centralized place that records monitoring information about the important timestamps throughout
+/// the lifetime of blocks and chunks. It keeps information of recent blocks and chunks
+/// (blocks with height > head height - BLOCK_DELAY_TRACKING_HORIZON).
+/// A block is added the first time when chain tries to process the block. Note that this means
+/// the block already passes a few checks in ClientActor and in Client before it enters the chain
+/// code. For example, client actor checks that the block must be within head_height + BLOCK_HORIZON (500),
+/// that's why we know tracker at most tracks 550 blocks.
+#[derive(Debug, Default)]
+pub struct BlocksDelayTracker {
+ // A block is added at the first time it was received, and
+ // removed if it is too far from the chain head.
+ blocks: HashMap,
+ // Maps block height to block hash. Used for gc.
+ // Theoretically, each block height should only have one block, if our block processing code
+ // works correctly. We are storing a vector here just in case.
+ blocks_height_map: BTreeMap>,
+ // Chunks that belong to the blocks in the tracker
+ chunks: HashMap,
+ // Chunks that we don't know which block it belongs to yet
+ floating_chunks: HashMap,
+ head_height: BlockHeight,
+}
+
+#[derive(Debug, Clone)]
+pub struct BlockTrackingStats {
+ /// Timestamp when block was received.
+ pub received_timestamp: Instant,
+ pub received_utc_timestamp: DateTime,
+ /// Timestamp when block was put to the orphan pool, if it ever was
+ pub orphaned_timestamp: Option,
+ /// Timestamp when block was put to the missing chunks pool
+ pub missing_chunks_timestamp: Option,
+ /// Timestamp when block was moved out of the orphan pool
+ pub removed_from_orphan_timestamp: Option,
+ /// Timestamp when block was moved out of the missing chunks pool
+ pub removed_from_missing_chunks_timestamp: Option,
+ /// Timestamp when block was done processing
+ pub processed_timestamp: Option,
+ /// Whether the block is not processed because of different reasons
+ pub dropped: Option,
+ /// Stores the error message encountered during the processing of this block
+ pub error: Option,
+ /// Only contains new chunks that belong to this block, if the block doesn't produce a new chunk
+ /// for a shard, the corresponding item will be None.
+ pub chunks: Vec